--- /dev/null
+/**
+ * Copyright (c) CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: Power display service.
+ * Author:
+ * Create:
+ */
+
+#include <soc_osal.h>
+#include <osal_list.h>
+#include <securec.h>
+#include "cmsis_os2.h"
+#include "systick.h"
+#include "soc_errno.h"
+#include "common_def.h"
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "oal_interface.h"
+#include "wearable_log.h"
+#include "local_device_manager.h"
+#include "remote_device_manager.h"
+#include "spp_service.h"
+#include "bts_spp.h"
+#include "btsrv_log.h"
+#include "bts_feature.h"
+#include "auto_ota_service.h"
+#include "msg_center_ota.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define AUTO_OTA_RETRY_TIMES 5
+#define AUTO_OTA_SEM_TIMEOUT (60*60*1000) /* 等待信号量超时时间,考虑资源大包传输时间长场景 */
+#define AUTO_OTA_DELAY_MS 100
+#define AUTO_OTA_SPP_TASK_STACK_SIZE 2048
+#define AUTO_OTA_SPP_TASK_PRI 20
+#define ADDR_MAC_LEN 6
+#define AUTO_OTA_RECORD_DEV_MAX_NUM 200 /* 设计成客户可定制 */
+#define AUTO_OTA_SCAN_WAIT_TIME (25*1000) /* 客户可定制 */
+#define AUTO_OTA_UPDATE_RSSI_WAIT_TIME (20*1000) /* 客户可定制 */
+#define AUTO_OTA_INQUERY_DEV_NUM 20 /* 客户可定制 */
+#define AUTO_OTA_OPRATE_DELAY_MS (2*1000) /* 客户可定制 */
+#define AUTO_OTA_ACL_CONN_DELAY (6*1000) /* 客户可定制 */
+#define AUTO_OTA_SPP_RECONN_TIMEOUT 10000 /* 客户可定制 */
+#define AUTO_OTA_WAIT_PREPARE_TIMEOUT (2 * 1000) /* 客户可定制, 用于更换升级包场景 */
+#define AUTO_OTA_DEV_NAME_PREFIX "Watch" /* 客户基于自己产品定义修改bt name前缀,用于黑名单管理 */
+#define AUTO_OTA_DEV_NAME_PREFIX_LEN 5
+#define AUTO_OTA_DST_UPG_VER_PATH "/user/dst_ver.txt"
+
+bool g_auto_ota_found_list_init = false;
+struct osal_list_head g_auto_ota_found_dev_list_head;
+osSemaphoreId_t g_auto_ota_transmit_done_sem = NULL;
+uint8_t g_auto_ota_upload_mode = 0; /* 默认是0,不阻塞auto_ota */
+uint8_t g_auto_ota_mac_tmp[ADDR_MAC_LEN] = {0};
+static bool g_anti_back_link_flag = false;
+
+typedef struct auto_ota_record_dev {
+ uint8_t addr[ADDR_MAC_LEN]; /* mac地址 */
+ uint8_t has_been_updated; /* 标记是否已经升级 */
+ uint8_t reserved; /* 对齐 */
+} auto_ota_record_dev_t;
+
+static auto_ota_record_dev_t g_auto_ota_record_dev[AUTO_OTA_RECORD_DEV_MAX_NUM];
+
+typedef struct {
+ struct osal_list_head node;
+ bd_addr_t bd_addr;
+ uint8_t name[BD_NAME_LEN];
+ int32_t cod;
+ int32_t rssi;
+} auto_ota_found_dev_list_node;
+
+typedef struct {
+ uint32_t sample_mode;
+ spp_create_socket_para_t socket_params;
+ bd_addr_t addr;
+} auto_ota_spp_connect_task_params;
+
+/* 数据管理 */
+void auto_ota_dev_init(void)
+{
+ for (uint8_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+ (void)memset_s(&g_auto_ota_record_dev[i], sizeof(auto_ota_record_dev_t), 0, sizeof(auto_ota_record_dev_t));
+ }
+ return;
+}
+
+void auto_ota_dev_add(uint8_t *addr)
+{
+ for (uint16_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+ if (g_auto_ota_record_dev[i].has_been_updated == 0) {
+ (void)memcpy_s(g_auto_ota_record_dev[i].addr, ADDR_MAC_LEN, addr, ADDR_MAC_LEN);
+ g_auto_ota_record_dev[i].has_been_updated = 1;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "to add record dev_mac : ****%02x%02x%02x%02x\r\n",
+ g_auto_ota_record_dev[i].addr[3], g_auto_ota_record_dev[i].addr[2], g_auto_ota_record_dev[i].addr[1],
+ g_auto_ota_record_dev[i].addr[0]);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "alloc index = %d\r\n", i);
+ return;
+ }
+ }
+}
+
+bool auto_ota_dev_del(uint8_t *addr)
+{
+ for (uint16_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+ if (g_auto_ota_record_dev[i].has_been_updated == 1 &&
+ memcmp(g_auto_ota_record_dev[i].addr, addr, ADDR_MAC_LEN) == 0) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "found! to del record dev_mac : ****%02x%02x%02x%02x\r\n",
+ g_auto_ota_record_dev[i].addr[3], g_auto_ota_record_dev[i].addr[2], g_auto_ota_record_dev[i].addr[1],
+ g_auto_ota_record_dev[i].addr[0]);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "free index = %d\r\n", i);
+ (void)memset_s(g_auto_ota_record_dev[i].addr, ADDR_MAC_LEN, 0, ADDR_MAC_LEN);
+ g_auto_ota_record_dev[i].has_been_updated = 0;
+ return true;
+ }
+ }
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "dev_del: no found dev_mac.\r\n");
+ return false;
+}
+
+bool auto_ota_dev_found(uint8_t *addr)
+{
+ for (uint16_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+ if (g_auto_ota_record_dev[i].has_been_updated == 1 &&
+ memcmp(g_auto_ota_record_dev[i].addr, addr, ADDR_MAC_LEN) == 0) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "no need to record dev_mac: ****%02x%02x%02x%02x\r\n",
+ g_auto_ota_record_dev[i].addr[3], g_auto_ota_record_dev[i].addr[2], g_auto_ota_record_dev[i].addr[1],
+ g_auto_ota_record_dev[i].addr[0]);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "taken index = %d\r\n", i);
+ return true;
+ }
+ }
+ return false;
+}
+
+void auto_ota_dev_show(void)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "auto_ota total dev info :");
+ for (uint16_t i = 0; i < AUTO_OTA_RECORD_DEV_MAX_NUM; i++) {
+ if (g_auto_ota_record_dev[i].has_been_updated == 1) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "already record dev_mac : ****%02x%02x%02x%02x\r\n",
+ g_auto_ota_record_dev[i].addr[3], g_auto_ota_record_dev[i].addr[2], g_auto_ota_record_dev[i].addr[1],
+ g_auto_ota_record_dev[i].addr[0]);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "taken index = %d\r\n", i);
+ }
+ }
+}
+
+/* 黑名单处理 */
+static bool auto_ota_dev_check_dev_name(unsigned char *dev_name)
+{
+ if (strncmp((const char *)dev_name, AUTO_OTA_DEV_NAME_PREFIX, AUTO_OTA_DEV_NAME_PREFIX_LEN) == 0) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* 重置发现设备链表 */
+void auto_ota_reset_found_dev_list(void)
+{
+ if (!g_auto_ota_found_list_init) {
+ g_auto_ota_found_list_init = true;
+ OSAL_INIT_LIST_HEAD(&g_auto_ota_found_dev_list_head);
+ return;
+ }
+
+ while (osal_list_empty(&g_auto_ota_found_dev_list_head) == false) {
+ struct osal_list_head *node = g_auto_ota_found_dev_list_head.next;
+ osal_list_del(node);
+ oal_mem_free(node);
+ }
+}
+
+bool auto_ota_bt_start_discovery(void)
+{
+ auto_ota_reset_found_dev_list();
+ (void)gap_br_set_inquiry_paramters(0, AUTO_OTA_INQUERY_DEV_NUM);
+ for (uint8_t i = 0; i < AUTO_OTA_RETRY_TIMES; i++) {
+ bool res = gap_br_start_discovery();
+ if (res != true) {
+ osDelay(AUTO_OTA_DELAY_MS);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_br_start_discovery fail.\r\n");
+ continue;
+ } else {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_br_start_discovery succ.\r\n");
+ return true;
+ }
+ }
+ return false;
+}
+
+/* 新增节点 */
+static void auto_ota_add_node_to_found_dev_list(const bd_addr_t *bd_addr, const uint8_t *name, int32_t cod, int32_t rssi)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "auto_ota_add_node, addr: ****%02x%02x%02x%02x, name: %s",
+ bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], name); /* addr下标 0 1 2 3 */
+
+ auto_ota_found_dev_list_node *node =
+ (auto_ota_found_dev_list_node *)(void *)oal_mem_alloc(sizeof(auto_ota_found_dev_list_node));
+ if (node == NULL) {
+ return;
+ }
+ (void)memset_s(node, sizeof(auto_ota_found_dev_list_node), 0, sizeof(auto_ota_found_dev_list_node));
+
+ if (memcpy_s(&node->bd_addr, sizeof(node->bd_addr), bd_addr, sizeof(bd_addr_t)) != EOK) {
+ oal_mem_free(node);
+ return;
+ }
+
+ if (memcpy_s(node->name, sizeof(node->name), name, BD_NAME_LEN) != EOK) {
+ oal_mem_free(node);
+ return;
+ }
+
+ node->cod = cod;
+ node->rssi = rssi;
+ osal_list_add_tail((struct osal_list_head *)node, &g_auto_ota_found_dev_list_head);
+}
+
+static void auto_ota_sort_found_dev_list(void)
+{
+ struct osal_list_head *list_head = &g_auto_ota_found_dev_list_head;
+
+ for (struct osal_list_head *node1 = list_head->next; node1 != NULL && node1 != list_head; node1 = node1->next) {
+ auto_ota_found_dev_list_node *dev_info1 = (auto_ota_found_dev_list_node *)node1;
+ for (struct osal_list_head *node2 = node1->next; node2 != NULL && node2 != list_head; node2 = node2->next) {
+ auto_ota_found_dev_list_node *dev_info2 = (auto_ota_found_dev_list_node *)node2;
+
+ /* rssi大的在前 */
+ if (dev_info1->rssi >= dev_info2->rssi) {
+ continue;
+ }
+
+ /* 交换两个节点的信息 */
+ auto_ota_found_dev_list_node tmp_node;
+ uint32_t ret =
+ (uint32_t)memcpy_s(&tmp_node, sizeof(tmp_node), dev_info1, sizeof(auto_ota_found_dev_list_node));
+ ret |= (uint32_t)memcpy_s(&dev_info1->bd_addr,
+ sizeof(auto_ota_found_dev_list_node) - sizeof(struct osal_list_head),
+ &dev_info2->bd_addr,
+ sizeof(auto_ota_found_dev_list_node) - sizeof(struct osal_list_head));
+ ret |= (uint32_t)memcpy_s(&dev_info2->bd_addr,
+ sizeof(auto_ota_found_dev_list_node) - sizeof(struct osal_list_head),
+ &tmp_node.bd_addr,
+ sizeof(auto_ota_found_dev_list_node) - sizeof(struct osal_list_head));
+ if (ret != EOK) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "swap fail %x\n", ret);
+ }
+ }
+ }
+}
+
+/* 异步返回,更新RSSI */
+static void auto_ota_update_found_dev_node_rssi(const bd_addr_t *bd_addr, int32_t rssi)
+{
+ struct osal_list_head *list_head = &g_auto_ota_found_dev_list_head;
+ struct osal_list_head *node = list_head->next;
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER,"will update rssi, addr: ****%02x%02x%02x%02x, rssi = %d\n",
+ bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], rssi); /* addr下标 0 1 2 3 */
+
+ while (node != NULL && node != list_head) {
+ auto_ota_found_dev_list_node *dev_info = (auto_ota_found_dev_list_node *)node;
+ if (memcmp(dev_info->bd_addr.addr, bd_addr->addr, BD_ADDR_LEN) == 0) {
+ dev_info->rssi = rssi;
+ return;
+ }
+
+ node = node->next;
+ }
+}
+
+static void auto_ota_gap_read_remote_rssi_event_callback(const bd_addr_t *bd_addr, int rssi, int status)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER,
+ " addr: ****%02x%02x%02x%02x rssi: %d status: %d\n",
+ bd_addr->addr[3], bd_addr->addr[2], /* addr下标 2 3 */
+ bd_addr->addr[1], bd_addr->addr[0], rssi, status); /* addr下标 0 1 */
+
+ if (status == ERRCODE_BT_SUCCESS) {
+ auto_ota_update_found_dev_node_rssi(bd_addr, rssi);
+ }
+}
+
+static bool auto_ota_get_top_dev_to_connect(void)
+{
+ struct osal_list_head *list_head = &g_auto_ota_found_dev_list_head;
+ uint8_t blank_addr[ADDR_MAC_LEN] = {0};
+
+ for (struct osal_list_head *node = list_head->next; node != NULL && node != list_head; node = node->next) {
+ auto_ota_found_dev_list_node *dev_info = (auto_ota_found_dev_list_node *)node;
+ if (memcmp(dev_info->bd_addr.addr, blank_addr, ADDR_MAC_LEN) == 0) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "ignore zero addr, name: %s\n", dev_info->name);
+ continue;
+ }
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER,
+ "plan to connect addr: ****%02x%02x%02x%02x name: \"%s\" cod: %x rssi: %d\n",
+ dev_info->bd_addr.addr[3], dev_info->bd_addr.addr[2], /* addr下标 3 2 */
+ dev_info->bd_addr.addr[1], dev_info->bd_addr.addr[0], /* addr下标 1 0 */
+ dev_info->name,
+ dev_info->cod,
+ dev_info->rssi);
+
+ for (uint8_t i = 0; i < AUTO_OTA_RETRY_TIMES; i++) {
+ if (gap_connect_remote_device(&(dev_info->bd_addr)) != true) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "to connect acl fail\r\n");
+ osDelay(100);
+ } else {
+ osDelay(AUTO_OTA_ACL_CONN_DELAY);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "to connect acl succ\r\n");
+ return true;
+ }
+ }
+ }
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "no found_device\n");
+ return false;
+}
+
+static void auto_ota_discovery_result_callback(const bd_addr_t *bd_addr)
+{
+ unsigned char length = BD_NAME_LEN;
+ unsigned char *device_name = (unsigned char *)(void *)oal_mem_alloc(length);
+ if (device_name == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_discovery_result_callback malloc error!\n");
+ return;
+ }
+ (void)memset_s(device_name, length, 0, length);
+
+ bool ret1 = gap_get_device_name(bd_addr, device_name, &length);
+ int cod = gap_get_device_class(bd_addr);
+ bool ret2 = gap_read_remote_rssi_value(bd_addr);
+
+ if (auto_ota_dev_found(bd_addr->addr) != true && auto_ota_dev_check_dev_name(device_name) == true) {
+ auto_ota_add_node_to_found_dev_list(bd_addr, device_name, cod, 0);
+ }
+
+ return;
+}
+
+static bool auto_ota_upg_check(void)
+{
+ errcode_t ret = ERRCODE_SUCC;
+
+ /* 目标版本从文件读取,方便客户每次推送不同版本 */
+ FILE *fp = NULL;
+
+ fp = fopen(AUTO_OTA_DST_UPG_VER_PATH, "rb");
+ if (fp == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "open %s fail.\r\n", AUTO_OTA_DST_UPG_VER_PATH);
+ return false;
+ }
+
+ fseek(fp, 0L, SEEK_END);
+ long file_len = ftell(fp);
+ char *dst_ver = (char *)malloc(sizeof(char) * (file_len + 1));
+ if (dst_ver == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "malloc fail, file_len = %d.\r\n", file_len);
+ fclose(fp);
+ return false;
+ }
+
+ fseek(fp, 0L, SEEK_SET);
+ if (fread(dst_ver, file_len, 1, fp) != 1) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "fread fail, file_len = %d.\r\n", file_len);
+ fclose(fp);
+ free(dst_ver);
+ dst_ver = NULL;
+ return false;
+ }
+ fclose(fp);
+ dst_ver[file_len] = '\0';
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "dst_ver = %s, file_len = %d.\r\n", dst_ver, file_len);
+
+ ret = msg_center_send_data(MSGCENTER_CMD_OTA, MSGCENTER_TYPE_ID_OTA_UPG_CHECK, dst_ver, strlen(dst_ver));
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send upgrade version check fail, ret = %d\r\n", ret);
+ free(dst_ver);
+ dst_ver = NULL;
+ return false;
+ }
+
+ free(dst_ver);
+ dst_ver = NULL;
+ return true;
+}
+
+static int auto_ota_spp_client_connect_task_body(void *data)
+{
+ auto_ota_spp_connect_task_params *task_params = (auto_ota_spp_connect_task_params *)data;
+ spp_create_socket_para_t *socket_param = &task_params->socket_params;
+
+ int ret = spp_connect(socket_param, &task_params->addr);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "spp_connect ret: %x\n", ret);
+
+ oal_mem_free(data);
+ return OSAL_SUCCESS;
+}
+
+/* client连接server */
+bool auto_ota_spp_connect(const char *spp_uuid, const bd_addr_t *addr)
+{
+ uint8_t uuid_len = (uint8_t)strlen(spp_uuid);
+ auto_ota_spp_connect_task_params *task_params =
+ (auto_ota_spp_connect_task_params *)oal_mem_alloc(sizeof(auto_ota_spp_connect_task_params));
+
+ if (generate_uuid_from_string(spp_uuid, uuid_len + 1, &task_params->socket_params.uuid) != EXT_ERR_SUCCESS) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "generate uuid fail\n");
+ return false;
+ }
+
+ task_params->sample_mode = 0;
+ task_params->socket_params.socket_type = SPP_SOCKET_RFCOMM;
+ task_params->socket_params.is_encrypt = true;
+ (void)memcpy_s(&(task_params->addr.addr), BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);
+
+ osal_task *task = osal_kthread_create(auto_ota_spp_client_connect_task_body, task_params,
+ "auto_ota_spp_client_connect_task", AUTO_OTA_SPP_TASK_STACK_SIZE);
+ if (task == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "create task fail\n");
+ return false;
+ }
+ int ret = osal_kthread_set_priority(task, AUTO_OTA_SPP_TASK_PRI);
+ if (ret != OSAL_SUCCESS) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "set pri error: %08x\n", ret);
+ }
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "create task success.\n");
+
+ bool is_connected = false;
+ uint64_t start_time = uapi_tcxo_get_ms();
+ uint64_t current_time;
+ while (is_connected == false) {
+ is_connected = is_spp_connected(0);
+ osDelay(AUTO_OTA_OPRATE_DELAY_MS);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "spp reconnecting.\r\n");
+ current_time = uapi_tcxo_get_ms();
+ if (current_time - start_time > AUTO_OTA_SPP_RECONN_TIMEOUT || is_connected == true) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "spp connect %s.\r\n", is_connected == true ? "Succ" : "Fail");
+ break;
+ }
+ }
+
+ /* 升级版本号校验 */
+ bool res = auto_ota_upg_check();
+ if (res != true) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "auto_ota_upg_check fail.\n");
+ return false;
+ }
+
+ return true;
+}
+
+static void auto_ota_acl_state_changed_callback(const bd_addr_t *bd_addr, gap_acl_state_t state, unsigned int reason)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "acl cb, state %d, reason %x", state, reason);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "addr: ****%02x%02x%02x%02x",
+ bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* mac下标 0 1 2 3 */
+ char uuid[] = {"1101"};
+ if (state == GAP_ACL_STATE_CONNECTED) {
+ if (g_anti_back_link_flag == true) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "anti back link addr: ****%02x%02x%02x%02x",
+ bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* mac下标 0 1 2 3 */
+ return;
+ }
+ bool res = auto_ota_spp_connect(uuid, bd_addr);
+ if (res != true) {
+ (void)osSemaphoreRelease(g_auto_ota_transmit_done_sem);
+ return;
+ }
+ /* spp trans回调中释放信号量最准确,故此处临时记录mac地址 */
+ (void)memcpy_s(g_auto_ota_mac_tmp, ADDR_MAC_LEN, (const char *)bd_addr->addr, ADDR_MAC_LEN);
+ g_anti_back_link_flag = true;
+ }
+}
+
+void auto_ota_gap_register_callbacks(void)
+{
+ gap_call_backs_t cb = {
+ NULL,
+ auto_ota_acl_state_changed_callback,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ auto_ota_discovery_result_callback,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ auto_ota_gap_read_remote_rssi_event_callback,
+ NULL
+ };
+ (void)gap_register_callbacks(&cb);
+}
+
+errcode_t auto_ota_enable_bt(void)
+{
+#if defined(SW_UART_DEBUG) || defined(SW_RTT_DEBUG)
+ g_bth_log_type_level = 0xFF2; /* BTSRV_LOG_UART_INFO */
+#endif
+ bts_feature_t feature = {0};
+ feature.bt_auto_reconnect_closed = 1;
+
+ auto_ota_gap_register_callbacks();
+ bts_set_features(&feature); /* 关闭client回链 */
+ errcode_t res = enable_bt_stack();
+ if (res != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "bt enable fail, ret = %d\r\n", res);
+ return ERRCODE_FAIL;
+ } else {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "bt enable ok\r\n");
+ return ERRCODE_SUCC;
+ }
+}
+
+void auto_ota_task_init(void)
+{
+ g_auto_ota_transmit_done_sem = osSemaphoreNew(1, 0, NULL);
+ if (!g_auto_ota_transmit_done_sem) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "sem creat fail!\r\n");
+ return;
+ }
+}
+
+void auto_ota_task_main(void)
+{
+ errcode_t ret;
+
+ auto_ota_dev_init();
+ auto_ota_task_init();
+
+ if (auto_ota_enable_bt() != ERRCODE_SUCC) {
+ return;
+ }
+
+ while (1) {
+ if (g_auto_ota_upload_mode == 1) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "enter upload fwpkg mode, auto_ota not run!\r\n");
+ osDelay(AUTO_OTA_WAIT_PREPARE_TIMEOUT);
+ continue;
+ }
+
+ /* 保证最开始不会有配对信息回连,可能导致B核wait等回连 */
+ if (gap_remove_all_pairs() != true) {
+ osDelay(AUTO_OTA_DELAY_MS);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "remove all pairs fail, auto retry...\r\n");
+ continue;
+ }
+ osDelay(AUTO_OTA_OPRATE_DELAY_MS);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_remove_all_pairs ok\r\n");
+
+ /* scan */
+ if (auto_ota_bt_start_discovery() != true) {
+ osDelay(AUTO_OTA_DELAY_MS);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "start discovery fail, auto retry...\r\n");
+ continue;
+ }
+
+ osDelay(AUTO_OTA_SCAN_WAIT_TIME); /* 保证能扫到设备 */
+
+ (void)gap_br_cancel_discovery();
+ osDelay(AUTO_OTA_UPDATE_RSSI_WAIT_TIME);
+ auto_ota_sort_found_dev_list(); /* 根据rssi降序排序 */
+ /* connect */
+ if (auto_ota_get_top_dev_to_connect() != true) {
+ osDelay(AUTO_OTA_DELAY_MS);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "connect fail, auto retry...\r\n");
+ continue;
+ }
+
+ osSemaphoreAcquire(g_auto_ota_transmit_done_sem, AUTO_OTA_SEM_TIMEOUT);
+
+ /* clean, spp资源内部释放 */
+ spp_disconnect(0);
+ /* 删除配对时会disconnect ACL */
+ if (gap_remove_all_pairs() != true) {
+ osDelay(AUTO_OTA_DELAY_MS);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "remove all pairs fail, auto retry...\r\n");
+ continue;
+ }
+ osDelay(AUTO_OTA_OPRATE_DELAY_MS);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "gap_remove_all_pairs ok\r\n");
+
+ osDelay(AUTO_OTA_DELAY_MS);
+ auto_ota_dev_show();
+ memset_s(g_auto_ota_mac_tmp, sizeof(g_auto_ota_mac_tmp), 0, sizeof(g_auto_ota_mac_tmp));
+ g_anti_back_link_flag = false;
+ osDelay(AUTO_OTA_DELAY_MS);
+ }
+
+ return;
+}
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
${CMAKE_CURRENT_SOURCE_DIR}/src/AbilitySlice.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/NativeAbility.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/StartNative.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ZoomOutTransition.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ZoomTransition.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ThreeDFoldTransition.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/FadeInOutTransition.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/transition/HexagonsTransition.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToHexagonsTransition.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToWaterfallTransition.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/transition/WaterfallTransition.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/transition/EnterWaterfallTransition.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/TransparentGradientTransition.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/GaussianBlurTransition.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/CrossShapedTransition.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToCrossShapedTransition.cpp
)
set(COMPONENT_PUBLIC_CCFLAGS
const static uint16_t gPageInvalid = 0;
const static uint16_t gSliceDefaultPriority = 4; // 页面默认是最低优先级
+struct ExtralConfig {
+ uint16_t pageId;
+ TransitionType type;
+ bool enableSlideBack;
+};
+
+// 定义默认配置
+constexpr ExtralConfig DEFAULT_CONF = {gPageInvalid, TransitionType::TRANSITION_INVALID, false};
+
class Ability {
public:
void AddSliceProxy(uint16_t sliceId, SliceProxy* proxy);
/**
- * @brief Switch to specified page in the current slice, matched page will be created, and current slice will not be
- * recreated. if slices or pages is being switched, this operation will be canceled
+ * @brief Switch to specified page in the current slice, target page will be created, and current slice will
+ * not be recreated. if slices or pages is being switched, this operation will be canceled
* @param pageId Indicates the specified id of the page in the current slice, it should not be zero
- * @param data Indicates the data which will be transfered to next page, default value is nullptr
* @param type Indicates Transition animation type, which is declared in TransitionType.h. The matched
* Transitioncallback should have params: enableCurrentSnapshot_ = false enableTargetSnapshot_ = false
- * @param canBack Indicates whether current page should be cached and can be back from target page
+ * @param canBack Indicates whether current page will be cached or destroyed. if cached, can back from target page
+ * @param data Indicates the data which will be transfered to next page, default value is nullptr,
+ * data can only be native C structures or basic data types
+ * @param dataLength Indicates the length of data
* @return Returns <b>true</b> if the pages is switched successfully, returns <b>false</b> otherwise.
+ * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue
+ */
+ bool SwitchPageInSlice(uint16_t pageId, TransitionType type = TransitionType::TRANSITION_INVALID,
+ bool canBack = false, void* data = nullptr, uint16_t dataLength = 0);
+
+ /**
+ * @brief Back to previous cached page in the current slice, current page will be destroyed, and previous
+ * cached page will be resumed. if slices or pages is being switched, this operation will be canceled
+ * @return Returns <b>true</b> if back to cached page successfully, returns <b>false</b> if no cached page.
+ * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue
*/
- bool SwitchPageInSlice(uint16_t pageId, void* data = nullptr,
- TransitionType type = TransitionType::TRANSITION_INVALID, bool canBack = false);
+ bool BackToPrevSlicePage();
+
+ /**
+ * @brief Back to target cached page in the current slice, current page and the cached pages on the top of target
+ * cached page will be destroyed, target cached page will be resumed. if slices or pages is being
+ * switched, this operation will be canceled
+ * @param pageId Indicates the target page id in cached pages, it should not be zero
+ * @return Returns <b>true</b> if back to target cached page successfully, returns <b>false</b> otherwise.
+ * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue
+ */
+ bool BackToCachedSlicePage(uint16_t pageId);
/**
* @brief Switch to specified slice. matched slice will be created.
- * 1. If pageId is valid or default page is exist, matched page will also be created
+ * 1. If pageId is valid or default page exists, matched page will also be created
* 2. If slices is being switched, this operation will be cached and run later.
* @param sliceId Indicates the specified id of the slice
* @param pageId Indicates the specified id of the slice, if pageId is invalid, default page will be used.
void SwitchSlice(uint16_t sliceId, uint16_t pageId = gPageInvalid,
TransitionType type = TransitionType::TRANSITION_INVALID, bool enableSlideBack = false);
+ /**
+ * @brief Switch to specified slice. matched slice will be created.
+ * 1. If pageId is valid or default page exists, matched page will also be created
+ * 2. If slices is being switched, this operation will be cached and run later.
+ * @param config Indicates the extern config of the slice.
+ */
+ void SwitchSliceWithData(uint16_t sliceId, void* data, uint16_t dataLength,
+ const ExtralConfig& config = DEFAULT_CONF);
+
/**
* @brief Switch to specified slice. matched slice will be created.
* 1. If default page is exist, default page will also be created
void ChangeSlice(uint16_t sliceId, TransitionType type = TransitionType::TRANSITION_INVALID,
uint16_t priority = gSliceDefaultPriority, bool enableSlideBack = false);
+ void ChangeSliceToApplist();
+
/**
* @brief Get SlicePageManager of currrent slice. you can Use SlicePageManager to get page info in the slice.
* @return Returns <b>nullptr</b> if slices is being switched, or js ability is running
void PauseSlice();
void StopSliceTransition();
void BackToPreSlice();
+ void EnterAod();
+ void ExitAod(uint32_t targetId);
protected:
// targetId consists of slice id and page id
- void StartSlice(uint32_t targetId);
+ void StartSlice(uint32_t targetId, void* data = nullptr);
void ResumeSliceWithoutJS();
void StopSlice();
Ability() = default;
SliceStruct curSlice_;
SliceStruct nextSlice_;
+ SliceStruct prevAodSlice_;
uint32_t targetIdFromJS_ = 0;
uint32_t defaultTargetId_ = gSliceInvalid;
uint16_t curSlicePriority_ = gSliceDefaultPriority;
- void PostChangeSlice(uint32_t targetId, TransitionType type);
+ void PostChangeSlice(uint32_t targetId, TransitionType type, void* data);
Ability::ProxyStruct* Find(const uint16_t sliceId);
};
}
: sliceId_(targetId & SLICE_MASK), view_(viewBase), presenter_(presenterBase),
slicePageMgr_(targetId), state_(SliceState::UNINITIALIZED) {}
- void OnStart() override;
+ void OnStart(void* data) override;
void OnResume() override;
bool ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack);
+ bool BackToPrevSlicePage();
+
+ bool BackToCachedSlicePage(uint16_t pageId);
+
SlicePageManager* GetSlicePageManger()
{
return &slicePageMgr_;
namespace OHOS {
class BackDragListener : public UIView::OnDragListener {
public:
+ static int16_t maxDragRegionX_;
BackDragListener() = default;
~BackDragListener() override;
bool OnDragStart(UIView& view, const DragEvent& event) override;
#endif
TransitionCaller transitionCaller_{TransitionCaller::INVALID};
TransitionCaller slideBackCaller_{TransitionCaller::INVALID};
- TransitionTarget slideBackTarget_{0};
+ TransitionTarget slideBackTarget_{{0, nullptr, 0}};
bool isTransAnimNeeded_ = false;
bool isCurrentSnapShotEnabled_ = false;
bool isTargetSnapShotEnabled_ = false;
PresenterBase() : viewBase_(nullptr) {}
virtual ~PresenterBase() = default;
+ /**
+ * @deprecated 推荐使用方法OnStart(void* data)
+ */
+ virtual void OnStart() {}
+
/**
* @brief Scheduled by slice when it is started and before transition animator starts if exsit
*
* You can create non-ui resource and update ui based on Model data here
*/
- virtual void OnStart() {}
+ virtual void OnStart(void* data) {}
/**
* @brief Scheduled by slice when it will be visiable and after transition animator ends if exsit
typedef struct {
bool isNativeSlice; // true: native; false: js
union {
- uint32_t targetId;
+ uint32_t targetId; // sliceId + pageId
char bundleName[RECENT_APP_BUNDLE_NAME_MAX_LEN];
};
ImageInfo* snapshot;
*/
uint32_t GetLoadingCnt();
+ /**
+ * @brief Remove a native app with same sliceId. If pageId is same, file will be deleted as well.
+ */
+ bool RemoveNativeRecentApp(uint32_t targetId);
+
private:
RecentManager();
virtual ~RecentManager();
* Its system implemention is in the AbilitySlice, you can define your own processing logic by overriding
* Prenseter::OnStart And View::OnStart
*/
- virtual void OnStart() = 0;
+ virtual void OnStart(void* data) = 0;
/**
* @brief Called when the slice will be visible and after transition animator ends if exits
*
void RegisterPage(uint16_t sliceId, uint16_t pageId, SlicePageProxyInterface* proxy, bool isMainPage);
+ void SetMainPage(uint16_t sliceId, uint16_t pageId);
+
private:
SlicePageFactory() {};
~SlicePageFactory() {};
};
}
-#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage) \
- const static OHOS::SlicePageRegister (STATIC_VAR)(sliceId, pageId, new OHOS::SlicePageProxy<V>(), isMainPage)
+#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage) \
+ const static OHOS::SlicePageRegister(STATIC_VAR##sliceId)( \
+ sliceId, pageId, new OHOS::SlicePageProxy<V>(), isMainPage)
#endif
\ No newline at end of file
return ((animator_ != nullptr) && (animator_->GetState() != Animator::STOP));
}
- void BackToPrevSlicePage();
+ bool BackToPrevSlicePage();
+
+ bool BackToCachedSlicePage(uint16_t pageId);
SlicePageManager(const SlicePageManager&) = delete;
SlicePageManager& operator=(const SlicePageManager&) = delete;
enum class TransitionType {
TRANSITION_INVALID = 0,
TRANSITION_ZOOM,
+ TRANSITION_ZOOM_OUT,
TRANSITION_HEXAGONS,
TRANSITION_BACK_TO_HEXAGONS,
TRANSITION_WATERFALL,
TRANSITION_BACK_TO_WATERFALL,
TRANSITION_ENTER_WATERFALL,
+ TRANSITION_FADEINOUT,
+ TRANSITION_TRANSPARENT_GRADIENT,
+ TRANSITION_GAUSSIAN_BLUR,
+ TRANSITION_CROSS_SHAPED,
+ TRANSITION_BACK_TO_CROSS_SHAPED,
+ TRANSITION_3DFOLD,
TRANSITION_MAX,
};
INVALID
};
+typedef struct {
+ uint32_t sliceAndPageId;
+ void *data;
+ uint16_t dataLength;
+} SliceInfo;
+
typedef union {
- uint32_t sliceInfo; // The number of high 16 bits is priority, and the number of low 16 bits is slice id
+ SliceInfo sliceInfo; // The number of high 16 bits is priority, and the number of low 16 bits is slice id
#ifdef JS_ENABLE
Want* want;
char* bundleName;
return backDragListener_;
}
+ /**
+ * @deprecated 推荐使用方法OnStart(void* data)
+ */
+ virtual void OnStart() {}
+
/**
* @brief Scheduled by slice after funtion SetupView and before transition animator starts if exits.
*
* AddViewToRootContainer(label_); // add label_ into container
* }
*/
- virtual void OnStart() {}
+ virtual void OnStart(void* data) {}
/**
* @brief Scheduled by slice after function TearDownView.
#include "PageTransitionMgr.h"
#include "gfx_utils/list.h"
#include "AbilitySlice.h"
+#include "settings/model/SettingDesktopModel.h"
+#include "NativeAbility.h"
+#include "power_display_service.h"
namespace OHOS {
void Ability::AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy)
allSlicesProxy_.PushBack(proxyPair);
}
-void Ability::StartSlice(uint32_t targetId)
+void Ability::StartSlice(uint32_t targetId, void* data)
{
if (targetId <= gSliceInvalid) {
return;
targetId >> PAGE_OFFSET, allSlices_.Size());
nextSlice_.sliceId = sliceId;
nextSlice_.slice = newSlice;
- newSlice->OnStart();
+ newSlice->OnStart(data);
}
Ability::ProxyStruct* Ability::Find(const uint16_t sliceId)
allSlices_[allSlices_.Size() - 1] = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
}
-bool Ability::SwitchPageInSlice(uint16_t pageId, void* data, TransitionType type, bool canBack)
+bool Ability::SwitchPageInSlice(uint16_t pageId, TransitionType type, bool canBack, void* data, uint16_t dataLength)
{
if (pageId == 0) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page id should be valid but no zero");
WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition");
return false;
}
+ if (!GraphicService::IsNativeUITask()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "SwitchPageInSlice is called not in ui task");
+ return false;
+ }
+ AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
+ if (slice == nullptr) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr");
+ return false;
+ }
+ void* sliceData = static_cast<void*>(UIMalloc(dataLength));
+ memcpy_s(sliceData, dataLength, data, dataLength);
+ GraphicService::GetInstance()->PostGraphicEvent([slice, pageId, sliceData, type, canBack]() {
+ slice->ChangeSlicePage(pageId, sliceData, type, canBack);
+ UIFree(sliceData);
+ });
+ return true;
+}
+
+bool Ability::BackToPrevSlicePage()
+{
+ if (PageTransitionMgr::GetInstance().IsTransitionRunning()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition");
+ return false;
+ }
+ if (!GraphicService::IsNativeUITask()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToPrevSlicePage is not called in ui task");
+ return false;
+ }
AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
if (slice == nullptr) {
WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr");
return false;
}
- return slice->ChangeSlicePage(pageId, data, type, canBack);
+ GraphicService::GetInstance()->PostGraphicEvent([slice]() {
+ slice->BackToPrevSlicePage();
+ });
+ return true;
+}
+
+bool Ability::BackToCachedSlicePage(uint16_t pageId)
+{
+ if (PageTransitionMgr::GetInstance().IsTransitionRunning()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition");
+ return false;
+ }
+ if (!GraphicService::IsNativeUITask()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToCachedSlicePage is not called in ui task");
+ return false;
+ }
+ AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
+ if (slice == nullptr) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr");
+ return false;
+ }
+ GraphicService::GetInstance()->PostGraphicEvent([slice, pageId]() {
+ slice->BackToCachedSlicePage(pageId);
+ });
+ return true;
}
void Ability::SwitchSlice(uint16_t sliceId, uint16_t pageId, TransitionType type, bool enableSlideBack)
{
+ ExtralConfig config = {pageId, type, enableSlideBack};
+ SwitchSliceWithData(sliceId, nullptr, 0, config);
+}
+
+void Ability::SwitchSliceWithData(uint16_t sliceId, void* data, uint16_t dataLength, const ExtralConfig& config)
+{
+ if (sliceId == VIEW_AOD) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "cannot enter aod by switch slice!");
+ return;
+ }
if (Find(sliceId) == nullptr) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "slice %d is not registered", sliceId);
return;
}
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ screen_context_t *sc = power_display_get_screen_context();
+ if (sc != nullptr && display_api != nullptr && sc->current_state == SCREEN_ON) {
+ display_api->turn_on_screen();
+ }
#ifdef JS_ENABLE
ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) {
- OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName, type);
- targetIdFromJS_ = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
+ OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName, config.type);
+ targetIdFromJS_ = sliceId | (static_cast<uint32_t>(config.pageId) << PAGE_OFFSET);
FreeElement(elementName);
return;
}
FreeElement(elementName);
#endif
TransitionTarget target;
- target.sliceInfo = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
+ target.sliceInfo.sliceAndPageId = sliceId | (static_cast<uint32_t>(config.pageId) << PAGE_OFFSET);
+ void* sliceData = nullptr;
+ if (dataLength != 0 && data != nullptr) {
+ sliceData = static_cast<void*>(UIMalloc(dataLength));
+ memcpy_s(sliceData, dataLength, data, dataLength);
+ }
+ target.sliceInfo.data = sliceData;
+ target.sliceInfo.dataLength = dataLength;
bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(TransitionCaller::CHANGE_SLICE, target,
- type, enableSlideBack);
+ config.type, config.enableSlideBack);
if (!runImmed) {
- printf("pending change slice id:%d type:%d enableSlideBack:%d\n", target.sliceInfo, type, enableSlideBack);
+ printf("pending change slice id:%d type:%d enableSlideBack:%d\n", target.sliceInfo.sliceAndPageId, config.type, config.enableSlideBack);
return;
}
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, target.sliceInfo, type));
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this,
+ target.sliceInfo.sliceAndPageId, config.type, target.sliceInfo.data));
}
void Ability::ChangeSlice(uint16_t sliceId, TransitionType type,
SwitchSlice(sliceId, gPageInvalid, type, enableSlideBack);
}
-void Ability::PostChangeSlice(uint32_t targetId, TransitionType type)
+void Ability::ChangeSliceToApplist()
{
+ if (SettingDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE) {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+ } else if (SettingDesktopModel::GetInstance().GetDesktopStyle() == WATERFALL_STYLE) {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_WATERFALL);
+ } else {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+ }
+}
+
+void Ability::EnterAod()
+{
+#ifdef JS_ENABLE
+ ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
+ if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) {
+ OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName);
+ targetIdFromJS_ = VIEW_AOD | (static_cast<uint32_t>(gPageInvalid) << PAGE_OFFSET);
+ FreeElement(elementName);
+ return;
+ }
+ FreeElement(elementName);
+#endif
+ TransitionTarget target;
+ target.sliceInfo.sliceAndPageId = VIEW_AOD | (static_cast<uint32_t>(gPageInvalid) << PAGE_OFFSET);
+ target.sliceInfo.data = nullptr;
+ target.sliceInfo.dataLength = 0;
+ bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(
+ TransitionCaller::CHANGE_SLICE, target, TransitionType::TRANSITION_INVALID, false);
+ if (!runImmed) {
+ printf("pending change slice id:%d type:%d enableSlideBack:%d\n",
+ target.sliceInfo.sliceAndPageId, TransitionType::TRANSITION_INVALID, false);
+ return;
+ }
PauseSlice();
- if (allSlices_.Size() > 0 && allSlices_[allSlices_.Size() - 1] == VIEW_AOD) {
- allSlices_.PopBack();
- if (allSlices_.Size() > 0 && (allSlices_[allSlices_.Size() - 1] & SLICE_MASK) == (targetId & SLICE_MASK)) {
- allSlices_.PopBack();
+ prevAodSlice_ = curSlice_;
+ curSlice_.slice = nullptr;
+ curSlice_.sliceId = gSliceInvalid;
+ ImageCacheManager::GetInstance().EnterAod();
+ StartSlice(VIEW_AOD);
+ ResumeSlice();
+ PageTransitionMgr::GetInstance().EndTransition(true);
+}
+
+void Ability::ExitAod(uint32_t targetId)
+{
+ TransitionTarget target;
+ target.sliceInfo.sliceAndPageId = targetId;
+ target.sliceInfo.data = nullptr;
+ target.sliceInfo.dataLength = 0;
+ bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(
+ TransitionCaller::CHANGE_SLICE, target, TransitionType::TRANSITION_INVALID, false);
+ if (!runImmed) {
+ printf("pending change slice id:%d type:%d enableSlideBack:%d\n",
+ target.sliceInfo.sliceAndPageId, TransitionType::TRANSITION_INVALID, false);
+ return;
+ }
+ allSlices_.PopBack();
+ PauseSlice();
+ StopSlice();
+ ImageCacheManager::GetInstance().ExitAod();
+ if ((targetId & SLICE_MASK) == prevAodSlice_.sliceId) { // back to prev slice
+ if (prevAodSlice_.slice != nullptr) {
+ nextSlice_ = prevAodSlice_;
+ prevAodSlice_.slice = nullptr;
+ prevAodSlice_.sliceId = gSliceInvalid;
+ }
+ InputDeviceManager::GetInstance()->ClearInputDeviceState();
+ } else {
+ if (prevAodSlice_.slice != nullptr) {
+ WEARABLE_LOGI(
+ WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StopSlice when exits aod %d", prevAodSlice_.sliceId);
+ prevAodSlice_.slice->OnStop();
+ prevAodSlice_.sliceId = gSliceInvalid;
+ delete prevAodSlice_.slice;
+ prevAodSlice_.slice = nullptr;
}
+ StartSlice(targetId);
}
+ ResumeSlice();
+ PageTransitionMgr::GetInstance().EndTransition(true);
+}
+
+void Ability::PostChangeSlice(uint32_t targetId, TransitionType type, void* data)
+{
+ if (curSlice_.sliceId == VIEW_AOD) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "cannot exit aod by switch slice!");
+ PageTransitionMgr::GetInstance().EndTransition(true);
+ return;
+ }
+ PauseSlice();
PageTransitionMgr::GetInstance().SaveCurrentSourceIfNecessary(curSlice_.slice->GetSliceContainer());
if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded() ||
PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) {
StopSlice();
}
- StartSlice(targetId);
+ StartSlice(targetId, data);
if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded()) {
ResumeSliceWithoutJS();
PageTransitionMgr::GetInstance().SaveTargetSource(nextSlice_.slice->GetSliceContainer());
PageTransitionMgr::GetInstance().StartTransAnim(std::bind(&Ability::ResumeSliceWithoutJS, this));
}
+ if (data != nullptr) {
+ UIFree(data);
+ }
}
void Ability::ResumeSliceWithoutJS()
return;
}
TransitionTarget target;
- target.sliceInfo = targetId;
+ target.sliceInfo.sliceAndPageId = targetId;
+ target.sliceInfo.data = nullptr;
+ target.sliceInfo.dataLength = 0;
uint16_t sliceId = static_cast<uint16_t>(targetId & SLICE_MASK);
uint16_t pageId = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
PageTransitionMgr::GetInstance().BeginBackTransition(TransitionCaller::CHANGE_SLICE, target);
#include "View.h"
#include "Presenter.h"
#include "key/KeyInputListener.h"
+#include "common/image_cache_manager.h"
namespace OHOS {
const uint16_t SLICE_MASK = 0xFFFF;
const uint32_t PAGE_OFFSET = 16;
-void AbilitySlice::OnStart()
+void AbilitySlice::OnStart(void* data)
{
if ((presenter_ == nullptr) || (view_ == nullptr)) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Presenter or View was nullptr for slice %s", sliceId_);
view_->SetupView();
view_->OnStart();
- slicePageMgr_.StartSlicePage();
+ view_->OnStart(data);
+ slicePageMgr_.StartSlicePage(data);
presenter_->OnStart();
+ presenter_->OnStart(data);
state_ = SliceState::START;
}
RootView::GetInstance()->Add(view_->GetRootContainer());
}
// Reset the default key listener
- RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance());
+ if (!ImageCacheManager::GetInstance().IsInAod()) {
+ RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance());
+ }
NativeAbility::GetInstance().SetCurSlicePriority(gSliceDefaultPriority);
UIView* backView = PageTransitionMgr::GetInstance().GetTopSlideBackImage();
{
return slicePageMgr_.ChangeSlicePage(pageId, data, type, canBack);
}
+
+bool AbilitySlice::BackToPrevSlicePage()
+{
+ return slicePageMgr_.BackToPrevSlicePage();
+}
+
+bool AbilitySlice::BackToCachedSlicePage(uint16_t pageId)
+{
+ return slicePageMgr_.BackToCachedSlicePage(pageId);
+}
}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BackToCrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "applist/AppItemView.h"\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "BackToCrossShapedTransition.h"\r
+\r
+namespace OHOS {\r
+ static constexpr uint16_t DURATION = 200;\r
+ static constexpr int16_t CAMERA_DISTANCE = 600;\r
+ static constexpr uint16_t NUM2 = 2;\r
+ static constexpr uint16_t HALF_DURATION = DURATION / NUM2;\r
+ static constexpr int16_t MIN_OFFSET = 10;\r
+ static constexpr int16_t EASE_RANGE = 100;\r
+\r
+ REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_CROSS_SHAPED,\r
+ BackToCrossShapedTransition, DURATION, true, true);\r
+\r
+ void BackToCrossShapedTransition::OnTransitionStart(UIImageView *current, UIImageView *target)\r
+ {\r
+ if (current == nullptr || target == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToCrossShapedTransition ImageView is empty!");\r
+ return;\r
+ }\r
+\r
+ currentView_ = current;\r
+ targetView_ = target;\r
+\r
+ if (cameraView_ == nullptr) {\r
+ cameraView_ = new UIImageView();\r
+ }\r
+\r
+ screenWidth_ = Screen::GetInstance().GetWidth();\r
+ screenHeight_ = Screen::GetInstance().GetHeight();\r
+ middleHeight_ = screenHeight_ / NUM2;\r
+ middleWidth_ = screenWidth_ / NUM2;\r
+\r
+ cameraView_->SetPosition(0, 0, screenWidth_, screenHeight_);\r
+ cameraView_->SetCameraPosition(Vector2<float>(middleWidth_, middleHeight_));\r
+ cameraView_->SetCameraDistance(CAMERA_DISTANCE);\r
+ currentView_->SetVisible(false);\r
+ targetView_->SetVisible(false);\r
+ RootView::GetInstance()->Add(cameraView_);\r
+ }\r
+\r
+ void BackToCrossShapedTransition::TransitionAlg(uint32_t time)\r
+ {\r
+ int16_t offSet = 0;\r
+ if (time < HALF_DURATION) {\r
+ offSet = EasingEquation::QuadEaseIn(-MIN_OFFSET, -middleWidth_, time, HALF_DURATION);\r
+ } else {\r
+ offSet = EasingEquation::QuadEaseIn(middleWidth_, MIN_OFFSET,\r
+ time - HALF_DURATION, DURATION - HALF_DURATION);\r
+ }\r
+\r
+ UIView* tmpCard = GetVisibleView(offSet);\r
+ CommonAlg(tmpCard, offSet);\r
+ }\r
+\r
+ UIView* BackToCrossShapedTransition::GetVisibleView(int16_t offSet)\r
+ {\r
+ UIView* view = nullptr;\r
+ if (offSet > 0) {\r
+ if (offSet < middleWidth_) {\r
+ return targetView_;\r
+ }\r
+ return currentView_;\r
+ } else {\r
+ if (abs(offSet) < middleWidth_) {\r
+ return currentView_;\r
+ }\r
+ return targetView_;\r
+ }\r
+ return view;\r
+ }\r
+\r
+ void BackToCrossShapedTransition::OnTransitionEnd()\r
+ {\r
+ if (cameraView_ != nullptr) {\r
+ RootView::GetInstance()->Remove(cameraView_);\r
+ }\r
+\r
+ if (targetView_ != nullptr) {\r
+ targetView_->SetVisible(true);\r
+ }\r
+ }\r
+\r
+ void BackToCrossShapedTransition::CommonAlg(UIView* visualView, int16_t offSet)\r
+ {\r
+ if (visualView == nullptr) {\r
+ return;\r
+ }\r
+\r
+ float factor;\r
+ if (abs(offSet) < middleWidth_) {\r
+ factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(offSet), middleWidth_);\r
+ } else {\r
+ factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, screenWidth_ - abs(offSet), middleWidth_);\r
+ }\r
+\r
+ float scale = 1.0 - 0.2 * factor / EASE_RANGE; // 0.2: scale range\r
+ float angle = 90 * factor / EASE_RANGE; // 90: quarter cycle degrees\r
+ if (visualView != currentView_) {\r
+ angle = -angle;\r
+ }\r
+\r
+ Vector3<float> scaleCenter = {middleWidth_, middleHeight_, 0};\r
+ Vector3<float> rotateStart = {middleWidth_, 0, 0};\r
+ Vector3<float> rotateEnd = {middleWidth_, 2, 0};\r
+ UIView* tmpCard = nullptr;\r
+\r
+ cameraView_->SetSrc(static_cast<UIImageView *>(visualView)->GetImageInfo());\r
+ cameraView_->Scale(Vector3<float>(scale, scale, 0), scaleCenter);\r
+ cameraView_->Rotate(angle, rotateStart, rotateEnd);\r
+ }\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BackToCrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef BACK_TO_CROSS_SHAPED_TRANSITION_H\r
+#define BACK_TO_CROSS_SHAPED_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+ class BackToCrossShapedTransition : public TransitionCallback {\r
+ public:\r
+ BackToCrossShapedTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+ TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+ ~BackToCrossShapedTransition() override {}\r
+\r
+ void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+ void TransitionAlg(uint32_t time) override;\r
+ void OnTransitionEnd() override;\r
+ private:\r
+\r
+ void CommonAlg(UIView* visualView, int16_t offSet);\r
+ UIView* GetVisibleView(int16_t offSet);\r
+\r
+ UIImageView* currentView_ = nullptr;\r
+ UIImageView* targetView_ = nullptr;\r
+ UIImageView* cameraView_ = nullptr;\r
+\r
+ int16_t middleWidth_;\r
+ int16_t middleHeight_;\r
+ int16_t screenWidth_;\r
+ int16_t screenHeight_;\r
+ };\r
+\r
+} // namespace OHOS\r
+\r
+#endif // BACK_TO_CROSS_SHAPED_TRANSITION_H
\ No newline at end of file
#include "TransitionManager.h"
#include "NativeAbility.h"
#include "components/root_view.h"
-#include "applist/AppItemView.h"
+#include "applist/HexagonsDesktopFragment.h"
#include "hal_tick.h"
#include "wearable_log.h"
#ifdef JS_ENABLE
#include "abilityms_slite_client.h"
#endif
+#include "TransitionUtils.h"
namespace OHOS {
REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_HEXAGONS, BackToHexagonsTransition, 300, true, false);
void BackToHexagonsTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)
{
current_ = current;
- target_ = dynamic_cast<UICustomHexagonsList*>(target->GetChildrenHead());
+ target_ = dynamic_cast<UICustomHexagonsList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_HEXAGONS_LIST));
if ((target_ == nullptr) || (current_ == nullptr)) {
return;
}
#include "TransitionManager.h"
#include "NativeAbility.h"
#include "components/root_view.h"
-#include "applist/AppItemView.h"
+#include "applist/WaterfallDesktopFragment.h"
#include "hal_tick.h"
#include "wearable_log.h"
#ifdef JS_ENABLE
#include "abilityms_slite_client.h"
#endif
+#include "TransitionUtils.h"
namespace OHOS {
REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_WATERFALL, BackToWaterfallTransition, 300, true, false);
void BackToWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)
{
current_ = current;
- target_ = dynamic_cast<UIWaterfallList *>(target->GetChildrenHead());
+ target_ = dynamic_cast<UIWaterfallList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_WATERFALL_LIST));
if ((target_ == nullptr) || (current_ == nullptr)) {
return;
}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "applist/AppItemView.h"\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "CrossShapedTransition.h"\r
+\r
+namespace OHOS {\r
+ static constexpr uint16_t DURATION = 200;\r
+ static constexpr uint16_t NUM2 = 2;\r
+ static constexpr uint16_t HALF_DURATION = DURATION / NUM2;\r
+ static constexpr int16_t CAMERA_DISTANCE = 600;\r
+ static constexpr int16_t EASE_RANGE = 100;\r
+ static constexpr int16_t MIN_OFFSET = 10;\r
+\r
+ REGIST_TRANSITION(TransitionType::TRANSITION_CROSS_SHAPED, CrossShapedTransition, DURATION, true, true);\r
+\r
+ void CrossShapedTransition::OnTransitionStart(UIImageView *current, UIImageView *target)\r
+ {\r
+ if (current == nullptr || target == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "CrossShapedTransition ImageView is empty!");\r
+ return;\r
+ }\r
+\r
+ currentView_ = current;\r
+ targetView_ = target;\r
+\r
+ currentView_->SetVisible(false);\r
+ targetView_->SetVisible(false);\r
+\r
+ if (cameraView_ == nullptr) {\r
+ cameraView_ = new UIImageView();\r
+ }\r
+\r
+ screenWidth_ = Screen::GetInstance().GetWidth();\r
+ screenHeight_ = Screen::GetInstance().GetHeight();\r
+\r
+ middleWidth_ = screenWidth_ / NUM2;\r
+ middleHeight_ = screenHeight_ / NUM2;\r
+\r
+ cameraView_->SetPosition(0, 0, screenWidth_, screenHeight_);\r
+ cameraView_->SetCameraPosition(Vector2<float>(middleWidth_, middleHeight_));\r
+ cameraView_->SetCameraDistance(CAMERA_DISTANCE);\r
+ RootView::GetInstance()->Add(cameraView_);\r
+ }\r
+\r
+ void CrossShapedTransition::TransitionAlg(uint32_t time)\r
+ {\r
+ int16_t xOffset = 0;\r
+ if (time < HALF_DURATION) {\r
+ xOffset = EasingEquation::QuadEaseIn(-MIN_OFFSET, -middleWidth_, time, HALF_DURATION);\r
+ } else {\r
+ xOffset = EasingEquation::QuadEaseIn(middleWidth_, MIN_OFFSET,\r
+ time - HALF_DURATION, DURATION - HALF_DURATION);\r
+ }\r
+\r
+ bool visible = false; // true: current; false: target\r
+ UIView* tmpCard = GetVisibleView(xOffset, visible);\r
+ CommonAlg(tmpCard, xOffset, visible);\r
+ }\r
+\r
+ UIView* CrossShapedTransition::GetVisibleView(int16_t xOffset, bool &visible)\r
+ {\r
+ UIView* view = nullptr;\r
+ if (xOffset > 0) {\r
+ if (xOffset < middleWidth_) {\r
+ view = targetView_;\r
+ visible = false;\r
+ return view;\r
+ }\r
+\r
+ view = currentView_;\r
+ visible = true;\r
+ } else {\r
+ if (abs(xOffset) < middleWidth_) {\r
+ view = currentView_;\r
+ visible = true;\r
+ return view;\r
+ }\r
+\r
+ view = targetView_;\r
+ visible = false;\r
+ }\r
+\r
+ return view;\r
+ }\r
+\r
+ void CrossShapedTransition::OnTransitionEnd()\r
+ {\r
+ if (cameraView_ != nullptr) {\r
+ RootView::GetInstance()->Remove(cameraView_);\r
+ }\r
+\r
+ if (targetView_ != nullptr) {\r
+ targetView_->SetVisible(true);\r
+ }\r
+ }\r
+\r
+ void CrossShapedTransition::CommonAlg(UIView* visualView, int16_t xOffset, bool visible)\r
+ {\r
+ if (visualView == nullptr) {\r
+ return;\r
+ }\r
+\r
+ float factor;\r
+ if (abs(xOffset) < middleWidth_) {\r
+ factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(xOffset), middleWidth_);\r
+ } else {\r
+ factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, screenWidth_ - abs(xOffset), middleWidth_);\r
+ }\r
+\r
+ float scale = 1.0 - 0.2 * factor / EASE_RANGE; // 0.2: scale range\r
+ float angle = 90 * factor / EASE_RANGE; // 90: quarter cycle degrees\r
+ if (visible) {\r
+ angle = -angle;\r
+ }\r
+\r
+ Vector3<float> scaleCenter = {middleWidth_, middleHeight_, 0};\r
+ Vector3<float> rotateStart = {middleWidth_, 0, 0};\r
+ Vector3<float> rotateEnd = {middleWidth_, 2, 0};\r
+ UIView* tmpCard = nullptr;\r
+\r
+ cameraView_->SetSrc(static_cast<UIImageView *>(visualView)->GetImageInfo());\r
+ cameraView_->Scale(Vector3<float>(scale, scale, 0), scaleCenter);\r
+ cameraView_->Rotate(angle, rotateStart, rotateEnd);\r
+ }\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef CROSS_SHAPED_TRANSITION_H\r
+#define CROSS_SHAPED_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+ class CrossShapedTransition : public TransitionCallback {\r
+ public:\r
+ CrossShapedTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+ TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+ ~CrossShapedTransition() override {}\r
+\r
+ void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+ void TransitionAlg(uint32_t time) override;\r
+ void OnTransitionEnd() override;\r
+ private:\r
+\r
+ void CommonAlg(UIView* visualView, int16_t xOffset, bool visible);\r
+ UIView* GetVisibleView(int16_t xOffset, bool &visible);\r
+\r
+ UIImageView* currentView_ = nullptr;\r
+ UIImageView* targetView_ = nullptr;\r
+ UIImageView* cameraView_ = nullptr;\r
+\r
+ int16_t middleWidth_;\r
+ int16_t middleHeight_;\r
+ int16_t screenWidth_;\r
+ int16_t screenHeight_;\r
+ };\r
+\r
+} // namespace OHOS\r
+\r
+#endif // CROSS_SHAPED_TRANSITION_H
\ No newline at end of file
#include "components/root_view.h"\r
#include "TransitionManager.h"\r
#include "wearable_log.h"\r
+#include "TransitionUtils.h"\r
\r
namespace OHOS {\r
REGIST_TRANSITION(TransitionType::TRANSITION_ENTER_WATERFALL, EnterWaterfallTransition, 300, true, false);\r
void EnterWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)\r
{\r
current_ = current;\r
- target_ = dynamic_cast<UIWaterfallList*>(target->GetChildrenHead());\r
+ target_ = dynamic_cast<UIWaterfallList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_WATERFALL_LIST));\r
if ((target_ == nullptr) || (current_ == nullptr)) {\r
return;\r
}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FadeInOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "FadeInOutTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DURA_RANGE = 400;\r
+static constexpr int16_t FADE_IN_END = 300;\r
+static constexpr int16_t FADE_IN_OPASTART = OPA_OPAQUE - 30;\r
+static constexpr int16_t FADE_IN_OPAEND = 0;\r
+static constexpr int16_t FADE_OUT_START = 100;\r
+static constexpr int16_t FADE_OUT_OPASTART = 0;\r
+static constexpr int16_t FADE_OUT_OPAEND = OPA_OPAQUE - 30;\r
+static constexpr int16_t FADE_OPA_DELTA = 15;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_FADEINOUT, FadeInOutTransition, DURA_RANGE, true, true);\r
+\r
+void FadeInOutTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+ if ((current == nullptr) || (target == nullptr)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+ return;\r
+ }\r
+ current_ = current;\r
+ target_ = target;\r
+ target_->SetVisible(false);\r
+ current_->SetOpaScale(OPA_OPAQUE - FADE_OPA_DELTA);\r
+ current_->Invalidate();\r
+ target_->SetOpaScale(0);\r
+}\r
+\r
+void FadeInOutTransition::TransitionAlg(uint32_t time)\r
+{\r
+ if ((current_ == nullptr) || (target_ == nullptr)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+ return;\r
+ }\r
+ if (time < FADE_IN_END) {\r
+ float curFloatOpa = (FADE_IN_OPASTART - FADE_IN_OPAEND) * (FADE_IN_END - time) * 1.0f;\r
+ uint8_t curOpa = static_cast<uint8_t> (curFloatOpa / FADE_IN_END);\r
+ curOpa = curOpa + FADE_IN_OPAEND;\r
+ current_->SetOpaScale(curOpa);\r
+ current_->Invalidate();\r
+ }\r
+ if (time > FADE_OUT_START) {\r
+ target_->SetVisible(true);\r
+ float curFloatOpa = (FADE_OUT_OPAEND - FADE_OUT_OPASTART) * (time - FADE_OUT_START) * 1.0f;\r
+ uint8_t tarOpa = static_cast<uint8_t> (curFloatOpa / (DURA_RANGE - FADE_OUT_START));\r
+ tarOpa = tarOpa + FADE_OUT_OPASTART;\r
+ target_->SetOpaScale(tarOpa);\r
+ target_->Invalidate();\r
+ }\r
+}\r
+\r
+void FadeInOutTransition::OnTransitionEnd()\r
+{\r
+ if ((current_ == nullptr) || (target_ == nullptr)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+ return;\r
+ }\r
+ current_->SetVisible(false);\r
+ target_->SetVisible(true);\r
+ target_->SetOpaScale(OPA_OPAQUE - FADE_OPA_DELTA);\r
+ target_->Invalidate();\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FadeInOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef FADE_IN_OUT_TRANSITION_H\r
+#define FADE_IN_OUT_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class FadeInOutTransition : public TransitionCallback {\r
+public:\r
+ FadeInOutTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+ TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+ ~FadeInOutTransition() override {}\r
+ void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+ void TransitionAlg(uint32_t time) override;\r
+ void OnTransitionEnd() override;\r
+private:\r
+ UIImageView* current_ = nullptr;\r
+ UIImageView* target_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif // FADE_IN_OUT_TRANSITION_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GaussianBlurTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "GaussianBlurTransition.h"\r
+\r
+namespace OHOS {\r
+ static constexpr int64_t VIEW_COLOR = 0xff505050;\r
+ static constexpr uint8_t VIEW_OPACITY = 10;\r
+ static constexpr uint64_t VIEW_BLUR_OPACITY = 150;\r
+ static constexpr uint8_t BLUR_MIN = 5;\r
+ static constexpr float BLUR_MAX = 31.0;\r
+ static constexpr int16_t BREAK_TIME = 125;\r
+ static constexpr int16_t DURITION = 200;\r
+ static constexpr char* BLURVIEW_NAME = "blur";\r
+\r
+ REGIST_TRANSITION(TransitionType::TRANSITION_GAUSSIAN_BLUR, GaussianBlurTransition, DURITION, false, false);\r
+\r
+ void GaussianBlurTransition::AddBlurView(UIViewGroup* groupView)\r
+ {\r
+ if (groupView == nullptr) {\r
+ return;\r
+ }\r
+\r
+ UIView* blurCurent = new UIView(BLURVIEW_NAME);\r
+ if (blurCurent == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_AAFWK, "GaussianBlurTransition new view failed!");\r
+ return;\r
+ }\r
+\r
+ Rect currRect = groupView->GetVisibleRect();\r
+ blurCurent->SetPosition(currRect.GetX(), currRect.GetY(), currRect.GetWidth(), currRect.GetHeight());\r
+ blurCurent->SetStyle(STYLE_BACKGROUND_COLOR, VIEW_COLOR);\r
+ blurCurent->SetStyle(STYLE_BACKGROUND_OPA, VIEW_OPACITY);\r
+\r
+ UIView* tailView = groupView->GetChildrenTail();\r
+ if (tailView != nullptr) {\r
+ groupView->Insert(tailView, blurCurent);\r
+ }\r
+ }\r
+\r
+ void GaussianBlurTransition::SetViewBlur(UIViewGroup* groupView, float guassScale)\r
+ {\r
+ if (nullptr == groupView) {\r
+ return;\r
+ }\r
+\r
+ UIView* tailView = groupView->GetChildrenTail();\r
+ if (tailView == nullptr && tailView->GetViewId() != BLURVIEW_NAME) {\r
+ return;\r
+ }\r
+\r
+ UIView* testView = RootView::GetInstance()->GetBlurView();\r
+ RootView::GetInstance()->ClearBlurView(tailView);\r
+ tailView->SetBackgroundBlur(guassScale);\r
+ tailView->SetStyle(STYLE_BACKGROUND_OPA, VIEW_BLUR_OPACITY);\r
+ }\r
+\r
+ void GaussianBlurTransition::ClearBlurView(UIViewGroup* groupView)\r
+ {\r
+ if (groupView == nullptr) {\r
+ return;\r
+ }\r
+\r
+ UIView* tailView = groupView->GetChildrenTail();\r
+ if (tailView != nullptr && tailView->GetViewId() == BLURVIEW_NAME) {\r
+ RootView::GetInstance()->ClearBlurView(tailView);\r
+ groupView->Remove(tailView);\r
+ }\r
+ }\r
+\r
+ void GaussianBlurTransition::OnTransitionStart(UIViewGroup* current, UIViewGroup* target)\r
+ {\r
+ if ((current == nullptr) || (target == nullptr)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_AAFWK, "GaussianBlurTransition ImageView is empty!");\r
+ return;\r
+ }\r
+\r
+ current_ = current;\r
+ target_ = target;\r
+ blurFlag_ = false;\r
+\r
+ AddBlurView(current_);\r
+ AddBlurView(target_);\r
+ target_->SetVisible(false);\r
+ }\r
+\r
+ void GaussianBlurTransition::TransitionAlg(uint32_t time)\r
+ {\r
+ if (time <= BREAK_TIME) {\r
+ float scale = EasingEquation::QuadEaseIn(BLUR_MIN, static_cast<int16_t>(BLUR_MAX), time,\\r
+ BREAK_TIME)/ BLUR_MAX;\r
+ float guassScale = scale * BLUR_MAX;\r
+\r
+ SetViewBlur(current_, guassScale);\r
+ } else {\r
+ if (!blurFlag_) {\r
+ UIView* tailView = current_->GetChildrenTail();\r
+ if (tailView != nullptr) {\r
+ tailView->ClearBackgroundBlur();\r
+ }\r
+\r
+ if (current_->IsVisible()) {\r
+ current_->SetVisible(false);\r
+ }\r
+\r
+ target_->SetVisible(true);\r
+ SetViewBlur(target_, BLUR_MAX);\r
+ blurFlag_ = true;\r
+ return;\r
+ }\r
+\r
+ float scale = EasingEquation::QuadEaseIn(static_cast<int16_t>(BLUR_MAX), BLUR_MIN, time - BREAK_TIME,\\r
+ DURITION) / BLUR_MAX;\r
+ float guassScale = scale * BLUR_MAX;\r
+ SetViewBlur(target_, guassScale);\r
+ }\r
+ }\r
+\r
+ void GaussianBlurTransition::OnTransitionEnd()\r
+ {\r
+ if (current_ == nullptr || target_ == nullptr) {\r
+ return;\r
+ }\r
+\r
+ ClearBlurView(current_);\r
+ ClearBlurView(target_);\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GaussianBlurTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GAUSSIAN_BLUR_TRANSITION_H\r
+#define GAUSSIAN_BLUR_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+ class GaussianBlurTransition : public TransitionCallback {\r
+ public:\r
+ GaussianBlurTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+ TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+ ~GaussianBlurTransition() override {}\r
+\r
+ void OnTransitionStart(UIViewGroup* current, UIViewGroup* target) override;\r
+ void TransitionAlg(uint32_t time) override;\r
+ void OnTransitionEnd() override;\r
+ private:\r
+\r
+ void AddBlurView(UIViewGroup* groupView);\r
+ void SetViewBlur(UIViewGroup* groupView, float guassScale);\r
+ void ClearBlurView(UIViewGroup* groupView);\r
+\r
+ UIViewGroup* current_ = nullptr;\r
+ UIViewGroup* target_ = nullptr;\r
+ bool blurFlag_;\r
+ };\r
+} // namespace OHOS\r
+\r
+#endif // GAUSSIAN_BLUR_TRANSITION_H
\ No newline at end of file
#include "components/root_view.h"
#include "TransitionManager.h"
#include "wearable_log.h"
+#include "TransitionUtils.h"
namespace OHOS {
REGIST_TRANSITION(TransitionType::TRANSITION_HEXAGONS, HexagonsTransition, 300, false, true);
void HexagonsTransition::OnTransitionStart(UIViewGroup* current, UIImageView* target)
{
- current->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
- current_ = dynamic_cast<UICustomHexagonsList*>(current->GetChildrenHead());
+ current_ = dynamic_cast<UICustomHexagonsList*>(TransitionUtils::GetViewAndTransparentizePath(current, UI_HEXAGONS_LIST));
if (current_ == nullptr) {
return;
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "HexagonsTransition no focus view\n");
return;
}
- current_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
Vector2<int16_t> delta = Vector2<int16_t>(current_->GetWidth() / 2, current_->GetHeight() / 2) -
current_->GetCurrentPosition(focusIndex_);
opaStart_ = focusView_->GetOpaScale();
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ThreeDFoldTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "ThreeDFoldTransition.h"\r
+#include "animator/easing_equation.h"\r
+#include "TransitionManager.h"\r
+#include "common/screen.h"\r
+#include "wearable_log.h"\r
+namespace OHOS {\r
+static constexpr int16_t DURA_RANGE = 200;\r
+static const float ROTATE_END = 90.0f;\r
+static constexpr int16_t ROTATE_RANGE_MAX = 90;\r
+static constexpr int16_t CAMERA_DISTANCE = 500;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_3DFOLD, ThreeDFoldTransition, DURA_RANGE, true, true);\r
+void ThreeDFoldTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+ if ((current == nullptr) || (target == nullptr)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+ return;\r
+ }\r
+ current_ = current;\r
+ target_ = target;\r
+ current_->SetVisible(true);\r
+ target_->SetVisible(true);\r
+\r
+ current_->SetCameraPosition(Vector2<float>(current_->GetWidth(), current_->GetHeight() / 2)); // 2: half\r
+ current_->SetCameraDistance(CAMERA_DISTANCE);\r
+ \r
+ target_->SetCameraPosition(Vector2<float>(0, target_->GetHeight() / 2)); // 2: half\r
+ target_->SetCameraDistance(CAMERA_DISTANCE);\r
+}\r
+\r
+void ThreeDFoldTransition::TransitionAlg(uint32_t time)\r
+{\r
+ if ((current_ == nullptr) || (target_ == nullptr)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+ return;\r
+ }\r
+\r
+ int16_t width = Screen::GetInstance().GetWidth();\r
+ float moveOffset = time * 1.0f / (float)DURA_RANGE;\r
+ float angle = ROTATE_RANGE_MAX * moveOffset;\r
+\r
+ Vector3<float> currRotateStart = {current_->GetWidth(), current_->GetHeight(), 0};\r
+ Vector3<float> currRotateEnd = {current_->GetWidth(), 0, 0};\r
+ Vector3<float> targRotateStart = {0, 0, 0};\r
+ Vector3<float> targRotateEnd = {0, target_->GetHeight(), 0};\r
+\r
+ current_->Rotate(angle, currRotateStart, currRotateEnd);\r
+ current_->SetPosition(-moveOffset * width, current_->GetY());\r
+\r
+ target_->Rotate(ROTATE_RANGE_MAX - angle, targRotateStart, targRotateEnd);\r
+ target_->SetPosition((width - moveOffset * width), target_->GetY());\r
+}\r
+\r
+void ThreeDFoldTransition::OnTransitionEnd()\r
+{\r
+ if ((current_ == nullptr) || (target_ == nullptr)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+ return;\r
+ }\r
+ current_->SetVisible(false);\r
+ target_->SetVisible(true);\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ThreeDFoldTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef THREE_D_FOLD_TRANSITION_H\r
+#define THREE_D_FOLD_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class ThreeDFoldTransition : public TransitionCallback {\r
+public:\r
+ ThreeDFoldTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+ TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+ ~ThreeDFoldTransition() override {}\r
+ void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+ void TransitionAlg(uint32_t time) override;\r
+ void OnTransitionEnd() override;\r
+private:\r
+ UIImageView* current_ = nullptr;\r
+ UIImageView* target_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif // THREE_D_FOLD_TRANSITION_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: TransitionUtils
+ * Author: Hisi Graphic Team
+ * Created: 2025-10
+ */
+
+#ifndef TRANSITION_UTILS_H
+#define TRANSITION_UTILS_H
+
+#include "components/ui_view.h"
+#include "components/ui_view_group.h"
+
+namespace OHOS {
+class TransitionUtils {
+public:
+ static UIView* GetViewAndTransparentizePath(UIView* current, UIViewType viewType)
+ {
+ if (current->GetViewType() == viewType) {
+ current->SetStyle(STYLE_BACKGROUND_OPA, 0);
+ return current;
+ }
+
+ if (!current->IsViewGroup()) {
+ return nullptr;
+ }
+
+ UIView* target = nullptr;
+ UIView* child = dynamic_cast<UIViewGroup*>(current)->GetChildrenHead();
+ while (child != nullptr) {
+ target = GetViewAndTransparentizePath(child, viewType);
+ if (target != nullptr) {
+ current->SetStyle(STYLE_BACKGROUND_OPA, 0);
+ break;
+ }
+ child = child->GetNextSibling();
+ }
+ return target;
+ }
+};
+}
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TransparentGradientTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "components/root_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "TransparentGradientTransition.h"\r
+\r
+\r
+namespace OHOS {\r
+ static const uint8_t FADE_OUT_OPACITY = 250;\r
+ static const uint8_t FADE_IN_OPACITY = 30;\r
+ static const uint8_t FADE_DELTA = 200;\r
+ static const int16_t FADE_IN_TRANS = 5;\r
+ static const int16_t FADE_OUT_TRANS = -5;\r
+ static constexpr int16_t OPA_MAX = 255;\r
+\r
+ REGIST_TRANSITION(TransitionType::TRANSITION_TRANSPARENT_GRADIENT, TransparentGradientTransition, 400, true, true);\r
+ void TransparentGradientTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+ {\r
+ if ((current == nullptr) || (target == nullptr)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "TransparentGradientTransition ImageView is empty!");\r
+ return;\r
+ }\r
+\r
+ current_ = current;\r
+ target_ = target;\r
+\r
+ // currentView fade out\r
+ currentOpa_ = FADE_OUT_OPACITY;\r
+ transOut_ = 0;\r
+ Vector2<int16_t> transTarget(transIn_, 0);\r
+ current_->SetOpaScale(currentOpa_);\r
+\r
+ // targeview fade in\r
+ transIn_ = FADE_IN_TRANS;\r
+ targetOpa_ = FADE_IN_OPACITY;\r
+ target_->Translate(transTarget);\r
+ target_->SetOpaScale(targetOpa_);\r
+ }\r
+\r
+ void TransparentGradientTransition::TransitionAlg(uint32_t time)\r
+ {\r
+ if ((current_ == nullptr) || (target_ == nullptr)) {\r
+ return;\r
+ }\r
+\r
+ float scale = EasingEquation::QuadEaseIn(0, OPA_MAX, time, duration_) / static_cast<float>(OPA_MAX);\r
+ uint8_t opa = uint8_t(scale * FADE_DELTA);\r
+ currentOpa_ = FADE_OUT_OPACITY - opa;\r
+ targetOpa_ = FADE_IN_OPACITY + opa;\r
+ transIn_ = FADE_IN_TRANS - int16_t(scale*FADE_IN_TRANS);\r
+ transOut_ = int16_t(scale*FADE_OUT_TRANS);\r
+\r
+ Vector2<int16_t> transCurrent(transOut_, 0);\r
+ Vector2<int16_t> transTarget(transIn_, 0);\r
+\r
+ current_->Translate(transCurrent);\r
+ current_->SetOpaScale(currentOpa_);\r
+\r
+ target_->Translate(transTarget);\r
+ target_->SetOpaScale(targetOpa_);\r
+ }\r
+\r
+ void TransparentGradientTransition::OnTransitionEnd()\r
+ {\r
+ if (current_ == nullptr || target_ == nullptr) {\r
+ return;\r
+ }\r
+\r
+ target_->SetOpaScale(OPA_OPAQUE);\r
+ current_->SetOpaScale(OPA_TRANSPARENT);\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TransparentGradientTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef TRANSPARENT_GRADIENT_TRANSITION_H\r
+#define TRANSPARENT_GRADIENT_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+ class TransparentGradientTransition : public TransitionCallback {\r
+ public:\r
+ TransparentGradientTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+ TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+ ~TransparentGradientTransition() override {}\r
+\r
+ void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+ void TransitionAlg(uint32_t time) override;\r
+ void OnTransitionEnd() override;\r
+ private:\r
+\r
+ UIImageView* current_ = nullptr;\r
+ UIImageView* target_ = nullptr;\r
+ uint8_t currentOpa_;\r
+ uint8_t targetOpa_;\r
+ int16_t transIn_;\r
+ int16_t transOut_;\r
+ };\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
#include "components/root_view.h"
#include "TransitionManager.h"
#include "wearable_log.h"
+#include "TransitionUtils.h"
namespace OHOS {
REGIST_TRANSITION(TransitionType::TRANSITION_WATERFALL, WaterfallTransition, 300, false, true);
void WaterfallTransition::OnTransitionStart(UIViewGroup* current, UIImageView* target)
{
- current->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
- current_ = dynamic_cast<UIWaterfallList*>(current->GetChildrenHead());
+ current_ = dynamic_cast<UIWaterfallList*>(TransitionUtils::GetViewAndTransparentizePath(current, UI_WATERFALL_LIST));
if (current_ == nullptr) {
return;
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "WaterfallTransition no focus view\n");
return;
}
- current_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
opaStart_ = focusView_->GetOpaScale();
scaleStart_ = current_->GetGlobalScale();
Rect rect = focusView_->GetRect();
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "ZoomOutTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DURATION = 200;\r
+static constexpr float HALF = 0.5f;\r
+static constexpr float NUM2 = 2.0f;\r
+static constexpr int16_t SCALE_BASE = 1;\r
+REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM_OUT, ZoomOutTransition, DURATION, true, true);\r
+\r
+void ZoomOutTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+ if (current == nullptr || target == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ZoomOutTransition ImageView is empty!");\r
+ return;\r
+ }\r
+ target_ = target;\r
+ current_ = current;\r
+ RootView::GetInstance()->Remove(target);\r
+ RootView::GetInstance()->Insert(nullptr, target);\r
+ middleWidth_ = Screen::GetInstance().GetWidth() / NUM2;\r
+ middleHeight_ = Screen::GetInstance().GetHeight() / NUM2;\r
+}\r
+\r
+void ZoomOutTransition::TransitionAlg(uint32_t time)\r
+{\r
+ float zoom_scale = EasingEquation::LinearEaseNone(DURATION, 0, time, duration_) / static_cast<float>(DURATION);\r
+ float zoom_in_scale = zoom_scale;\r
+ current_->Scale(Vector2<float>{zoom_in_scale, zoom_in_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+ float zoom_out_scale = SCALE_BASE + zoom_scale;\r
+ target_->Scale(Vector2<float>{zoom_out_scale, zoom_out_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef ZOOM_OUT_TRANSITION_H\r
+#define ZOOM_OUT_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class ZoomOutTransition : public TransitionCallback {\r
+public:\r
+ ZoomOutTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+ TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+ ~ZoomOutTransition() override {}\r
+ void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+ void TransitionAlg(uint32_t time) override;\r
+private:\r
+ UIImageView* current_ = nullptr;\r
+ UIImageView* target_ = nullptr;\r
+ float middleWidth_;\r
+ float middleHeight_;\r
+};\r
+} // namespace OHOS\r
+#endif // ZOOM_OUT_TRANSITION_H
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
- * Description: ZoomTransition
- * Author:
- * Create: 2023-11
- */
-
-#include "ZoomTransition.h"
-#include "animator/easing_equation.h"
-#include "TransitionManager.h"
-
-namespace OHOS {
-static constexpr int16_t RANGE = 1000;
-REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM, ZoomTransition, 800, true, true);
-
-void ZoomTransition::OnTransitionStart(UIImageView* current, UIImageView* target)
-{
- current_ = current;
- target_ = target;
-}
-
-void ZoomTransition::TransitionAlg(uint32_t time)
-{
- if ((current_ == nullptr) || (target_ == nullptr)) {
- return;
- }
-
- float scale;
- uint32_t half = duration_ / 2; // 2: half of duration
- if (time < half) {
- scale = 1 - EasingEquation::QuadEaseOut(0, RANGE, time, half) / static_cast<float>(RANGE);
- } else {
- scale = EasingEquation::QuadEaseIn(0, RANGE, time - half, half) / static_cast<float>(RANGE);
- }
- uint8_t opa = scale * OPA_OPAQUE;
- if (time < half) {
- float centerX = current_->GetX() + current_->GetWidth() / 2.0f; // 2.0: half of width
- float centerY = current_->GetY() + current_->GetHeight() / 2.0f; // 2.0: half of height
- current_->SetVisible(true);
- target_->SetVisible(false);
- current_->Scale(Vector2<float>{scale, scale}, Vector2<float>{centerX, centerY});
- current_->SetOpaScale(opa);
- } else {
- float centerX = target_->GetX() + target_->GetWidth() / 2.0f; // 2.0: half of width
- float centerY = target_->GetY() + target_->GetHeight() / 2.0f; // 2.0: half of height
- target_->SetVisible(true);
- current_->SetVisible(false);
- target_->Scale(Vector2<float>{scale, scale}, Vector2<float>{centerX, centerY});
- target_->SetOpaScale(opa);
- }
-}
-} // namespace OHOS
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "ZoomTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t DURATION = 160;\r
+static constexpr uint16_t OPA_DURATION = 100;\r
+static constexpr float NUM2 = 2.0f;\r
+static constexpr float SCALE_BASE = 1;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM, ZoomTransition, DURATION, true, true);\r
+\r
+void ZoomTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+ if (current == nullptr || target == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ZoomTransition ImageView is empty!");\r
+ return;\r
+ }\r
+ current_ = current;\r
+ target_ = target;\r
+ middleWidth_ = Screen::GetInstance().GetWidth() / NUM2;\r
+ middleHeight_ = Screen::GetInstance().GetHeight() / NUM2;\r
+}\r
+\r
+void ZoomTransition::TransitionAlg(uint32_t time)\r
+{\r
+ float zoom_scale = EasingEquation::LinearEaseNone(0, DURATION, time, duration_) \\r
+ / static_cast<float>(DURATION);\r
+ float zoom_out_scale = SCALE_BASE + zoom_scale;\r
+ float zoom_in_scale = zoom_scale;\r
+ uint8_t opaScale = EasingEquation::CubicEaseOut(OPA_OPAQUE / NUM2, OPA_OPAQUE, time, OPA_DURATION);\r
+ current_->Scale(Vector2<float>{zoom_out_scale, zoom_out_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+ target_->SetOpaScale(opaScale);\r
+ target_->Scale(Vector2<float>{zoom_in_scale, zoom_in_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+}\r
+} // namespace OHOS\r
-/*
- * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
- * Description: ZoomTransition
- * Author:
- * Create: 2023-11
- */
-
-#ifndef ZOOM_TRANSITION_H
-#define ZOOM_TRANSITION_H
-#include "TransitionCallback.h"
-
-namespace OHOS {
-class ZoomTransition : public TransitionCallback {
-public:
- ZoomTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :
- TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}
- ~ZoomTransition() override {}
- void OnTransitionStart(UIImageView* current, UIImageView* target) override;
- void TransitionAlg(uint32_t time) override;
-private:
- UIImageView* current_ = nullptr;
- UIImageView* target_ = nullptr;
-};
-} // namespace OHOS
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef ZOOM_TRANSITION_H\r
+#define ZOOM_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class ZoomTransition : public TransitionCallback {\r
+public:\r
+ ZoomTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+ TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+ ~ZoomTransition() override {}\r
+ void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+ void TransitionAlg(uint32_t time) override;\r
+private:\r
+ UIImageView* current_ = nullptr;\r
+ UIImageView* target_ = nullptr;\r
+ float middleWidth_;\r
+ float middleHeight_;\r
+};\r
+} // namespace OHOS\r
#endif // ZOOM_TRANSITION_H
\ No newline at end of file
set(PRIVATE_HEADER
${NativeApp}/nativeui/
${NativeApp}/nativeui/uisample/uitest/framework/include
- ${UI_SAMPLE_ROOT}/components
+ ${NativeApp}/nativeui/inlcude/screennotify
${NativeApp}/../service/smart_voice/smart_voice_service/interfaces/innerkits/native_c/include
${NativeApp}/../service/smart_voice/voice_engine_hal/interfaces/innerkits/native_c/include
${NativeApp}/../ohos_deps
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/innerkits
+ ${UI_SAMPLE_ROOT}/components
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/events
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/animator
${ROOTDIR}/open_source/flatbuffers/include
${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/lwip_driver_adapter
+ ${ROOT_DIR}/open_source/openharmony/foundation/ace/ace_engine_lite/modules/calendarManager
+ ${ROOTDIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include/public
)
file(GLOB_RECURSE SOURCES "${NativeApp}/nativeui/*.cpp")
+file(GLOB_RECURSE UI_SAMPLE_SRC "${UI_SAMPLE_ROOT}/components/*.cpp")
+list(REMOVE_ITEM UI_SAMPLE_SRC
+ ${UI_SAMPLE_ROOT}/components/ui_test_bitmap_font/ui_test_bitmap_font.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/ui_test_clock_dial.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/ScreenModel.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/PullUpDownView.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/MainClockView.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/HeartRateView.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/CompassView.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/CompassControlView.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_clock_dial/ActivityWeekView.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_compass/ui_test_compass.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_dump_dom_tree/ui_test_dump_dom.cpp
+)
+
+if(NOT "CONFIG_NATIVEAPP_TEST" IN_LIST DEFINES)
+ file(GLOB FILES_TO_REMOVE_MONKEY "${CMAKE_CURRENT_SOURCE_DIR}/nativeui/monkey/src/*.cpp")
+ file(GLOB FILES_TO_REMOVE_EMPTY "${CMAKE_CURRENT_SOURCE_DIR}/nativeui/emptypage/src/*.cpp")
+ list(APPEND FILES_TO_REMOVE ${FILES_TO_REMOVE_MONKEY} ${FILES_TO_REMOVE_EMPTY})
+ list(REMOVE_ITEM SOURCES ${FILES_TO_REMOVE})
+endif()
+
set(SOURCES
${SOURCES}
${NativeApp}/nativelauncher/src/NativeLauncher.cpp
${NativeApp}/nativelauncher/src/NativeRegisterManager.cpp
${NativeApp}/nativelauncher/src/UICardPageFactory.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_lottie/ui_test_lottie.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_tiger/tiger_view.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_tiger/ui_test_tiger.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_running_ball/ui_test_running_ball.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_breath/ui_test_breath.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_card_switch/ui_test_card_switch.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_countdown/ui_test_countdown.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_list_fps/image_text_adapter.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_list_fps/ui_test_list_fps.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_particle/ui_test_particle.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_message/ui_test_message.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_icosahedron/ui_test_icosahedron.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_cube_rotate/cube_rotate_view.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_cube_rotate/ui_test_cube_rotate.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_video_play/ui_test_video_play.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_keyboard/ui_test_keyboard.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_hexagons_list/ui_test_hexagons_list.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_waterfall_list/ui_test_waterfall_list.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_coverflow/ui_test_coverflow.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_slipflow/ui_test_slipflow.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_kaleidoscope/ui_test_kaleidoscope.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_roller_view/ui_test_roller_view.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_emoji/ui_test_emoji.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_sphere_view/ui_test_sphere_view.cpp
- ${UI_SAMPLE_ROOT}/components/ui_test_nested/ui_test_nested.cpp
+ ${NativeApp}/nativelauncher/src/UIWatchDialFactory.cpp
+ ${UI_SAMPLE_SRC}
)
list(REMOVE_ITEM SOURCES
${ROOT_DIR}/open_source/openharmony/foundation/ace/ace_engine_lite/interfaces/base
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/utils/innerkits
- ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/
+ ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils
VIEW_MAIN_ACTIVITY = 7,
VIEW_ALARM_POP_UP,
VIEW_CALLER_SAMPLE,
- VIEW_MAEKPHONE_SAMPLE,
VIEW_BLOODOXY_SAMPLE,
VIEW_BLUETOOTH_EARPHONE,
VIEW_OFFLINEVOICE,
VIEW_COMPASS,
VIEW_CONNECT_PHONE,
VIEW_MAIN_TEMP,
- VIEW_INDOORWALK,
VIEW_REBOOT,
VIEW_UISAMPLE,
- VIEW_MAIN_BREATHEASE,
+ VIEW_BREATH,
VIEW_FLASHLIGHT, // 手电筒;
VIEW_STOPWATCH, // 秒表;
VIEW_WEATHER, // 天气
VIEW_CAMERA, // 相机
VIEW_FIND_PHONE, // 寻找手机
VIEW_DATE, // 日期
- VIEW_QRCODE_CONN, // 二维码连接;
- VIEW_SPORTS,
+ VIEW_SPORT,
+ VIEW_PHONE_MENU,
VIEW_SLEEPING,
- VIEW_TRAINING,
VIEW_EMPTY,
+ VIEW_HEARTRATE,
+ VIEW_MONKEY,
#ifdef SUPPORT_ALIPAY_SEC
VIEW_MAIN_ALIPAY,
#endif
- VIEW_SET_DESKTOP,
- VIEW_SET_OTA,
- VIEW_SET_CARD,
- VIEW_ADD_CARD,
- VIEW_SET_DIAL,
- VIEW_SET_DIAL_STYLE,
VIEW_AOD,
VIEW_RESTORE_DEFAULTS,
VIEW_RECENT_APP,
static UICardPageFactory instance;
return instance;
}
- void RegisterWatchDial(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage);
- UICardPage* CreateWatchDial(uint16_t mode, uint16_t id);
+ void RegisterCardPage(const uint16_t id, UICardPageProxyInterface* uiCardPage);
+ UICardPage* CreateCardPage(uint16_t id);
private:
UICardPageFactory() {};
~UICardPageFactory() {};
UICardPageFactory(const UICardPageFactory&) = delete;
UICardPageFactory &operator=(const UICardPageFactory&) = delete;
- std::unordered_map<uint16_t, UICardPageProxyInterface*> watchDials_[static_cast<uint16_t>(DIAL_DISPLAY_MODE_MAX)];
+ std::unordered_map<uint16_t, UICardPageProxyInterface*> cardPage_;
};
-class WatchDialRegister {
+class CardPageRegister {
public:
- WatchDialRegister(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage)
+ CardPageRegister(const uint16_t id, UICardPageProxyInterface* uiCardPage)
{
- UICardPageFactory::GetInstance().RegisterWatchDial(mode, id, uiCardPage);
+ UICardPageFactory::GetInstance().RegisterCardPage(id, uiCardPage);
}
};
};
template <class U>
-class WatchDialProxy : public UICardPageProxyInterface {
+class CardPageProxy : public UICardPageProxyInterface {
public:
UICardPage* CreateUICardPage() override
{
};
} // namespace OHOS
-#define REGIST_WATCH_DIAL(mode, id, U) \
- const static OHOS::WatchDialRegister (STATIC_VAR)(static_cast<uint16_t>(mode), static_cast<uint16_t>(id), \
- new WatchDialProxy<U>())
+#define REGIST_CARD_PAGE(id, U) \
+ const static OHOS::CardPageRegister (STATIC_VAR)(static_cast<uint16_t>(id), \
+ new CardPageProxy<U>())
#endif // UI_CARD_PAGE_FACTORY_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: UIWatchDialFactory
+ * Author:
+ * Create: 2025-06
+ */
+
+#ifndef UI_WATCH_DIAL_FACTORY_H
+#define UI_WATCH_DIAL_FACTORY_H
+
+#include <unordered_map>
+#include "components/ui_card_page.h"
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "main/MainModel.h"
+#include "components/ui_fragment.h"
+
+namespace OHOS {
+class UIWatchDialProxyInterface;
+class UIWatchDialFactory {
+public:
+ static UIWatchDialFactory& GetInstance()
+ {
+ static UIWatchDialFactory instance;
+ return instance;
+ }
+ void RegisterWatchDial(const uint16_t ability, const uint16_t id, UIWatchDialProxyInterface* uiWatchDial,
+ const DialInfo* dialInfo);
+ UICardPage* CreateNormalDial(uint16_t id);
+ UIFragment* CreateAodDial(uint16_t id);
+ const DialInfo* GetNormalDialInfo(uint16_t id);
+ uint8_t GetNormalDialInfoNum();
+
+private:
+ UIWatchDialFactory() {};
+ ~UIWatchDialFactory() {};
+ UIWatchDialFactory(const UIWatchDialFactory&) = delete;
+ UIWatchDialFactory &operator=(const UIWatchDialFactory&) = delete;
+ std::unordered_map<uint16_t, UIWatchDialProxyInterface*> watchDials_[static_cast<uint16_t>(DIAL_DISPLAY_MODE_MAX)];
+ std::unordered_map<uint16_t, const DialInfo*> normalDialInfo_;
+};
+
+class WatchDialRegister {
+public:
+ WatchDialRegister(const uint16_t ability, const uint16_t id, UIWatchDialProxyInterface* uiWatchDial,
+ const DialInfo* dialInfo)
+ {
+ UIWatchDialFactory::GetInstance().RegisterWatchDial(ability, id, uiWatchDial, dialInfo);
+ }
+};
+
+class UIWatchDialProxyInterface {
+public:
+ virtual UICardPage* CreateWatchDialCardPage(const uint16_t id) = 0;
+ virtual UIFragment* CreateWatchDialFragment(const uint16_t id) = 0;
+ UIWatchDialProxyInterface() = default;
+ virtual ~UIWatchDialProxyInterface() = default;
+ UIWatchDialProxyInterface(const UIWatchDialProxyInterface&) = delete;
+ UIWatchDialProxyInterface& operator=(const UIWatchDialProxyInterface&) = delete;
+ UIWatchDialProxyInterface(UIWatchDialProxyInterface&&) = delete;
+ UIWatchDialProxyInterface& operator=(UIWatchDialProxyInterface&&) = delete;
+};
+
+template <class U>
+class WatchDialProxy : public UIWatchDialProxyInterface {
+public:
+ UICardPage* CreateWatchDialCardPage(const uint16_t id) override
+ {
+ U* u = new U();
+ UICardPage* page = dynamic_cast<UICardPage*>(u);
+ if (page == nullptr) {
+ delete u;
+ }
+ return page;
+ }
+
+ UIFragment* CreateWatchDialFragment(const uint16_t id) override
+ {
+ U* u = new U();
+ UIFragment* fragment = dynamic_cast<UIFragment*>(u);
+ if (fragment == nullptr) {
+ delete u;
+ }
+ fragment->CreateView();
+ return fragment;
+ }
+};
+} // namespace OHOS
+
+#define REGIST_WATCH_DIAL(ability, id, U, info) \
+ const static OHOS::WatchDialRegister (STATIC_VAR)(static_cast<uint16_t>(ability), static_cast<uint16_t>(id), \
+ new WatchDialProxy<U>(), static_cast<const DialInfo*>(info))
+
+#endif // UI_WATCH_DIAL_FACTORY_H
\ No newline at end of file
namespace OHOS {
typedef enum {
WATCH_FACE = 0, /* 主表盘枚举值不能修改 */
- HEART_RATE,
COMPASS,
ACTIVITY,
MUSIC_PLAYER,
typedef enum {
DIAL_CLOCK = 0,
+ GRADIENT_CLOCK,
DIAL_MAX,
} DialId;
typedef enum {
- DIAL_DISPLAY_MODE_MAIN = 0,
+ DIAL_DISPLAY_MODE_NORMAL = 0,
DIAL_DISPLAY_MODE_AOD,
DIAL_DISPLAY_MODE_MAX,
- } DialDispayMode;
+ } DialDisplayMode;
+
+ typedef enum {
+ DIAL_DISPLAY_SUPPORT_NORMAL = 0,
+ DIAL_DISPLAY_SUPPORT_AOD,
+ DIAL_DISPLAY_SUPPORT_NORMAL_AOD,
+ DIAL_DISPLAY_SUPPORT_MAX,
+ } DialDisplayAbility;
#ifndef UNUSED
#define UNUSED(x) ((void)(x))
#define APP_MUSIC_PATH "/user/music"
#define APP_VIDEO_PATH "/user/video"
#define APP_DIAL_PATH "/user/dial"
+ #define APP_RECENT_PATH "/system/recent/"
#else
#ifdef RELEASE_VERSION
#define APP_RES_PATH "res/res"
#define APP_MUSIC_PATH "res/music"
#define APP_VIDEO_PATH "res/video"
#define APP_DIAL_PATH "res/dial"
+ #define APP_RECENT_PATH "/res/recent/"
#else
#define APP_RES_PATH "../../../wearable/res/res"
#define APP_MUSIC_PATH "../../../wearable/res/music"
#define APP_VIDEO_PATH "../../../wearable/res/video"
#define APP_DIAL_PATH "../../../wearable/res/dial"
+ #define APP_RECENT_PATH "../../../wearable/res/recent/"
#endif
#endif
static constexpr const char *DROPDOWN_IAMGES = APP_RES_PATH"/dropdown/dropdown.bin";
static constexpr const char *HEART_IAMGES = APP_RES_PATH"/heart/heart.bin";
static constexpr const char *PNG_BLUETOOTH_HINTS_PATH = APP_RES_PATH"/BLUETOOTH_HINTS.bin";
- static constexpr const char *PNG_BLOODOXYGEN_IMAGE_PATH = APP_RES_PATH"/BLOODOXYGEN_VIEW.bin";
-
- static constexpr const char *PNG_BLOOD_ICON_ENTER = APP_RES_PATH"/BLOOD_ICON_ENTER.bin";
-
- static constexpr const char *PNG_AGREEING_IMAGE_PATH = APP_RES_PATH"/AGREEING.bin";
- static constexpr const char *PNG_DISSGREE_IMAGE_PATH = APP_RES_PATH"/DISSGREE.bin";
- static constexpr const char *PNG_MICROPHONE_OPEN_IMAGE_PATH = APP_RES_PATH"/MICRO_PHONE_OPEN.bin";
- static constexpr const char *PNG_MICROPHONE_CLOSE_IMAGE_PATH = APP_RES_PATH"/MICRO_PHONE_CLOSE.bin";
- static constexpr const char *PNG_HANDUP_IMAGE_PATH = APP_RES_PATH"/HANDUP.bin";
- static constexpr const char *PNG_ANSWER_TMAGE_PATH = APP_RES_PATH"/ANSWER_PHONE.bin";
- static constexpr const char *PNG_CALLING_TMAGE_PATH = APP_RES_PATH"/CALLING_PHONE.bin";
- static constexpr const char *PNG_CALLER_TMAGE_PATH = APP_RES_PATH"/CALLER_LOG_IMAGE.bin";
- static constexpr const char *PNG_NO_CALLER_LOG_IMAGE = APP_RES_PATH"/NO_CALLER_LOG_IMAGE.bin";
- static constexpr const char *PNG_APPLIST_CALLER_IMAGE = APP_RES_PATH"/APPLIST_CALLER_IMAGE.bin";
static constexpr const char *PNG_APPLIST_COMPASS_IMAGE = APP_RES_PATH"/APPLIST_COMPASS_IMAGE.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_0 = APP_RES_PATH"/COUNTDOWN_IMAGE_01.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_1 = APP_RES_PATH"/COUNTDOWN_IMAGE_02.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_2 = APP_RES_PATH"/COUNTDOWN_IMAGE_03.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_3 = APP_RES_PATH"/COUNTDOWN_IMAGE_04.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_4 = APP_RES_PATH"/COUNTDOWN_IMAGE_05.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_5 = APP_RES_PATH"/COUNTDOWN_IMAGE_06.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_6 = APP_RES_PATH"/COUNTDOWN_IMAGE_07.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_7 = APP_RES_PATH"/COUNTDOWN_IMAGE_08.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_8 = APP_RES_PATH"/COUNTDOWN_IMAGE_09.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_9 = APP_RES_PATH"/COUNTDOWN_IMAGE_10.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_10 = APP_RES_PATH"/COUNTDOWN_IMAGE_11.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_11 = APP_RES_PATH"/COUNTDOWN_IMAGE_12.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_12 = APP_RES_PATH"/COUNTDOWN_IMAGE_13.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_13 = APP_RES_PATH"/COUNTDOWN_IMAGE_14.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_14 = APP_RES_PATH"/COUNTDOWN_IMAGE_15.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_15 = APP_RES_PATH"/COUNTDOWN_IMAGE_16.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_16 = APP_RES_PATH"/COUNTDOWN_IMAGE_17.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_17 = APP_RES_PATH"/COUNTDOWN_IMAGE_18.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_18 = APP_RES_PATH"/COUNTDOWN_IMAGE_19.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_19 = APP_RES_PATH"/COUNTDOWN_IMAGE_20.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_20 = APP_RES_PATH"/COUNTDOWN_IMAGE_21.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_21 = APP_RES_PATH"/COUNTDOWN_IMAGE_22.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_22 = APP_RES_PATH"/COUNTDOWN_IMAGE_23.bin";
- static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_23 = APP_RES_PATH"/COUNTDOWN_IMAGE_24.bin";
-
static constexpr const char *PNG_PROGRESS_BAR_TMAGE = APP_RES_PATH"/PROGRESS_BAR_TMAGE.bin";
- static constexpr const char *TEMP_WAITING = APP_RES_PATH"/TEMP_WAITING.bin";
- static constexpr const char *TEMP_REPORT = APP_RES_PATH"/TEMP_REPORT.bin";
- static constexpr const char *TEMP_POINT = APP_RES_PATH"/TEMP_POINT.bin";
- static constexpr const char *TEMP_REV_POINTER = APP_RES_PATH"/TEMP_REV_POINTER.bin";
-
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_0 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_02.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_1 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_03.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_2 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_04.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_3 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_05.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_4 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_06.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_5 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_07.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_6 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_08.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_7 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_09.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_8 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_10.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_9 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_11.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_10 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_12.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_11 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_13.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_12 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_14.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_13 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_15.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_14 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_16.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_15 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_17.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_16 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_18.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_17 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_19.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_18 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_20.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_19 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_21.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_20 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_22.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_21 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_23.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_22 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_24.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_23 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_25.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_24 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_26.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_25 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_27.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_26 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_28.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_27 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_29.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_28 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_30.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_29 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_31.bin";
- static constexpr const char *PNG_BLOOD_FLOW_IMAGE_30 = APP_RES_PATH"/BLOOD_FLOW_IMAGE_32.bin";
static constexpr const char *PNG_SOUNDBUTTON2 = APP_RES_PATH"/SOUND_IMAGE.bin";
- static constexpr const char *PNG_PULLBUTTON_FACE_IMAGE = APP_RES_PATH"/BLOOD_FLOW_IMAGE_01.bin";
+ static constexpr const char *PNG_PULLUP_BUTTON = APP_RES_PATH"/PNG_PULLUP_BUTTON.bin";
static constexpr const char *MUSIC_2 = APP_RES_PATH"/mp3_48k_caiqing.mp3";
static constexpr const char *MUSIC_1 = APP_RES_PATH"/one.mp3";
static constexpr const char *PNG_BLUETOOTH_IMAGE = APP_RES_PATH"/BLUETOOTH_IMAGE.bin";
static constexpr const char *PNG_WATCH_IMAGE = APP_RES_PATH"/WATCH_IMAGE.bin";
static constexpr const char *PNG_PHONE_IMAGE = APP_RES_PATH"/PHONE_IMAGE.bin";
- static constexpr const char *PNG_REBOOT_BUTTON_IMAGE = APP_RES_PATH"/REBOOT_BUTTON.bin";
- static constexpr const char *PNG_SHUTDOWN_BUTTON_IMAGE = APP_RES_PATH"/SHUTDOWN_BUTTON.bin";
- static constexpr const char *PNG_SETTTING_REBOOT_IMAGE = APP_RES_PATH"/SETTTING_REBOOT.bin";
- static constexpr const char *PNG_SETTTING_SHUTDOWN_IMAGE = APP_RES_PATH"/SETTTING_SHUTDOWN.bin";
- static constexpr const char *PNG_SETTTING_DESKTOP_IMAGE = APP_RES_PATH"/SETTTING_DESKTOP.bin";
- static constexpr const char *PNG_SET_DESKTOP_LIST_IMAGE = APP_RES_PATH"/SET_DESKTOP_LIST.bin";
- static constexpr const char *PNG_SET_DESKTOP_HEXAGONS_IMAGE = APP_RES_PATH"/SET_DESKTOP_HEXAGONS.bin";
- static constexpr const char *PNG_SET_DESKTOP_BG_IMAGE = APP_RES_PATH"/SET_DESKTOP_BG.bin";
-
- static constexpr const char *PNG_CONNECT_PHONE_IMAGE = APP_RES_PATH"/CONNECT_PHONE.bin";
- static constexpr const char *PNG_BLUETOOTH_STITLE = APP_RES_PATH"/BLUETOOTH_TITLE.bin";
static constexpr const char *PNG_NEW_DEVICE = APP_RES_PATH"/NEW_DEVICE.bin";
static constexpr const char *PNG_BT_LIST = APP_RES_PATH"/BT_LIST.bin";
static constexpr const char *ALARM_CLOCK_POP_ADD_PATH = APP_RES_PATH"/RING_CLOCK.bin";
static constexpr const char *ALARM_DELETE_ADD_PATH = APP_RES_PATH"/DELETE.bin";
static constexpr const char *ALARM_TRUE_ADD_PATH = APP_RES_PATH"/TRUE_ADD.bin";
- static constexpr const char *TEMP_MEASURE = APP_RES_PATH"/TEMP_MEASURE.bin";
- static constexpr const char *TEMP_UP_DROP = APP_RES_PATH"/TEMP_UP_DROP.bin";
- static constexpr const char *TEMP_EXIT = APP_RES_PATH"/TEMP_EXIT.bin";
- static constexpr const char *TEMP_ROTATE = APP_RES_PATH"/TEMP_ROTATE.bin";
- static constexpr const char *TEMP_ICON_ENTER = APP_RES_PATH"/TEMP_ICON_ENTER.bin";
- static constexpr const char *TEMP_BACKGROUND = APP_RES_PATH"/TEMP_BACKGROUND.bin";
- static constexpr const char *TEMP_WARN = APP_RES_PATH"/TEMP_WARN.bin";
- static constexpr const char *TEMP_LITTLE_MEASURE = APP_RES_PATH"/TEMP_LITTLE_MEASURE.bin";
- static constexpr const char *TEMP_HOT = APP_RES_PATH"/TEMP_HOT.bin";
- static constexpr const char *TEMP_COLD = APP_RES_PATH"/TEMP_COLD.bin";
- static constexpr const char *TEMP_LIT_TIP = APP_RES_PATH"/TEMP_LIT_TIP.bin";
- static constexpr const char *TEMP_ABOUT_STUDY = APP_RES_PATH"/TEMP_ABOUT_STUDY.bin";
- static constexpr const char *TEMP_TRUE = APP_RES_PATH"/TEMP_TRUE.bin";
- static constexpr const char *TEMP_DELETE = APP_RES_PATH"/TEMP_DELETE.bin";
static constexpr const char *COMPASS_CALIBRATE_IMAGE = APP_RES_PATH"/COMPASS_CALIBRATE_IMAGE.bin";
static constexpr const char *PNG_SETTING_NEXT_IMAGE = APP_RES_PATH"/SETTING_NEXT.bin";
static constexpr const char *PNG_STEP_SHOE_IMAGE_PATH = APP_RES_PATH"/SHOE_IMAGE.bin";
- static constexpr const char *PNG_A004_070_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_01.bin";
- static constexpr const char *PNG_A004_071_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_02.bin";
- static constexpr const char *PNG_A004_072_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_03.bin";
- static constexpr const char *PNG_A004_073_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_04.bin";
- static constexpr const char *PNG_A004_074_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_05.bin";
- static constexpr const char *PNG_A004_075_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_06.bin";
- static constexpr const char *PNG_A004_076_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_07.bin";
- static constexpr const char *PNG_A004_077_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_08.bin";
- static constexpr const char *PNG_A004_078_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_09.bin";
- static constexpr const char *PNG_A004_079_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_10.bin";
- static constexpr const char *PNG_A004_080_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_11.bin";
- static constexpr const char *PNG_A004_081_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_12.bin";
- static constexpr const char *PNG_A004_082_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_13.bin";
- static constexpr const char *PNG_A004_083_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_14.bin";
- static constexpr const char *PNG_A004_084_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_15.bin";
- static constexpr const char *PNG_A004_085_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_16.bin";
- static constexpr const char *PNG_A004_086_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_17.bin";
- static constexpr const char *PNG_A004_087_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_18.bin";
- static constexpr const char *PNG_A004_088_IMAGE_PATH = APP_RES_PATH"/HEARTBEAT_IMAGE_19.bin";
-
static constexpr const char *PNG_A019_080_IMAGE_PATH = APP_RES_PATH"/BLUETOOTH_IMAGE_01.bin";
static constexpr const char *PNG_A019_081_IMAGE_PATH = APP_RES_PATH"/BLUETOOTH_IMAGE_02.bin";
static constexpr const char *PNG_A019_082_IMAGE_PATH = APP_RES_PATH"/BLUETOOTH_IMAGE_03.bin";
// AppList
static constexpr const char *PNG_APPLIST_ALARM_IMAGE = APP_RES_PATH"/APPLIST_ALARM.bin"; // 闹钟
- static constexpr const char *PNG_APPLIST_SPO2_IMAGE = APP_RES_PATH"/APPLIST_SPO2.bin"; // 血氧
static constexpr const char *PNG_APPLIST_SETTING_IMAGE = APP_RES_PATH"/APPLIST_SETTING.bin"; // 设置
- static constexpr const char *PNG_APPLIST_TEMP_IMAGE = APP_RES_PATH"/TEMP_IMAGE.bin"; // 体温
static constexpr const char *PNG_APPLIST_ALIPAY_IMAGE = APP_RES_PATH"/alipay_logo.bin"; // 支付宝
static constexpr const char *PNG_ALIPAY_BIND_FAILURE = APP_RES_PATH"/ALIPAY_BIND_FAILURE.bin";
static constexpr const char *PNG_APPLIST_DEFAULT_IMG = APP_RES_PATH"/regular_hexagon.bin";
static constexpr const char *PNG_APPLIST_NOTSETUSE_IMG = APP_RES_PATH"/regular_hexagon_inverse.bin";
- // 室内步行
- static constexpr const char *PNG_APPLIST_WALK_IMAGE = APP_RES_PATH"/APPLIST_WALK.bin"; // Applist图标
- static constexpr const char *PNG_WALK_BACK_GROUND = APP_RES_PATH"/WALK_BACK_GROUND.bin";
- static constexpr const char *PNG_WALK_IMAGE = APP_RES_PATH"/INDOORWALK.bin";
- static constexpr const char *PNG_AEROBIC_IMAGE = APP_RES_PATH"/AEROBIC.bin";
- static constexpr const char *PNG_ANAEROBIC_IMAGE = APP_RES_PATH"/ANAEROBIC.bin";
- static constexpr const char *PNG_OPTIONS_BOX1_IMAGE = APP_RES_PATH"/OPTIONS_BOX1.bin";
- static constexpr const char *PNG_OPTIONS_BOX2_IMAGE = APP_RES_PATH"/OPTIONS_BOX2.bin";
- static constexpr const char *PNG_OPTIONS_BOX3_IMAGE = APP_RES_PATH"/OPTIONS_BOX3.bin";
- static constexpr const char *PNG_OPTIONS_BOX4_IMAGE = APP_RES_PATH"/OPTIONS_BOX4.bin";
- static constexpr const char *PNG_WALK_TIME_IMAGE = APP_RES_PATH"/TIME_IMAGE.bin";
- static constexpr const char *PNG_WALK_DISTANCES_IMAGE = APP_RES_PATH"/DISTANCES_IMAGE.bin";
- static constexpr const char *PNG_WALK_HEART_IMAGE = APP_RES_PATH"/HEART_IMAGE.bin";
- static constexpr const char *PNG_WALK_SPEED_IMAGE = APP_RES_PATH"/SPEED_IMAGE.bin";
- static constexpr const char *PNG_WALK_STEPS_IMAGE = APP_RES_PATH"/STEPS_IMAGE.bin";
-
static constexpr const char *PNG_APPLIST_UI_SAMPLE_IMAGE = APP_RES_PATH"/APPLIST_UI_SAMPLE.bin"; // Applist图标
- static constexpr const char *PNG_SET_CARD_ADD = APP_RES_PATH"/CARD_ADD.bin";
- static constexpr const char *PNG_SET_CARD_DEL = APP_RES_PATH"/CARD_DEL.bin";
- static constexpr const char *PNG_SET_CARD_HEART = APP_RES_PATH"/CARD_HEART.bin";
static constexpr const char *PNG_SET_CARD_COMPASS = APP_RES_PATH"/CARD_COMPASS.bin";
static constexpr const char *PNG_SET_CARD_ACTIVITY = APP_RES_PATH"/CARD_ACTIVITY.bin";
static constexpr const char *PNG_SET_CARD_PLAYER = APP_RES_PATH"/CARD_PLAYER.bin";
static constexpr const char *PNG_SET_DIAL_CLOCK = APP_RES_PATH"/DIAL_CLOCK.bin";
- static constexpr const char *PNG_APPLIST_STOPWATCH_LOGO = APP_RES_PATH"/STOPWATCH_LOGO.bin";
- static constexpr const char *PNG_APPLIST_STOPWATCH_IMAGE = APP_RES_PATH"/STOPWATCH.bin";
+ static constexpr const char *SPORT_ICON = APP_RES_PATH"/SPORT_ICON.bin";
+ static constexpr const char *SPORT_IMAGE = APP_RES_PATH"/SPORT.bin";
+ static constexpr const char *STOPWATCH_ICON = APP_RES_PATH"/STOPWATCH_ICON.bin";
+ static constexpr const char *STOPWATCH_IMAGE = APP_RES_PATH"/STOPWATCH.bin";
static constexpr const char *WEATHER_IMAGE = APP_RES_PATH"/WEATHER.bin";
- static constexpr const char *WEATHER_MAIN_ICON = APP_RES_PATH"/WEATHER_LOGO.bin";
+ static constexpr const char *WEATHER_ICON = APP_RES_PATH"/WEATHER_ICON.bin";
static constexpr const char *TIMER_IMAGE = APP_RES_PATH"/TIMER.bin";
- static constexpr const char *TIMER_MAIN_ICON = APP_RES_PATH"/TIMER_ICON.bin";
+ static constexpr const char *TIMER_ICON = APP_RES_PATH"/TIMER_ICON.bin";
static constexpr const char *DATE_IMAGE = APP_RES_PATH"/DATE.bin";
- static constexpr const char *DATE_MAIN_ICON = APP_RES_PATH"/DATE_LOGO.bin";
+ static constexpr const char *DATE_ICON = APP_RES_PATH"/DATE_ICON.bin";
static constexpr const char *FLASHLIGHT_IMAGE = APP_RES_PATH"/FLASHLIGHT.bin";
- static constexpr const char *FLASHLIGHT_MAIN_ICON = APP_RES_PATH"/FLASHLIGHT_LOGO.bin";
+ static constexpr const char *FLASHLIGHT_ICON = APP_RES_PATH"/FLASHLIGHT_ICON.bin";
static constexpr const char *SLEEP_IMAGE = APP_RES_PATH"/SLEEP.bin";
static constexpr const char *SLEEP_ICON = APP_RES_PATH"/SLEEP_ICON.bin";
static constexpr const char *BREATH_IMAGE = APP_RES_PATH"/BREATH.bin";
- static constexpr const char *BREATH_MAIN_ICON = APP_RES_PATH"/BREATH_ICON.bin";
+ static constexpr const char *BREATH_ICON = APP_RES_PATH"/BREATH_ICON.bin";
static constexpr const char *FINDPHONE_IMAGE = APP_RES_PATH"/FINDPHONE.bin";
- static constexpr const char *FINDPHONE_MAIN_ICON = APP_RES_PATH"/FINDPHONE_LOGO.bin";
+ static constexpr const char *FINDPHONE_ICON = APP_RES_PATH"/FINDPHONE_ICON.bin";
static constexpr const char *CAMERA_IMAGE = APP_RES_PATH"/CAMERA.bin";
- static constexpr const char *CAMERA_MAIN_ICON = APP_RES_PATH"/CAMERA_ICON.bin";
+ static constexpr const char *CAMERA_ICON = APP_RES_PATH"/CAMERA_ICON.bin";
+ static constexpr const char *PHONEMENU_IMAGE = APP_RES_PATH"/PHONEMENU.bin";
+ static constexpr const char *PHONEMENU_ICON = APP_RES_PATH"/PHONEMENU_ICON.bin";
+ static constexpr const char *HEART_RATE_IMAGE = APP_RES_PATH"/HEART_RATE.bin";
+ static constexpr const char *HEART_RATE_ICON = APP_RES_PATH"/HEART_RATE_ICON.bin";
+ static constexpr const char *MESSAGE_IMAGE = APP_RES_PATH"/MESSAGE.bin";
+ static constexpr const char *BLOOD_IMAGE = APP_RES_PATH"/BLOOD.bin";
+ static constexpr const char *BLOOD_ICON = APP_RES_PATH"/BLOOD_ICON.bin";
+ static constexpr const char *SETTING_IMAGE = APP_RES_PATH"/SETTING.bin";
+ static constexpr const char *SETTING_ICON = APP_RES_PATH"/SETTING_ICON.bin";
+ static constexpr const char *EMPTY_IMAGE = APP_RES_PATH"/EMPTY.bin";
+ static constexpr const char *EMPTY_ICON = APP_RES_PATH"/EMPTY_ICON.bin";
+ static constexpr const char *MONKEY_ICON = APP_RES_PATH"/MONKEY_ICON.bin";
+
+ static constexpr const char *PNG_SET_GRADIENT_CLOCK = APP_RES_PATH"/GRADIENT_CLOCK.bin";
+ static constexpr const char *PNG_TRANSITION_SLICE_SAMPLE = APP_RES_PATH"/TRANSITION_SLICE_SAMPLE.bin";
}
#endif // UI_CONFIG_H
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceBlood\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef UI_RESOURCE_BLOOD_H\r
+#define UI_RESOURCE_BLOOD_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_BLOOD_ABNORMAL = 0x100001;\r
+static const int IMAGE_BLOOD_AGAIN = 0x100002;\r
+static const int IMAGE_BLOOD_BG = 0x100003;\r
+static const int IMAGE_BLOOD_COMMON = 0x100004;\r
+static const int IMAGE_BLOOD_FRAME00 = 0x100005;\r
+static const int IMAGE_BLOOD_FRAME01 = 0x100006;\r
+static const int IMAGE_BLOOD_FRAME02 = 0x100007;\r
+static const int IMAGE_BLOOD_FRAME03 = 0x100008;\r
+static const int IMAGE_BLOOD_FRAME04 = 0x100009;\r
+static const int IMAGE_BLOOD_FRAME05 = 0x10000a;\r
+static const int IMAGE_BLOOD_FRAME06 = 0x10000b;\r
+static const int IMAGE_BLOOD_FRAME07 = 0x10000c;\r
+static const int IMAGE_BLOOD_FRAME08 = 0x10000d;\r
+static const int IMAGE_BLOOD_FRAME09 = 0x10000e;\r
+static const int IMAGE_BLOOD_FRAME10 = 0x10000f;\r
+static const int IMAGE_BLOOD_FRAME11 = 0x100010;\r
+static const int IMAGE_BLOOD_FRAME12 = 0x100011;\r
+static const int IMAGE_BLOOD_FRAME13 = 0x100012;\r
+static const int IMAGE_BLOOD_FRAME14 = 0x100013;\r
+static const int IMAGE_BLOOD_FRAME15 = 0x100014;\r
+static const int IMAGE_BLOOD_FRAME16 = 0x100015;\r
+static const int IMAGE_BLOOD_FRAME17 = 0x100016;\r
+static const int IMAGE_BLOOD_FRAME18 = 0x100017;\r
+static const int IMAGE_BLOOD_FRAME19 = 0x100018;\r
+static const int IMAGE_BLOOD_FRAME20 = 0x100019;\r
+static const int IMAGE_BLOOD_FRAME21 = 0x10001a;\r
+static const int IMAGE_BLOOD_FRAME22 = 0x10001b;\r
+static const int IMAGE_BLOOD_FRAME23 = 0x10001c;\r
+static const int IMAGE_BLOOD_FRAME24 = 0x10001d;\r
+static const int IMAGE_BLOOD_FRAME25 = 0x10001e;\r
+static const int IMAGE_BLOOD_FRAME26 = 0x10001f;\r
+static const int IMAGE_BLOOD_FRAME27 = 0x100020;\r
+static const int IMAGE_BLOOD_FRAME28 = 0x100021;\r
+static const int IMAGE_BLOOD_FRAME29 = 0x100022;\r
+static const int IMAGE_BLOOD_NORMAL = 0x100023;\r
+static const int IMAGE_BLOOD_PREVIEW1 = 0x100024;\r
+static const int IMAGE_BLOOD_PREVIEW2 = 0x100025;\r
+static const int IMAGE_BLOOD_RESET = 0x100026;\r
+static const int IMAGE_BLOOD_SCALE = 0x100027;\r
+} // OHOS\r
+#endif // UI_RESOURCE_BLOOD_H\r
/*\r
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UIBreathResource\r
+ * Description: UIResourceBreath\r
* Create: 2025-06-05\r
*/\r
-#ifndef UI_RESOURCE_BREATH_IMAGE_H\r
-#define UI_RESOURCE_BREATH_IMAGE_H\r
-#include <cstdint>\r
+\r
+#ifndef UI_RESOURCE_BREATH_H\r
+#define UI_RESOURCE_BREATH_H\r
+\r
namespace OHOS {\r
- static const int IMAGE_CONVERTER_TOOL_BREATH001 = 0x100001;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH002 = 0x100002;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH003 = 0x100003;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH004 = 0x100004;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH005 = 0x100005;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH006 = 0x100006;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH007 = 0x100007;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH008 = 0x100008;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH009 = 0x100009;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH010 = 0x10000a;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH011 = 0x10000b;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH012 = 0x10000c;\r
- static const int IMAGE_CONVERTER_TOOL_BREATH013 = 0x10000d;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE001 = 0x10000e;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE002 = 0x10000f;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE003 = 0x100010;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE004 = 0x100011;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE005 = 0x100012;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE006 = 0x100013;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE007 = 0x100014;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE008 = 0x100015;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE009 = 0x100016;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE010 = 0x100017;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE011 = 0x100018;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE012 = 0x100019;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE013 = 0x10001a;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE014 = 0x10001b;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE015 = 0x10001c;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE016 = 0x10001d;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE017 = 0x10001e;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE018 = 0x10001f;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE019 = 0x100020;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE020 = 0x100021;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE021 = 0x100022;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE022 = 0x100023;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE023 = 0x100024;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE024 = 0x100025;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE025 = 0x100026;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE026 = 0x100027;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE027 = 0x100028;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE028 = 0x100029;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE029 = 0x10002a;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE030 = 0x10002b;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE031 = 0x10002c;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE032 = 0x10002d;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE033 = 0x10002e;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE034 = 0x10002f;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE035 = 0x100030;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE036 = 0x100031;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE037 = 0x100032;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE038 = 0x100033;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE039 = 0x100034;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE040 = 0x100035;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE041 = 0x100036;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE042 = 0x100037;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE043 = 0x100038;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE044 = 0x100039;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE045 = 0x10003a;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE046 = 0x10003b;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE047 = 0x10003c;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE048 = 0x10003d;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE049 = 0x10003e;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE050 = 0x10003f;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE051 = 0x100040;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE052 = 0x100041;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE053 = 0x100042;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE054 = 0x100043;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE055 = 0x100044;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE056 = 0x100045;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE057 = 0x100046;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE058 = 0x100047;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE059 = 0x100048;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE060 = 0x100049;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE061 = 0x10004a;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE062 = 0x10004b;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE063 = 0x10004c;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE064 = 0x10004d;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE065 = 0x10004e;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE066 = 0x10004f;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE067 = 0x100050;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE068 = 0x100051;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE069 = 0x100052;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE070 = 0x100053;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE071 = 0x100054;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE072 = 0x100055;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE073 = 0x100056;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE074 = 0x100057;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE075 = 0x100058;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE076 = 0x100059;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE077 = 0x10005a;\r
- static const int IMAGE_CONVERTER_TOOL_INOREX_HALE078 = 0x10005b;\r
-} // OHOS\r
-#endif // UI_RESOURCE_BREATH_IMAGE_H
\ No newline at end of file
+static const int IMAGE_BREATH_BAD = 0x100001;\r
+static const int IMAGE_BREATH_BG1 = 0x100002;\r
+static const int IMAGE_BREATH_BG2 = 0x100003;\r
+static const int IMAGE_BREATH_BG3 = 0x100004;\r
+static const int IMAGE_BREATH_BG4 = 0x100005;\r
+static const int IMAGE_BREATH_CENTER = 0x100006;\r
+static const int IMAGE_BREATH_CENTER1 = 0x100007;\r
+static const int IMAGE_BREATH_CENTER2 = 0x100008;\r
+static const int IMAGE_BREATH_COMPLETE = 0x100009;\r
+static const int IMAGE_BREATH_EXCELLENT = 0x10000a;\r
+static const int IMAGE_BREATH_GOOD = 0x10000b;\r
+static const int IMAGE_BREATH_NORMAL = 0x10000c;\r
+static const int IMAGE_BREATH_OK = 0x10000d;\r
+static const int IMAGE_BREATH_PASS = 0x10000e;\r
+static const int IMAGE_BREATH_RESULT = 0x10000f;\r
+static const int IMAGE_BREATH_RETEST = 0x100010;\r
+static const int IMAGE_BREATH_ROMATA1 = 0x100011;\r
+static const int IMAGE_BREATH_ROMATA2 = 0x100012;\r
+static const int IMAGE_BREATH_SETTING = 0x100013;\r
+static const int IMAGE_BREATH_START = 0x100014;\r
+static const int IMAGE_BREATH_TIME = 0x100015;\r
+} // OHOS\r
+#endif // UI_RESOURCE_BREATH_H
\ No newline at end of file
/*\r
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UICameraResource\r
+ * Description: UIResourceCamera\r
* Create: 2025-06-05\r
*/\r
+\r
#ifndef UI_RESOURCE_CAMERA_H\r
#define UI_RESOURCE_CAMERA_H\r
-#include <cstdint>\r
-namespace OHOS {\r
- static const int IMAGE_CONVERTER_TOOL_CAMERA_1 = 0x100001;\r
- static const int IMAGE_CONVERTER_TOOL_CAMERA_2 = 0x100002;\r
- static const int IMAGE_CONVERTER_TOOL_CAMERA_3 = 0x100003;\r
- static const int IMAGE_CONVERTER_TOOL_CAMERA_4 = 0x100004;\r
- static const int IMAGE_CONVERTER_TOOL_CAMERA_5 = 0x100005;\r
\r
-} // OHOS\r
-#endif // UI_RESOURCE_CAMERA_H\r
+namespace OHOS {\r
+static const int IMAGE_CAMERA_TAKEPHOTO = 0x100001;\r
+static const int IMAGE_CAMERA_DISCONNECT = 0x100002;\r
+} // OHOS\r
+#endif // UI_RESOURCE_CAMERA_H\r
/*\r
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UIWeatherResource\r
+ * Description: UIResourceDate\r
* Create: 2025-06-10\r
*/\r
+\r
#ifndef UI_RESOURCE_DATE_H\r
#define UI_RESOURCE_DATE_H\r
-#include <cstdint>\r
+\r
namespace OHOS {\r
- static const int DIR_MASK = 0xfff00000;\r
- static const int PNG_MASK = 0x000fffff;\r
- static const int IMAGE_CONVERTER_TOOL_DATE1 = 0x100001;\r
- static const int IMAGE_CONVERTER_TOOL_DATE2 = 0x100002;\r
- static const int IMAGE_CONVERTER_TOOL_DATE3 = 0x100003;\r
- static const int IMAGE_CONVERTER_TOOL_DATE4 = 0x100004;\r
- static const int IMAGE_CONVERTER_TOOL_DATE5 = 0x100005;\r
- static const int IMAGE_CONVERTER_TOOL_DATE6 = 0x100006;\r
- static const int IMAGE_CONVERTER_TOOL_DATE7 = 0x100007;\r
- static const int IMAGE_CONVERTER_TOOL_DATE8 = 0x100008;\r
-} // OHOS\r
-#endif // UI_RESOURCE_DATE_H\r
+static const int IMAGE_DATE_BG1 = 0x100001;\r
+static const int IMAGE_DATE_BG2 = 0x100002;\r
+static const int IMAGE_DATE_GRAY = 0x100003;\r
+static const int IMAGE_DATE_RED = 0x100004;\r
+static const int IMAGE_DATE_SELECT = 0x100005;\r
+static const int IMAGE_DATE_SIGNS = 0x100006;\r
+static const int IMAGE_DATE_WHITE = 0x100007;\r
+} // OHOS\r
+#endif // UI_RESOURCE_DATE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceEmpty\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_RESOURCE_EMPTY_H\r
+#define UI_RESOURCE_EMPTY_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_EMPTY_BG = 0x100001;\r
+} // OHOS\r
+#endif // UI_RESOURCE_EMPTY_H\r
/*\r
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UIFindPhoneResource\r
+ * Description: UIResourceFindPhone\r
* Create: 2025-2-13\r
*/\r
+\r
#ifndef UI_RESOURCE_FINDPHONE_H\r
#define UI_RESOURCE_FINDPHONE_H\r
-#include <cstdint>\r
+\r
namespace OHOS {\r
- static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_1 = 0x100001;\r
- static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_2 = 0x100002;\r
- static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_3 = 0x100003;\r
- static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4 = 0x100004;\r
- static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5 = 0x100005;\r
- static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_6 = 0x100006;\r
- static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7 = 0x100007;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE001 = 0x100008;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE002 = 0x100009;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE003 = 0x10000a;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE004 = 0x10000b;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE005 = 0x10000c;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE006 = 0x10000d;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE007 = 0x10000e;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE008 = 0x10000f;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE009 = 0x100010;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE010 = 0x100011;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE011 = 0x100012;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE012 = 0x100013;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE013 = 0x100014;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE014 = 0x100015;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE015 = 0x100016;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE016 = 0x100017;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE017 = 0x100018;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE018 = 0x100019;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE019 = 0x10001a;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE020 = 0x10001b;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE021 = 0x10001c;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE022 = 0x10001d;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE023 = 0x10001e;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE024 = 0x10001f;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE025 = 0x100020;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE026 = 0x100021;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE027 = 0x100022;\r
- static const int IMAGE_CONVERTER_TOOL_FINDPHONE028 = 0x100023;\r
-} // OHOS\r
-#endif // UI_RESOURCE_FINDPHONE_H\r
+static const int IMAGE_FINDPHONE_CONNECT = 0x100001;\r
+static const int IMAGE_FINDPHONE_DISCONNECT = 0x100002;\r
+static const int IMAGE_FINDPHONE_FRAME01 = 0x100003;\r
+static const int IMAGE_FINDPHONE_FRAME02 = 0x100004;\r
+static const int IMAGE_FINDPHONE_FRAME03 = 0x100005;\r
+static const int IMAGE_FINDPHONE_FRAME04 = 0x100006;\r
+static const int IMAGE_FINDPHONE_FRAME05 = 0x100007;\r
+static const int IMAGE_FINDPHONE_FRAME06 = 0x100008;\r
+static const int IMAGE_FINDPHONE_FRAME07 = 0x100009;\r
+static const int IMAGE_FINDPHONE_FRAME08 = 0x10000a;\r
+static const int IMAGE_FINDPHONE_FRAME09 = 0x10000b;\r
+static const int IMAGE_FINDPHONE_FRAME10 = 0x10000c;\r
+static const int IMAGE_FINDPHONE_FRAME11 = 0x10000d;\r
+static const int IMAGE_FINDPHONE_FRAME12 = 0x10000e;\r
+static const int IMAGE_FINDPHONE_FRAME13 = 0x10000f;\r
+static const int IMAGE_FINDPHONE_FRAME14 = 0x100010;\r
+static const int IMAGE_FINDPHONE_FRAME15 = 0x100011;\r
+static const int IMAGE_FINDPHONE_FRAME16 = 0x100012;\r
+static const int IMAGE_FINDPHONE_FRAME17 = 0x100013;\r
+static const int IMAGE_FINDPHONE_FRAME18 = 0x100014;\r
+static const int IMAGE_FINDPHONE_FRAME19 = 0x100015;\r
+static const int IMAGE_FINDPHONE_FRAME20 = 0x100016;\r
+static const int IMAGE_FINDPHONE_FRAME21 = 0x100017;\r
+static const int IMAGE_FINDPHONE_FRAME22 = 0x100018;\r
+static const int IMAGE_FINDPHONE_FRAME23 = 0x100019;\r
+static const int IMAGE_FINDPHONE_FRAME24 = 0x10001a;\r
+static const int IMAGE_FINDPHONE_FRAME25 = 0x10001b;\r
+static const int IMAGE_FINDPHONE_FRAME26 = 0x10001c;\r
+static const int IMAGE_FINDPHONE_FRAME27 = 0x10001d;\r
+static const int IMAGE_FINDPHONE_FRAME28 = 0x10001e;\r
+static const int IMAGE_FINDPHONE_RESET = 0x10001f;\r
+} // OHOS\r
+#endif // UI_RESOURCE_FINDPHONE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResouceFlashlight\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef UI_RESOURCE_FLASHLIGHT_H\r
+#define UI_RESOURCE_FLASHLIGHT_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_FLASHLIGHT_BLINKBUTTON = 0x100001;\r
+static const int IMAGE_FLASHLIGHT_BLINKITEM = 0x100002;\r
+static const int IMAGE_FLASHLIGHT_COLORITEM = 0x100003;\r
+static const int IMAGE_FLASHLIGHT_COLOR_DARK_BLUE_BUTTON = 0x100004;\r
+static const int IMAGE_FLASHLIGHT_COLOR_DARK_BLUE_PRESSBUTTON = 0x100005;\r
+static const int IMAGE_FLASHLIGHT_COLOR_GREEN_BUTTON = 0x100006;\r
+static const int IMAGE_FLASHLIGHT_COLOR_GREEN_PRESSBUTTON = 0x100007;\r
+static const int IMAGE_FLASHLIGHT_COLOR_LIGHT_BLUE_BUTTON = 0x100008;\r
+static const int IMAGE_FLASHLIGHT_COLOR_LIGHT_BLUE_PRESSBUTTON = 0x100009;\r
+static const int IMAGE_FLASHLIGHT_COLOR_MULTI_BUTTON = 0x10000a;\r
+static const int IMAGE_FLASHLIGHT_COLOR_MULTI_PRESSBUTTON = 0x10000b;\r
+static const int IMAGE_FLASHLIGHT_COLOR_ORANGE_BUTTON = 0x10000c;\r
+static const int IMAGE_FLASHLIGHT_COLOR_ORANGE_PRESSBUTTON = 0x10000d;\r
+static const int IMAGE_FLASHLIGHT_COLOR_PURPLE_BUTTON = 0x10000e;\r
+static const int IMAGE_FLASHLIGHT_COLOR_PURPLE_PRESSBUTTON = 0x10000f;\r
+static const int IMAGE_FLASHLIGHT_COLOR_RED_BUTTON = 0x100010;\r
+static const int IMAGE_FLASHLIGHT_COLOR_RED_PRESSBUTTON = 0x100011;\r
+static const int IMAGE_FLASHLIGHT_COLOR_WHITE_BUTTON = 0x100012;\r
+static const int IMAGE_FLASHLIGHT_COLOR_WHITE_PRESSBUTTON = 0x100013;\r
+static const int IMAGE_FLASHLIGHT_COLOR_YELLOW_BUTTON = 0x100014;\r
+static const int IMAGE_FLASHLIGHT_COLOR_YELLOW_PRESSBUTTON = 0x100015;\r
+static const int IMAGE_FLASHLIGHT_DOWNARROW = 0x100016;\r
+static const int IMAGE_FLASHLIGHT_FLASHLIGHTON = 0x100017;\r
+static const int IMAGE_FLASHLIGHT_PLAY_BLACK_PAGE = 0x100018;\r
+static const int IMAGE_FLASHLIGHT_PLAY_DARK_BLUE_PAGE = 0x100019;\r
+static const int IMAGE_FLASHLIGHT_PLAY_GREEN_PAGE = 0x10001a;\r
+static const int IMAGE_FLASHLIGHT_PLAY_LIGHT_BLUE_PAGE = 0x10001b;\r
+static const int IMAGE_FLASHLIGHT_PLAY_MULTI_PAGE = 0x10001c;\r
+static const int IMAGE_FLASHLIGHT_PLAY_ORANGE_PAGE = 0x10001d;\r
+static const int IMAGE_FLASHLIGHT_PLAY_PURPLE_PAGE = 0x10001e;\r
+static const int IMAGE_FLASHLIGHT_PLAY_RED_PAGE = 0x10001f;\r
+static const int IMAGE_FLASHLIGHT_PLAY_WHITE_PAGE = 0x100020;\r
+static const int IMAGE_FLASHLIGHT_PLAY_YELLOW_PAGE = 0x100021;\r
+static const int IMAGE_FLASHLIGHT_RECOVERBUTTON = 0x100022;\r
+static const int IMAGE_FLASHLIGHT_RECOVERCANCLE = 0x100023;\r
+static const int IMAGE_FLASHLIGHT_RECOVERCONFIRM = 0x100024;\r
+static const int IMAGE_FLASHLIGHT_RIGHTARROW = 0x100025;\r
+} // OHOS\r
+#endif // UI_RESOURCE_FLASHLIGHT_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceHeartRate\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef UI_RESOURCE_HEARTRATE_H\r
+#define UI_RESOURCE_HEARTRATE_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_HEART_RATE_BG1 = 0x100001;\r
+static const int IMAGE_HEART_RATE_BG2 = 0x100002;\r
+static const int IMAGE_HEART_RATE_DOWN = 0x100003;\r
+static const int IMAGE_HEART_RATE_FRAME00 = 0x100004;\r
+static const int IMAGE_HEART_RATE_FRAME01 = 0x100005;\r
+static const int IMAGE_HEART_RATE_FRAME02 = 0x100006;\r
+static const int IMAGE_HEART_RATE_FRAME03 = 0x100007;\r
+static const int IMAGE_HEART_RATE_FRAME04 = 0x100008;\r
+static const int IMAGE_HEART_RATE_FRAME05 = 0x100009;\r
+static const int IMAGE_HEART_RATE_FRAME06 = 0x10000a;\r
+static const int IMAGE_HEART_RATE_FRAME07 = 0x10000b;\r
+static const int IMAGE_HEART_RATE_FRAME08 = 0x10000c;\r
+static const int IMAGE_HEART_RATE_FRAME09 = 0x10000d;\r
+static const int IMAGE_HEART_RATE_FRAME10 = 0x10000e;\r
+static const int IMAGE_HEART_RATE_FRAME11 = 0x10000f;\r
+static const int IMAGE_HEART_RATE_FRAME12 = 0x100010;\r
+static const int IMAGE_HEART_RATE_FRAME13 = 0x100011;\r
+static const int IMAGE_HEART_RATE_FRAME14 = 0x100012;\r
+static const int IMAGE_HEART_RATE_FRAME15 = 0x100013;\r
+static const int IMAGE_HEART_RATE_FRAME16 = 0x100014;\r
+static const int IMAGE_HEART_RATE_FRAME17 = 0x100015;\r
+static const int IMAGE_HEART_RATE_FRAME18 = 0x100016;\r
+static const int IMAGE_HEART_RATE_FRAME19 = 0x100017;\r
+static const int IMAGE_HEART_RATE_FRAME20 = 0x100018;\r
+static const int IMAGE_HEART_RATE_FRAME21 = 0x100019;\r
+static const int IMAGE_HEART_RATE_FRAME22 = 0x10001a;\r
+static const int IMAGE_HEART_RATE_FRAME23 = 0x10001b;\r
+static const int IMAGE_HEART_RATE_FRAME24 = 0x10001c;\r
+static const int IMAGE_HEART_RATE_FRAME25 = 0x10001d;\r
+static const int IMAGE_HEART_RATE_FRAME26 = 0x10001e;\r
+static const int IMAGE_HEART_RATE_FRAME27 = 0x10001f;\r
+static const int IMAGE_HEART_RATE_FRAME28 = 0x100020;\r
+static const int IMAGE_HEART_RATE_FRAME29 = 0x100021;\r
+static const int IMAGE_HEART_RATE_PREVIEW1 = 0x100022;\r
+static const int IMAGE_HEART_RATE_PREVIEW2 = 0x100023;\r
+static const int IMAGE_HEART_RATE_RESET = 0x100024;\r
+static const int IMAGE_HEART_RATE_UP = 0x100025;\r
+} // OHOS\r
+#endif // UI_RESOURCE_HEARTRATE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceMessage\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef UI_RESOURCE_MESSAGE_H\r
+#define UI_RESOURCE_MESSAGE_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_MESSAGE_BG = 0x100001;\r
+static const int IMAGE_MESSAGE_CALENDAR = 0x100002;\r
+static const int IMAGE_MESSAGE_CANCEL = 0x100003;\r
+static const int IMAGE_MESSAGE_CONFIRM = 0x100004;\r
+static const int IMAGE_MESSAGE_DELETE = 0x100005;\r
+static const int IMAGE_MESSAGE_DUANXIN = 0x100006;\r
+static const int IMAGE_MESSAGE_DY = 0x100007;\r
+static const int IMAGE_MESSAGE_QQ = 0x100008;\r
+static const int IMAGE_MESSAGE_RING = 0x100009;\r
+static const int IMAGE_MESSAGE_SINGLE_DELETE = 0x10000a;\r
+static const int IMAGE_MESSAGE_TOUTIAO = 0x10000b;\r
+static const int IMAGE_MESSAGE_WB = 0x10000c;\r
+static const int IMAGE_MESSAGE_WX = 0x10000d;\r
+static const int IMAGE_MESSAGE_XHS = 0x10000e;\r
+} // OHOS\r
+#endif // UI_RESOURCE_MESSAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UiResourcePhoneMenu\r
+ * Create: 2025-2-13\r
+ */\r
+\r
+#ifndef UI_RESOURCE_PHONEMENU_H\r
+#define UI_RESOURCE_PHONEMENU_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_PHONEMENU_ANSWER = 0x100001;\r
+static const int IMAGE_PHONEMENU_CALL = 0x100002;\r
+static const int IMAGE_PHONEMENU_CALLIN = 0x100003;\r
+static const int IMAGE_PHONEMENU_CALLIN_ICON = 0x100004;\r
+static const int IMAGE_PHONEMENU_CALLOUT = 0x100005;\r
+static const int IMAGE_PHONEMENU_CALLOUT_ICON = 0x100006;\r
+static const int IMAGE_PHONEMENU_CONTACTS = 0x100007;\r
+static const int IMAGE_PHONEMENU_CONTACTS_BOOKS = 0x100008;\r
+static const int IMAGE_PHONEMENU_DEL = 0x100009;\r
+static const int IMAGE_PHONEMENU_DIAL = 0x10000a;\r
+static const int IMAGE_PHONEMENU_DISCONNECT = 0x10000b;\r
+static const int IMAGE_PHONEMENU_HANGUP = 0x10000c;\r
+static const int IMAGE_PHONEMENU_MIC = 0x10000d;\r
+static const int IMAGE_PHONEMENU_MIC_MUTE = 0x10000e;\r
+static const int IMAGE_PHONEMENU_PHONE = 0x10000f;\r
+static const int IMAGE_PHONEMENU_POUND_KEY = 0x100010;\r
+static const int IMAGE_PHONEMENU_RECENT_CALL = 0x100011;\r
+static const int IMAGE_PHONEMENU_STAR_KEY = 0x100012;\r
+} // OHOS\r
+#endif // UI_RESOURCE_PHONEMENU_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceSettings\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_RESOURCE_SETTINGS_H\r
+#define UI_RESOURCE_SETTINGS_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_3D_FOLD_01 = 0x100001;\r
+static const int IMAGE_3D_FOLD_02 = 0x100002;\r
+static const int IMAGE_3D_FOLD_03 = 0x100003;\r
+static const int IMAGE_3D_FOLD_04 = 0x100004;\r
+static const int IMAGE_3D_FOLD_05 = 0x100005;\r
+static const int IMAGE_3D_FOLD_06 = 0x100006;\r
+static const int IMAGE_3D_FOLD_07 = 0x100007;\r
+static const int IMAGE_3D_FOLD_08 = 0x100008;\r
+static const int IMAGE_3D_FOLD_09 = 0x100009;\r
+static const int IMAGE_3D_FOLD_10 = 0x10000a;\r
+static const int IMAGE_ARROW = 0x10000b;\r
+static const int IMAGE_BG = 0x10000c;\r
+static const int IMAGE_BLUETOOTH = 0x10000d;\r
+static const int IMAGE_CANCEL = 0x10000e;\r
+static const int IMAGE_CARD_ADD_ADD = 0x10000f;\r
+static const int IMAGE_CARD_ADD_ADDED = 0x100010;\r
+static const int IMAGE_CARD_FLIP_01 = 0x100011;\r
+static const int IMAGE_CARD_FLIP_02 = 0x100012;\r
+static const int IMAGE_CARD_FLIP_03 = 0x100013;\r
+static const int IMAGE_CARD_FLIP_04 = 0x100014;\r
+static const int IMAGE_CARD_FLIP_05 = 0x100015;\r
+static const int IMAGE_CARD_FLIP_06 = 0x100016;\r
+static const int IMAGE_CARD_FLIP_07 = 0x100017;\r
+static const int IMAGE_CARD_FLIP_08 = 0x100018;\r
+static const int IMAGE_CARD_FLIP_09 = 0x100019;\r
+static const int IMAGE_CARD_FLIP_10 = 0x10001a;\r
+static const int IMAGE_CARD_LIST_CARDANIMATOR = 0x10001b;\r
+static const int IMAGE_CARD_LIST_CARDMANAGER = 0x10001c;\r
+static const int IMAGE_CARD_MGR_ADD = 0x10001d;\r
+static const int IMAGE_CARD_MGR_DEL = 0x10001e;\r
+static const int IMAGE_CONNECT = 0x10001f;\r
+static const int IMAGE_DESKTOP_BG = 0x100020;\r
+static const int IMAGE_DESKTOP_BRIGHTNESS_BG = 0x100021;\r
+static const int IMAGE_DESKTOP_BRIGHTNESS_FG = 0x100022;\r
+static const int IMAGE_DESKTOP_DIALSTYLE_AOD = 0x100023;\r
+static const int IMAGE_DESKTOP_DIALSTYLE_COVERFLOW = 0x100024;\r
+static const int IMAGE_DESKTOP_DIALSTYLE_ROLLER = 0x100025;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_APPLIST = 0x100026;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_FOOTBALL = 0x100027;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_HEXAGONS = 0x100028;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_PLANET = 0x100029;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_SPHERE = 0x10002a;\r
+static const int IMAGE_DESKTOP_HOME_SELECTED_WATERFALL = 0x10002b;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_APPLIST = 0x10002c;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_FOOTBALL = 0x10002d;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_HEXAGONS = 0x10002e;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_PLANET = 0x10002f;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_SPHERE = 0x100030;\r
+static const int IMAGE_DESKTOP_HOME_UNSELECT_WATERFALL = 0x100031;\r
+static const int IMAGE_DESKTOP_LIST_DIAL = 0x100032;\r
+static const int IMAGE_DESKTOP_LIST_DIAL_STYLE = 0x100033;\r
+static const int IMAGE_DESKTOP_LIST_HOME = 0x100034;\r
+static const int IMAGE_DISPLAY_BRIGHTNESS_ADD = 0x100035;\r
+static const int IMAGE_DISPLAY_BRIGHTNESS_SUB = 0x100036;\r
+static const int IMAGE_DISPLAY_LIST_ADJUST_BRIGHTNESS = 0x100037;\r
+static const int IMAGE_DISPLAY_LIST_AUTO_ADJUST = 0x100038;\r
+static const int IMAGE_DISPLAY_LIST_SCREEN_OFF_TIME = 0x100039;\r
+static const int IMAGE_DISPLAY_LIST_SCREEN_ON_TIME = 0x10003a;\r
+static const int IMAGE_DISPLAY_OK = 0x10003b;\r
+static const int IMAGE_MAIN_LIST_ABOUT = 0x10003c;\r
+static const int IMAGE_MAIN_LIST_ARROW = 0x10003d;\r
+static const int IMAGE_MAIN_LIST_BLUETOOTH = 0x10003e;\r
+static const int IMAGE_MAIN_LIST_CARD = 0x10003f;\r
+static const int IMAGE_MAIN_LIST_DESKTOP = 0x100040;\r
+static const int IMAGE_MAIN_LIST_DISPLAY = 0x100041;\r
+static const int IMAGE_MAIN_LIST_POWER = 0x100042;\r
+static const int IMAGE_MAIN_LIST_SYSTEM = 0x100043;\r
+static const int IMAGE_OK = 0x100044;\r
+static const int IMAGE_OK_BLUE = 0x100045;\r
+static const int IMAGE_OK_DOWN = 0x100046;\r
+static const int IMAGE_PAGE_BACKGROUND = 0x100047;\r
+static const int IMAGE_PHONE = 0x100048;\r
+static const int IMAGE_PUSH_PRESS_01 = 0x100049;\r
+static const int IMAGE_PUSH_PRESS_02 = 0x10004a;\r
+static const int IMAGE_PUSH_PRESS_03 = 0x10004b;\r
+static const int IMAGE_PUSH_PRESS_04 = 0x10004c;\r
+static const int IMAGE_PUSH_PRESS_05 = 0x10004d;\r
+static const int IMAGE_PUSH_PRESS_06 = 0x10004e;\r
+static const int IMAGE_PUSH_PRESS_07 = 0x10004f;\r
+static const int IMAGE_PUSH_PRESS_08 = 0x100050;\r
+static const int IMAGE_PUSH_PRESS_09 = 0x100051;\r
+static const int IMAGE_PUSH_PRESS_10 = 0x100052;\r
+static const int IMAGE_QCODE = 0x100053;\r
+static const int IMAGE_SURPRISE = 0x100054;\r
+static const int IMAGE_SYSTEM_LIST_OTA = 0x100055;\r
+static const int IMAGE_SYSTEM_LIST_POWEROFF = 0x100056;\r
+static const int IMAGE_SYSTEM_LIST_RESTART = 0x100057;\r
+static const int IMAGE_SYSTEM_LIST_RESUME = 0x100058;\r
+static const int IMAGE_SYSTEM_OPERATION_CLOSE = 0x100059;\r
+static const int IMAGE_SYSTEM_OTA_UNBLUETOOTH = 0x10005a;\r
+static const int IMAGE_SYSTEM_OTA_UNUPDATE = 0x10005b;\r
+static const int IMAGE_SYSTEM_OTA_UPDATE = 0x10005c;\r
+static const int IMAGE_TRAINSTION_END = 0x10005d;\r
+static const int IMAGE_TRAINSTION_START = 0x10005e;\r
+static const int IMAGE_TURN_PAGE_01 = 0x10005f;\r
+static const int IMAGE_TURN_PAGE_02 = 0x100060;\r
+static const int IMAGE_TURN_PAGE_03 = 0x100061;\r
+static const int IMAGE_TURN_PAGE_04 = 0x100062;\r
+static const int IMAGE_TURN_PAGE_05 = 0x100063;\r
+static const int IMAGE_TURN_PAGE_06 = 0x100064;\r
+static const int IMAGE_TURN_PAGE_07 = 0x100065;\r
+static const int IMAGE_TURN_PAGE_08 = 0x100066;\r
+static const int IMAGE_TURN_PAGE_09 = 0x100067;\r
+static const int IMAGE_TURN_PAGE_10 = 0x100068;\r
+static const int IMAGE_UNPAIR = 0x100069;\r
+static const int IMAGE_WINDMILL_01 = 0x10006a;\r
+static const int IMAGE_WINDMILL_02 = 0x10006b;\r
+static const int IMAGE_WINDMILL_03 = 0x10006c;\r
+static const int IMAGE_WINDMILL_04 = 0x10006d;\r
+static const int IMAGE_WINDMILL_05 = 0x10006e;\r
+static const int IMAGE_WINDMILL_06 = 0x10006f;\r
+static const int IMAGE_WINDMILL_07 = 0x100070;\r
+static const int IMAGE_WINDMILL_08 = 0x100071;\r
+static const int IMAGE_WINDMILL_09 = 0x100072;\r
+static const int IMAGE_WINDMILL_10 = 0x100073;\r
+static const int IMAGE_Y3_1 = 0x100074;\r
+static const int IMAGE_Y3_10 = 0x100075;\r
+static const int IMAGE_Y3_11 = 0x100076;\r
+static const int IMAGE_Y3_12 = 0x100077;\r
+static const int IMAGE_Y3_13 = 0x100078;\r
+static const int IMAGE_Y3_14 = 0x100079;\r
+static const int IMAGE_Y3_15 = 0x10007a;\r
+static const int IMAGE_Y3_16 = 0x10007b;\r
+static const int IMAGE_Y3_17 = 0x10007c;\r
+static const int IMAGE_Y3_18 = 0x10007d;\r
+static const int IMAGE_Y3_19 = 0x10007e;\r
+static const int IMAGE_Y3_2 = 0x10007f;\r
+static const int IMAGE_Y3_20 = 0x100080;\r
+static const int IMAGE_Y3_21 = 0x100081;\r
+static const int IMAGE_Y3_22 = 0x100082;\r
+static const int IMAGE_Y3_23 = 0x100083;\r
+static const int IMAGE_Y3_24 = 0x100084;\r
+static const int IMAGE_Y3_25 = 0x100085;\r
+static const int IMAGE_Y3_26 = 0x100086;\r
+static const int IMAGE_Y3_27 = 0x100087;\r
+static const int IMAGE_Y3_28 = 0x100088;\r
+static const int IMAGE_Y3_29 = 0x100089;\r
+static const int IMAGE_Y3_3 = 0x10008a;\r
+static const int IMAGE_Y3_30 = 0x10008b;\r
+static const int IMAGE_Y3_31 = 0x10008c;\r
+static const int IMAGE_Y3_4 = 0x10008d;\r
+static const int IMAGE_Y3_5 = 0x10008e;\r
+static const int IMAGE_Y3_6 = 0x10008f;\r
+static const int IMAGE_Y3_7 = 0x100090;\r
+static const int IMAGE_Y3_8 = 0x100091;\r
+static const int IMAGE_Y3_9 = 0x100092;\r
+static const int IMAGE_ZOOM_01 = 0x100093;\r
+static const int IMAGE_ZOOM_02 = 0x100094;\r
+static const int IMAGE_ZOOM_03 = 0x100095;\r
+static const int IMAGE_ZOOM_04 = 0x100096;\r
+static const int IMAGE_ZOOM_05 = 0x100097;\r
+static const int IMAGE_ZOOM_06 = 0x100098;\r
+static const int IMAGE_ZOOM_07 = 0x100099;\r
+static const int IMAGE_ZOOM_08 = 0x10009a;\r
+static const int IMAGE_ZOOM_09 = 0x10009b;\r
+static const int IMAGE_ZOOM_10 = 0x10009c;\r
+static const int IMAGE_MAIN_LIST_LANGUAGE = 0x100043;\r
+} // OHOS\r
+#endif // UI_RESOURCE_SETTING_H\r
/*\r
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UISleepResource\r
+ * Description: UIResourceSleep\r
* Create: 2025-06-05\r
*/\r
+\r
#ifndef UI_RESOURCE_SLEEP_H\r
#define UI_RESOURCE_SLEEP_H\r
-#include <cstdint>\r
+\r
namespace OHOS {\r
- static const int IMAGE_CONVERTER_TOOL_BACKGROUND = 0x100001;\r
- static const int IMAGE_CONVERTER_TOOL_BLACK_BG = 0x100002;\r
- static const int IMAGE_CONVERTER_TOOL_BLUE_CIR = 0x100003;\r
- static const int IMAGE_CONVERTER_TOOL_GREEN_CIR = 0x100004;\r
- static const int IMAGE_CONVERTER_TOOL_NORECORD_SLEEP = 0x100005;\r
- static const int IMAGE_CONVERTER_TOOL_ORANGE_CIR = 0x100006;\r
- static const int IMAGE_CONVERTER_TOOL_RECORD_BG = 0x100007;\r
- static const int IMAGE_CONVERTER_TOOL_RECORD_SLEEP = 0x100008;\r
- static const int IMAGE_CONVERTER_TOOL_RED_CIR = 0x100009;\r
- static const int IMAGE_CONVERTER_TOOL_SELECTEDTIME = 0x10000a;\r
- static const int IMAGE_CONVERTER_TOOL_SELECTTIME = 0x10000b;\r
- static const int IMAGE_CONVERTER_TOOL_SETTIMEBTN = 0x10000c;\r
- static const int IMAGE_CONVERTER_TOOL_SETTING = 0x10000d;\r
- static const int IMAGE_CONVERTER_TOOL_START_GRAY = 0x10000e;\r
- static const int IMAGE_CONVERTER_TOOL_STAR_GRAY = 0x10000f;\r
- static const int IMAGE_CONVERTER_TOOL_STAR_YELLOW = 0x100010;\r
- static const int IMAGE_CONVERTER_TOOL_TIPS = 0x100011;\r
-} // OHOS\r
-#endif // UI_RESOURCE_SLEEP_H\r
+static const int IMAGE_SLEEP_BACKGROUND = 0x100001;\r
+static const int IMAGE_SLEEP_BLUE_CIR = 0x100002;\r
+static const int IMAGE_SLEEP_GREEN_CIR = 0x100003;\r
+static const int IMAGE_SLEEP_NORECORD_SLEEP = 0x100004;\r
+static const int IMAGE_SLEEP_ORANGE_CIR = 0x100005;\r
+static const int IMAGE_SLEEP_RECORD_BG = 0x100006;\r
+static const int IMAGE_SLEEP_RECORD_SLEEP = 0x100007;\r
+static const int IMAGE_SLEEP_RED_CIR = 0x100008;\r
+static const int IMAGE_SLEEP_SETTIMEBTN = 0x100009;\r
+static const int IMAGE_SLEEP_SETTING = 0x10000a;\r
+static const int IMAGE_SLEEP_SLEEPING_MOON = 0x10000b;\r
+static const int IMAGE_SLEEP_SLEEPING_TIME = 0x10000c;\r
+static const int IMAGE_SLEEP_START_GRAY = 0x10000d;\r
+static const int IMAGE_SLEEP_STAR_GRAY = 0x10000e;\r
+static const int IMAGE_SLEEP_STAR_YELLOW = 0x10000f;\r
+} // OHOS\r
+#endif // UI_RESOURCE_SLEEP_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceSport\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_RESOURCE_SPORT_H\r
+#define UI_RESOURCE_SPORT_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_SPORT_10KM = 0x100001;\r
+static const int IMAGE_SPORT_10MIN = 0x100002;\r
+static const int IMAGE_SPORT_120MIN = 0x100003;\r
+static const int IMAGE_SPORT_15KM = 0x100004;\r
+static const int IMAGE_SPORT_180MIN = 0x100005;\r
+static const int IMAGE_SPORT_1KM = 0x100006;\r
+static const int IMAGE_SPORT_200MIN = 0x100007;\r
+static const int IMAGE_SPORT_20KM = 0x100008;\r
+static const int IMAGE_SPORT_20MIN = 0x100009;\r
+static const int IMAGE_SPORT_25KM = 0x10000a;\r
+static const int IMAGE_SPORT_30KM = 0x10000b;\r
+static const int IMAGE_SPORT_30MIN = 0x10000c;\r
+static const int IMAGE_SPORT_3KM = 0x10000d;\r
+static const int IMAGE_SPORT_40KM = 0x10000e;\r
+static const int IMAGE_SPORT_5KM = 0x10000f;\r
+static const int IMAGE_SPORT_60MIN = 0x100010;\r
+static const int IMAGE_SPORT_7KM = 0x100011;\r
+static const int IMAGE_SPORT_BATTERY1 = 0x100012;\r
+static const int IMAGE_SPORT_BATTERY2 = 0x100013;\r
+static const int IMAGE_SPORT_BATTERY3 = 0x100014;\r
+static const int IMAGE_SPORT_BATTERY4 = 0x100015;\r
+static const int IMAGE_SPORT_BATTERY5 = 0x100016;\r
+static const int IMAGE_SPORT_BG = 0x100017;\r
+static const int IMAGE_SPORT_BG1 = 0x100018;\r
+static const int IMAGE_SPORT_BG2 = 0x100019;\r
+static const int IMAGE_SPORT_BG3 = 0x10001a;\r
+static const int IMAGE_SPORT_BG4 = 0x10001b;\r
+static const int IMAGE_SPORT_BG5 = 0x10001c;\r
+static const int IMAGE_SPORT_BG6 = 0x10001d;\r
+static const int IMAGE_SPORT_CALORIE = 0x10001e;\r
+static const int IMAGE_SPORT_CANCEL = 0x10001f;\r
+static const int IMAGE_SPORT_CLIMBING1 = 0x100020;\r
+static const int IMAGE_SPORT_CLIMBING2 = 0x100021;\r
+static const int IMAGE_SPORT_CONFIRM = 0x100022;\r
+static const int IMAGE_SPORT_CROWN = 0x100023;\r
+static const int IMAGE_SPORT_CYCLING1 = 0x100024;\r
+static const int IMAGE_SPORT_CYCLING2 = 0x100025;\r
+static const int IMAGE_SPORT_DISTANCE = 0x100026;\r
+static const int IMAGE_SPORT_FACE = 0x100027;\r
+static const int IMAGE_SPORT_FINISH = 0x100028;\r
+static const int IMAGE_SPORT_GO1 = 0x100029;\r
+static const int IMAGE_SPORT_GO2 = 0x10002a;\r
+static const int IMAGE_SPORT_GO3 = 0x10002b;\r
+static const int IMAGE_SPORT_GO4 = 0x10002c;\r
+static const int IMAGE_SPORT_GO5 = 0x10002d;\r
+static const int IMAGE_SPORT_GO6 = 0x10002e;\r
+static const int IMAGE_SPORT_GPS = 0x10002f;\r
+static const int IMAGE_SPORT_HALF = 0x100030;\r
+static const int IMAGE_SPORT_HEART1 = 0x100031;\r
+static const int IMAGE_SPORT_HEART2 = 0x100032;\r
+static const int IMAGE_SPORT_HEART3 = 0x100033;\r
+static const int IMAGE_SPORT_HEARTRATE = 0x100034;\r
+static const int IMAGE_SPORT_INDOOR_RUNNING1 = 0x100035;\r
+static const int IMAGE_SPORT_INDOOR_RUNNING2 = 0x100036;\r
+static const int IMAGE_SPORT_INDOOR_SWIMMING1 = 0x100037;\r
+static const int IMAGE_SPORT_INDOOR_SWIMMING2 = 0x100038;\r
+static const int IMAGE_SPORT_INTERVAL = 0x100039;\r
+static const int IMAGE_SPORT_ITEMBG = 0x10003a;\r
+static const int IMAGE_SPORT_ITEMBG1 = 0x10003b;\r
+static const int IMAGE_SPORT_ITEMBG2 = 0x10003c;\r
+static const int IMAGE_SPORT_ITEMBG3 = 0x10003d;\r
+static const int IMAGE_SPORT_ITEMBG4 = 0x10003e;\r
+static const int IMAGE_SPORT_ITEMBG5 = 0x10003f;\r
+static const int IMAGE_SPORT_ITEMBG6 = 0x100040;\r
+static const int IMAGE_SPORT_LAP = 0x100041;\r
+static const int IMAGE_SPORT_LAP1 = 0x100042;\r
+static const int IMAGE_SPORT_LAP10 = 0x100043;\r
+static const int IMAGE_SPORT_LAP12 = 0x100044;\r
+static const int IMAGE_SPORT_LAP16 = 0x100045;\r
+static const int IMAGE_SPORT_LAP2 = 0x100046;\r
+static const int IMAGE_SPORT_LAP20 = 0x100047;\r
+static const int IMAGE_SPORT_LAP30 = 0x100048;\r
+static const int IMAGE_SPORT_LAP4 = 0x100049;\r
+static const int IMAGE_SPORT_LAP6 = 0x10004a;\r
+static const int IMAGE_SPORT_LAP8 = 0x10004b;\r
+static const int IMAGE_SPORT_MISTOUCH = 0x10004c;\r
+static const int IMAGE_SPORT_NEXT = 0x10004d;\r
+static const int IMAGE_SPORT_NONE = 0x10004e;\r
+static const int IMAGE_SPORT_OK1 = 0x10004f;\r
+static const int IMAGE_SPORT_OK2 = 0x100050;\r
+static const int IMAGE_SPORT_OK3 = 0x100051;\r
+static const int IMAGE_SPORT_OUTDOOR_RUNNING1 = 0x100052;\r
+static const int IMAGE_SPORT_OUTDOOR_RUNNING2 = 0x100053;\r
+static const int IMAGE_SPORT_OUTDOOR_SWIMMING1 = 0x100054;\r
+static const int IMAGE_SPORT_OUTDOOR_SWIMMING2 = 0x100055;\r
+static const int IMAGE_SPORT_RADIO0 = 0x100056;\r
+static const int IMAGE_SPORT_RADIO1 = 0x100057;\r
+static const int IMAGE_SPORT_REMIND = 0x100058;\r
+static const int IMAGE_SPORT_SCALE = 0x100059;\r
+static const int IMAGE_SPORT_SCREEN = 0x10005a;\r
+static const int IMAGE_SPORT_SETTING = 0x10005b;\r
+static const int IMAGE_SPORT_SIGNAL0 = 0x10005c;\r
+static const int IMAGE_SPORT_SIGNAL1 = 0x10005d;\r
+static const int IMAGE_SPORT_SIGNAL2 = 0x10005e;\r
+static const int IMAGE_SPORT_SIGNAL3 = 0x10005f;\r
+static const int IMAGE_SPORT_START = 0x100060;\r
+static const int IMAGE_SPORT_STOP = 0x100061;\r
+static const int IMAGE_SPORT_TARGET = 0x100062;\r
+static const int IMAGE_SPORT_TIME = 0x100063;\r
+static const int IMAGE_SPORT_TOGGLE0 = 0x100064;\r
+static const int IMAGE_SPORT_TOGGLE1 = 0x100065;\r
+static const int IMAGE_SPORT_TRIANGLE = 0x100066;\r
+} // OHOS\r
+#endif // UI_RESOURCE_SPORT_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceStopwatch\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_RESOURCE_STOPWATCH_H\r
+#define UI_RESOURCE_STOPWATCH_H\r
+\r
+namespace OHOS {\r
+static const int IMAGE_STOPWATCH_BG = 0x100001;\r
+static const int IMAGE_STOPWATCH_HAND = 0x100002;\r
+static const int IMAGE_STOPWATCH_PAUSE = 0x100003;\r
+static const int IMAGE_STOPWATCH_RECORD = 0x100004;\r
+static const int IMAGE_STOPWATCH_RECORD_DISABLE = 0x100005;\r
+static const int IMAGE_STOPWATCH_RESET = 0x100006;\r
+static const int IMAGE_STOPWATCH_RESET_DISABLE = 0x100007;\r
+static const int IMAGE_STOPWATCH_SCALE = 0x100008;\r
+static const int IMAGE_STOPWATCH_START = 0x100009;\r
+} // OHOS\r
+#endif // UI_RESOURCE_STOPWATCH_H\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UITimerResource\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceTimer\r
* Create: 2025-06-05\r
*/\r
+\r
#ifndef UI_RESOURCE_TIMER_H\r
#define UI_RESOURCE_TIMER_H\r
-#include <cstdint>\r
+\r
namespace OHOS {\r
- static const int IMAGE_CONVERTER_TOOL_BG_CIR = 0x100001;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_1 = 0x100002;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_15 = 0x100003;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_3 = 0x100004;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_30 = 0x100005;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_BEGIN_GRAY = 0x100006;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_BEGIN_ORANGE = 0x100007;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_BG = 0x100008;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_EXIT = 0x100009;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_PAUSE = 0x10000a;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_PAUSE_ORANGE = 0x10000b;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_PBG = 0x10000c;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_PLAY = 0x10000d;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_POINTER = 0x10000e;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_RESTART = 0x10000f;\r
- static const int IMAGE_CONVERTER_TOOL_TIMER_USER = 0x100010;\r
-} // OHOS\r
-#endif // UI_RESOURCE_TIMER_H\r
+static const int IMAGE_TIMER_1 = 0x100001;\r
+static const int IMAGE_TIMER_15 = 0x100002;\r
+static const int IMAGE_TIMER_3 = 0x100003;\r
+static const int IMAGE_TIMER_30 = 0x100004;\r
+static const int IMAGE_TIMER_BEGIN_GRAY = 0x100005;\r
+static const int IMAGE_TIMER_BEGIN_ORANGE = 0x100006;\r
+static const int IMAGE_TIMER_BG = 0x100007;\r
+static const int IMAGE_TIMER_EXIT = 0x100008;\r
+static const int IMAGE_TIMER_PAUSE = 0x100009;\r
+static const int IMAGE_TIMER_PAUSE_ORANGE = 0x10000a;\r
+static const int IMAGE_TIMER_PLAY = 0x10000b;\r
+static const int IMAGE_TIMER_RESTART = 0x10000c;\r
+static const int IMAGE_TIMER_USER = 0x10000d;\r
+} // OHOS\r
+#endif // UI_RESOURCE_TIMER_H\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: UIWeatherResource\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIResourceWeather\r
* Create: 2025-06-05\r
*/\r
-#ifndef UI_RESOURCE_WEATHER_IMAGE_H\r
-#define UI_RESOURCE_WEATHER_IMAGE_H\r
-#include <cstdint>\r
+\r
+#ifndef UI_RESOURCE_WEATHER_H\r
+#define UI_RESOURCE_WEATHER_H\r
+\r
namespace OHOS {\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER00 = 0x100001;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER01 = 0x100002;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER02 = 0x100003;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER03 = 0x100004;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER04 = 0x100005;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER05 = 0x100006;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER06 = 0x100007;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER07 = 0x100008;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER08 = 0x100009;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER09 = 0x10000a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER10 = 0x10000b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER11 = 0x10000c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER12 = 0x10000d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER13 = 0x10000e;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER14 = 0x10000f;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER15 = 0x100010;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER16 = 0x100011;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER17 = 0x100012;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER18 = 0x100013;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER19 = 0x100014;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER20 = 0x100015;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER21 = 0x100016;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER22 = 0x100017;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER23 = 0x100018;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER24 = 0x100019;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER25 = 0x10001a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER26 = 0x10001b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER27 = 0x10001c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER28 = 0x10001d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER29 = 0x10001e;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER30 = 0x10001f;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER31 = 0x100020;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER32 = 0x100021;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER33 = 0x100022;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER34 = 0x100023;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER35 = 0x100024;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER36 = 0x100025;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER37 = 0x100026;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER38 = 0x100027;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER39 = 0x100028;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER40 = 0x100029;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER41 = 0x10002a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER42 = 0x10002b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER43 = 0x10002c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER44 = 0x10002d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER45 = 0x10002e;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER46 = 0x10002f;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER47 = 0x100030;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER48 = 0x100031;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER49 = 0x100032;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER50 = 0x100033;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER51 = 0x100034;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER52 = 0x100035;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER53 = 0x100036;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER54 = 0x100037;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER55 = 0x100038;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER56 = 0x100039;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER57 = 0x10003a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER58 = 0x10003b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER59 = 0x10003c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER60 = 0x10003d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER61 = 0x10003e;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER62 = 0x10003f;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER63 = 0x100040;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER64 = 0x100041;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER65 = 0x100042;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER66 = 0x100043;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER67 = 0x100044;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER68 = 0x100045;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER69 = 0x100046;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER70 = 0x100047;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER71 = 0x100048;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER72 = 0x100049;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER73 = 0x10004a;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER74 = 0x10004b;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER75 = 0x10004c;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER76 = 0x10004d;\r
-static const int IMAGE_CONVERTER_TOOL_WEATHER77 = 0x10004e;\r
+static const int IMAGE_WEATHER_AIR = 0x100001;\r
+static const int IMAGE_WEATHER_BG1 = 0x100002;\r
+static const int IMAGE_WEATHER_BG2 = 0x100003;\r
+static const int IMAGE_WEATHER_ITEM1 = 0x100004;\r
+static const int IMAGE_WEATHER_ITEM2 = 0x100005;\r
+static const int IMAGE_WEATHER_ITEM3 = 0x100006;\r
+static const int IMAGE_WEATHER_ITEM4 = 0x100007;\r
+static const int IMAGE_WEATHER_ITEM5 = 0x100008;\r
+static const int IMAGE_WEATHER_ITEM6 = 0x100009;\r
+static const int IMAGE_WEATHER_LOCATE = 0x10000a;\r
+static const int IMAGE_WEATHER_MOON = 0x10000b;\r
+static const int IMAGE_WEATHER_MOON1 = 0x10000c;\r
+static const int IMAGE_WEATHER_MOON2 = 0x10000d;\r
+static const int IMAGE_WEATHER_MOON3 = 0x10000e;\r
+static const int IMAGE_WEATHER_MOON4 = 0x10000f;\r
+static const int IMAGE_WEATHER_MOON5 = 0x100010;\r
+static const int IMAGE_WEATHER_MOON6 = 0x100011;\r
+static const int IMAGE_WEATHER_MOON7 = 0x100012;\r
+static const int IMAGE_WEATHER_MOON8 = 0x100013;\r
+static const int IMAGE_WEATHER_NEXT = 0x100014;\r
+static const int IMAGE_WEATHER_NEXT_GRAY = 0x100015;\r
+static const int IMAGE_WEATHER_PAGE1 = 0x100016;\r
+static const int IMAGE_WEATHER_PAGE2 = 0x100017;\r
+static const int IMAGE_WEATHER_PAGE3 = 0x100018;\r
+static const int IMAGE_WEATHER_PREV = 0x100019;\r
+static const int IMAGE_WEATHER_PREV_GRAY = 0x10001a;\r
+static const int IMAGE_WEATHER_SUN = 0x10001b;\r
+static const int IMAGE_WEATHER_SUNRISE = 0x10001c;\r
+static const int IMAGE_WEATHER_SUNSET = 0x10001d;\r
+static const int IMAGE_WEATHER_WEATHER00 = 0x10001e;\r
+static const int IMAGE_WEATHER_WEATHER01 = 0x10001f;\r
+static const int IMAGE_WEATHER_WEATHER02 = 0x100020;\r
+static const int IMAGE_WEATHER_WEATHER03 = 0x100021;\r
+static const int IMAGE_WEATHER_WEATHER04 = 0x100022;\r
+static const int IMAGE_WEATHER_WEATHER05 = 0x100023;\r
+static const int IMAGE_WEATHER_WEATHER06 = 0x100024;\r
+static const int IMAGE_WEATHER_WEATHER07 = 0x100025;\r
+static const int IMAGE_WEATHER_WEATHER08 = 0x100026;\r
+static const int IMAGE_WEATHER_WEATHER09 = 0x100027;\r
+static const int IMAGE_WEATHER_WEATHER10 = 0x100028;\r
+static const int IMAGE_WEATHER_WEATHER11 = 0x100029;\r
+static const int IMAGE_WEATHER_WEATHER12 = 0x10002a;\r
+static const int IMAGE_WEATHER_WEATHER13 = 0x10002b;\r
+static const int IMAGE_WEATHER_WEATHER14 = 0x10002c;\r
+static const int IMAGE_WEATHER_WEATHER15 = 0x10002d;\r
+static const int IMAGE_WEATHER_WEATHER16 = 0x10002e;\r
+static const int IMAGE_WEATHER_WEATHER17 = 0x10002f;\r
+static const int IMAGE_WEATHER_WEATHER18 = 0x100030;\r
+static const int IMAGE_WEATHER_WEATHER19 = 0x100031;\r
+static const int IMAGE_WEATHER_WEATHER20 = 0x100032;\r
+static const int IMAGE_WEATHER_WEATHER21 = 0x100033;\r
+static const int IMAGE_WEATHER_WEATHER22 = 0x100034;\r
+static const int IMAGE_WEATHER_WEATHER23 = 0x100035;\r
+static const int IMAGE_WEATHER_WEATHER24 = 0x100036;\r
+static const int IMAGE_WEATHER_WEATHER25 = 0x100037;\r
+static const int IMAGE_WEATHER_WEATHER26 = 0x100038;\r
+static const int IMAGE_WEATHER_WEATHER27 = 0x100039;\r
+static const int IMAGE_WEATHER_WEATHER28 = 0x10003a;\r
+static const int IMAGE_WEATHER_WEATHER29 = 0x10003b;\r
+static const int IMAGE_WEATHER_WEATHER30 = 0x10003c;\r
+static const int IMAGE_WEATHER_WEATHER31 = 0x10003d;\r
+static const int IMAGE_WEATHER_WEATHER32 = 0x10003e;\r
+static const int IMAGE_WEATHER_WEATHER33 = 0x10003f;\r
+static const int IMAGE_WEATHER_WEATHER34 = 0x100040;\r
+static const int IMAGE_WEATHER_WEATHER35 = 0x100041;\r
+static const int IMAGE_WEATHER_WEATHER36 = 0x100042;\r
+static const int IMAGE_WEATHER_WEATHER37 = 0x100043;\r
+static const int IMAGE_WEATHER_WEATHER38 = 0x100044;\r
+static const int IMAGE_WEATHER_WEATHER39 = 0x100045;\r
+static const int IMAGE_WEATHER_WEATHER40 = 0x100046;\r
+static const int IMAGE_WEATHER_WEATHER41 = 0x100047;\r
+static const int IMAGE_WEATHER_WEATHER42 = 0x100048;\r
+static const int IMAGE_WEATHER_WEATHER43 = 0x100049;\r
+static const int IMAGE_WEATHER_WEATHER44 = 0x10004a;\r
+static const int IMAGE_WEATHER_WEATHER45 = 0x10004b;\r
+static const int IMAGE_WEATHER_WEATHER46 = 0x10004c;\r
+static const int IMAGE_WEATHER_WEATHER47 = 0x10004d;\r
+static const int IMAGE_WEATHER_WEATHER48 = 0x10004e;\r
+static const int IMAGE_WEATHER_WEATHER49 = 0x10004f;\r
+static const int IMAGE_WEATHER_WEATHER50 = 0x100050;\r
+static const int IMAGE_WEATHER_WEATHER51 = 0x100051;\r
+static const int IMAGE_WEATHER_WEATHER52 = 0x100052;\r
+static const int IMAGE_WEATHER_WEATHER53 = 0x100053;\r
+static const int IMAGE_WEATHER_WEATHER54 = 0x100054;\r
+static const int IMAGE_WEATHER_WEATHER55 = 0x100055;\r
+static const int IMAGE_WEATHER_WEATHER56 = 0x100056;\r
+static const int IMAGE_WEATHER_WEATHER57 = 0x100057;\r
+static const int IMAGE_WEATHER_WEATHER58 = 0x100058;\r
+static const int IMAGE_WEATHER_WEATHER59 = 0x100059;\r
+static const int IMAGE_WEATHER_WEATHER60 = 0x10005a;\r
+static const int IMAGE_WEATHER_WEATHER61 = 0x10005b;\r
+static const int IMAGE_WEATHER_WEATHER62 = 0x10005c;\r
+static const int IMAGE_WEATHER_WEATHER63 = 0x10005d;\r
+static const int IMAGE_WEATHER_WET = 0x10005e;\r
} // OHOS\r
-#endif // UI_RESOURCE_IMAGE_H\r
+#endif // UI_RESOURCE_WEATHER_H\r
#include "SliceProxy.h"
#include "AbilitySliceProxy.h"
#include "wearable_log.h"
-#include "callerlog/CallerLogModel.h"
+#include "phonemenu/PhoneMenuCallerLogModel.h"
#include "activity/ActivityModel.h"
-#include "heartrate/HeartModel.h"
#include "player/PlayersModel.h"
#include "main/HealthModel.h"
-#include "sports/SportsModel.h"
#include "offlinevoice/VocassistModel.h"
#include "screensetting/ScreenModels.h"
-#include "bluetooth/BluetoothHeadsetEvent.h"
#include "graphic_hardware_config.h"
#include "graphic_service.h"
#include "common/graphic_startup.h"
#ifdef JS_ENABLE
#include "product_adapter.h"
#endif
+#ifdef ENABLE_MODULE_CALENDAR
+#include "event_id_manager.h"
+#endif
#include "RecentManager.h"
#include "PageTransitionMgr.h"
-
+#include "date/DateModel.h"
+#include "settings/model/SettingDisplayModel.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/model/SettingBluetoothHeadsetEvent.h"
+#include "NativeLauncher.h"
namespace OHOS {
-
+int16_t BackDragListener::maxDragRegionX_ = MAX_X_IN_DRAG_REGION;
NativeLauncher::NativeLauncher() {}
NativeLauncher::~NativeLauncher() {}
#endif
GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE,
OHOS::VECTOR_FONT_DIR, DEFAULT_VECTOR_FONT_FILENAME);
+ GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE,
+ OHOS::VECTOR_FONT_DIR, BOLD_VECTOR_FONT_FILENAME);
WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeLauncher::InitNativeLauncher");
// 初始化所有预加载slice
- InitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
+ SettingInitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
NativeRegisterManager::GetInstance().InitAllNativesSlices();
- CallerLogModel::GetInstance()->InitPhoneService();
+ PhoneMenuCallerLogModel::GetInstance()->InitPhoneService();
PlayersModel::GetInstance()->AudioInit();
ActivityModel::GetInstance()->Init();
ScreenModels::GetInstance()->InitKvStorage();
+#ifdef ENABLE_MODULE_CALENDAR
+ ACELite::InitEventMaps();
+#endif
VocassistModel::GetInstance()->Init();
- HeartModel::GetInstance()->Init();
- BluetoothModel::GetInstance()->Init();
- SportsModel::GetInstance()->Init();
+ SettingBluetoothModel::GetInstance()->Init();
// 初始化默认首页
ScreenModels::GetInstance()->PreLoadAppimages();
NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN_SAMPLE);
- RecentManager::GetInstance()->SetDirPath("system/recent/");
+ RecentManager::GetInstance()->SetDirPath(APP_RECENT_PATH);
RecentManager::GetInstance()->AddToBlackList(VIEW_AOD);
RecentManager::GetInstance()->AddToBlackList(VIEW_RECENT_APP);
RecentManager::GetInstance()->AddToBlackList(VIEW_APPLIST);
RecentManager::GetInstance()->AddToBlackList(VIEW_MAIN_SAMPLE);
RecentManager::GetInstance()->SetMaxSize(5); // 5: max number of recent apps.
PageTransitionMgr::GetInstance().SetRecentMinPeriod(1000); // 1000: min period
-}
+ DateModel::GetInstance().Init();
+ SettingDisplayModel::GetInstance().InitDisplayModel();
+}
}
namespace OHOS {
-void UICardPageFactory::RegisterWatchDial(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage)
+void UICardPageFactory::RegisterCardPage(const uint16_t id, UICardPageProxyInterface* uiCardPage)
{
- if (mode >= DIAL_DISPLAY_MODE_MAX || uiCardPage == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register watch dial using invalid mode or proxy %d-%p",
- mode, uiCardPage);
+ if (uiCardPage == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register watch dial using invalid proxy %p",
+ uiCardPage);
return;
}
- if (watchDials_[mode].find(id) != watchDials_[mode].end()) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial mode %d id:%d has already been registered", mode, id);
+ if (cardPage_.find(id) != cardPage_.end()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial id:%d has already been registered", id);
return;
} else {
- watchDials_[mode].insert({id, uiCardPage});
+ cardPage_.insert({id, uiCardPage});
}
}
-UICardPage* UICardPageFactory::CreateWatchDial(uint16_t mode, uint16_t id)
+UICardPage* UICardPageFactory::CreateCardPage(uint16_t id)
{
- if (mode >= DIAL_DISPLAY_MODE_MAX ) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't create watch dial using invalid mode %d", mode);
- return nullptr;
- }
-
- auto it = watchDials_[mode].find(id);
- if (it != watchDials_[mode].end()) {
+ auto it = cardPage_.find(id);
+ if (it != cardPage_.end()) {
return it->second->CreateUICardPage();
} else {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial mode %d id:%d was not registered", mode, id);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial id:%d was not registered", id);
return nullptr;
}
}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: UICardPageFactory
+ * Author:
+ * Create: 2025-06
+ */
+
+#include "UIWatchDialFactory.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+void UIWatchDialFactory::RegisterWatchDial(const uint16_t ability, const uint16_t id,
+ UIWatchDialProxyInterface* uiWatchDial, const DialInfo* dialInfo)
+{
+ if (ability >= DIAL_DISPLAY_SUPPORT_MAX || uiWatchDial == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register watch dial using invalid ability or proxy %d-%p",
+ ability, uiWatchDial);
+ return;
+ }
+
+ if ((ability == DIAL_DISPLAY_SUPPORT_NORMAL || ability == DIAL_DISPLAY_SUPPORT_NORMAL_AOD) && dialInfo != nullptr) {
+ if (watchDials_[DIAL_DISPLAY_MODE_NORMAL].find(id) != watchDials_[DIAL_DISPLAY_MODE_NORMAL].end() ||
+ normalDialInfo_.find(id) != normalDialInfo_.end()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "normal dial(info) id:%d has already been registered", id);
+ return;
+ } else {
+ watchDials_[DIAL_DISPLAY_MODE_NORMAL].insert({id, uiWatchDial});
+ normalDialInfo_.insert({id, dialInfo});
+ }
+ }
+
+ if ((ability == DIAL_DISPLAY_SUPPORT_AOD || ability == DIAL_DISPLAY_SUPPORT_NORMAL_AOD)) {
+ if (watchDials_[DIAL_DISPLAY_MODE_AOD].find(id) != watchDials_[DIAL_DISPLAY_MODE_AOD].end()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "aod dial id:%d has already been registered", id);
+ return;
+ } else {
+ watchDials_[DIAL_DISPLAY_MODE_AOD].insert({id, uiWatchDial});
+ }
+ }
+}
+
+const DialInfo* UIWatchDialFactory::GetNormalDialInfo(uint16_t id)
+{
+ auto it = normalDialInfo_.find(id);
+ if (it != normalDialInfo_.end()) {
+ return it->second;
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "normal dial info id:%d was not created", id);
+ return nullptr;
+ }
+}
+
+uint8_t UIWatchDialFactory::GetNormalDialInfoNum()
+{
+ return normalDialInfo_.size();
+}
+
+UICardPage* UIWatchDialFactory::CreateNormalDial(uint16_t id)
+{
+ auto it = watchDials_[DIAL_DISPLAY_MODE_NORMAL].find(id);
+ if (it != watchDials_[DIAL_DISPLAY_MODE_NORMAL].end()) {
+ return it->second->CreateWatchDialCardPage(id);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "normal dial id:%d was not registered", id);
+ return nullptr;
+ }
+}
+
+UIFragment* UIWatchDialFactory::CreateAodDial(uint16_t id)
+{
+ auto it = watchDials_[DIAL_DISPLAY_MODE_AOD].find(id);
+ if (it != watchDials_[DIAL_DISPLAY_MODE_AOD].end()) {
+ return it->second->CreateWatchDialFragment(id);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "aod dial id:%d was not registered", id);
+ return nullptr;
+ }
+}
+} // namespace OHOS
#include "securec.h"
#include "broadcast_service.h"
#include "clock/MainClockView.h"
-#include "indoorwalk/IndoorWalkPresenter.h"
#include "activity/ActivityWeekView.h"
#include "graphic_service.h"
});
}
- IndoorWalkPresenter *indoorWalkPresenter = OHOS::IndoorWalkPresenter::GetInstance();
- if (indoorWalkPresenter != nullptr) {
- GraphicService::GetInstance()->PostGraphicEvent([value]() {
- if (OHOS::IndoorWalkPresenter::GetInstance() != nullptr) {
- OHOS::IndoorWalkPresenter::GetInstance()->ModifiesSteps(value);
- }
- });
- }
-
ActivityWeekView *activityWeekView = OHOS::ActivityWeekView::GetInstance();
if (activityWeekView == nullptr) {
return;
namespace OHOS {\r
\r
REGIST_SLICE(VIEW_MAIN_ACTIVITY, MainActivityView, ActivityPresenter);\r
-\r
+ \r
static ActivityPresenter *g_pActivityPresenter = nullptr;\r
ActivityPresenter::ActivityPresenter()\r
{\r
#include "graphic_service.h"
#include "player/PlayersModel.h"
#include "phoneservice/PhoneService.h"
+#include "phonemenu/PhoneMenuView.h"
#include "uiservice/ui_service.h"
#ifdef __cplusplus
uint16_t AlarmClockModel::JudgePreSlice(void)
{
- uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+ uint32_t targetId = NativeAbility::GetInstance().GetPreTargetId();
+ uint16_t preSlice = static_cast<uint16_t>(targetId & SLICE_MASK);
+ uint16_t prePage = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
if (preSlice == VIEW_ALARM_POP_UP || preSlice < VIEW_SETTING) {
preSlice = VIEW_MAIN_SAMPLE;
- } else if ((preSlice == VIEW_MAEKPHONE_SAMPLE) &&
+ } else if ((preSlice == VIEW_PHONE_MENU && prePage == PhoneMenuPages::PHONE_MENU_CALLING_PAGE) &&
(GetCurrCallNum() == 0 || GetScoConnectState() != HFP_SCO_STATE_CONNECTED)) {
int num;
PhoneCallInfo callList[MULTI_CALL_MAX_NUME]{};
#include "common/screen.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
#include <string>\r
#include <iostream>\r
#include <sstream>\r
return true;\r
}\r
\r
-void AlarmPopUpPresenter::Notify()\r
+void AlarmPopUpPresenter::Callback()\r
{\r
if (isStartCalcu) {\r
if (calcuNotifyNums == RENDER_FINISH) {\r
++calcuNotifyNums;\r
}\r
}\r
+\r
+void AlarmPopUpPresenter::OnResume()\r
+{\r
+ Init();\r
+}\r
+\r
+void AlarmPopUpPresenter::OnPause()\r
+{\r
+ Deinit();\r
+}\r
}
\ No newline at end of file
#include "common/screen.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
#include <string>\r
\r
namespace OHOS {\r
AlipayModel::GetInstance()->AlipayFinishBind();\r
}\r
AlipayModel::GetInstance()->AlipayStopSwitchTimer();\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
\r
} else if (&view == container[ALIPAY_TRANS_LIST_VIEW]) {\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlipayMainView::DropView::container[ALIPAY_TRANS_LIST_VIEW]");\r
alipayMode_->AlipayExitLpm();\r
if (!alipayMode_->AlipayInitModel()) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlipayPresenter::OnStart AlipayInitModel fail.");\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
return;\r
}\r
}\r
view_->ChangeView(ALIPAY_TRANS_LIST_VIEW, ALIPAY_TRANS_ANI_VIEW);\r
return;\r
}\r
- \r
+\r
ret = alipayMode_->AlipayGetTransCode(index);\r
if (ret == 0) {\r
view_->ChangeView(ALIPAY_TRANS_LIST_VIEW, ALIPAY_TRANS_VIEW);\r
#include "aod_view/AodPresenter.h"
#include "NativeRegisterManager.h"
+#include "main/dial/DialViewGroup.h"
namespace OHOS {
REGIST_SLICE(VIEW_AOD, AodView, AodPresenter);
-void AodPresenter::Notify()
+void AodPresenter::Callback()
{
- view_->PeriodicUpdate();
+ if (view_ != nullptr) {
+ view_->Update();
+ }
+}
+
+void AodPresenter::OnResume()
+{
+ Init();
+}
+
+void AodPresenter::OnPause()
+{
+ Deinit();
}
} // OHOS
#include "aod_view/AodPresenter.h"
#include "aod_view/AodModel.h"
#include "common/graphic_utils.h"
-#include "UICardPageFactory.h"
+#include "UIWatchDialFactory.h"
#include "main/DialBinParser.h"
#include "main/dial/DialViewGroup.h"
#include "clock/AmbientClockView.h"
#include "main/dial/DialModelTime.h"
+#include "clock/GradientAodView.h"
+#include "common/task.h"
+#include "common/periodicupdate_interface.h"
namespace OHOS {
AodView::~AodView()
{
+ if (clockDialFragment_ != nullptr) {
+ delete clockDialFragment_;
+ clockDialFragment_ = nullptr;
+ clockDial_ = nullptr;
+ }
+
if (clockDial_ != nullptr) {
delete clockDial_;
clockDial_ = nullptr;
DialViewGroup *dial = dynamic_cast<DialViewGroup*>(clockDial_);
if (dial != nullptr) {
dial->PreLoad();
- dial->OnActive();
presenter_->SetPeriod(dial->GetPeriod());
- } else {
- AmbientClockView *clock = dynamic_cast<AmbientClockView*>(clockDial_);
- if (clock != nullptr) {
- presenter_->SetPeriod(clock->GetPeriod());
+ } else if (clockDialFragment_ != nullptr) {
+#ifndef __WIN32
+ PeriodicUpdateInterface *interface = dynamic_cast<PeriodicUpdateInterface*>(clockDialFragment_);
+ if (interface != nullptr) {
+ presenter_->SetPeriod(interface->GetPeriod());
}
+#endif
}
isLoaded_ = true;
AddViewToRootContainer(clockDial_);
void AodView::OnStop()
{
if (clockDial_ != nullptr) {
- DialViewGroup *dial = dynamic_cast<DialViewGroup *>(clockDial_);
+ DialViewGroup *dial = dynamic_cast<DialViewGroup*>(clockDial_);
if (dial != nullptr) {
dial->OnInactive();
dial->UnLoad();
UIViewGroup *AodView::InitAodDial(DialSetting &setting)
{
- return UICardPageFactory::GetInstance().CreateWatchDial(DIAL_DISPLAY_MODE_AOD, setting.dialId);
+ clockDialFragment_ = UIWatchDialFactory::GetInstance().CreateAodDial(setting.dialId);
+ if (clockDialFragment_ != nullptr) {
+ return dynamic_cast<UIViewGroup*>(clockDialFragment_->GetFragmentView());
+ }
+ return nullptr;
}
UIViewGroup *AodView::InitAodOffDial(DialSetting &setting)
if (fp == nullptr) {
return nullptr;
}
- bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(setting.dialFullName, fp, &preview);
+ bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(setting.dialFullName, fp, &preview, false);
fclose(fp);
if (!ret) {
return nullptr;
return InitAodOffDial(setting);
}
-void AodView::PeriodicUpdate()
+void AodView::Update()
{
if (clockDial_ == nullptr || !isLoaded_) {
return;
return;
}
- AmbientClockView *clock = dynamic_cast<AmbientClockView*>(clockDial_);
- if (clockDial_ != nullptr) {
- clock->UpdateTime();
+#ifndef __WIN32
+ PeriodicUpdateInterface *interface = dynamic_cast<PeriodicUpdateInterface*>(clockDialFragment_);
+ if (interface != nullptr) {
+ interface->Update();
}
+#endif
}
} // OHOS
label_.SetTextColor(Color::Gray());
icon_.ResetTransParameter();
}
-
- HexagonsItemView::HexagonsItemView()
- {
- }
-
- HexagonsItemView::~HexagonsItemView()
- {
- if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
- ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
- }
- }
-
- void HexagonsItemView::SetItemInfo(const AppItem &itemInfo)
- {
- itemInfo_ = itemInfo;
- }
-
- AppViewId HexagonsItemView::GetViewId()
- {
- return static_cast<AppViewId>(itemInfo_.id);
- }
-
- const char *HexagonsItemView::GetAppUid()
- {
- return itemInfo_.uid;
- }
-
- FootballItemView::~FootballItemView()
- {
- if (itemInfo_.iconHexagon == nullptr && itemInfo_.hexagonPath != nullptr) {
- ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.hexagonId, itemInfo_.hexagonPath);
- }
- }
-
- void FootballItemView::SetItemInfo(const AppItem &itemInfo)
- {
- itemInfo_ = itemInfo;
- }
-
- AppViewId FootballItemView::GetViewId()
- {
- return static_cast<AppViewId>(itemInfo_.id);
- }
-
- const char *FootballItemView::GetAppUid()
- {
- return itemInfo_.uid;
- }
-
- WaterfallItemView::~WaterfallItemView()
- {
- if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
- ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
- }
- }
-
- void WaterfallItemView::SetItemInfo(const AppItem &itemInfo)
- {
- itemInfo_ = itemInfo;
- }
-
- AppViewId WaterfallItemView::GetViewId()
- {
- return static_cast<AppViewId>(itemInfo_.id);
- }
-
- const char *WaterfallItemView::GetAppUid()
- {
- return itemInfo_.uid;
- }
}
#include "applist/ApplistModel.h"
#include "applist/ApplistPresenter.h"
#include "font/font_global_manager.h"
-#include "settings/SetDesktopModel.h"
#include "NativeRegisterManager.h"
namespace OHOS {
initFlag = flag;
}
- void ApplistModel::ResolvingJSAppItems(void)
+ void ApplistModel::CleanupApplistStrings(uint8_t nativeAppNumTotal)
{
-#ifdef JS_ENABLE
- if (bundleInfos != nullptr) {
- for (uint8_t i = 0; i < bundleLen; i++) {
- ClearBundleInfo(bundleInfos + i);
- }
-
- if (bundleInfos != nullptr) {
- AdapterFree(bundleInfos);
- bundleInfos = nullptr;
- }
+ for (uint8_t i = nativeAppNumTotal; i < appLen; i++) {
+ free((void*)applist[i].iconSmall);
+ free((void*)applist[i].iconHexagon);
+ free((void*)applist[i].label);
+ free((void*)applist[i].uid);
+ applist[i].iconSmall = nullptr;
+ applist[i].iconHexagon = nullptr;
+ applist[i].label = nullptr;
+ applist[i].uid = nullptr;
}
-#endif
- bundleLen = 0;
- appLen = 0;
+ }
+
+ void ApplistModel::ResolvingJSAppItems(void)
+ {
List<AppItem>& nativeAppLists = NativeRegisterManager::GetInstance().GetNativeAppLists();
uint8_t registerNativeAppNum = nativeAppLists.Size();
if (registerNativeAppNum > APP_MAX_NUM) {
applist[index] = appNode->data_;
appNode = appNode->next_;
}
+ CleanupApplistStrings(nativeAppNumTotal);
+ bundleLen = 0;
+ appLen = 0;
appLen = nativeAppNumTotal;
#ifdef JS_ENABLE
int32_t len = 0;
len = APP_MAX_NUM - nativeAppNumTotal;
}
while (len--) {
- applist[appLen] = {
- VIEW_EXTERN_APP,
- bundleInfos[len].smallIconPath,
- bundleInfos[len].bigIconPath,
- bundleInfos[len].label,
- bundleInfos[len].bundleName
- };
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems bundleName is %s \r", bundleInfos[len].bundleName);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems label is %s \r", bundleInfos[len].label);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems smallIconPath is %s \r", bundleInfos[len].smallIconPath);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems bigIconPath is %s \r", bundleInfos[len].bigIconPath);
+ char* smallIconPath = strdup(bundleInfos[len].smallIconPath);
+ char* bigIconPath = strdup(bundleInfos[len].bigIconPath);
+ char* label = strdup(bundleInfos[len].label);
+ char* bundleName = strdup(bundleInfos[len].bundleName);
+ applist[appLen] = AppItem(
+ VIEW_EXTERN_APP, // id
+ smallIconPath, // iconSmall
+ bigIconPath, // iconHexagon
+ label, // label
+ bundleName // uid
+ );
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems bundleName is %s \r", bundleName);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems label is %s \r", label);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems smallIconPath is %s \r", smallIconPath);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems bigIconPath is %s \r", bigIconPath);
appLen++;
bundleInfos[len].abilityInfo = nullptr;
}
} else {
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ResolvingJSAppItems GetBundleInfos ret = %d \r", ret);
}
+ if (bundleInfos != nullptr) {
+ for (uint8_t i = 0; i < bundleLen; i++) {
+ ClearBundleInfo(bundleInfos + i);
+ }
+ if (bundleInfos != nullptr) {
+ AdapterFree(bundleInfos);
+ bundleInfos = nullptr;
+ }
+ }
#endif
}
return startIndex;
}
+ void ApplistModel::SetLastOffset(int16_t x, int16_t y)
+ {
+ lastOffsetX = x;
+ lastOffsetY = y;
+ }
+
+ void ApplistModel::GetLastOffset(int16_t& x, int16_t& y)
+ {
+ x = lastOffsetX;
+ y = lastOffsetY;
+ }
+
void ApplistModel::SetHeadItemY(int y)
{
headItemY = y;
{
presenter = p;
}
-
- AppListStyle ApplistModel::GetCurrentStyle(void)
- {
- return static_cast<AppListStyle>(SetDesktopModel::GetInstance().GetDesktopStyle());
- }
}
*/
#include "applist/ApplistPresenter.h"
-#include "ability_manager.h"
-#include "securec.h"
-#include "components/ui_hexagons_list.h"
-#include "components/ui_waterfall_list.h"
-#include "TransitionType.h"
#include "NativeRegisterManager.h"
+#include "wearable_log.h"
namespace OHOS {
-
REGIST_SLICE(VIEW_APPLIST, ApplistView, ApplistPresenter);
- ApplistPresenter::ApplistPresenter()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::ApplistPresenter()");
- model = &ApplistModel::GetInstance();
- model->Init();
- model->SetPresenter(this);
- }
-
- ApplistPresenter::~ApplistPresenter()
- {
- model->SetPresenter(nullptr);
- }
-
- void ApplistPresenter::OnStart()
- {
- if (view_ == nullptr) {
- return;
- }
- const AppItem *itemInfo = model->GetApplistItems();
- for (uint8 i = 0; i < model->GetAppListNum(); i++) {
- view_->AddAppItemToList(itemInfo[i]);
- }
- view_->RefreshAppList();
- }
-
- void ApplistPresenter::OnResume()
- {
- if (GetCurrentStyle() == AppListStyle::FOOTBALL_STYLE) {
- view_->StartFootBallAnimator();
- } else if (GetCurrentStyle() == AppListStyle::WATERFALL_STYLE) {
- view_->ResumeWaterFallDraggable();
- }
- }
-
- bool ApplistPresenter::OnRotate(UIView& view, const RotateEvent& event)
- {
- UICustomHexagonsList* hexagonsView = dynamic_cast<UICustomHexagonsList *>(&view);
- if (hexagonsView == nullptr) {
- return false;
- }
- int8_t index = hexagonsView->GetFocusedImgIndex();
- uint8_t focusIndex_ = 0;
- if (index >= 0) {
- focusIndex_ = static_cast<uint8_t>(index);
- }
- HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(hexagonsView->GetViewByIndex(focusIndex_));
- AppViewId viewId = itemView->GetViewId();
- if (FloatMore(hexagonsView->GetGlobalScale(), 2.0f)) { // 2.0 threshold for beginning transition
- hexagonsView->StopRotateAnimator();
- NativeAbility::GetInstance().ChangeSlice(viewId, TransitionType::TRANSITION_HEXAGONS);
- hexagonsView->ClearFocus();
- }
- return true;
- }
-
- bool ApplistPresenter::OnClick(UIView &view, const ClickEvent &event)
- {
- UNUSED(event);
- AppViewId viewId = VIEW_INVALID;
- char *uid = nullptr;
- TransitionType type = TransitionType::TRANSITION_INVALID;
- AppListStyle style = GetCurrentStyle();
- if (style == AppListStyle::FOOTBALL_STYLE) {
- FootballItemView *itemView = dynamic_cast<FootballItemView *>(&view);
- viewId = itemView->GetViewId();
- uid = (char *)itemView->GetAppUid();
- } else if (style == AppListStyle::HEXAGONS_STYLE) {
- HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(&view);
- UIHexagonsList *hexagonsView = dynamic_cast<UIHexagonsList *>(itemView->GetParent());
- if (hexagonsView == nullptr || itemView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hexagonsView or itemView is nullptr");
- return false;
- }
- viewId = itemView->GetViewId();
- uid = (char *)itemView->GetAppUid();
- hexagonsView->SetDraggable(false);
- hexagonsView->Scale(1.0f, itemView->GetViewIndex()); // switch focus to click view
- type = TransitionType::TRANSITION_HEXAGONS;
- } else if (style == AppListStyle::WATERFALL_STYLE) {
- WaterfallItemView *itemView = dynamic_cast<WaterfallItemView *>(&view);
- UIWaterfallList *waterfallView = dynamic_cast<UIWaterfallList *>(itemView->GetParent());
- if (waterfallView == nullptr || itemView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "waterfallView or itemView is nullptr");
- return false;
- }
- viewId = itemView->GetViewId();
- uid = (char *)itemView->GetAppUid();
- waterfallView->SetDraggable(false);
- waterfallView->Scale(1.0f, itemView->GetViewIndex());
- type = TransitionType::TRANSITION_WATERFALL;
- } else {
- AppItemView *itemView = dynamic_cast<AppItemView *>(&view);
- if (itemView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "itemView is nullptr", viewId);
- return false;
- }
- viewId = itemView->GetViewId();
- uid = (char *)itemView->GetAppUid();
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick viewid = %d", viewId);
- if (viewId < VIEW_MAX_INTER_APP) {
- if (viewId == VIEW_SETTING && style == AppListStyle::APPLIST_STYLE) {
- NativeAbility::GetInstance().ChangeSlice(viewId, type, gSliceDefaultPriority, true);
- } else {
- NativeAbility::GetInstance().ChangeSlice(viewId, type);
- }
- return true;
- } else if (viewId == VIEW_EXTERN_APP) {
-#ifdef JS_ENABLE
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick bundleName = %s", uid);
- Want *want = new Want();
- memset_s(want, sizeof(Want), 0, sizeof(Want));
- ElementName startElement = {};
- startElement.abilityName = (char *)"default";
- startElement.bundleName = uid;
- startElement.deviceId = nullptr;
- SetWantElement(want, startElement);
- if (viewId == VIEW_SETTING && style == AppListStyle::APPLIST_STYLE) {
- StartAbilityWithAnimation(want, static_cast<uint8_t>(type), true);
- } else {
- StartAbilityWithAnimation(want, static_cast<uint8_t>(type), false);
- }
- ClearWant(want);
- delete want;
- return true;
-#endif
- }
- return false;
- }
-
- void ApplistPresenter::OnItemSelected(int16 index, UIView *view)
- {
- UNUSED(index);
- if (view != nullptr) {
- itemViewSele = static_cast<AppItemView *>(view);
- itemViewSele->SelectedChange();
+ApplistPresenter::ApplistPresenter()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::ApplistPresenter()");
+ model = &ApplistModel::GetInstance();
+ model->Init();
+ model->SetPresenter(this);
+}
- if (preItemViewSele != nullptr && preItemViewSele != itemViewSele) {
- preItemViewSele->Reset();
- }
- preItemViewSele = itemViewSele;
- }
- }
- void ApplistPresenter::SetStartIndex(uint16_t index)
- {
- model->SetStartIndex(index);
+ApplistPresenter::~ApplistPresenter()
+{
+ model->SetPresenter(nullptr);
+}
+void ApplistPresenter::OnStart()
+{
+ if (view_ == nullptr) {
return;
}
-
- uint16_t ApplistPresenter::GetStartIndex(void)
- {
- return model->GetStartIndex();
- }
-
- void ApplistPresenter::SetHeadItemY(int y)
- {
- model->SetHeadItemY(y);
- }
-
- int ApplistPresenter::GetHeadItemY(void)
- {
- return model->GetHeadItemY();
- }
-
- uint8_t ApplistPresenter::GetListItemNum(void)
- {
- return model->GetAppListNum();
- }
-
- AppListStyle ApplistPresenter::GetCurrentStyle(void)
- {
- return model->GetCurrentStyle();
+ const AppItem *itemInfo = model->GetApplistItems();
+ for (uint8 i = 0; i < model->GetAppListNum(); i++) {
+ view_->AddAppItemToList(itemInfo[i]);
}
+ view_->RefreshAppList();
+}
- ApplistView* ApplistPresenter::GetAppListView()
- {
- return view_;
- }
+void ApplistPresenter::OnResume()
+{
+ view_->OnResume();
+}
+ApplistView* ApplistPresenter::GetAppListView()
+{
+ return view_;
+}
}
* Create: 2021-09-18
*/
-#include "components/ui_view_group.h"
#include "applist/ApplistView.h"
#include "applist/ApplistPresenter.h"
-#include "applist/AppItemView.h"
+#include "applist/DesktopFactory.h"
#include "common/image_cache_manager.h"
-#include "common/screen.h"
-#include "hal_tick.h"
namespace OHOS {
-static constexpr int16 NUM_2 = 2;
-static constexpr int16 MAX_SCROLL_DIS = 1000;
-
-ApplistView::ApplistView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ApplistView ");
-}
-
-ApplistView::~ApplistView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::~ApplistView ");
- if (listAdapter_ != nullptr) {
- delete listAdapter_;
- listAdapter_ = nullptr;
- }
- if (contentList_ != nullptr) {
- delete contentList_;
- contentList_ = nullptr;
- }
- if (dragListener_ != nullptr) {
- delete dragListener_;
- dragListener_ = nullptr;
- }
- if (hexagonsList_ != nullptr) {
- delete hexagonsList_;
- hexagonsList_ = nullptr;
- }
- if (footballList_ != nullptr) {
- delete footballList_;
- footballList_ = nullptr;
- }
- if (waterfallList_ != nullptr) {
- delete waterfallList_;
- waterfallList_ = nullptr;
- }
- if (callback_ != nullptr) {
- delete callback_;
- callback_ = nullptr;
- }
- enterAnimator_ = nullptr;
-}
-
void ApplistView::OnStart()
{
- AppListStyle style = presenter_->GetCurrentStyle();
- if (style == AppListStyle::FOOTBALL_STYLE) {
- FootballStyleOnStart();
- } else if (style == AppListStyle::HEXAGONS_STYLE) {
- HexagonsStyleOnStart();
- } else if (style == AppListStyle::WATERFALL_STYLE) {
- WaterfallStyleOnStart();
- } else {
- ListStyleOnStart();
- }
-}
-
-void ApplistView::FootballStyleOnStart()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::FootballStyleOnStart ");
- if (footballList_ == nullptr) {
- footballList_ = new UIIcosahedronView();
- }
- footballList_->SetThrowDrag(true);
- if (footballDefaultImg_ == nullptr) {
- footballDefaultImg_ = ImageCacheManager::GetInstance().LoadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
- if (footballDefaultImg_ == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load res faild");
- return;
- }
- }
- if (callback_ == nullptr) {
- callback_ = new FootballAnimatorCallback(footballList_, 30, 200); // 30: Initial Size 200: Final display size
- }
- footballList_->SetDefaultImage(footballDefaultImg_);
- footballList_->SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight());
- enterAnimator_ = callback_->GetAnimator();
- AddViewToRootContainer(footballList_);
- if (callback_ != nullptr) {
- callback_->SetStartTime(HALTick::GetInstance().GetTime());
- }
-}
-
-void ApplistView::HexagonsStyleOnStart()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::HexagonsStyleOnStart ");
- if (hexagonsList_ == nullptr) {
- hexagonsList_ = new UICustomHexagonsList();
- }
- hexagonsList_->SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight()); // 2, two
- imgDistance_ = hexagonsList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
- imgSize_ = hexagonsList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
- hexagonsList_->SetImageDistance(imgDistance_);
- hexagonsList_->SetImageSizeInCenter(imgSize_);
- int16_t blankSize = hexagonsList_->GetRelativeRect().GetWidth() > hexagonsList_->GetRelativeRect().GetHeight() ?
- hexagonsList_->GetRelativeRect().GetWidth() / 2 : hexagonsList_->GetRelativeRect().GetHeight() / 2; // 2, half
- hexagonsList_->SetScrollBlankSize(blankSize);
- hexagonsList_->SetReboundSize(blankSize);
- hexagonsList_->SetThrowDrag(true);
- hexagonsList_->SetOnRotateListener(presenter_);
- hexagonsList_->RequestFocus();
- AddViewToRootContainer(hexagonsList_);
-}
-
-void ApplistView::WaterfallStyleOnStart()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::WaterfallStyleOnStart ");
- if (waterfallList_ == nullptr) {
- waterfallList_ = new UIWaterfallList();
- }
- waterfallList_->SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight());
- imgDistance_ = waterfallList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
- imgSize_ = waterfallList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
- waterfallList_->SetImageDistance(imgDistance_);
- waterfallList_->SetImageSizeInCenter(imgSize_);
- int16_t blankSize = waterfallList_->GetRelativeRect().GetWidth() > waterfallList_->GetRelativeRect().GetHeight() ?
- waterfallList_->GetRelativeRect().GetWidth() / 2 : waterfallList_->GetRelativeRect().GetHeight() / 2; // 2, half
- waterfallList_->SetThrowDrag(true);
- uint16_t layoutHeight = static_cast<uint16_t>(imgDistance_ * Sin(60));
- waterfallList_->SetReboundSize(layoutHeight); // 60: degree, row's layout height
- waterfallList_->SetScrollBlankSize(layoutHeight, UIAbstractScroll::Direction::TOP);
- waterfallList_->SetScrollBlankSize(Screen::GetInstance().GetHeight() / 2 - layoutHeight, // 2: half
- UIAbstractScroll::Direction::BOTTOM);
- waterfallList_->RequestFocus();
- waterfallList_->SetRotateFactor(10); // 10, empirical coefficient
- waterfallList_->SetOnRotateListener(presenter_);
- waterfallList_->SetTouchable(false);
- waterfallList_->SetDraggable(false); // ensure that it can't be dragged during animation to avoid error display
- AddViewToRootContainer(waterfallList_);
-}
-
-void ApplistView::ListStyleOnStart()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ListStyleOnStart");
- listAdapter_ = new ApplistAdapter();
- if (listAdapter_ == nullptr) {
- return;
- }
- listAdapter_->SetItemClickListener(presenter_);
-
- contentList_ = new UIList(UIList::VERTICAL);
- if (contentList_ == nullptr) {
- return;
- }
- contentList_->SetPosition(0, 0);
- contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
- contentList_->SetScrollBlankSize(VERTICAL_RESOLUTION / NUM_2);
- contentList_->SetSelectPosition(VERTICAL_RESOLUTION / NUM_2); // middle position
- contentList_->SetDraggable(true);
- contentList_->SetThrowDrag(true);
- contentList_->EnableAutoAlign(true);
- contentList_->SetScrollStateListener(presenter_);
- contentList_->SetMaxScrollDistance(MAX_SCROLL_DIS);
- contentList_->SetYScrollBarVisible(true);
-
- dragListener_ = new AppListOnDragListener();
- if (dragListener_ == nullptr) {
- return;
- }
- contentList_->SetOnDragListener(dragListener_);
- AddViewToRootContainer(contentList_);
-}
-
-void ApplistView::ResumeWaterFallDraggable()
-{
- if (waterfallList_ != nullptr) {
- waterfallList_->SetTouchable(true);
- waterfallList_->SetDraggable(true); // resume touchable after transition animation
- }
-}
-
-void ApplistView::StartFootBallAnimator()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::StartFootBallAnimator");
- if (enterAnimator_ != nullptr) {
- enterAnimator_->Start();
+ if (desktopFragment_ != nullptr) {
+ OnStop();
}
+ DesktopStyle style = SettingDesktopModel::GetInstance().GetDesktopStyle();
+ desktopFragment_ = DesktopFactory::GetInstance().CreateDesktopStyle(style);
+ desktopFragment_->SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight());
+ desktopFragment_->CreateView();
+ AddViewToRootContainer(desktopFragment_->GetFragmentView());
}
void ApplistView::OnStop()
{
- AppListStyle style = presenter_->GetCurrentStyle();
- if (style == AppListStyle::FOOTBALL_STYLE) {
- FootballStyleOnStop();
- } else if (style == AppListStyle::HEXAGONS_STYLE) {
- HexagonsStyleOnStop();
- } else if (style == AppListStyle::WATERFALL_STYLE) {
- WaterfallStyleOnStop();
- } else {
- ListStyleOnStop();
- }
- return;
-}
-
-void ApplistView::FootballStyleOnStop()
-{
- if (enterAnimator_ != nullptr) {
- enterAnimator_->Stop();
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::FootballStyleOnStop");
- if (footballDefaultImg_ != nullptr) {
- ImageCacheManager::GetInstance().UnloadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
- footballDefaultImg_ = nullptr;
- }
- if (footballList_ != nullptr) {
- footballList_->RemoveAll();
- }
- ListNode<FootballItemView*>* viewNode = footballItemList_.Head();
- while (viewNode != footballItemList_.End()) {
- delete(viewNode->data_);
- viewNode = viewNode->next_;
- }
- footballItemList_.Clear();
-}
-
-void ApplistView::HexagonsStyleOnStop()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::HexagonsStyleOnStop");
- if (hexagonsList_ != nullptr) {
- hexagonsList_->RemoveAll();
- }
- ListNode<HexagonsItemView*>* viewNode = listHexagonsView_.Head();
- while (viewNode != listHexagonsView_.End()) {
- delete(viewNode->data_);
- viewNode = viewNode->next_;
- }
- listHexagonsView_.Clear();
-}
-
-void ApplistView::WaterfallStyleOnStop()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::WaterfallStyleOnStop");
- if (waterfallList_ != nullptr) {
- waterfallList_->RemoveAll();
- }
- ListNode<WaterfallItemView*>* viewNode = waterfallItemList_.Head();
- while (viewNode != waterfallItemList_.End()) {
- delete(viewNode->data_);
- viewNode = viewNode->next_;
+ if (desktopFragment_ == nullptr) {
+ return;
}
- waterfallItemList_.Clear();
+ desktopFragment_->DestroyView();
+ delete desktopFragment_;
+ desktopFragment_ = nullptr;
}
-void ApplistView::ListStyleOnStop()
+void ApplistView::OnResume()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::ListStyleOnStop");
- int16_t listHeadY = contentList_->GetChildrenHead()->GetY();
- int16_t listHeadIndex = contentList_->GetChildrenHead()->GetViewIndex();
- presenter_->SetHeadItemY(listHeadY);
- presenter_->SetStartIndex(listHeadIndex);
-}
-
-void ApplistView::LoadAppIconImage(UIImageView *view, const uint32_t id, const char *path)
-{
- ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(id, path);
- if (image == nullptr) {
- GRAPHIC_LOGE("Load App Icon path %s Image %x fail\n", path, id);
+ if (desktopFragment_ == nullptr) {
return;
}
- view->SetSrc(image);
+ desktopFragment_->ResumeView();
}
void ApplistView::AddAppItemToList(const AppItem &item)
{
- AppListStyle style = presenter_->GetCurrentStyle();
- if (style == AppListStyle::FOOTBALL_STYLE) {
- FootballItemView *itemView = new FootballItemView();
- itemView->SetItemInfo(item);
- if (item.iconHexagon == nullptr && item.hexagonPath != nullptr) {
- LoadAppIconImage(itemView, item.hexagonId, item.hexagonPath);
- } else {
- itemView->SetSrc(item.iconHexagon);
- }
- itemView->SetTouchable(true);
- itemView->SetOnClickListener(presenter_);
- footballList_->Add(itemView);
- footballItemList_.PushBack(itemView);
- } else if (style == AppListStyle::HEXAGONS_STYLE) {
- HexagonsItemView *itemView = new HexagonsItemView();
- itemView->SetItemInfo(item);
- if (item.iconSmall == nullptr && item.resPath != nullptr) {
- LoadAppIconImage(itemView, item.resId, item.resPath);
- } else {
- itemView->SetSrc(item.iconSmall);
- }
- itemView->SetTouchable(true);
- itemView->SetOnClickListener(presenter_);
- hexagonsList_->Add(itemView);
- listHexagonsView_.PushBack(itemView);
- } else if (style == AppListStyle::WATERFALL_STYLE) {
- WaterfallItemView *itemView = new WaterfallItemView();
- itemView->SetItemInfo(item);
- if (item.iconSmall == nullptr && item.resPath != nullptr) {
- LoadAppIconImage(itemView, item.resId, item.resPath);
- } else {
- itemView->SetSrc(item.iconSmall);
- }
- itemView->SetTouchable(true);
- itemView->SetOnClickListener(presenter_);
- waterfallList_->Add(itemView);
- waterfallItemList_.PushBack(itemView);
- } else {
- listAdapter_->AddListItem(item);
+ if (desktopFragment_ == nullptr) {
+ return;
}
+ desktopFragment_->AddAppItemToList(item);
}
void ApplistView::ClearAppItemToList()
{
- AppListStyle style = presenter_->GetCurrentStyle();
- if (style == FOOTBALL_STYLE) {
- FootballStyleOnStop();
- } else if (style == AppListStyle::HEXAGONS_STYLE) {
- HexagonsStyleOnStop();
- } else if (style == AppListStyle::WATERFALL_STYLE) {
- WaterfallStyleOnStop();
- } else {
- listAdapter_->ClearItem();
- }
-}
-
-void ApplistView::RefreshAppList(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistView::RefreshAppList");
- AppListStyle style = presenter_->GetCurrentStyle();
- if (style == AppListStyle::FOOTBALL_STYLE) {
- footballList_->RefreshIcosahedron();
- } else if (style == AppListStyle::HEXAGONS_STYLE) {
- hexagonsList_->LayoutChildren(true);
- } else if (style == AppListStyle::WATERFALL_STYLE) {
- waterfallList_->LayoutChildren(true);
- } else {
- uint16_t startIndex = 0;
- int16_t headY = 0;
- if (presenter_->GetStartIndex() >= presenter_->GetListItemNum()) {
- startIndex = presenter_->GetListItemNum() - 1;
- headY = VERTICAL_RESOLUTION / NUM_2;
- } else {
- startIndex = presenter_->GetStartIndex();
- headY = presenter_->GetHeadItemY();
- if (headY == 0) {
- headY = VERTICAL_RESOLUTION / NUM_2;
- }
- }
- contentList_->SetAdapter(listAdapter_);
- contentList_->ScrollTo(startIndex);
- contentList_->ScrollBy(headY);
- contentList_->RefreshList();
+ if (desktopFragment_ == nullptr) {
+ return;
}
+ desktopFragment_->ClearAppItemToList();
}
-void FootballAnimatorCallback::Callback(UIView *view)
+void ApplistView::RefreshAppList()
{
- if (HALTick::GetInstance().GetElapseTime(startTime_) < 300) { // 300, empirical coefficient
+ if (desktopFragment_ == nullptr) {
return;
}
- if (!isStartAnim_) {
- animator_->Stop();
- animator_->Start();
- isStartAnim_ = true;
- }
- UIIcosahedronView* footView = dynamic_cast<UIIcosahedronView*>(view);
- int16_t el = EasingEquation::LinearEaseNone(startPos_, endPos_, animator_->GetRunTime(), animator_->GetTime());
- footView->SetSideLength(el);
- footView->RefreshIcosahedron();
- const Vector3<float> rotateStart(Screen::GetInstance().GetWidth() / 2.0, // 2.0: divisor
- Screen::GetInstance().GetHeight() / 2.0, 0); // 2.0: divisor
- const Vector3<float> rotateEnd(0, 0, 0);
- // 270 : stop angle
- int16_t angle = EasingEquation::LinearEaseNone(0, 270, animator_->GetRunTime(), animator_->GetTime());
- footView->RotatePlanes(angle, rotateStart, rotateEnd);
+ desktopFragment_->RefreshAppList();
}
}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: DesktopFactory
+ * Author:
+ * Create: 2025-07
+ */
+
+#include "applist/DesktopFactory.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+void DesktopFactory::RegisterDesktopStyle(const uint16_t style, DesktopInterface* desktop)
+{
+ if (desktop == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register desktop using null proxy");
+ return;
+ }
+ if (desktops_.find(style) != desktops_.end()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "desktop style %d has already been registered", style);
+ return;
+ } else {
+ desktops_.insert({style, desktop});
+ }
+}
+
+UIDesktopFragment* DesktopFactory::CreateDesktopStyle(uint16_t style)
+{
+ auto it = desktops_.find(style);
+ if (it != desktops_.end()) {
+ return it->second->CreateDesktop();
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Desktop style:%d was not registered", style);
+ return nullptr;
+ }
+}
+} // namespace OHOS
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: FootballDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#include "applist/FootballDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+#include "hal_tick.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(FOOTBALL_STYLE, FootballDesktopFragment);
+
+void FootballDesktopFragment::OnCreateView(void* data)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnCreateView ");
+ if (footballList_ == nullptr) {
+ footballList_ = new UIIcosahedronView();
+ }
+ footballList_->SetThrowDrag(true);
+ if (footballDefaultImg_ == nullptr) {
+ footballDefaultImg_ = ImageCacheManager::GetInstance().LoadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
+ if (footballDefaultImg_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load res faild");
+ return;
+ }
+ }
+ if (callback_ == nullptr) {
+ callback_ = new FootballAnimatorCallback(footballList_, 30, 200); // 30: Initial Size 200: Final display size
+ }
+ footballList_->SetDefaultImage(footballDefaultImg_);
+ footballList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+ enterAnimator_ = callback_->GetAnimator();
+ fragmentView_.Add(footballList_);
+ if (callback_ != nullptr) {
+ callback_->SetStartTime(HALTick::GetInstance().GetTime());
+ }
+}
+
+void FootballDesktopFragment::OnDestroyView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnDestroyView");
+ ClearAppItemToList();
+ if (footballList_ != nullptr) {
+ delete footballList_;
+ footballList_ = nullptr;
+ }
+ if (footballDefaultImg_ != nullptr) {
+ ImageCacheManager::GetInstance().UnloadSingleRes(PNG_APPLIST_NOTSETUSE_IMG);
+ footballDefaultImg_ = nullptr;
+ }
+ if (callback_ != nullptr) {
+ delete callback_;
+ callback_ = nullptr;
+ }
+ enterAnimator_ = nullptr;
+}
+
+void FootballDesktopFragment::OnResumeView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnResumeView");
+ if (enterAnimator_ != nullptr) {
+ enterAnimator_->Start();
+ }
+}
+
+bool FootballDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ FootballItemView *itemView = dynamic_cast<FootballItemView *>(&view);
+ AppViewId viewId = itemView->GetViewId();
+ char *uid = (char *)itemView->GetAppUid();
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::OnClick viewid = %d", viewId);
+ return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, FOOTBALL_STYLE);
+}
+
+void FootballDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::AddAppItemToList");
+ FootballItemView *itemView = new FootballItemView();
+ if (!itemView->SetItemInfo(item)) {
+ delete itemView;
+ return;
+ }
+ itemView->SetTouchable(true);
+ itemView->SetOnClickListener(this);
+ footballList_->Add(itemView);
+ footballItemList_.PushBack(itemView);
+}
+
+void FootballDesktopFragment::ClearAppItemToList()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::ClearAppItemToList");
+ if (enterAnimator_ != nullptr) {
+ enterAnimator_->Stop();
+ }
+ if (footballList_ != nullptr) {
+ footballList_->RemoveAll();
+ }
+ ListNode<FootballItemView*>* viewNode = footballItemList_.Head();
+ while (viewNode != footballItemList_.End()) {
+ delete(viewNode->data_);
+ viewNode = viewNode->next_;
+ }
+ footballItemList_.Clear();
+}
+
+void FootballDesktopFragment::RefreshAppList(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FootballDesktopFragment::RefreshAppList");
+ footballList_->RefreshIcosahedron();
+}
+
+void FootballAnimatorCallback::Callback(UIView *view)
+{
+ if (HALTick::GetInstance().GetElapseTime(startTime_) < 300) { // 300, empirical coefficient
+ return;
+ }
+ if (!isStartAnim_) {
+ animator_->Stop();
+ animator_->Start();
+ isStartAnim_ = true;
+ }
+ UIIcosahedronView* footView = dynamic_cast<UIIcosahedronView*>(view);
+ int16_t el = EasingEquation::LinearEaseNone(startPos_, endPos_, animator_->GetRunTime(), animator_->GetTime());
+ footView->SetSideLength(el);
+ footView->RefreshIcosahedron();
+ const Vector3<float> rotateStart(Screen::GetInstance().GetWidth() / 2.0, // 2.0: divisor
+ Screen::GetInstance().GetHeight() / 2.0, 0); // 2.0: divisor
+ const Vector3<float> rotateEnd(0, 0, 0);
+ // 270 : stop angle
+ int16_t angle = EasingEquation::LinearEaseNone(0, 270, animator_->GetRunTime(), animator_->GetTime());
+ footView->RotatePlanes(angle, rotateStart, rotateEnd);
+}
+
+FootballItemView::~FootballItemView()
+{
+ if (itemInfo_.iconHexagon == nullptr && itemInfo_.hexagonPath != nullptr) {
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.hexagonId, itemInfo_.hexagonPath);
+ }
+}
+
+bool FootballItemView::SetItemInfo(const AppItem &itemInfo)
+{
+ itemInfo_ = itemInfo;
+ if (itemInfo.iconHexagon == nullptr && itemInfo.hexagonPath != nullptr) {
+ ImageInfo* image =
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.hexagonId, itemInfo.hexagonPath);
+ if (image == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+ itemInfo.hexagonId, itemInfo.hexagonPath);
+ return false;
+ }
+ SetSrc(image);
+ } else {
+ SetSrc(itemInfo.iconHexagon);
+ }
+ return true;
+}
+
+AppViewId FootballItemView::GetViewId()
+{
+ return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *FootballItemView::GetAppUid()
+{
+ return itemInfo_.uid;
+}
+}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: HexagonsDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#include "applist/HexagonsDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "common/image_cache_manager.h"
+#include "NativeAbility.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(HEXAGONS_STYLE, HexagonsDesktopFragment);
+
+void HexagonsDesktopFragment::OnCreateView(void* data)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::OnCreateView ");
+ if (hexagonsList_ == nullptr) {
+ hexagonsList_ = new UICustomHexagonsList();
+ }
+ hexagonsList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight()); // 2, two
+ imgDistance_ = hexagonsList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
+ imgSize_ = hexagonsList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
+ hexagonsList_->SetImageDistance(imgDistance_);
+ hexagonsList_->SetImageSizeInCenter(imgSize_);
+ int16_t blankSize = hexagonsList_->GetRelativeRect().GetWidth() > hexagonsList_->GetRelativeRect().GetHeight() ?
+ hexagonsList_->GetRelativeRect().GetWidth() / 2 : hexagonsList_->GetRelativeRect().GetHeight() / 2; // 2, half
+ hexagonsList_->SetScrollBlankSize(blankSize);
+ hexagonsList_->SetReboundSize(blankSize);
+ hexagonsList_->SetThrowDrag(true);
+ hexagonsList_->SetOnRotateListener(this);
+ hexagonsList_->RequestFocus();
+ fragmentView_.Add(hexagonsList_);
+}
+
+void HexagonsDesktopFragment::OnDestroyView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::OnDestroyView");
+ ClearAppItemToList();
+ if (hexagonsList_ != nullptr) {
+ delete hexagonsList_;
+ hexagonsList_ = nullptr;
+ }
+}
+
+bool HexagonsDesktopFragment::OnRotate(UIView& view, const RotateEvent& event)
+{
+ UICustomHexagonsList* hexagonsView = dynamic_cast<UICustomHexagonsList *>(&view);
+ if (hexagonsView == nullptr) {
+ return false;
+ }
+ int8_t index = hexagonsView->GetFocusedImgIndex();
+ uint8_t focusIndex_ = 0;
+ if (index >= 0) {
+ focusIndex_ = static_cast<uint8_t>(index);
+ }
+ HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(hexagonsView->GetViewByIndex(focusIndex_));
+ AppViewId viewId = itemView->GetViewId();
+ if (FloatMore(hexagonsView->GetGlobalScale(), 2.0f)) { // 2.0 threshold for beginning transition
+ hexagonsView->StopRotateAnimator();
+ NativeAbility::GetInstance().ChangeSlice(viewId, TransitionType::TRANSITION_HEXAGONS);
+ hexagonsView->ClearFocus();
+ }
+ return true;
+}
+
+bool HexagonsDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ HexagonsItemView *itemView = dynamic_cast<HexagonsItemView *>(&view);
+ UIHexagonsList *hexagonsView = dynamic_cast<UIHexagonsList *>(itemView->GetParent());
+ if (hexagonsView == nullptr || itemView == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hexagonsView or itemView is nullptr");
+ return false;
+ }
+ AppViewId viewId = itemView->GetViewId();
+ char *uid = (char *)itemView->GetAppUid();
+ hexagonsView->SetDraggable(false);
+ hexagonsView->Scale(1.0f, itemView->GetViewIndex()); // switch focus to click view
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnClick viewid = %d", viewId);
+ return SwitchView(viewId, uid, TransitionType::TRANSITION_HEXAGONS, HEXAGONS_STYLE);
+}
+
+void HexagonsDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::AddAppItemToList");
+ HexagonsItemView *itemView = new HexagonsItemView();
+ if (!itemView->SetItemInfo(item)) {
+ delete itemView;
+ return;
+ }
+ itemView->SetTouchable(true);
+ itemView->SetOnClickListener(this);
+ hexagonsList_->Add(itemView);
+ listHexagonsView_.PushBack(itemView);
+}
+
+void HexagonsDesktopFragment::ClearAppItemToList()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HexagonsDesktopFragment::ClearAppItemToList");
+ if (hexagonsList_ != nullptr) {
+ hexagonsList_->RemoveAll();
+ }
+ ListNode<HexagonsItemView*>* viewNode = listHexagonsView_.Head();
+ while (viewNode != listHexagonsView_.End()) {
+ delete(viewNode->data_);
+ viewNode = viewNode->next_;
+ }
+ listHexagonsView_.Clear();
+}
+
+void HexagonsDesktopFragment::RefreshAppList(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::RefreshAppList");
+ hexagonsList_->LayoutChildren(true);
+}
+
+HexagonsItemView::~HexagonsItemView()
+{
+ if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+ }
+}
+
+bool HexagonsItemView::SetItemInfo(const AppItem &itemInfo)
+{
+ itemInfo_ = itemInfo;
+ if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+ if (image == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+ itemInfo.resId, itemInfo.resPath);
+ return false;
+ }
+ SetSrc(image);
+ } else {
+ SetSrc(itemInfo.iconSmall);
+ }
+ return true;
+}
+
+AppViewId HexagonsItemView::GetViewId()
+{
+ return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *HexagonsItemView::GetAppUid()
+{
+ return itemInfo_.uid;
+}
+}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: ListDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#include "applist/ListDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "applist/ApplistModel.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(APPLIST_STYLE, ListDesktopFragment);
+
+static constexpr int16 NUM_2 = 2;
+static constexpr int16 MAX_SCROLL_DIS = 1000;
+
+void ListDesktopFragment::OnCreateView(void* data)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnCreateView");
+ listAdapter_ = new ApplistAdapter();
+ if (listAdapter_ == nullptr) {
+ return;
+ }
+ listAdapter_->SetItemClickListener(this);
+
+ contentList_ = new UIList(UIList::VERTICAL);
+ if (contentList_ == nullptr) {
+ return;
+ }
+ contentList_->SetPosition(0, 0);
+ contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ contentList_->SetScrollBlankSize(VERTICAL_RESOLUTION / NUM_2);
+ contentList_->SetSelectPosition(VERTICAL_RESOLUTION / NUM_2); // middle position
+ contentList_->SetDraggable(true);
+ contentList_->SetThrowDrag(true);
+ contentList_->EnableAutoAlign(true);
+ contentList_->SetScrollStateListener(this);
+ contentList_->SetMaxScrollDistance(MAX_SCROLL_DIS);
+ contentList_->SetYScrollBarVisible(true);
+
+ dragListener_ = new AppListOnDragListener();
+ if (dragListener_ == nullptr) {
+ return;
+ }
+ contentList_->SetOnDragListener(dragListener_);
+ fragmentView_.Add(contentList_);
+}
+
+
+void ListDesktopFragment::OnDestroyView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnDestroyView");
+ int16_t listHeadY = contentList_->GetChildrenHead()->GetY();
+ int16_t listHeadIndex = contentList_->GetChildrenHead()->GetViewIndex();
+ ApplistModel *model = &ApplistModel::GetInstance();
+ model->SetHeadItemY(listHeadY);
+ model->SetStartIndex(listHeadIndex);
+
+ ClearAppItemToList();
+
+ if (listAdapter_ != nullptr) {
+ delete listAdapter_;
+ listAdapter_ = nullptr;
+ }
+ if (contentList_ != nullptr) {
+ delete contentList_;
+ contentList_ = nullptr;
+ }
+ if (dragListener_ != nullptr) {
+ delete dragListener_;
+ dragListener_ = nullptr;
+ }
+}
+
+bool ListDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ AppItemView *itemView = dynamic_cast<AppItemView *>(&view);
+ if (itemView == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "itemView is nullptr");
+ return false;
+ }
+ AppViewId viewId = itemView->GetViewId();
+ char *uid = (char *)itemView->GetAppUid();
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::OnClick viewid = %d", viewId);
+ return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, APPLIST_STYLE);
+}
+
+void ListDesktopFragment::OnItemSelected(int16 index, UIView *view)
+{
+ UNUSED(index);
+ if (view != nullptr) {
+ itemViewSele = static_cast<AppItemView *>(view);
+ itemViewSele->SelectedChange();
+
+ if (preItemViewSele != nullptr && preItemViewSele != itemViewSele) {
+ preItemViewSele->Reset();
+ }
+ preItemViewSele = itemViewSele;
+ }
+}
+
+void ListDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::AddAppItemToList");
+ listAdapter_->AddListItem(item);
+}
+
+void ListDesktopFragment::ClearAppItemToList()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::ClearAppItemToList");
+ listAdapter_->ClearItem();
+}
+
+void ListDesktopFragment::RefreshAppList(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ListDesktopFragment::RefreshAppList");
+ uint16_t startIndex = 0;
+ int16_t headY = 0;
+ ApplistModel *model = &ApplistModel::GetInstance();
+ if (model->GetStartIndex() >= model->GetAppListNum()) {
+ startIndex = model->GetAppListNum() - 1;
+ headY = VERTICAL_RESOLUTION / NUM_2;
+ } else {
+ startIndex = model->GetStartIndex();
+ headY = model->GetHeadItemY();
+ if (headY == 0) {
+ headY = VERTICAL_RESOLUTION / NUM_2;
+ }
+ }
+ contentList_->SetAdapter(listAdapter_);
+ contentList_->ScrollTo(startIndex);
+ contentList_->ScrollBy(headY);
+ contentList_->RefreshList();
+}
+}
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlanetDesktop
+ * Created: 2025-07-29
+ */
+
+#include "applist/PlanetDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "applist/ApplistModel.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(PLANET_STYLE, PlanetDesktopFragment);
+
+static constexpr int16 LABEL_FONT_SIZE = 15;
+
+void PlanetDesktopFragment::OnCreateView(void* data)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnCreateView ");
+ imgSize_ = 100; // 100, size of item
+ int16_t imageDistance = 5; // 5, image distance
+ if (planetList_ == nullptr) {
+ planetList_ = new UICustomPlanetList(imgSize_, imageDistance);
+ }
+ planetList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+ planetList_->SetDraggable(true);
+ planetList_->SetThrowDrag(true);
+ planetList_->SetItemClickListener(this);
+ planetList_->RequestFocus();
+ fragmentView_.Add(planetList_);
+}
+
+void PlanetDesktopFragment::OnDestroyView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnDestroyView");
+ ClearAppItemToList();
+ if (planetList_ != nullptr) {
+ delete planetList_;
+ planetList_ = nullptr;
+ }
+}
+
+bool PlanetDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ PlanetItemView *itemView = dynamic_cast<PlanetItemView *>(&view);
+ AppViewId viewId = itemView->GetViewId();
+ char *uid = (char *)itemView->GetAppUid();
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::OnClick viewid = %d", viewId);
+ return SwitchView(viewId, uid, TransitionType::TRANSITION_INVALID, PLANET_STYLE);
+}
+
+void PlanetDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::AddAppItemToList");
+ PlanetItemView* itemView = new PlanetItemView();
+ UILabel* label = new UILabel();
+ itemView->SetItemInfo(item);
+ itemView->SetSrc(item.iconSmall);
+ itemView->SetTouchable(true);
+ itemView->SetAutoEnable(false);
+ itemView->SetResizeMode(UIImageView::ImageResizeMode::CONTAIN);
+ itemView->SetOnClickListener(this);
+ label->SetText(item.label);
+ label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE);
+ label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ label->SetVisible(false);
+ label->SetHeight(30); // 30, label height
+ label->SetWidth(100); // 100, label width
+ planetList_->AddItemVIew(itemView);
+ planetList_->AddLabel(label);
+ pltItemList_.PushBack(itemView);
+ pltLabelList_.PushBack(label);
+}
+
+void PlanetDesktopFragment::ClearAppItemToList()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::ClearAppItemToList");
+ int16_t offsetX = 0;
+ int16_t offsetY = 0;
+ ApplistModel *model = &ApplistModel::GetInstance();
+
+ planetList_->RestoreItemState();
+ planetList_->GetLastOffset(offsetX, offsetY);
+ model->SetLastOffset(offsetX, offsetY);
+ if (planetList_ != nullptr) {
+ planetList_->RemoveAll();
+ }
+ ListNode<PlanetItemView*>* viewNode = pltItemList_.Head();
+ while (viewNode != pltItemList_.End()) {
+ delete(viewNode->data_);
+ viewNode = viewNode->next_;
+ }
+ pltItemList_.Clear();
+ ListNode<UILabel*>* labelNode = pltLabelList_.Head();
+ while (labelNode != pltLabelList_.End()) {
+ delete(labelNode->data_);
+ labelNode = labelNode->next_;
+ }
+ pltLabelList_.Clear();
+}
+
+void PlanetDesktopFragment::RefreshAppList(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlanetDesktopFragment::RefreshAppList");
+ int16_t offsetX = 0;
+ int16_t offsetY = 0;
+ ApplistModel *model = &ApplistModel::GetInstance();
+ model->GetLastOffset(offsetX, offsetY);
+ planetList_->SetLastOffset(offsetX, offsetY);
+ planetList_->LayoutChildren(true);
+ planetList_->AddClickListenerToAppItems();
+}
+
+void PlanetItemView::SetItemInfo(const AppItem &itemInfo)
+{
+ itemInfo_ = itemInfo;
+}
+
+AppViewId PlanetItemView::GetViewId()
+{
+ return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *PlanetItemView::GetAppUid()
+{
+ return itemInfo_.uid;
+}
+
+const char *PlanetItemView::GetAppLabel()
+{
+ return itemInfo_.label;
+}
+}
--- /dev/null
+ /*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: SphereDesktopFragment
+ * Author: Hisi Graphic Team
+ * Created: 2025-09
+ */
+
+#include <cmath>
+#include "applist/SphereDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "common/image_cache_manager.h"
+#include "NativeAbility.h"
+#include "hal_tick.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(SPHERE_STYLE, SphereDesktopFragment);
+
+void SphereDesktopFragment::OnCreateView(void* data)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnCreateView ");
+ if (sphereView_ == nullptr) {
+ sphereView_ = new UISphereView(1);
+ }
+ sphereView_->SetThrowDrag(true);
+
+ if (callback_ == nullptr) {
+ callback_ = new SphereAnimatorCallback(sphereView_, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+ }
+
+ sphereView_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+ enterAnimator_ = callback_->GetAnimator();
+ sphereView_->SetVisible(false);
+ fragmentView_.Add(sphereView_);
+ if (callback_ != nullptr) {
+ callback_->SetStartTime(HALTick::GetInstance().GetTime());
+ }
+}
+
+void SphereDesktopFragment::OnDestroyView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnDestroyView");
+ ClearAppItemToList();
+ if (sphereView_ != nullptr) {
+ delete sphereView_;
+ sphereView_ = nullptr;
+ }
+ if (callback_ != nullptr) {
+ delete callback_;
+ callback_ = nullptr;
+ }
+ enterAnimator_ = nullptr;
+}
+
+void SphereDesktopFragment::OnResumeView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnResumeView");
+ if (enterAnimator_ != nullptr) {
+ enterAnimator_->Start();
+ }
+}
+
+bool SphereDesktopFragment::OnRotate(UIView& view, const RotateEvent& event)
+{
+ UISphereView *sphereView = dynamic_cast<UISphereView *>(&view);
+ if (sphereView == nullptr) {
+ return false;
+ }
+ sphereView->UpdateItemAngle(event.GetRotate());
+ return true;
+}
+
+bool SphereDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ SphereItemView *itemView = dynamic_cast<SphereItemView *>(&view);
+ UISphereView *sphereView = dynamic_cast<UISphereView *>(itemView->GetParent());
+ if (sphereView == nullptr || itemView == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sphereView or itemView is nullptr");
+ return false;
+ }
+ AppViewId viewId = itemView->GetViewId();
+ char *uid = (char *)itemView->GetAppUid();
+ sphereView->SetDraggable(false);
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::OnClick viewid = %d", viewId);
+ return SwitchView(viewId, uid, TransitionType::TRANSITION_FADEINOUT, SPHERE_STYLE);
+}
+
+void SphereDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::AddAppItemToList");
+ SphereItemView *itemView = new SphereItemView();
+ if (!itemView->SetItemInfo(item)) {
+ delete itemView;
+ return;
+ }
+ itemView->SetTouchable(true);
+ itemView->SetOnClickListener(this);
+ sphereView_->Add(itemView);
+ listSphereView_.PushBack(itemView);
+ sphereView_->SetNumberOfRow((listSphereView_.Size() + 2) / 3); // 控制在3排显示
+}
+
+void SphereDesktopFragment::ClearAppItemToList()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::ClearAppItemToList");
+ if (enterAnimator_ != nullptr) {
+ enterAnimator_->Stop();
+ }
+ if (sphereView_ != nullptr) {
+ sphereView_->RemoveAll();
+ }
+ ListNode<SphereItemView*>* viewNode = listSphereView_.Head();
+ while (viewNode != listSphereView_.End()) {
+ delete(viewNode->data_);
+ viewNode = viewNode->next_;
+ }
+ listSphereView_.Clear();
+}
+
+void SphereDesktopFragment::RefreshAppList(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SphereDesktopFragment::RefreshAppList");
+ sphereView_->LayoutChildren(true);
+}
+
+void SphereAnimatorCallback::Callback(UIView *view)
+{
+ if (HALTick::GetInstance().GetElapseTime(startTime_) < 300) { // 300: 动画延迟显示时间,观感效果更好
+ angle_=0;
+ return;
+ }
+ if (!view->IsVisible()) {
+ view->SetVisible(true);
+ }
+ if (!isStartAnim_) {
+ animator_->Stop();
+ animator_->Start();
+ isStartAnim_ = true;
+ }
+ UISphereView* sphereView = dynamic_cast<UISphereView*>(view);
+ const int16_t precision = 1000;// 1000: 精度
+ int16_t el = EasingEquation::QuadEaseOut(0, precision, animator_->GetRunTime(), animator_->GetTime());
+ int roateAngle = el * 360 / precision; // 360 : 一共旋转360度
+ sphereView->UpdateItemAngle(roateAngle - angle_);
+ angle_ = roateAngle;
+}
+
+SphereItemView::~SphereItemView()
+{
+ if (imageView_ != nullptr) {
+ delete imageView_;
+ imageView_ = nullptr;
+ }
+ if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+ }
+}
+
+bool SphereItemView::SetItemInfo(const AppItem &itemInfo)
+{
+ if (imageView_ == nullptr) {
+ imageView_ = new UIImageView();
+ }
+ itemInfo_ = itemInfo;
+ if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+ if (image == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+ itemInfo.resId, itemInfo.resPath);
+ return false;
+ }
+ imageView_->SetSrc(image);
+ } else {
+ imageView_->SetSrc(itemInfo.iconSmall);
+ }
+ Add(imageView_);
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ Resize(imageView_->GetWidth(), imageView_->GetHeight());
+ return true;
+}
+
+AppViewId SphereItemView::GetViewId()
+{
+ return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *SphereItemView::GetAppUid()
+{
+ return itemInfo_.uid;
+}
+}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: UIDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-07
+ */
+
+#include "applist/UIDesktopFragment.h"
+#include "common/image_cache_manager.h"
+#include "ability_manager.h"
+#include "NativeAbility.h"
+
+namespace OHOS {
+void UIDesktopFragment::SetPosition(int16_t x, int16_t y, int16_t width, int16_t height)
+{
+ fragmentView_.SetPosition(x, y, width, height);
+}
+
+bool UIDesktopFragment::SwitchView(AppViewId viewId, char *uid, TransitionType type, DesktopStyle style)
+{
+ if (viewId < VIEW_MAX_INTER_APP) {
+ if (viewId == VIEW_SETTING && style == DesktopStyle::APPLIST_STYLE) {
+ NativeAbility::GetInstance().ChangeSlice(viewId, type, gSliceDefaultPriority, true);
+ } else {
+ NativeAbility::GetInstance().ChangeSlice(viewId, type);
+ }
+ return true;
+ } else if (viewId == VIEW_EXTERN_APP) {
+#ifdef JS_ENABLE
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UIDesktopFragment::OnClick bundleName = %s", uid);
+ Want *want = new Want();
+ memset_s(want, sizeof(Want), 0, sizeof(Want));
+ ElementName startElement = {};
+ startElement.abilityName = (char *)"default";
+ startElement.bundleName = uid;
+ startElement.deviceId = nullptr;
+ SetWantElement(want, startElement);
+ if (viewId == VIEW_SETTING && style == DesktopStyle::APPLIST_STYLE) {
+ StartAbilityWithAnimation(want, static_cast<uint8_t>(type), true);
+ } else {
+ StartAbilityWithAnimation(want, static_cast<uint8_t>(type), false);
+ }
+ ClearWant(want);
+ delete want;
+ return true;
+#endif
+ }
+ return false;
+}
+}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: WaterfallDesktopFragment.cpp
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#include "applist/WaterfallDesktopFragment.h"
+#include "applist/DesktopFactory.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+
+namespace OHOS {
+REGIST_DESKTOP_STYLE(WATERFALL_STYLE, WaterfallDesktopFragment);
+
+void WaterfallDesktopFragment::OnCreateView(void* data)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnCreateView ");
+ if (waterfallList_ == nullptr) {
+ waterfallList_ = new UIWaterfallList();
+ }
+ waterfallList_->SetPosition(0, 0, fragmentView_.GetWidth(), fragmentView_.GetHeight());
+ imgDistance_ = waterfallList_->GetWidth() * 0.25991; // 0.25991, empirical coefficient
+ imgSize_ = waterfallList_->GetWidth() * 0.23348; // 0.23348, empirical coefficient
+ waterfallList_->SetImageDistance(imgDistance_);
+ waterfallList_->SetImageSizeInCenter(imgSize_);
+ int16_t blankSize = waterfallList_->GetRelativeRect().GetWidth() > waterfallList_->GetRelativeRect().GetHeight() ?
+ waterfallList_->GetRelativeRect().GetWidth() / 2 : waterfallList_->GetRelativeRect().GetHeight() / 2; // 2, half
+ waterfallList_->SetThrowDrag(true);
+ uint16_t layoutHeight = static_cast<uint16_t>(imgDistance_ * Sin(60));
+ waterfallList_->SetReboundSize(layoutHeight); // 60: degree, row's layout height
+ waterfallList_->SetScrollBlankSize(layoutHeight, UIAbstractScroll::Direction::TOP);
+ waterfallList_->SetScrollBlankSize(Screen::GetInstance().GetHeight() / 2 - layoutHeight, // 2: half
+ UIAbstractScroll::Direction::BOTTOM);
+ waterfallList_->RequestFocus();
+ waterfallList_->SetRotateFactor(10); // 10, empirical coefficient
+ waterfallList_->SetOnRotateListener(this);
+ waterfallList_->SetTouchable(false);
+ waterfallList_->SetDraggable(false); // ensure that it can't be dragged during animation to avoid error display
+ fragmentView_.Add(waterfallList_);
+}
+
+void WaterfallDesktopFragment::OnDestroyView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnDestroyView");
+ ClearAppItemToList();
+ if (waterfallList_ != nullptr) {
+ delete waterfallList_;
+ waterfallList_ = nullptr;
+ }
+}
+
+void WaterfallDesktopFragment::OnResumeView()
+{
+ if (waterfallList_ != nullptr) {
+ waterfallList_->SetTouchable(true);
+ waterfallList_->SetDraggable(true); // resume touchable after transition animation
+ }
+}
+
+bool WaterfallDesktopFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ WaterfallItemView *itemView = dynamic_cast<WaterfallItemView *>(&view);
+ UIWaterfallList *waterfallView = dynamic_cast<UIWaterfallList *>(itemView->GetParent());
+ if (waterfallView == nullptr || itemView == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "waterfallView or itemView is nullptr");
+ return false;
+ }
+ AppViewId viewId = itemView->GetViewId();
+ char *uid = (char *)itemView->GetAppUid();
+ waterfallView->SetDraggable(false);
+ waterfallView->Scale(1.0f, itemView->GetViewIndex());
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::OnClick viewid = %d", viewId);
+ return SwitchView(viewId, uid, TransitionType::TRANSITION_WATERFALL, APPLIST_STYLE);
+}
+
+void WaterfallDesktopFragment::AddAppItemToList(const AppItem &item)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::AddAppItemToList");
+ WaterfallItemView *itemView = new WaterfallItemView();
+ if (!itemView->SetItemInfo(item)) {
+ delete itemView;
+ return;
+ }
+ itemView->SetTouchable(true);
+ itemView->SetOnClickListener(this);
+ waterfallList_->Add(itemView);
+ waterfallItemList_.PushBack(itemView);
+}
+
+void WaterfallDesktopFragment::ClearAppItemToList()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::ClearAppItemToList");
+ if (waterfallList_ != nullptr) {
+ waterfallList_->RemoveAll();
+ }
+ ListNode<WaterfallItemView*>* viewNode = waterfallItemList_.Head();
+ while (viewNode != waterfallItemList_.End()) {
+ delete(viewNode->data_);
+ viewNode = viewNode->next_;
+ }
+ waterfallItemList_.Clear();
+}
+
+void WaterfallDesktopFragment::RefreshAppList(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WaterfallDesktopFragment::RefreshAppList");
+ waterfallList_->LayoutChildren(true);
+}
+
+WaterfallItemView::~WaterfallItemView()
+{
+ if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+ }
+}
+
+bool WaterfallItemView::SetItemInfo(const AppItem &itemInfo)
+{
+ itemInfo_ = itemInfo;
+ if (itemInfo.iconSmall == nullptr && itemInfo.resPath != nullptr) {
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+ if (image == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Load App Icon path %s Image %x fail",
+ itemInfo.resId, itemInfo.resPath);
+ return false;
+ }
+ SetSrc(image);
+ } else {
+ SetSrc(itemInfo.iconSmall);
+ }
+ return true;
+}
+
+AppViewId WaterfallItemView::GetViewId()
+{
+ return static_cast<AppViewId>(itemInfo_.id);
+}
+
+const char *WaterfallItemView::GetAppUid()
+{
+ return itemInfo_.uid;
+}
+}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodChartPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <random>\r
+#include <iostream>\r
+#include <chrono>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_chart.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "common/image_cache_manager.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "AppViewIDs.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodModel.h"\r
+#include "blood/BloodChartPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t PERSEC_BLOOD_FONT_SIZE = 60;\r
+static constexpr uint16_t PERSEC_BLOOD_X = 203;\r
+static constexpr uint16_t PERSEC_BLOOD_Y = 40;\r
+static constexpr uint16_t PERSEC_BLOOD_WIDTH = 260;\r
+static constexpr uint16_t PERSEC_BLOOD_HEIGHT = 53;\r
+static constexpr uint16_t PERSEC_BLOOD_TEXT_X = 188;\r
+static constexpr uint16_t PERSEC_BLOOD_TEXT_Y = 96;\r
+static constexpr uint16_t PERSEC_BLOOD_TEXT_HEIGHT = 64;\r
+static constexpr uint16_t COORDINATE_POINT_X = 70;\r
+static constexpr uint16_t COORDINATE_POINT_Y = 120;\r
+static constexpr uint16_t COORDINATE_HEIGHT = 156;\r
+static constexpr uint16_t COORDINATE_WIDTH = 330;\r
+static constexpr uint16_t BLOOD_LIMIT_FONT_SIZE = 30;\r
+static constexpr uint16_t TOP_TEXT_WIDTH = 232;\r
+static constexpr uint16_t TOP_TEXT_HEIGHT = 76;\r
+static constexpr uint16_t TOP_TEXT_X = 107;\r
+static constexpr uint16_t TOP_TEXT_Y = 352;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH = 35;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT = 36;\r
+static constexpr uint16_t BLOOD_LIMIT_FONT_SIZE_ONE = 24;\r
+static constexpr uint16_t BLOOD_LABLE_FONT_SIZE_ONE = 16;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH_ONE = 89;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT_ONE = 29;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_X = 188;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_Y = 105;\r
+static constexpr uint16_t LABLE_XAXIS1_POSION_X = 50;\r
+static constexpr uint16_t LABLE_XAXIS2_POSION_X = 210;\r
+static constexpr uint16_t LABLE_XAXIS3_POSION_X = 370;\r
+static constexpr uint16_t LABLE_XAXIS_POSION_Y = 275;\r
+static constexpr uint16_t BLOOD_XAXIS_SETMARKNUM = 40;\r
+static constexpr uint16_t BLOOD_YAXIS_SETMARKNUM = 3;\r
+static constexpr uint16_t BLOOD_XAXIS_RANGE_MAX = 4;\r
+static constexpr uint16_t BLOOD_YAXIS_RANGE_MAX = 200;\r
+static constexpr uint16_t BLOOD_STYLE_LINE_NUM = 3;\r
+static constexpr uint16_t BLOOD_CHART_IMAGE_POSION_X = 15;\r
+static constexpr uint16_t BLOOD_CHART_IMAGE_POSION_Y = 140;\r
+static constexpr uint16_t BLOOD_BIND_IMAGE_X = 140;\r
+static constexpr uint16_t BLOOD_BIND_IMAGE_Y = 50;\r
+static constexpr uint16_t BLOOD_BIND_IMAGE_WIDTH = 50;\r
+static constexpr uint16_t BLOOD_BIND_IMAGE_HEIGHT = 50;\r
+static constexpr char *BLOOD_RETEST_BUTTON = "retestButton";\r
+\r
+const int g_imageAnimatorInfo[BLOOD_ANIMATOR_IMAGE_NUM] = {\r
+ IMAGE_BLOOD_FRAME00, IMAGE_BLOOD_FRAME01, IMAGE_BLOOD_FRAME02, IMAGE_BLOOD_FRAME03, IMAGE_BLOOD_FRAME04,\r
+ IMAGE_BLOOD_FRAME05, IMAGE_BLOOD_FRAME06, IMAGE_BLOOD_FRAME07, IMAGE_BLOOD_FRAME08, IMAGE_BLOOD_FRAME09,\r
+ IMAGE_BLOOD_FRAME10, IMAGE_BLOOD_FRAME11, IMAGE_BLOOD_FRAME12, IMAGE_BLOOD_FRAME13, IMAGE_BLOOD_FRAME14,\r
+ IMAGE_BLOOD_FRAME15, IMAGE_BLOOD_FRAME16, IMAGE_BLOOD_FRAME17, IMAGE_BLOOD_FRAME18, IMAGE_BLOOD_FRAME19,\r
+ IMAGE_BLOOD_FRAME20, IMAGE_BLOOD_FRAME21, IMAGE_BLOOD_FRAME22, IMAGE_BLOOD_FRAME23, IMAGE_BLOOD_FRAME24,\r
+ IMAGE_BLOOD_FRAME25, IMAGE_BLOOD_FRAME26, IMAGE_BLOOD_FRAME27, IMAGE_BLOOD_FRAME28, IMAGE_BLOOD_FRAME29,\r
+};\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_CHART_PAGE, BloodChartPage, false);\r
+\r
+BloodChartPage::BloodChartPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodChartPage::BloodChartPage");\r
+}\r
+\r
+void BloodChartPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UIViewGroup fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+ mainImg_ = new UIImageView();\r
+ if (mainImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new mainImg_ fail");\r
+ return;\r
+ }\r
+ mainImg_->SetPosition(0, 0);\r
+ mainImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(mainImg_, BLOOD_IMAGE, IMAGE_BLOOD_BG);\r
+ group_->Add(mainImg_);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(PERSEC_BLOOD_X, PERSEC_BLOOD_Y);\r
+ labelTitle_->Resize(PERSEC_BLOOD_WIDTH, PERSEC_BLOOD_HEIGHT);\r
+ labelTitle_->SetStyle(STYLE_TEXT_FONT, PERSEC_BLOOD_FONT_SIZE);\r
+ labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetRollSpeed(0);\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, PERSEC_BLOOD_FONT_SIZE);\r
+\r
+ labelTestTime_ = new UILabel();\r
+ if (labelTestTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTestTime_ fail");\r
+ return;\r
+ }\r
+ labelTestTime_->SetText("刚刚");\r
+ labelTestTime_->SetPosition(BOTTOM_TEXT_ONE_X, BOTTOM_TEXT_ONE_Y, BOTTOM_TEXT_WIDTH_ONE, BOTTOM_TEXT_HEIGHT_ONE);\r
+ labelTestTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LIMIT_FONT_SIZE_ONE);\r
+ labelTestTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTestTime_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+ labelTestTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ bloodMeasurementInfo info = BloodModel::GetInstance().GetBlood();\r
+ std::string strBlood = std::to_string(info.blood) + "%";\r
+ labelTitle_->SetText(strBlood.c_str());\r
+\r
+ dataSerial_ = new UIChartDataSerial();\r
+ if (dataSerial_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new dataSerial_ fail");\r
+ return;\r
+ }\r
+ dataSerial_->SetMaxDataCount(BLOOD_XAXIS_RANGE_MAX);\r
+ // 打桩数据,真实测量数据的存储和更新需要客户自实现\r
+ Point pointArray[BLOOD_XAXIS_RANGE_MAX] = {{0, info.blood}, {1, 75}, {2, 100}, {3, 80}};\r
+ dataSerial_->AddPoints(pointArray, BLOOD_XAXIS_RANGE_MAX);\r
+ dataSerial_->SetLineColor(Color::Green());\r
+ dataSerial_->SetFillColor(Color::Green());\r
+ dataSerial_->EnableGradient(true);\r
+\r
+ chartPillar_ = new UIChartPillar();\r
+ if (chartPillar_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new chartPillar_ fail");\r
+ return;\r
+ }\r
+ chartPillar_->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y);\r
+ chartPillar_->SetWidth(COORDINATE_WIDTH);\r
+ chartPillar_->SetHeight(COORDINATE_HEIGHT);\r
+ chartPillar_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ chartPillar_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ chartPillar_->SetStyle(STYLE_LINE_WIDTH, BLOOD_STYLE_LINE_NUM);\r
+\r
+ chartPillar_->GetXAxis().SetDataRange(0, BLOOD_XAXIS_RANGE_MAX);\r
+ chartPillar_->GetXAxis().SetMarkNum(BLOOD_XAXIS_SETMARKNUM);\r
+ chartPillar_->GetYAxis().SetDataRange(0, BLOOD_YAXIS_RANGE_MAX);\r
+ chartPillar_->GetYAxis().SetMarkNum(BLOOD_YAXIS_SETMARKNUM);\r
+ chartPillar_->GetYAxis().SetVisible(false);\r
+ chartPillar_->AddDataSerial(dataSerial_);\r
+ group_->Add(chartPillar_);\r
+\r
+ chartImg_ = new UIImageView();\r
+ if (chartImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new chartImg_ fail");\r
+ return;\r
+ }\r
+ chartImg_->SetPosition(BLOOD_CHART_IMAGE_POSION_X, BLOOD_CHART_IMAGE_POSION_Y);\r
+ LOADIMG::LoadImageViewImg(chartImg_, BLOOD_IMAGE, IMAGE_BLOOD_SCALE);\r
+ chartImg_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group_->Add(chartImg_);\r
+\r
+ labelXAxisPointOne_ = new UILabel();\r
+ if (labelXAxisPointOne_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointOne_ fail");\r
+ return;\r
+ }\r
+ labelXAxisPointOne_->SetText("00:00");\r
+ labelXAxisPointOne_->SetPosition(LABLE_XAXIS1_POSION_X, LABLE_XAXIS_POSION_Y, BOTTOM_TEXT_WIDTH_ONE,\r
+ BOTTOM_TEXT_HEIGHT_ONE);\r
+ labelXAxisPointOne_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLE_FONT_SIZE_ONE);\r
+ group_->Add(labelXAxisPointOne_);\r
+\r
+ labelXAxisPointTwo_ = new UILabel();\r
+ if (labelXAxisPointTwo_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointTwo_ fail");\r
+ return;\r
+ }\r
+ labelXAxisPointTwo_->SetText("12:00");\r
+ labelXAxisPointTwo_->SetPosition(LABLE_XAXIS2_POSION_X, LABLE_XAXIS_POSION_Y, BOTTOM_TEXT_WIDTH_ONE,\r
+ BOTTOM_TEXT_HEIGHT_ONE);\r
+ labelXAxisPointTwo_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLE_FONT_SIZE_ONE);\r
+ group_->Add(labelXAxisPointTwo_);\r
+\r
+ labelXAxisPointThree_ = new UILabel();\r
+ if (labelXAxisPointThree_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointThree_ fail");\r
+ return;\r
+ }\r
+ labelXAxisPointThree_->SetText("24:00");\r
+ labelXAxisPointThree_->SetPosition(LABLE_XAXIS3_POSION_X, LABLE_XAXIS_POSION_Y, BOTTOM_TEXT_WIDTH_ONE,\r
+ BOTTOM_TEXT_HEIGHT_ONE);\r
+ labelXAxisPointThree_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLE_FONT_SIZE_ONE);\r
+ group_->Add(labelXAxisPointThree_);\r
+\r
+ labelButtonRetest_ = new UILabelButton();\r
+ if (labelButtonRetest_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelButtonRetest_ fail");\r
+ return;\r
+ }\r
+ labelButtonRetest_->SetPosition(TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+ LOADIMG::LoadBtnImage(labelButtonRetest_, BLOOD_IMAGE, IMAGE_BLOOD_AGAIN, IMAGE_BLOOD_AGAIN);\r
+ labelButtonRetest_->SetViewId(BLOOD_RETEST_BUTTON);\r
+ labelButtonRetest_->SetOnClickListener(this);\r
+ labelButtonRetest_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ labelButtonRetest_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ labelButtonRetest_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelButtonRetest_->SetVisible(true);\r
+ group_->Add(labelButtonRetest_);\r
+\r
+ group_->Add(labelTitle_);\r
+ group_->Add(labelTestTime_);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ InitImageAnimator();\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool BloodChartPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_RESULT_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BloodChartPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp (view.GetViewId(), BLOOD_RETEST_BUTTON) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_READY_PAGE,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ return true;\r
+}\r
+\r
+void BloodChartPage::InitImageAnimator()\r
+{\r
+ imageAnimator_ = new UIImageAnimatorView();\r
+ if (imageAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imageAnimator_ fail");\r
+ return;\r
+ }\r
+ for (uint8_t i = 0; i < BLOOD_ANIMATOR_IMAGE_NUM; i++) {\r
+ imageAnimatorImageInfo_[i].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[i], BLOOD_IMAGE);\r
+ imageAnimatorImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;\r
+ imageAnimatorImageInfo_[i].pos.x = BLOOD_BIND_IMAGE_X;\r
+ imageAnimatorImageInfo_[i].pos.y = BLOOD_BIND_IMAGE_Y;\r
+ imageAnimatorImageInfo_[i].width = BLOOD_BIND_IMAGE_WIDTH;\r
+ imageAnimatorImageInfo_[i].height = BLOOD_BIND_IMAGE_HEIGHT;\r
+ }\r
+\r
+ imageAnimator_->SetPosition(PERSEC_BLOOD_TEXT_X, PERSEC_BLOOD_TEXT_Y);\r
+ imageAnimator_->SetImageAnimatorSrc(imageAnimatorImageInfo_,\r
+ BLOOD_ANIMATOR_IMAGE_NUM, BLOOD_ANIMATOR_IMAGE_UPDATE);\r
+ imageAnimator_->SetRepeat(true);\r
+ imageAnimator_->SetAutoEnable(false);\r
+ imageAnimator_->SetResizeMode(UIImageView::FILL);\r
+ imageAnimator_->Start();\r
+ imageAnimator_->LayoutCenterOfParent();\r
+ imageAnimator_->SetDraggable(true);\r
+ group_->Add(imageAnimator_);\r
+}\r
+\r
+BloodChartPage::~BloodChartPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelButtonRetest_ != nullptr) {\r
+ delete labelButtonRetest_;\r
+ labelButtonRetest_ = nullptr;\r
+ }\r
+\r
+ if (labelTestTime_ != nullptr) {\r
+ delete labelTestTime_;\r
+ labelTestTime_ = nullptr;\r
+ }\r
+\r
+ if (dataSerial_ != nullptr) {\r
+ delete dataSerial_;\r
+ dataSerial_ = nullptr;\r
+ }\r
+\r
+ if (chartPillar_ != nullptr) {\r
+ delete chartPillar_;\r
+ chartPillar_ = nullptr;\r
+ }\r
+\r
+ if (labelXAxisPointOne_ != nullptr) {\r
+ delete labelXAxisPointOne_;\r
+ labelXAxisPointOne_ = nullptr;\r
+ }\r
+\r
+ if (labelXAxisPointTwo_ != nullptr) {\r
+ delete labelXAxisPointTwo_;\r
+ labelXAxisPointTwo_ = nullptr;\r
+ }\r
+\r
+ if (labelXAxisPointThree_ != nullptr) {\r
+ delete labelXAxisPointThree_;\r
+ labelXAxisPointThree_ = nullptr;\r
+ }\r
+\r
+ if (mainImg_ != nullptr) {\r
+ delete mainImg_;\r
+ mainImg_ = nullptr;\r
+ }\r
+\r
+ if (chartImg_ != nullptr) {\r
+ delete chartImg_;\r
+ chartImg_ = nullptr;\r
+ }\r
+\r
+ if (imageAnimator_ != nullptr) {\r
+ delete imageAnimator_;\r
+ imageAnimator_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodChartPage::~BloodChartPage");\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodExplainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodExplainPage.h"\r
+\r
+namespace OHOS {\r
+static BloodExplainPage *g_pBloodCalcPage = nullptr;\r
+static const char *BLOOD_LABEL_ONE = (char *)"血氧饱和度";\r
+static const char *BLOOD_LABEL_TWO =\r
+ (char\r
+ *)"血氧饱和度(SpO2)是血液中氧和血红蛋白(HbO2)的容量占全部血红蛋白的百分比,是维持人体正常机制的重要生理参数。";\r
+static const char *BLOOD_LABEL_THREE = (char *)"测量须知";\r
+static const char *BLOOD_LABEL_FOUR =\r
+ (char *)"本设备支持血氧测量范围为70%~100%"\r
+ "。在穿戴设备上启动血氧测量后,为确保测量准确,须按佩戴指引进行操作。受外界因素影响("\r
+ "血流灌注低、手臂毛发多、有纹身、低温等)影响,测量精度可能会下降,测量结果仅供参考,不作为医疗诊断依据。";\r
+static constexpr uint16_t BLOOD_FIRST_LABEL_FONT = 38;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_Y = 40;\r
+static constexpr uint16_t BLOOD_LABEL_SECOND_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_SECOND_Y = 98;\r
+static constexpr uint16_t BLOOD_LABEL_THIRD_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_THIRD_Y = 514;\r
+static constexpr uint16_t BLOOD_LABEL_FOUR_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_FOUR_Y = 564;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_WIDTH = 350;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_HEIGHT = 400;\r
+static constexpr uint16_t BLOOD_LABEL_POSITION_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL_POSITION_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_Y = 404;\r
+static constexpr uint16_t BLOOD_BUTTONLEVEL_POSITION_X = 127;\r
+static constexpr uint16_t BLOOD_BUTTONLABLE_POSITION_X = 217;\r
+static constexpr uint16_t BLOOD_BUTTONLEVEL2_POSITION_Y = 440;\r
+static constexpr uint16_t BLOOD_BUTTONLEVEL3_POSITION_Y = 474;\r
+static constexpr uint16_t LIST_BLANK_SIZE = 50;\r
+static constexpr uint16_t INDEX_0 = 0;\r
+static constexpr uint16_t INDEX_1 = 1;\r
+static constexpr uint16_t INDEX_2 = 2;\r
+static constexpr uint16_t INDEX_3 = 3;\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_EXPLAIN_PAGE, BloodExplainPage, false);\r
+\r
+BloodExplainPage::BloodExplainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodExplainPage::BloodExplainPage");\r
+}\r
+\r
+BloodExplainPage::~BloodExplainPage()\r
+{\r
+ if (scrollGroup_ != nullptr) {\r
+ scrollGroup_->RemoveAll();\r
+ delete scrollGroup_;\r
+ scrollGroup_ = nullptr;\r
+ }\r
+\r
+ if (imgNormal_ != nullptr) {\r
+ delete imgNormal_;\r
+ imgNormal_ = nullptr;\r
+ }\r
+\r
+ if (imgGeneral_ != nullptr) {\r
+ delete imgGeneral_;\r
+ imgGeneral_ = nullptr;\r
+ }\r
+\r
+ if (imgAbnormal_ != nullptr) {\r
+ delete imgAbnormal_;\r
+ imgAbnormal_ = nullptr;\r
+ }\r
+\r
+ if (labelNormal_ != nullptr) {\r
+ delete labelNormal_;\r
+ labelNormal_ = nullptr;\r
+ }\r
+\r
+ if (labelGeneral_ != nullptr) {\r
+ delete labelGeneral_;\r
+ labelGeneral_ = nullptr;\r
+ }\r
+\r
+ if (labelAbnormal_ != nullptr) {\r
+ delete labelAbnormal_;\r
+ labelAbnormal_ = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < LABEL_DES_COUNT; i++) {\r
+ if (labelDes_[i] != nullptr) {\r
+ delete labelDes_[i];\r
+ labelDes_[i] = nullptr;\r
+ }\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodExplainPage::~BloodExplainPage");\r
+}\r
+\r
+void BloodExplainPage::OnStart(void *data)\r
+{\r
+ scrollGroup_ = new UIScrollView();\r
+ if (scrollGroup_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new scrollGroup_ fail");\r
+ return;\r
+ }\r
+ scrollGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scrollGroup_->SetThrowDrag(true);\r
+ scrollGroup_->SetScrollBlankSize(LIST_BLANK_SIZE);\r
+ scrollGroup_->SetOnDragListener(this);\r
+ scrollGroup_->SetDraggable(true);\r
+ scrollGroup_->SetTouchable(true);\r
+ if (!InitSimilarLabel(INDEX_0, BLOOD_LABEL_FIRST_X, BLOOD_LABEL_FIRST_Y, BLOOD_LABEL_ONE)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new InitSimilarLabel[INDEX_0] error");\r
+ }\r
+ if (!InitSimilarLabel(INDEX_1, BLOOD_LABEL_SECOND_X, BLOOD_LABEL_SECOND_Y, BLOOD_LABEL_TWO)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new InitSimilarLabel[INDEX_1] error");\r
+ }\r
+ if (!InitSimilarLabel(INDEX_2, BLOOD_LABEL_THIRD_X, BLOOD_LABEL_THIRD_Y, BLOOD_LABEL_THREE)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new InitSimilarLabel[INDEX_2] error");\r
+ }\r
+ if (!InitSimilarLabel(INDEX_3, BLOOD_LABEL_FOUR_X, BLOOD_LABEL_FOUR_Y, BLOOD_LABEL_FOUR)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new InitSimilarLabel[INDEX_3] error");\r
+ }\r
+\r
+ imgNormal_ = new UIImageView();\r
+ if (imgNormal_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imgNormal_ fail");\r
+ return;\r
+ }\r
+ imgNormal_->SetPosition(BLOOD_BUTTONLEVEL_POSITION_X, BLOOD_LABEL2_POSITION_Y);\r
+ LOADIMG::LoadImageViewImg(imgNormal_, BLOOD_IMAGE, IMAGE_BLOOD_NORMAL);\r
+ scrollGroup_->Add(imgNormal_);\r
+\r
+ labelNormal_ = new UILabel();\r
+ if (labelNormal_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelNormal_ fail");\r
+ return;\r
+ }\r
+ labelNormal_->SetText(">=94%");\r
+ labelNormal_->SetPosition(BLOOD_BUTTONLABLE_POSITION_X, BLOOD_LABEL2_POSITION_Y);\r
+ labelNormal_->Resize(BLOOD_LABEL_POSITION_WIDTH, BLOOD_LABEL_POSITION_HEIGHT);\r
+ labelNormal_->SetTextColor(Color::White());\r
+ scrollGroup_->Add(labelNormal_);\r
+\r
+ imgGeneral_ = new UIImageView();\r
+ if (imgGeneral_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imgGeneral_ fail");\r
+ return;\r
+ }\r
+ imgGeneral_->SetPosition(BLOOD_BUTTONLEVEL_POSITION_X, BLOOD_BUTTONLEVEL2_POSITION_Y);\r
+ LOADIMG::LoadImageViewImg(imgGeneral_, BLOOD_IMAGE, IMAGE_BLOOD_COMMON);\r
+ scrollGroup_->Add(imgGeneral_);\r
+\r
+ labelGeneral_ = new UILabel();\r
+ if (labelGeneral_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelGeneral_ fail");\r
+ return;\r
+ }\r
+ labelGeneral_->SetText("70%~93%");\r
+ labelGeneral_->SetPosition(BLOOD_BUTTONLABLE_POSITION_X, BLOOD_BUTTONLEVEL2_POSITION_Y);\r
+ labelGeneral_->Resize(BLOOD_LABEL_POSITION_WIDTH, BLOOD_LABEL_POSITION_HEIGHT);\r
+ labelGeneral_->SetTextColor(Color::White());\r
+ scrollGroup_->Add(labelGeneral_);\r
+\r
+ imgAbnormal_ = new UIImageView();\r
+ if (imgAbnormal_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imgAbnormal_ fail");\r
+ return;\r
+ }\r
+ imgAbnormal_->SetPosition(BLOOD_BUTTONLEVEL_POSITION_X, BLOOD_BUTTONLEVEL3_POSITION_Y);\r
+ LOADIMG::LoadImageViewImg(imgAbnormal_, BLOOD_IMAGE, IMAGE_BLOOD_ABNORMAL);\r
+ scrollGroup_->Add(imgAbnormal_);\r
+\r
+ labelAbnormal_ = new UILabel();\r
+ if (labelAbnormal_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelAbnormal_ fail");\r
+ return;\r
+ }\r
+ labelAbnormal_->SetText("<70%");\r
+ labelAbnormal_->SetPosition(BLOOD_BUTTONLABLE_POSITION_X, BLOOD_BUTTONLEVEL3_POSITION_Y);\r
+ labelAbnormal_->Resize(BLOOD_LABEL_POSITION_WIDTH, BLOOD_LABEL_POSITION_HEIGHT);\r
+ labelAbnormal_->SetTextColor(Color::White());\r
+ scrollGroup_->Add(labelAbnormal_);\r
+ AddViewToPageContainer(scrollGroup_);\r
+}\r
+\r
+bool BloodExplainPage::InitSimilarLabel(int16 num, int16 labelX, int16 labelY, const char *labelText)\r
+{\r
+ if (num < 0 || num >= LABEL_DES_COUNT) {\r
+ return false;\r
+ }\r
+ labelDes_[num] = new UILabel();\r
+ if (labelDes_[num] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelDes_[%d] error", num);\r
+ return false;\r
+ }\r
+ labelDes_[num]->SetPosition(labelX, labelY, BLOOD_LABEL_FIRST_WIDTH, BLOOD_LABEL_FIRST_HEIGHT);\r
+ labelDes_[num]->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ labelDes_[num]->SetText(labelText);\r
+ if (num == INDEX_0) {\r
+ labelDes_[num]->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_FIRST_LABEL_FONT);\r
+ } else {\r
+ labelDes_[num]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_FIRST_LABEL_FONT);\r
+ }\r
+ labelDes_[num]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ scrollGroup_->Add(labelDes_[num]);\r
+ return true;\r
+}\r
+\r
+bool BloodExplainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_RESULT_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodMainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <chrono>\r
+#include <sstream>\r
+#include <string>\r
+#include <iomanip>\r
+#include "components/root_view.h"\r
+#include "sys/time.h"\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "securec.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_X = 110;\r
+static constexpr uint16_t BLOOD_BUTTON_HEIGHT = 76;\r
+static constexpr uint16_t BLOOD_TITLE_POSITION_X = 195;\r
+static constexpr uint16_t BLOOD_TITLE_POSITION_Y = 40;\r
+static constexpr uint16_t BLOOD_TITLE_WIDTH = 260;\r
+static constexpr uint16_t BLOOD_TITLE_HEIGHT = 53;\r
+static constexpr uint16_t BLOOD_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_Y = 330;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_WIDTH = 232;\r
+static constexpr uint16_t BLOOD_LABLETEST_POSITION_X = 158;\r
+static constexpr uint16_t BLOOD_LABLETEST_POSITION_Y = 281;\r
+static constexpr uint16_t BLOOD_LABLETEST_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABLETEST_HEIGHT = 40;\r
+static constexpr uint16_t BLOOD_LABLETEST_SIZE_FONT = 24;\r
+static constexpr uint16_t VIDEO_WIDTH = 454;\r
+static constexpr uint16_t VIDEO_HEIGHT = 454;\r
+static constexpr uint16_t STRIDE_ALIGNMENT_VALUE = 128;\r
+static constexpr uint16_t BUFFER_QUEUE_SIZE = 3;\r
+static constexpr uint16_t JPEG_HEIGHT_DIVISOR = 2;\r
+static constexpr uint16_t JPEG_WIDTH_BYTE_ALIGNMENT = 128;\r
+static constexpr uint16_t JPEG_HEIGHT_BYTE_ALIGNMENT = 16;\r
+static constexpr uint16_t BLOOD_BUTTON_FONT_SIZE = 35;\r
+static constexpr uint16_t BLOOD_DATE_TIME_ONE = 90;\r
+static constexpr uint16_t BLOOD_DATE_TIME_TWO = 3000;\r
+static constexpr uint16_t BLOOD_DATE_TIME_THREE = 60;\r
+static constexpr uint16_t BLOOD_DATE_TIME_FOUR = 3600;\r
+static constexpr uint16_t BLOOD_OPA = 50;\r
+static constexpr char *BLOOD_START_BUTTON = "startButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_MAIN_PAGE, BloodMainPage, true);\r
+\r
+BloodMainPage::BloodMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodMainPage::BloodMainPage");\r
+}\r
+\r
+BloodMainPage::~BloodMainPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (buttonStart_ != nullptr) {\r
+ delete buttonStart_;\r
+ buttonStart_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelPreTest_ != nullptr) {\r
+ delete labelPreTest_;\r
+ labelPreTest_ = nullptr;\r
+ }\r
+\r
+ if (videoPlay_ != nullptr) {\r
+ videoPlay_->StopVideoPlay();\r
+ delete videoPlay_;\r
+ videoPlay_ = nullptr;\r
+ }\r
+\r
+ if (surfaceView_ != nullptr) {\r
+ delete surfaceView_;\r
+ surfaceView_ = nullptr;\r
+ }\r
+\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodMainPage::~BloodMainPage");\r
+}\r
+\r
+void BloodMainPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ InitImageAnimator();\r
+\r
+ buttonStart_ = new UILabelButton();\r
+ if (buttonStart_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonStart_ fail");\r
+ return;\r
+ }\r
+ buttonStart_->SetPosition(BLOOD_BUTTON_POSITION_X, BLOOD_BUTTON_TWO_POSITION_Y);\r
+ buttonStart_->Resize(BLOOD_BUTTON_TWO_WIDTH, BLOOD_BUTTON_HEIGHT);\r
+ buttonStart_->SetViewId(BLOOD_START_BUTTON);\r
+ buttonStart_->SetOnClickListener(this);\r
+ buttonStart_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::RELEASED);\r
+ buttonStart_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::PRESSED);\r
+ buttonStart_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::INACTIVE);\r
+ buttonStart_->SetText("开始测量");\r
+ buttonStart_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_BUTTON_FONT_SIZE);\r
+ buttonStart_->SetVisible(true);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(BLOOD_TITLE_POSITION_X, BLOOD_TITLE_POSITION_Y, BLOOD_TITLE_WIDTH, BLOOD_TITLE_HEIGHT);\r
+ labelTitle_->SetText("血氧");\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_TITLE_FONT_SIZE);\r
+ SetTestTime();\r
+ group_->Add(buttonStart_);\r
+ group_->Add(labelPreTest_);\r
+ group_->Add(labelTitle_);\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BloodMainPage::OnResume()\r
+{\r
+ videoPlay_->StartVideoPlay();\r
+}\r
+\r
+void BloodMainPage::OnPause()\r
+{\r
+ videoPlay_->StopVideoPlay();\r
+}\r
+\r
+void BloodMainPage::SetTestTime()\r
+{\r
+ labelPreTest_ = new UILabel();\r
+ if (labelPreTest_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelPreTest_ fail");\r
+ return;\r
+ }\r
+ labelPreTest_->SetPosition(BLOOD_LABLETEST_POSITION_X, BLOOD_LABLETEST_POSITION_Y, BLOOD_LABLETEST_WIDTH,\r
+ BLOOD_LABLETEST_HEIGHT);\r
+ labelPreTest_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLETEST_SIZE_FONT);\r
+ labelPreTest_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+ labelPreTest_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelPreTest_->SetVisible(false);\r
+ bloodMeasurementInfo info = BloodModel::GetInstance().GetBlood();\r
+ struct timeval current_time;\r
+ if (info.blood == 0) {\r
+ info.blood = BLOOD_DATE_TIME_ONE;\r
+ gettimeofday(¤t_time, nullptr);\r
+ int64_t now = current_time.tv_sec;\r
+ struct timeval time1;\r
+ time1.tv_sec = now - BLOOD_DATE_TIME_TWO;\r
+ info.time = time1;\r
+ }\r
+ if (info.blood != 0) {\r
+ struct timeval tv = info.time;\r
+ std::time_t time = tv.tv_sec;\r
+ std::tm *tm_info = std::localtime(&time);\r
+ std::stringstream ss;\r
+ if (IsToday(tv)) {\r
+ gettimeofday(¤t_time, nullptr);\r
+ int64_t now = current_time.tv_sec;\r
+ int64_t diff_seconds = now - tv.tv_sec;\r
+ if (diff_seconds < 0) {\r
+ ss << info.blood << "% "\r
+ << "刚刚";\r
+ } else if (diff_seconds < BLOOD_DATE_TIME_THREE) {\r
+ ss << info.blood << "% (" << diff_seconds << "秒前)";\r
+ } else if (diff_seconds < BLOOD_DATE_TIME_FOUR) {\r
+ int minutes = diff_seconds / BLOOD_DATE_TIME_THREE;\r
+ ss << info.blood << "% (" << minutes << "分钟前)";\r
+ } else {\r
+ int hours = diff_seconds / BLOOD_DATE_TIME_FOUR;\r
+ ss << info.blood << "% (" << hours << "小时前)";\r
+ }\r
+ } else {\r
+ ss << info.blood << "% " << (tm_info->tm_mon + 1) << "/" << tm_info->tm_mday;\r
+ }\r
+ labelPreTest_->SetText(ss.str().c_str());\r
+ int textWidth = labelPreTest_->GetTextWidth();\r
+ int posX = (HORIZONTAL_RESOLUTION - textWidth) / 2;\r
+ labelPreTest_->SetX(posX);\r
+ labelPreTest_->SetVisible(true);\r
+ }\r
+}\r
+\r
+bool BloodMainPage::IsToday(const struct timeval &tv)\r
+{\r
+ time_t now = time(nullptr);\r
+ std::tm *now_tm = localtime(&now);\r
+ std::time_t given_time = tv.tv_sec;\r
+ std::tm *given_tm = std::localtime(&given_time);\r
+\r
+ return (now_tm->tm_year == given_tm->tm_year) && (now_tm->tm_mon == given_tm->tm_mon) &&\r
+ (now_tm->tm_mday == given_tm->tm_mday);\r
+}\r
+\r
+bool BloodMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BloodMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), BLOOD_START_BUTTON) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_READY_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+\r
+void BloodMainPage::InitImageAnimator()\r
+{\r
+ surfaceView_ = new UILiteSurfaceView();\r
+ if (surfaceView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImageAnimator new UILiteSurfaceView fail");\r
+ return;\r
+ }\r
+ colorKey_.full = 0xff202020;\r
+ surfaceView_->SetPosition(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);\r
+ surfaceView_->SetPreview(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_BLOOD_PREVIEW1, BLOOD_IMAGE));\r
+ surfaceView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ surfaceView_->SetSurfaceColorkey(colorKey_);\r
+ group_->Add(surfaceView_);\r
+\r
+ Surface *surface = surfaceView_->GetSurface();\r
+ surface->SetStrideAlignment(STRIDE_ALIGNMENT_VALUE);\r
+ surface->SetWidthAndHeight(VIDEO_WIDTH, VIDEO_HEIGHT);\r
+ surface->SetQueueSize(BUFFER_QUEUE_SIZE);\r
+ surface->SetFormat(PIXEL_FMT_YCBCR_420_SP);\r
+\r
+ int32_t ySize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) * VIDEO_HEIGHT;\r
+ int32_t uvSize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) *\r
+ ALIGN_BYTE(VIDEO_HEIGHT, JPEG_HEIGHT_BYTE_ALIGNMENT) / JPEG_HEIGHT_DIVISOR;\r
+ int32_t bufferSize = ySize + uvSize;\r
+ surface->SetSize(bufferSize);\r
+ std::string uri("/user/res/video/bloodBackGround.mp4");\r
+ videoPlay_ = new MediaVideoPlay(surface, nullptr, uri, false);\r
+ if (videoPlay_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new videoPlay_ fail");\r
+ return;\r
+ }\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodMeasurementPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <random>\r
+#include <chrono>\r
+#include "ui_test_group.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "surface.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodMeasurementPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_X = 152;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_Y = 330;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT = 72;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT_BOTTOM = 36;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_X = 183;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_Y = 162;\r
+static constexpr uint16_t BLOOD_LABEL2_WIDTH = 180;\r
+static constexpr uint16_t BLOOD_LABEL2_HEIGHT = 42;\r
+static constexpr uint16_t VIDEO_WIDTH = 454;\r
+static constexpr uint16_t VIDEO_HEIGHT = 454;\r
+static constexpr uint16_t STRIDE_ALIGNMENT_VALUE = 128;\r
+static constexpr uint16_t BUFFER_QUEUE_SIZE = 3;\r
+static constexpr uint16_t JPEG_HEIGHT_DIVISOR = 2;\r
+static constexpr uint16_t JPEG_WIDTH_BYTE_ALIGNMENT = 128;\r
+static constexpr uint16_t JPEG_HEIGHT_BYTE_ALIGNMENT = 16;\r
+static constexpr uint16_t BLOOD_LABLETITLE_POSITION_X = 195;\r
+static constexpr uint16_t BLOOD_LABLETITLE_POSITION_Y = 40;\r
+static constexpr uint16_t BLOOD_LABLETITLE_WIDTH = 260;\r
+static constexpr uint16_t BLOOD_LABLETITLE_HEIGHT = 53;\r
+static constexpr uint16_t BLOOD_LABLETITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BLOOD_TIME = 15;\r
+static constexpr uint16_t BLOOD_NUM = 60;\r
+static constexpr uint16_t BLOOD_NUM_ONE = 40;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_MEASUREMENT_PAGE, BloodMeasurementPage, false);\r
+\r
+BloodMeasurementPage::BloodMeasurementPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodMeasurementPage::BloodMeasurementPage");\r
+}\r
+\r
+BloodMeasurementPage::~BloodMeasurementPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelTime_ != nullptr) {\r
+ delete labelTime_;\r
+ labelTime_ = nullptr;\r
+ }\r
+\r
+ if (labelTips_ != nullptr) {\r
+ delete labelTips_;\r
+ labelTips_ = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+\r
+ if (callBack_ != nullptr) {\r
+ delete callBack_;\r
+ callBack_ = nullptr;\r
+ }\r
+\r
+ if (videoPlay_ != nullptr) {\r
+ videoPlay_->StopVideoPlay();\r
+ delete videoPlay_;\r
+ videoPlay_ = nullptr;\r
+ }\r
+\r
+ if (surfaceView_ != nullptr) {\r
+ delete surfaceView_;\r
+ surfaceView_ = nullptr;\r
+ }\r
+\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodMeasurementPage::~BloodMeasurementPage");\r
+}\r
+\r
+void BloodMeasurementPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ InitImageAnimator();\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(BLOOD_LABLETITLE_POSITION_X, BLOOD_LABLETITLE_POSITION_Y, BLOOD_LABLETITLE_WIDTH,\r
+ BLOOD_LABLETITLE_HEIGHT);\r
+ labelTitle_->SetText("血氧");\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_LABLETITLE_FONT_SIZE);\r
+ labelTitle_->SetVisible(false);\r
+\r
+ InitAnimator();\r
+ gettimeofday(&startTime_, nullptr);\r
+ StartAnimator();\r
+ group_->Add(labelTitle_);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BloodMeasurementPage::OnResume()\r
+{\r
+ videoPlay_->StartVideoPlay();\r
+ SettingDisplayModel::GetInstance().EnableSteadyOn();\r
+}\r
+\r
+void BloodMeasurementPage::OnPause()\r
+{\r
+ videoPlay_->StopVideoPlay();\r
+ SettingDisplayModel::GetInstance().DisableSteadyOn();\r
+}\r
+\r
+void BloodMeasurementPage::InitAnimator()\r
+{\r
+ labelTime_ = new UILabel();\r
+ if (labelTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTime_ fail");\r
+ return;\r
+ }\r
+ labelTime_->SetPosition(BLOOD_LABEL2_POSITION_X, BLOOD_LABEL2_POSITION_Y);\r
+ labelTime_->Resize(BLOOD_LABEL2_WIDTH, BLOOD_LABEL2_HEIGHT);\r
+ labelTime_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT);\r
+\r
+ labelTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelTime_->SetText("15s");\r
+ labelTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTime_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT);\r
+ labelTime_->SetVisible(false);\r
+\r
+ labelTips_ = new UILabel();\r
+ if (labelTips_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTips_ fail");\r
+ return;\r
+ }\r
+ labelTips_->SetPosition(BLOOD_BUTTON_TWO_POSITION_X, BLOOD_BUTTON_TWO_POSITION_Y);\r
+ labelTips_->Resize(BLOOD_LABEL2_WIDTH, BLOOD_LABEL2_HEIGHT);\r
+ labelTips_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT_BOTTOM);\r
+ labelTips_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelTips_->SetText("正在测量");\r
+ labelTips_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT_BOTTOM);\r
+ labelTips_->SetVisible(false);\r
+ group_->Add(labelTime_);\r
+ group_->Add(labelTips_);\r
+\r
+ callBack_ = new BloodAnimatorCallback(this);\r
+ if (callBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new callBack_ fail");\r
+ return;\r
+ }\r
+ animator_ = new Animator(callBack_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+void BloodMeasurementPage::BloodAnimatorCallback::Callback(UIView *view)\r
+{\r
+ (void)view;\r
+ static int count = 0;\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ int time = current_time.tv_sec - page_->startTime_.tv_sec;\r
+ std::string strTime1 = std::to_string(BLOOD_TIME - time) + "s";\r
+ page_->SetLabelTime(strTime1);\r
+ page_->ShowOnMeasurement();\r
+ if (time >= BLOOD_TIME) {\r
+ page_->StopAnimator();\r
+ int random_number = BLOOD_NUM + rand() % BLOOD_NUM_ONE;\r
+ struct timeval testTime;\r
+ gettimeofday(&testTime, nullptr);\r
+ bloodMeasurementInfo info;\r
+ info.blood = random_number;\r
+ info.time = testTime;\r
+ BloodModel::GetInstance().SetBlood(info);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_RESULT_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+}\r
+\r
+void BloodMeasurementPage::StopAnimator()\r
+{\r
+ animator_->Stop();\r
+}\r
+void BloodMeasurementPage::StartAnimator()\r
+{\r
+ animator_->Start();\r
+}\r
+\r
+void BloodMeasurementPage::SetLabelTime(std::string str)\r
+{\r
+ labelTime_->SetText(str.c_str());\r
+}\r
+\r
+void BloodMeasurementPage::ShowOnMeasurement()\r
+{\r
+ labelTips_->SetVisible(true);\r
+ labelTitle_->SetVisible(true);\r
+ labelTime_->SetVisible(true);\r
+}\r
+\r
+bool BloodMeasurementPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ StopAnimator();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+void BloodMeasurementPage::InitImageAnimator()\r
+{\r
+ surfaceView_ = new UILiteSurfaceView();\r
+ if (surfaceView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new surfaceView_ fail");\r
+ return;\r
+ }\r
+ colorKey_.full = 0xff202020;\r
+ surfaceView_->SetPosition(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);\r
+ surfaceView_->SetPreview(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_BLOOD_PREVIEW2, BLOOD_IMAGE));\r
+ surfaceView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ surfaceView_->SetSurfaceColorkey(colorKey_);\r
+ group_->Add(surfaceView_);\r
+\r
+ Surface *surface = surfaceView_->GetSurface();\r
+ surface->SetStrideAlignment(STRIDE_ALIGNMENT_VALUE);\r
+ surface->SetWidthAndHeight(VIDEO_WIDTH, VIDEO_HEIGHT);\r
+ surface->SetQueueSize(BUFFER_QUEUE_SIZE);\r
+ surface->SetFormat(PIXEL_FMT_YCBCR_420_SP);\r
+\r
+ int32_t ySize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) * VIDEO_HEIGHT;\r
+ int32_t uvSize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) *\r
+ ALIGN_BYTE(VIDEO_HEIGHT, JPEG_HEIGHT_BYTE_ALIGNMENT) / JPEG_HEIGHT_DIVISOR;\r
+ int32_t bufferSize = ySize + uvSize;\r
+ surface->SetSize(bufferSize);\r
+ std::string uri("/user/res/video/blood.mp4");\r
+ videoPlay_ = new MediaVideoPlay(surface, nullptr, uri, false);\r
+ if (videoPlay_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new videoPlay_ fail");\r
+ return;\r
+ }\r
+}\r
+}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- */\r
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: SettingModel.cpp\r
- * Author:\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodModel\r
* Create: 2025-03-23\r
*/\r
\r
#include <sys/time.h>\r
-#include "blood/BloodModel.h"\r
-#include "blood/BloodView.h"\r
#include "ohos_timer.h"\r
#include "wearable_log.h"\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodModel.h"\r
\r
namespace OHOS {\r
-static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
-static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
-static constexpr uint16_t NUM_TEN = 10;\r
-static constexpr uint16_t NUM_TIME_MIN = 60;\r
-static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
-static constexpr int32_t NUM_TIME_DAY = 86400;\r
+BloodModel::BloodModel() {}\r
\r
-static constexpr int16_t MIN_TO_HOUR = 60;\r
-static constexpr int16_t HOURLY_SYSTEM = 24;\r
-BloodModel::BloodModel()\r
-{\r
- InitCurrentTimeTimer();\r
-}\r
-\r
-BloodModel::~BloodModel()\r
-{\r
- DisableCurrentTimeTimer();\r
-}\r
+BloodModel::~BloodModel() {}\r
\r
BloodModel &BloodModel::GetInstance()\r
{\r
static BloodModel instance;\r
return instance;\r
}\r
-void BloodModel::SetbuttonStatus(bool status)\r
-{\r
- buttonStatus = status;\r
-}\r
-\r
-bool BloodModel::GetbuttonStatus()\r
-{\r
- return buttonStatus;\r
-}\r
-\r
-/* 定时器回调函数 */\r
-static void CurrentTimeTimerCallback(void *data)\r
-{\r
- (void)data;\r
- BloodView *view = BloodView::GetInstance();\r
- if (view != nullptr && view->IsCurrentTimeLabelValid()) {\r
- std::string currTime = BloodModel::GetInstance().GetCurrentTimeString();\r
- view->UpdateCurrentTimeLabel(currTime.c_str());\r
- }\r
-}\r
-\r
-std::string BloodModel::GetCurrentTimeString()\r
-{\r
- std::string strHours;\r
- std::string strMinute;\r
- struct timeval tv;\r
- gettimeofday(&tv, NULL);\r
- uint64_t second = tv.tv_sec;\r
- uint64_t uSecond = tv.tv_usec;\r
- uint64_t minute = second / MIN_TO_HOUR;\r
- uint64_t hour = minute / MIN_TO_HOUR;\r
- uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);\r
- uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
-\r
- if (realHour >= 0 && realHour < NUM_TEN) {\r
- strHours = "0" + std::to_string(realHour);\r
- } else {\r
- strHours = std::to_string(realHour);\r
- }\r
- if (realMinute >= 0 && realMinute < NUM_TEN) {\r
- strMinute = "0" + std::to_string(realMinute);\r
- } else {\r
- strMinute = std::to_string(realMinute);\r
- }\r
- return strHours + ":" + strMinute;\r
-}\r
-\r
-void BloodModel::InitCurrentTimeTimer()\r
-{\r
- if (pCurrentTimeTimer_ != nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchModel::InitCurrentTimeTimer GraphicTimer already exists!!");\r
- return;\r
- }\r
- uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
- pCurrentTimeTimer_ = new GraphicTimer(tick, CurrentTimeTimerCallback, nullptr, true);\r
- if (pCurrentTimeTimer_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchModel::InitCurrentTimeTimer new GraphicTimer failed!!");\r
- return;\r
- }\r
-}\r
\r
-void BloodModel::DisableCurrentTimeTimer()\r
-{\r
- if (pCurrentTimeTimer_ != nullptr) {\r
- pCurrentTimeTimer_->Stop();\r
- delete pCurrentTimeTimer_;\r
- pCurrentTimeTimer_ = nullptr;\r
- }\r
-}\r
-\r
-void BloodModel::StartCurrentTimeTimer()\r
-{\r
- if (pCurrentTimeTimer_ != nullptr) {\r
- bool retTimer = pCurrentTimeTimer_->Start();\r
- if (!retTimer) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartStopwatchTimer GraphicTimer Start failed!!");\r
- if (pCurrentTimeTimer_ != nullptr) {\r
- delete pCurrentTimeTimer_;\r
- pCurrentTimeTimer_ = nullptr;\r
- }\r
- return;\r
- }\r
- }\r
-}\r
-\r
-void BloodModel::PauseCurrentTimeTimer()\r
-{\r
- if (pCurrentTimeTimer_ != nullptr) {\r
- pCurrentTimeTimer_->Stop();\r
- }\r
-}\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: SettingPresenter.cpp\r
- * Author:\r
- * Create: 2025-03-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodPresenter\r
+ * Create: 2025-06\r
*/\r
\r
-#include "blood/BloodPresenter.h"\r
-#include "blood/BloodView.h"\r
-#include "blood/BloodModel.h"\r
#include "uiservice/ui_service.h"\r
#include "NativeRegisterManager.h"\r
-namespace OHOS {\r
-\r
-REGIST_MENU(VIEW_BLOOD, BloodView, BloodPresenter, PNG_APPLIST_TEMP_IMAGE, PNG_APPLIST_TEMP_IMAGE, "血氧");\r
-\r
-static BloodPresenter *g_pBloodPresenter = nullptr;\r
-\r
-BloodPresenter::BloodPresenter()\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodPresenter::BloodPresenter");\r
- findPhoneModel = &BloodModel::GetInstance();\r
- g_pBloodPresenter = this;\r
-}\r
-\r
-BloodPresenter::~BloodPresenter()\r
-{\r
- g_pBloodPresenter = nullptr;\r
-}\r
-\r
-void BloodPresenter::OnResume(void)\r
-{\r
- Presenter<BloodView>::OnResume();\r
- SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);\r
- BloodModel::GetInstance().StartCurrentTimeTimer();\r
-}\r
-\r
-void BloodPresenter::OnPause(void)\r
-{\r
- Presenter<BloodView>::OnPause();\r
- SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);\r
- BloodModel::GetInstance().PauseCurrentTimeTimer();\r
- return;\r
-}\r
-\r
-BloodPresenter *BloodPresenter::GetInstance()\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodPresenter GetInstance");\r
- return g_pBloodPresenter;\r
-}\r
-\r
-bool BloodPresenter::ClickFuncId(const char *buttonName)\r
-{\r
- if (buttonName == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempPresenter::ClickFuncId buttonName nullptr error!");\r
- return false;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::ClickFuncId buttonName = %s", buttonName);\r
- if (strcmp(buttonName, "button1") == 0) {\r
- } else if (strcmp(buttonName, "button2") == 0) {\r
- }\r
- return false;\r
-}\r
-\r
-bool BloodPresenter::OnClick(UIView &view, const ClickEvent &event)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::OnClick ");\r
- UNUSED(event);\r
- BloodView::GetInstance()->DropView(view, 1);\r
- return true;\r
-}\r
-\r
-bool BloodPresenter::OnDrag(UIView &view, const DragEvent &event)\r
-{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherOnDragListener::OnDrag");\r
- UNUSED(view);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag %s", view.GetViewId());\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag %s", event.GetDragDirection());\r
- if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
- BloodView::GetInstance()->DropView(view, 0);\r
- } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag DIRECTION_RIGHT_TO_LEFT");\r
- BloodView::GetInstance()->DropView(view, 1);\r
- }\r
- return false;\r
-}\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodModel.h"\r
+#include "blood/BloodPresenter.h"\r
\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_BLOOD, BloodView, BloodPresenter, BLOOD_ICON, BLOOD_ICON, "血氧");\r
}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodReadyPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <cmath>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "surface.h"\r
+#include "ui_resource_blood.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodReadyPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_X = 188;\r
+static constexpr uint16_t BLOOD_BUTTON_WIDTH = 96;\r
+static constexpr uint16_t BLOOD_BUTTON_HEIGHT = 96;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_Y = 288;\r
+static constexpr uint16_t BLOOD_LABEL3_POSITION_X = 65;\r
+static constexpr uint16_t BLOOD_LABEL3_POSITION_Y = 150;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_POSITION_X = 110;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_POSITION_Y = 200;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_WIDTH = 424;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_HEIGHT = 424;\r
+static constexpr uint16_t BLOOD_LABLETIPSSATRT_FONT_SIZE = 36;\r
+static constexpr uint16_t BLOOD_LABLEBACK_POSITION_X = 218;\r
+static constexpr uint16_t BLOOD_LABLEBACK_POSITION_Y = 318;\r
+static constexpr uint16_t BLOOD_LABLEBACK_WIDTH = 50;\r
+static constexpr uint16_t BLOOD_LABLEBACK_HEIGHT = 50;\r
+static constexpr uint16_t BLOOD_LABLEBACK_FONT_SIZE = 30;\r
+static constexpr uint16_t BLOOD_PLAYBACK_POSITION_X = 140;\r
+static constexpr uint16_t BLOOD_PLAYBACK_POSITION_Y = 250;\r
+static constexpr uint16_t BLOOD_PLAYBACK_WIDTH = 172;\r
+static constexpr uint16_t BLOOD_PLAYBACK_HEIGHT = 172;\r
+static constexpr uint16_t BLOOD_PLAYBACK_VENTER_POSITION = 86;\r
+static constexpr uint32_t BLOOD_PLAYBACK_RANGE = 100000;\r
+static constexpr uint16_t BLOOD_PLAYBACK_RADIUS = 48;\r
+static constexpr uint16_t BLOOD_PLAYBACK_START_ANGLE = 360;\r
+static constexpr uint16_t BLOOD_PLAYBACK_STYLE_LINE_WIDTH = 12;\r
+static constexpr uint16_t BLOOD_TIME = 3;\r
+static constexpr uint16_t BLOOD_PROGRESS_TIME = 3;\r
+static constexpr uint16_t BLOOD_TIME_USEC = 1000;\r
+static constexpr char *BLOOD_START_BUTTON = "startButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_READY_PAGE, BloodReadyPage, false);\r
+\r
+BloodReadyPage::BloodReadyPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodReadyPage::BloodReadyPage");\r
+}\r
+\r
+BloodReadyPage::~BloodReadyPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (buttonStart_ != nullptr) {\r
+ delete buttonStart_;\r
+ buttonStart_ = nullptr;\r
+ }\r
+\r
+ if (labelTips_ != nullptr) {\r
+ delete labelTips_;\r
+ labelTips_ = nullptr;\r
+ }\r
+\r
+ if (timeProgress_ != nullptr) {\r
+ delete timeProgress_;\r
+ timeProgress_ = nullptr;\r
+ }\r
+\r
+ if (labelProgressTime_ != nullptr) {\r
+ delete labelProgressTime_;\r
+ labelProgressTime_ = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+\r
+ if (callBack_ != nullptr) {\r
+ delete callBack_;\r
+ callBack_ = nullptr;\r
+ }\r
+\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodReadyPage::~BloodReadyPage");\r
+}\r
+\r
+void BloodReadyPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ buttonStart_ = new UILabelButton();\r
+ if (buttonStart_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonStart_ fail");\r
+ return;\r
+ }\r
+ buttonStart_->SetPosition(BLOOD_BUTTON_POSITION_X, BLOOD_BUTTON_TWO_POSITION_Y);\r
+ buttonStart_->Resize(BLOOD_BUTTON_WIDTH, BLOOD_BUTTON_HEIGHT);\r
+ LOADIMG::LoadBtnImage(buttonStart_, BLOOD_IMAGE, IMAGE_BLOOD_RESET, IMAGE_BLOOD_RESET);\r
+ buttonStart_->SetViewId(BLOOD_START_BUTTON);\r
+ buttonStart_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ buttonStart_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ buttonStart_->SetVisible(true);\r
+ buttonStart_->SetOnClickListener(this);\r
+ group_->Add(buttonStart_);\r
+\r
+ labelTips_ = new UILabel();\r
+ if (labelTips_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTips_ fail");\r
+ return;\r
+ }\r
+ labelTips_->SetPosition(BLOOD_LABLETIPSSATRT_POSITION_X, BLOOD_LABLETIPSSATRT_POSITION_Y,\r
+ BLOOD_LABLETIPSSATRT_WIDTH, BLOOD_LABLETIPSSATRT_HEIGHT);\r
+ labelTips_->SetText("请佩戴手表测量");\r
+ labelTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLETIPSSATRT_FONT_SIZE);\r
+ labelTips_->SetVisible(true);\r
+ group_->Add(labelTips_);\r
+\r
+ InitCircleProgress();\r
+\r
+ InitAnimator();\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BloodReadyPage::InitAnimator()\r
+{\r
+ callBack_ = new BloodAnimatorCallback(this);\r
+ if (callBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new callBack_ fail");\r
+ return;\r
+ }\r
+ animator_ = new Animator(callBack_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+int BloodReadyPage::InitCircleProgress()\r
+{\r
+ labelProgressTime_ = new UILabel();\r
+ if (labelProgressTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelProgressTime_ fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ labelProgressTime_->SetPosition(BLOOD_LABLEBACK_POSITION_X, BLOOD_LABLEBACK_POSITION_Y, BLOOD_LABLEBACK_WIDTH,\r
+ BLOOD_LABLEBACK_HEIGHT);\r
+ labelProgressTime_->SetText("3");\r
+ labelProgressTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABLEBACK_FONT_SIZE);\r
+ labelProgressTime_->SetVisible(true);\r
+ labelProgressTime_->SetVisible(false);\r
+ group_->Add(labelProgressTime_);\r
+ timeProgress_ = new UICircleProgress();\r
+ if (timeProgress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timeProgress_ fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ timeProgress_->SetPosition(BLOOD_PLAYBACK_POSITION_X, BLOOD_PLAYBACK_POSITION_Y, BLOOD_PLAYBACK_WIDTH,\r
+ BLOOD_PLAYBACK_HEIGHT);\r
+ timeProgress_->SetCenterPosition(BLOOD_PLAYBACK_VENTER_POSITION, BLOOD_PLAYBACK_VENTER_POSITION);\r
+ timeProgress_->SetRange(BLOOD_PLAYBACK_RANGE, 0);\r
+ timeProgress_->SetRadius(BLOOD_PLAYBACK_RADIUS);\r
+ timeProgress_->SetStartAngle(BLOOD_PLAYBACK_START_ANGLE);\r
+ timeProgress_->SetEndAngle(0);\r
+ timeProgress_->SetValue(0);\r
+ timeProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xFF491010);\r
+ timeProgress_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ timeProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFFD72C2E);\r
+ timeProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, BLOOD_PLAYBACK_STYLE_LINE_WIDTH);\r
+ timeProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, BLOOD_PLAYBACK_STYLE_LINE_WIDTH);\r
+ timeProgress_->SetVisible(false);\r
+ group_->Add(timeProgress_);\r
+ return OHOS_SUCCESS;\r
+}\r
+\r
+void BloodReadyPage::BloodAnimatorCallback::Callback(UIView *view)\r
+{\r
+ (void)view;\r
+ static int count = 0;\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ long seconds = current_time.tv_sec - page_->startTime_.tv_sec;\r
+ long micros = current_time.tv_usec - page_->startTime_.tv_usec;\r
+ long time = (seconds * BLOOD_TIME_USEC) + (micros / BLOOD_TIME_USEC);\r
+ page_->SetLabelProgressTime(time);\r
+ if ((time / BLOOD_TIME_USEC) == BLOOD_TIME) {\r
+ page_->ShowOnMeasurement();\r
+ page_->StopAnimator();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MEASUREMENT_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+}\r
+\r
+void BloodReadyPage::StopAnimator()\r
+{\r
+ animator_->Stop();\r
+}\r
+\r
+void BloodReadyPage::SetLabelProgressTime(int time)\r
+{\r
+ int progressTime = BLOOD_PROGRESS_TIME - (time / BLOOD_TIME_USEC);\r
+ std::string strTime = std::to_string(progressTime);\r
+ labelProgressTime_->SetText(strTime.c_str());\r
+ double percentage = static_cast<double>(time) / (BLOOD_TIME * BLOOD_TIME_USEC);\r
+ double value = round(percentage * BLOOD_PLAYBACK_RANGE);\r
+ timeProgress_->SetValue(value);\r
+}\r
+\r
+void BloodReadyPage::ShowOnMeasurement()\r
+{\r
+ buttonStart_->SetVisible(false);\r
+ labelTips_->SetVisible(false);\r
+ timeProgress_->SetVisible(false);\r
+ labelProgressTime_->SetVisible(false);\r
+}\r
+\r
+bool BloodReadyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ StopAnimator();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BloodReadyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), BLOOD_START_BUTTON) == 0) {\r
+ labelTips_->SetVisible(false);\r
+ labelTips_->SetPosition(BLOOD_LABEL3_POSITION_X, BLOOD_LABEL3_POSITION_Y);\r
+ labelTips_->SetText("请屏幕朝上偏紧佩戴, 保持静止");\r
+ labelTips_->SetVisible(true);\r
+ buttonStart_->SetVisible(false);\r
+ animator_->Start();\r
+ timeProgress_->SetVisible(true);\r
+ labelProgressTime_->SetVisible(true);\r
+ gettimeofday(&startTime_, nullptr);\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodResultPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <random>\r
+#include <chrono>\r
+#include <iostream>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_blood.h"\r
+#include "msg_center_device.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodResultPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_X = 120;\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_Y = 320;\r
+static constexpr uint16_t BLOOD_BUTTON_WIDTH = 232;\r
+static constexpr uint16_t BLOOD_BUTTON_HEIGHT = 76;\r
+static constexpr uint16_t BLOOD_BUTTON_FONT_SIZE = 35;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT = 30;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_POSITION_X = 170;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_POSITION_Y = 150;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_POSITION_WIDTH = 72;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_POSITION_HEIGHT = 32;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL_ONE_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT_ONE = 60;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_X = 117;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_Y = 212;\r
+static constexpr uint16_t BLOOD_LABEL3_POSITION_Y = 212;\r
+static constexpr uint16_t BLOOD_LABEL2_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL2_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_TITLE_POSITION_X = 195;\r
+static constexpr uint16_t BLOOD_TITLE_POSITION_Y = 40;\r
+static constexpr uint16_t BLOOD_TITLE_WIDTH = 260;\r
+static constexpr uint16_t BLOOD_TITLE_HEIGHT = 53;\r
+static constexpr uint16_t BLOOD_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BLOOD_BUTTONLEVEL_POSITION_X = 277;\r
+static constexpr uint16_t BLOOD_RANDOM_NUMBER_HIGH = 90;\r
+static constexpr uint16_t BLOOD_RANDOM_NUMBER_LOW = 70;\r
+static constexpr uint16_t BLOOD_OPA = 50;\r
+static constexpr char *BLOOD_BUTTON_MORE = "moreButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_BLOOD, BLOOD_PAGES::BLOOD_RESULT_PAGE, BloodResultPage, false);\r
+\r
+BloodResultPage::BloodResultPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodResultPage::BloodResultPage");\r
+}\r
+\r
+BloodResultPage::~BloodResultPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (buttonMore_ != nullptr) {\r
+ delete buttonMore_;\r
+ buttonMore_ = nullptr;\r
+ }\r
+\r
+ if (labelData_ != nullptr) {\r
+ delete labelData_;\r
+ labelData_ = nullptr;\r
+ }\r
+\r
+ if (labelBloodOxygen_ != nullptr) {\r
+ delete labelBloodOxygen_;\r
+ labelBloodOxygen_ = nullptr;\r
+ }\r
+\r
+ if (mainImg_ != nullptr) {\r
+ delete mainImg_;\r
+ mainImg_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (levelImg_ != nullptr) {\r
+ delete levelImg_;\r
+ levelImg_ = nullptr;\r
+ }\r
+\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(BLOOD_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodResultPage::~BloodResultPage");\r
+}\r
+\r
+void BloodResultPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ mainImg_ = new UIImageView();\r
+ if (mainImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new mainImg_ fail");\r
+ return;\r
+ }\r
+ mainImg_->SetPosition(0, 0);\r
+ mainImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(mainImg_, BLOOD_IMAGE, IMAGE_BLOOD_BG);\r
+ group_->Add(mainImg_);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(BLOOD_TITLE_POSITION_X, BLOOD_TITLE_POSITION_Y, BLOOD_TITLE_WIDTH, BLOOD_TITLE_HEIGHT);\r
+ labelTitle_->SetText("结果");\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_TITLE_FONT_SIZE);\r
+ labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetRollSpeed(0);\r
+\r
+ labelData_ = new UILabel();\r
+ if (labelData_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelData_ fail");\r
+ return;\r
+ }\r
+ labelData_->SetPosition(BLOOD_LABEL_ONE_POSITION_X, BLOOD_LABEL_ONE_POSITION_Y);\r
+ labelData_->Resize(BLOOD_LABEL_ONE_WIDTH, BLOOD_LABEL_ONE_HEIGHT);\r
+ labelData_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT_ONE);\r
+ labelData_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelData_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelData_->SetRollSpeed(0);\r
+ labelData_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT_ONE);\r
+\r
+ labelBloodOxygen_ = new UILabel();\r
+ if (labelBloodOxygen_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelBloodOxygen_ fail");\r
+ return;\r
+ }\r
+ labelBloodOxygen_->SetPosition(BLOOD_LABEL2_POSITION_X, BLOOD_LABEL2_POSITION_Y);\r
+ labelBloodOxygen_->Resize(BLOOD_LABEL2_WIDTH, BLOOD_LABEL2_HEIGHT);\r
+ labelBloodOxygen_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT);\r
+ labelBloodOxygen_->SetText("血氧饱和度");\r
+ labelBloodOxygen_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelBloodOxygen_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelBloodOxygen_->SetRollSpeed(0);\r
+ labelBloodOxygen_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT);\r
+ labelBloodOxygen_->SetVisible(true);\r
+\r
+ buttonMore_ = new UILabelButton();\r
+ if (buttonMore_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonMore_ fail");\r
+ return;\r
+ }\r
+ buttonMore_->SetPosition(BLOOD_BUTTON_POSITION_X, BLOOD_BUTTON_POSITION_Y);\r
+ buttonMore_->Resize(BLOOD_BUTTON_WIDTH, BLOOD_BUTTON_HEIGHT);\r
+ buttonMore_->SetViewId(BLOOD_BUTTON_MORE);\r
+ buttonMore_->SetOnClickListener(this);\r
+ buttonMore_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::RELEASED);\r
+ buttonMore_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::PRESSED);\r
+ buttonMore_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::INACTIVE);\r
+ buttonMore_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_BUTTON_FONT_SIZE);\r
+ buttonMore_->SetText("进一步了解");\r
+ buttonMore_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+ buttonMore_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ buttonMore_->SetVisible(true);\r
+\r
+ levelImg_ = new UIImageView();\r
+ if (levelImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new levelImg_ fail");\r
+ return;\r
+ }\r
+ levelImg_->SetPosition(BLOOD_BUTTONLEVEL_POSITION_X, BLOOD_LABEL3_POSITION_Y);\r
+ bloodMeasurementInfo info = BloodModel::GetInstance().GetBlood();\r
+ std::string strBlood = std::to_string(info.blood) + "%";\r
+ labelData_->SetText(strBlood.c_str());\r
+ errcode_t result;\r
+#ifdef _WIN32\r
+ result = 0;\r
+#else\r
+ result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN, &info.blood,\r
+ sizeof(info.blood));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "send blood result:%d ", result);\r
+#endif\r
+ if (info.blood >= BLOOD_RANDOM_NUMBER_HIGH) {\r
+ LOADIMG::LoadImageViewImg(levelImg_, BLOOD_IMAGE, IMAGE_BLOOD_NORMAL);\r
+ } else if (info.blood >= BLOOD_RANDOM_NUMBER_LOW && info.blood < BLOOD_RANDOM_NUMBER_HIGH) {\r
+ LOADIMG::LoadImageViewImg(levelImg_, BLOOD_IMAGE, IMAGE_BLOOD_COMMON);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(levelImg_, BLOOD_IMAGE, IMAGE_BLOOD_ABNORMAL);\r
+ }\r
+\r
+ group_->Add(labelTitle_);\r
+ group_->Add(labelData_);\r
+ group_->Add(labelBloodOxygen_);\r
+ group_->Add(buttonMore_);\r
+ group_->Add(levelImg_);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool BloodResultPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_CHART_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BloodResultPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), BLOOD_BUTTON_MORE) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BLOOD_PAGES::BLOOD_EXPLAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+\r
+}\r
#endif\r
\r
static bool gatts_register_flag = false;\r
+static bool gattc_register_flag = false;\r
static uint8_t gatts_server_id = 0;\r
+static uint8_t gattc_client_id = 0;\r
std::list<gap_ble_callbacks_t> g_gap_ble_callback_list;\r
std::list<gatts_callbacks_t> g_gatts_callback_list;\r
+std::list<gattc_callbacks_t> g_gattc_callback_list;\r
std::list<bt_uuid_t> g_uuid_list;\r
std::list<uint16_t> g_svr_handle_list;\r
\r
return ERRCODE_SUCC;\r
}\r
\r
+errcode_t wrapper_gattc_register_callbacks(gattc_callbacks_t *func)\r
+{\r
+ g_gattc_callback_list.push_back(*func);\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
void wrapper_gap_ble_enable_callback(errcode_t status)\r
{\r
for (auto callback : g_gap_ble_callback_list) {\r
if (callback.delete_service_cb) {\r
callback.delete_service_cb(server_id, status);\r
}\r
- } \r
+ }\r
}\r
void wrapper_gatts_read_request_callback(uint8_t server_id, uint16_t conn_id, gatts_req_read_cb_t *read_cb_para, errcode_t status)\r
{\r
}\r
}\r
}\r
+\r
void wrapper_gatts_mtu_changed_callback(uint8_t server_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)\r
{\r
for (auto callback : g_gatts_callback_list) {\r
}\r
}\r
\r
+void wrapper_gattc_discovery_svc_callback(uint8_t client_id, uint16_t conn_id,\r
+ gattc_discovery_service_result_t *service, errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.discovery_svc_cb) {\r
+ callback.discovery_svc_cb(client_id, conn_id, service, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_discovery_svc_cmp_callback(uint8_t client_id, uint16_t conn_id,\r
+ bt_uuid_t *uuid, errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.discovery_svc_cmp_cb) {\r
+ callback.discovery_svc_cmp_cb(client_id, conn_id, uuid, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_discovery_chara_callback(uint8_t client_id, uint16_t conn_id,\r
+ gattc_discovery_character_result_t *character, errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.discovery_chara_cb) {\r
+ callback.discovery_chara_cb(client_id, conn_id, character, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_discovery_chara_cmp_callback(uint8_t client_id, uint16_t conn_id,\r
+ gattc_discovery_character_param_t *param, errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.discovery_chara_cmp_cb) {\r
+ callback.discovery_chara_cmp_cb(client_id, conn_id, param, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_discovery_desc_callback(uint8_t client_id, uint16_t conn_id,\r
+ gattc_discovery_descriptor_result_t *descriptor, errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.discovery_desc_cb) {\r
+ callback.discovery_desc_cb(client_id, conn_id, descriptor, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_discovery_desc_cmp_callback(uint8_t client_id, uint16_t conn_id,\r
+ uint16_t character_handle, errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.discovery_desc_cmp_cb) {\r
+ callback.discovery_desc_cmp_cb(client_id, conn_id, character_handle, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_read_callback(uint8_t client_id, uint16_t conn_id,\r
+ gattc_handle_value_t *read_result, gatt_status_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.read_cb) {\r
+ callback.read_cb(client_id, conn_id, read_result, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_read_cmp_callback(uint8_t client_id, uint16_t conn_id,\r
+ gattc_read_req_by_uuid_param_t *param, errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.read_cmp_cb) {\r
+ callback.read_cmp_cb(client_id, conn_id, param, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_write_callback(uint8_t client_id, uint16_t conn_id, uint16_t handle, gatt_status_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.write_cb) {\r
+ callback.write_cb(client_id, conn_id, handle, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_mtu_changed_callback(uint8_t client_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.mtu_changed_cb) {\r
+ callback.mtu_changed_cb(client_id, conn_id, mtu_size, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_gattc_notification_callback(uint8_t client_id, uint16_t conn_id, gattc_handle_value_t *data,\r
+ errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.notification_cb) {\r
+ callback.notification_cb(client_id, conn_id, data, status);\r
+ }\r
+ }\r
+}\r
+\r
+void wrapper_indication_callback(uint8_t client_id, uint16_t conn_id, gattc_handle_value_t *data,\r
+ errcode_t status)\r
+{\r
+ for (auto callback : g_gattc_callback_list) {\r
+ if (callback.indication_cb) {\r
+ callback.indication_cb(client_id, conn_id, data, status);\r
+ }\r
+ }\r
+}\r
+\r
static gap_ble_callbacks_t g_wrapper_gap_ble_callbacks = {\r
.ble_enable_cb = wrapper_gap_ble_enable_callback,\r
.ble_disable_cb = wrapper_gap_ble_disable_callback,\r
.read_rssi_cb = wrapper_gap_ble_read_rssi_callback,\r
.terminate_adv_cb = wrapper_gap_ble_terminate_adv_callback,\r
.auth_complete_cb = wrapper_gap_ble_auth_complete_callback,\r
- .conn_param_update_cb = wrapper_gap_ble_connect_param_update_callback, \r
+ .conn_param_update_cb = wrapper_gap_ble_connect_param_update_callback,\r
};\r
\r
static gatts_callbacks_t g_wrapper_gatts_callbacks = {\r
.delete_service_cb = wrapper_gatts_delete_all_service_callback,\r
.read_request_cb = wrapper_gatts_read_request_callback,\r
.write_request_cb = wrapper_gatts_write_request_callback,\r
- .mtu_changed_cb = wrapper_gatts_mtu_changed_callback, \r
+ .mtu_changed_cb = wrapper_gatts_mtu_changed_callback,\r
+};\r
+\r
+static gattc_callbacks_t g_wrapper_gattc_callbacks = {\r
+ .discovery_svc_cb = wrapper_gattc_discovery_svc_callback,\r
+ .discovery_svc_cmp_cb = wrapper_gattc_discovery_svc_cmp_callback,\r
+ .discovery_chara_cb = wrapper_gattc_discovery_chara_callback,\r
+ .discovery_chara_cmp_cb = wrapper_gattc_discovery_chara_cmp_callback,\r
+ .discovery_desc_cb = wrapper_gattc_discovery_desc_callback,\r
+ .discovery_desc_cmp_cb = wrapper_gattc_discovery_desc_cmp_callback,\r
+ .read_cb = wrapper_gattc_read_callback,\r
+ .read_cmp_cb = wrapper_gattc_read_cmp_callback,\r
+ .write_cb = wrapper_gattc_write_callback,\r
+ .mtu_changed_cb = wrapper_gattc_mtu_changed_callback,\r
+ .notification_cb = wrapper_gattc_notification_callback,\r
+ .indication_cb = wrapper_indication_callback,\r
};\r
\r
void wrapper_ble_register(void)\r
{\r
gap_ble_register_callbacks(&g_wrapper_gap_ble_callbacks);\r
gatts_register_callbacks(&g_wrapper_gatts_callbacks);\r
+ gattc_register_callbacks(&g_wrapper_gattc_callbacks);\r
}\r
\r
+errcode_t wrapper_gattc_register_client(bt_uuid_t *uuid, uint8_t *clientId)\r
+{\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ if (gattc_register_flag) {\r
+ *clientId = gattc_client_id;\r
+ ret = ERRCODE_SUCC;\r
+ } else {\r
+ gattc_register_flag = true;\r
+ ret = gattc_register_client(uuid, clientId);\r
+ gattc_client_id = *clientId;\r
+ }\r
+ return ret;\r
+}\r
\r
errcode_t wrapper_gatts_register_server(bt_uuid_t *app_uuid, uint8_t *server_id)\r
{\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathExerPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sys/time.h>\r
+#include <chrono>\r
+#include <iostream>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "PageTransitionMgr.h"\r
+#include "SlicePageFactory.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_image_animator.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ohos_timer.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathExerPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t BREATH_GROUP_SIZE = 454;\r
+static constexpr int16_t BREATH_ZERO = 0;\r
+static constexpr int16_t BREATH_ONE = 1;\r
+static constexpr int16_t BREATH_TWO = 2;\r
+static constexpr int16_t BREATH_THREE = 3;\r
+static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 80;\r
+static constexpr uint16_t END_TIME = 20;\r
+static constexpr int16_t BREATH_INHALE_POSITION_X = 180;\r
+static constexpr int16_t BREATH_INHALE_POSITION_Y = 380;\r
+static constexpr int16_t BREATH_INHALE_SIZE_WIDTH = 100;\r
+static constexpr int16_t BREATH_INHALE_SIZE_HEIGHT = 50;\r
+static constexpr int16_t BREATH_FRONT = 40;\r
+static constexpr int16_t BREATH_HALF = 2;\r
+static constexpr int16_t ONE_MINUTE = 60;\r
+static constexpr float BREATH_DEFAULT_SCALE = 0.5f;\r
+static constexpr float BREATH_DEFAULT_ANGLE = 30.0f;\r
+static constexpr float BREATH_MID_ANGLE = 60.0f;\r
+static constexpr float BREATH_MAX_ANGLE = 90.0f;\r
+static constexpr float BREATH_MAX_FACTOR = 1.0f;\r
+static constexpr float BREATH_MIN_FACTOR = 0.5f;\r
+const Vector2<float> VIEW_CENTER = {227, 227};\r
+enum class State { FadingOutFirst, FadingInSecond, FadingOutSecond, FadingInFirst } currentState;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_EXER_VIEW, BreathExerPage, false);\r
+\r
+BreathExerPage::BreathExerPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::BreathExerPage");\r
+}\r
+\r
+BreathExerPage::~BreathExerPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (mainImg_ != nullptr) {\r
+ delete mainImg_;\r
+ mainImg_ = nullptr;\r
+ }\r
+\r
+ if (romataImg_ != nullptr) {\r
+ delete romataImg_;\r
+ romataImg_ = nullptr;\r
+ }\r
+\r
+ if (romataImgVirtual_ != nullptr) {\r
+ delete romataImgVirtual_;\r
+ romataImgVirtual_ = nullptr;\r
+ }\r
+\r
+ if (breathInhale_ != nullptr) {\r
+ delete breathInhale_;\r
+ breathInhale_ = nullptr;\r
+ }\r
+\r
+ if (breathExhale_ != nullptr) {\r
+ delete breathExhale_;\r
+ breathExhale_ = nullptr;\r
+ }\r
+\r
+ if (animatorCallBack_ != nullptr) {\r
+ delete animatorCallBack_;\r
+ animatorCallBack_ = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ \r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::~BreathExerPage");\r
+}\r
+\r
+void BreathExerPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group_->SetTouchable(true);\r
+ group_->SetDraggable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ mainImg_ = new UIImageView();\r
+ if (mainImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainImg_ new image fail");\r
+ return;\r
+ }\r
+ mainImg_->SetPosition(0, 0);\r
+ mainImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(mainImg_, BREATH_IMAGE, IMAGE_BREATH_BG1);\r
+ group_->Add(mainImg_);\r
+\r
+ romataImg_ = new UIImageView();\r
+ if (romataImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainImg_ new romataImg_ fail");\r
+ return;\r
+ }\r
+ romataImg_->SetPosition(0, 0);\r
+ romataImg_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ romataImg_->Rotate(0, VIEW_CENTER);\r
+ LOADIMG::LoadImageViewImg(romataImg_, BREATH_IMAGE, IMAGE_BREATH_ROMATA1);\r
+ group_->Add(romataImg_);\r
+\r
+ romataImgVirtual_ = new UIImageView();\r
+ if (romataImgVirtual_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainImg_ new romataImgVirtual_ fail");\r
+ return;\r
+ }\r
+ romataImgVirtual_->SetPosition(0, 0);\r
+ romataImgVirtual_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ romataImgVirtual_->Rotate(0, VIEW_CENTER);\r
+ LOADIMG::LoadImageViewImg(romataImgVirtual_, BREATH_IMAGE, IMAGE_BREATH_ROMATA2);\r
+ group_->Add(romataImgVirtual_);\r
+\r
+ breathInhale_ = new UILabel();\r
+ breathInhale_->SetPosition(BREATH_INHALE_POSITION_X, BREATH_INHALE_POSITION_Y, BREATH_INHALE_SIZE_WIDTH,\r
+ BREATH_INHALE_SIZE_HEIGHT);\r
+ breathInhale_->SetText("吸气");\r
+ breathInhale_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_FRONT);\r
+ breathInhale_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ breathInhale_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ group_->Add(breathInhale_);\r
+\r
+ breathExhale_ = new UILabel();\r
+ breathExhale_->SetPosition(BREATH_INHALE_POSITION_X, BREATH_INHALE_POSITION_Y, BREATH_INHALE_SIZE_WIDTH,\r
+ BREATH_INHALE_SIZE_HEIGHT);\r
+ breathExhale_->SetText("呼气");\r
+ breathExhale_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_FRONT);\r
+ breathExhale_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ breathExhale_->SetStyle(STYLE_TEXT_OPA, OPA_TRANSPARENT);\r
+ group_->Add(breathExhale_);\r
+\r
+ animatorCallBack_ = new BreathExerPageCallback(this);\r
+ if (animatorCallBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animatorCallBack_ ERROR");\r
+ return;\r
+ }\r
+ animator_ = new Animator(animatorCallBack_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ ERROR");\r
+ return;\r
+ }\r
+\r
+ currentState = State::FadingOutFirst;\r
+ g_StartTime = BreathModel::GetInstance().GetBeginTime();\r
+ rotateStep_ = BreathModel::GetInstance().GetRotateStep();\r
+ flag_ = true;\r
+ scale_ = BREATH_DEFAULT_SCALE;\r
+ angle_ = BREATH_DEFAULT_ANGLE;\r
+ animator_->Start();\r
+ SettingDisplayModel::GetInstance().EnableSteadyOn();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathExerPage::UpdateTextOpa()\r
+{\r
+ static float alpha = 0;\r
+ float totalRotationSteps = (BREATH_MAX_ANGLE - BREATH_DEFAULT_ANGLE) / rotateStep_;\r
+ float deltaAlpha = (float)OPA_OPAQUE / totalRotationSteps * BREATH_HALF;\r
+ switch (currentState) {\r
+ case State::FadingOutFirst:\r
+ if (angle_ < BREATH_MID_ANGLE) {\r
+ alpha += deltaAlpha;\r
+ alpha = (alpha > (float)OPA_OPAQUE) ? (float)OPA_OPAQUE : alpha;\r
+ breathInhale_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+ breathInhale_->SetVisible(true);\r
+ breathExhale_->SetVisible(false);\r
+ } else {\r
+ currentState = State::FadingInSecond;\r
+ alpha = OPA_OPAQUE;\r
+ }\r
+ break;\r
+ case State::FadingInSecond:\r
+ if (angle_ < BREATH_MAX_ANGLE) {\r
+ alpha -= deltaAlpha;\r
+ alpha = (alpha < 0.0f) ? 0.0f : alpha;\r
+ breathInhale_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+ breathInhale_->SetVisible(true);\r
+ breathExhale_->SetVisible(false);\r
+ } else {\r
+ currentState = State::FadingOutSecond;\r
+ alpha = 0;\r
+ }\r
+ break;\r
+ case State::FadingOutSecond:\r
+ if (angle_ > BREATH_MID_ANGLE) {\r
+ alpha += deltaAlpha;\r
+ alpha = (alpha > (float)OPA_OPAQUE) ? ((float)OPA_OPAQUE) : alpha;\r
+ breathExhale_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+ breathInhale_->SetVisible(false);\r
+ breathExhale_->SetVisible(true);\r
+ } else {\r
+ currentState = State::FadingInFirst;\r
+ alpha = OPA_OPAQUE;\r
+ }\r
+ break;\r
+ case State::FadingInFirst:\r
+ if (angle_ > BREATH_DEFAULT_ANGLE) {\r
+ alpha -= deltaAlpha;\r
+ alpha = (alpha < 0.0f) ? 0.0f : alpha;\r
+ breathExhale_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+ breathInhale_->SetVisible(false);\r
+ breathExhale_->SetVisible(true);\r
+ } else {\r
+ currentState = State::FadingOutFirst;\r
+ alpha = 0;\r
+ }\r
+ break;\r
+ }\r
+}\r
+\r
+void BreathExerPage::UpdateImageRotate()\r
+{\r
+ if (flag_) {\r
+ angle_ += rotateStep_;\r
+ scale_ += (BREATH_MAX_FACTOR - BREATH_MIN_FACTOR) / ((BREATH_MAX_ANGLE - BREATH_DEFAULT_ANGLE) / rotateStep_);\r
+ } else {\r
+ angle_ -= rotateStep_;\r
+ scale_ -= (BREATH_MAX_FACTOR - BREATH_MIN_FACTOR) / ((BREATH_MAX_ANGLE - BREATH_DEFAULT_ANGLE) / rotateStep_);\r
+ }\r
+ scale_ = (scale_ > BREATH_MAX_FACTOR) ? BREATH_MAX_FACTOR : scale_;\r
+ scale_ = (scale_ < BREATH_MIN_FACTOR) ? BREATH_MIN_FACTOR : scale_;\r
+\r
+ if (angle_ >= BREATH_MAX_ANGLE) {\r
+ angle_ = BREATH_MAX_ANGLE;\r
+ flag_ = false;\r
+ } else if (angle_ <= BREATH_DEFAULT_ANGLE) {\r
+ angle_ = BREATH_DEFAULT_ANGLE;\r
+ flag_ = true;\r
+ }\r
+\r
+ romataImgVirtual_->Scale(Vector2<float>{scale_, scale_}, VIEW_CENTER);\r
+ romataImgVirtual_->Rotate(angle_, VIEW_CENTER);\r
+ romataImgVirtual_->Invalidate();\r
+ romataImg_->Scale(Vector2<float>{scale_, scale_}, VIEW_CENTER);\r
+ romataImg_->Rotate(BREATH_MID_ANGLE - angle_, VIEW_CENTER);\r
+ romataImg_->Invalidate();\r
+}\r
+\r
+void BreathExerPage::OnPause()\r
+{\r
+ animator_->Stop();\r
+ SettingDisplayModel::GetInstance().DisableSteadyOn();\r
+}\r
+\r
+bool BreathExerPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ animator_->Stop();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+void BreathExerPage::BreathExerPageCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+ struct timeval currentTime;\r
+ gettimeofday(¤tTime, nullptr);\r
+ uint32_t breathingTime = (BreathModel::GetInstance().GetTrainTime() + 1) * ONE_MINUTE;\r
+ if (breathingTime <= currentTime.tv_sec - g_StartTime) {\r
+ BreathExerPage->animator_->Stop();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_RESULT_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ BreathExerPage->UpdateImageRotate();\r
+ BreathExerPage->UpdateTextOpa();\r
+ }\r
+}\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathMainPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sstream>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "PageTransitionMgr.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "breathexercise/BreathModel.h"\r
+#include "breathexercise/BreathMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr char *BREATH_MAIN_BTN_TIMEID = "timeButton";\r
+static constexpr char *BREATH_MAIN_BTN_RHYTHM_ID = "rhythmButton";\r
+static constexpr char *BREATH_MAIN_BTN_START_ID = "startButton";\r
+static constexpr int16_t BREATH_MAIN_TITLE_X = 97;\r
+static constexpr int16_t BREATH_MAIN_TITLE_Y = 34;\r
+static constexpr int16_t BREATH_MAIN_TITLE_W = 260;\r
+static constexpr int16_t BREATH_MAIN_TITLE_H = 53;\r
+static constexpr int16_t BREATH_MAIN_TITLE_FONT_SIZE = 38;\r
+static constexpr int16_t BREATH_MAIN_DURBTN_X = 16;\r
+static constexpr int16_t BREATH_MAIN_DURBTN_Y = 190;\r
+static constexpr int16_t BREATH_MAIN_DURBTN_W = 74;\r
+static constexpr int16_t BREATH_MAIN_DURBTN_H = 74;\r
+static constexpr int16_t BREATH_MAIN_RHYBTN_X = 364;\r
+static constexpr int16_t BREATH_MAIN_RHYBTN_Y = 190;\r
+static constexpr int16_t BREATH_MAIN_RHYBTN_W = 74;\r
+static constexpr int16_t BREATH_MAIN_RHYBTN_H = 74;\r
+static constexpr int16_t BREATH_MAIN_STARTBTN_X = 60;\r
+static constexpr int16_t BREATH_MAIN_STARTBTN_Y = 358;\r
+static constexpr int16_t BREATH_MAIN_STARTBTN_W = 333;\r
+static constexpr int16_t BREATH_MAIN_STARTBTN_H = 96;\r
+static constexpr int16_t BREATH_MAIN_DURLAB_X = 20;\r
+static constexpr int16_t BREATH_MAIN_DURLAB_Y = 275;\r
+static constexpr int16_t BREATH_MAIN_DURLAB_W = 65;\r
+static constexpr int16_t BREATH_MAIN_DURLAB_H = 30;\r
+static constexpr int16_t BREATH_MAIN_RHYLAB_X = 376;\r
+static constexpr int16_t BREATH_MAIN_RHYLAB_Y = 275;\r
+static constexpr int16_t BREATH_MAIN_RHYLAB_W = 50;\r
+static constexpr int16_t BREATH_MAIN_RHYLAB_H = 30;\r
+static constexpr int16_t BREATH_MAIN_CENTER_XY = 127;\r
+static constexpr int16_t BREATH_MAIN_CENTER_WH = 200;\r
+static constexpr int16_t BREATH_MAIN_SETTING_FONT_SIZE = 24;\r
+static constexpr int16_t BREATH_MAIN_TIME_FONT_SIZE = 20;\r
+static constexpr int16_t BREATH_GROUP_SIZE = 466;\r
+static constexpr uint16_t Y_OFFSET = 300;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_MAIN_VIEW, BreathMainPage, true);\r
+\r
+BreathMainPage::BreathMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage::BreathMainPage");\r
+}\r
+\r
+BreathMainPage::~BreathMainPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (lableSetting_ != nullptr) {\r
+ delete lableSetting_;\r
+ lableSetting_ = nullptr;\r
+ }\r
+ if (buttonStart_ != nullptr) {\r
+ delete buttonStart_;\r
+ buttonStart_ = nullptr;\r
+ }\r
+ if (buttonSetting_ != nullptr) {\r
+ delete buttonSetting_;\r
+ buttonSetting_ = nullptr;\r
+ }\r
+ if (buttonTime_ != nullptr) {\r
+ delete buttonTime_;\r
+ buttonTime_ = nullptr;\r
+ }\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+ if (lableTime_ != nullptr) {\r
+ delete lableTime_;\r
+ lableTime_ = nullptr;\r
+ }\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+ if (center_ != nullptr) {\r
+ delete center_;\r
+ center_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage::~BreathMainPage");\r
+}\r
+\r
+void BreathMainPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group_->SetTouchable(true);\r
+ group_->SetDraggable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Background ERROR");\r
+ return;\r
+ }\r
+ bgImg_->SetPosition(0, 0);\r
+ bgImg_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ LOADIMG::LoadImageViewImg(bgImg_, BREATH_IMAGE, IMAGE_BREATH_BG3);\r
+ group_->Add(bgImg_);\r
+\r
+ center_ = new UIImageView();\r
+ if (center_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Center ERROR");\r
+ return;\r
+ }\r
+ center_->SetPosition(BREATH_MAIN_CENTER_XY, BREATH_MAIN_CENTER_XY);\r
+ center_->Resize(BREATH_MAIN_CENTER_WH, BREATH_MAIN_CENTER_WH);\r
+ LOADIMG::LoadImageViewImg(center_, BREATH_IMAGE, IMAGE_BREATH_CENTER2);\r
+ group_->Add(center_);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ ERROR");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(BREATH_MAIN_TITLE_X, BREATH_MAIN_TITLE_Y);\r
+ labelTitle_->Resize(BREATH_MAIN_TITLE_W, BREATH_MAIN_TITLE_H);\r
+ labelTitle_->SetText("呼吸");\r
+ labelTitle_->SetTextColor(Color::White());\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_MAIN_TITLE_FONT_SIZE);\r
+ group_->Add(labelTitle_);\r
+\r
+ buttonTime_ = new UIButton();\r
+ if (buttonTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonTime_ ERROR");\r
+ return;\r
+ }\r
+ buttonTime_->SetPosition(BREATH_MAIN_DURBTN_X, BREATH_MAIN_DURBTN_Y);\r
+ buttonTime_->Resize(BREATH_MAIN_DURBTN_W, BREATH_MAIN_DURBTN_H);\r
+ buttonTime_->SetViewId(BREATH_MAIN_BTN_TIMEID);\r
+ buttonTime_->SetOnClickListener(this);\r
+ LOADIMG::LoadBtnImage(buttonTime_, BREATH_IMAGE, IMAGE_BREATH_TIME, IMAGE_BREATH_TIME);\r
+ buttonTime_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group_->Add(buttonTime_);\r
+\r
+ buttonSetting_ = new UIButton();\r
+ if (buttonSetting_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonSetting_ ERROR");\r
+ return;\r
+ }\r
+ buttonSetting_->SetPosition(BREATH_MAIN_RHYBTN_X, BREATH_MAIN_RHYBTN_Y);\r
+ buttonSetting_->Resize(BREATH_MAIN_RHYBTN_W, BREATH_MAIN_RHYBTN_H);\r
+ buttonSetting_->SetViewId(BREATH_MAIN_BTN_RHYTHM_ID);\r
+ buttonSetting_->SetOnClickListener(this);\r
+ LOADIMG::LoadBtnImage(buttonSetting_, BREATH_IMAGE, IMAGE_BREATH_SETTING, IMAGE_BREATH_SETTING);\r
+ buttonSetting_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonSetting_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group_->Add(buttonSetting_);\r
+\r
+ buttonStart_ = new UIButton();\r
+ if (buttonStart_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonStart_ ERROR");\r
+ return;\r
+ }\r
+ buttonStart_->SetPosition(BREATH_MAIN_STARTBTN_X, BREATH_MAIN_STARTBTN_Y);\r
+ buttonStart_->Resize(BREATH_MAIN_STARTBTN_W, BREATH_MAIN_STARTBTN_H);\r
+ buttonStart_->SetViewId(BREATH_MAIN_BTN_START_ID);\r
+ buttonStart_->SetOnClickListener(this);\r
+ LOADIMG::LoadBtnImage(buttonStart_, BREATH_IMAGE, IMAGE_BREATH_START, IMAGE_BREATH_START);\r
+ buttonStart_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonStart_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group_->Add(buttonStart_);\r
+\r
+ lableSetting_ = new UILabel();\r
+ if (lableSetting_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new lableSetting_ ERROR");\r
+ return;\r
+ }\r
+ lableSetting_->SetPosition(BREATH_MAIN_RHYLAB_X, BREATH_MAIN_RHYLAB_Y);\r
+ lableSetting_->Resize(BREATH_MAIN_RHYLAB_W, BREATH_MAIN_RHYLAB_H);\r
+ lableSetting_->SetText("设置");\r
+ lableSetting_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ lableSetting_->SetTextColor(Color::White());\r
+ lableSetting_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ lableSetting_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_MAIN_SETTING_FONT_SIZE);\r
+ group_->Add(lableSetting_);\r
+\r
+ lableTime_ = new UILabel();\r
+ if (lableTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new lableTime_ ERROR");\r
+ return;\r
+ }\r
+ lableTime_->SetPosition(BREATH_MAIN_DURLAB_X, BREATH_MAIN_DURLAB_Y);\r
+ lableTime_->Resize(BREATH_MAIN_DURLAB_W, BREATH_MAIN_DURLAB_H);\r
+ lableTime_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ lableTime_->SetTextColor(Color::White());\r
+ lableTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ lableTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_MAIN_TIME_FONT_SIZE);\r
+ group_->Add(lableTime_);\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathMainPage::OnResume(void)\r
+{\r
+ int time = BreathModel::GetInstance().GetTrainTime() + 1;\r
+ std::ostringstream oss;\r
+ oss << time << " 分钟";\r
+ std::string timeStr = oss.str();\r
+ lableTime_->SetText(timeStr.c_str());\r
+}\r
+\r
+bool BreathMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), BREATH_MAIN_BTN_TIMEID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_DUR_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), BREATH_MAIN_BTN_RHYTHM_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_RHY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), BREATH_MAIN_BTN_START_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_START_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+#ifdef _WIN32\r
+ struct timeval tv;\r
+ gettimeofday(&tv, NULL);\r
+#else\r
+ struct timeval64 tv;\r
+ gettimeofday64(&tv, NULL);\r
+#endif\r
+ uint32_t remTime = tv.tv_sec;\r
+ BreathModel::GetInstance().SetStartTime(remTime);\r
+ } else {\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BreathMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ } else if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) &&\r
+ (event.GetStartPoint().y > Y_OFFSET)) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_TRAINING_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathModel\r
+ * Create: 2025-5-13\r
+ */\r
+#include "main/HealthModel.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "uiservice/ui_service.h"\r
+#include "wearable_log.h"\r
+#include "breathexercise/BreathTimeSetPage.h"\r
+#include "breathexercise/BreathModel.h"\r
+\r
+\r
+namespace OHOS {\r
+static constexpr char *SPEED_FASTER_LITTLE = "稍快";\r
+static constexpr char *SPEED_SOOTHING = "舒缓";\r
+static constexpr char *SPEED_SLOWING = "缓慢";\r
+static constexpr uint16_t MINUTE_0_DATA = 0;\r
+static constexpr uint16_t MINUTE_1_DATA = 1;\r
+static constexpr uint16_t MINUTE_2_DATA = 2;\r
+static constexpr uint16_t Frequency_Score_LOWER = 60;\r
+static constexpr uint16_t Frequency_Score_RANGE = 40;\r
+static constexpr uint16_t Heart_Rate_LOWER = 90;\r
+static constexpr uint16_t Heart_Rate_RANGE = 10;\r
+static constexpr uint16_t ONE_MINUTE = 60;\r
+static constexpr uint16_t TWO_MINUTES = 120;\r
+static constexpr uint16_t THREE_MINUTES = 180;\r
+static constexpr uint8_t FREQUENCY_8 = 0;\r
+static constexpr uint8_t FREQUENCY_7 = 1;\r
+static constexpr uint8_t FREQUENCY_6 = 2;\r
+static constexpr float BREATH_ROTETAESTEP_6 = 0.295f;\r
+static constexpr float BREATH_ROTETAESTEP_7 = 0.347f;\r
+static constexpr float BREATH_ROTETAESTEP_8 = 0.393f;\r
+\r
+BreathModel::BreathModel() {}\r
+\r
+BreathModel::~BreathModel() {}\r
+\r
+BreathModel &BreathModel::GetInstance()\r
+{\r
+ static BreathModel instance;\r
+ return instance;\r
+}\r
+\r
+uint8_t BreathModel::GetTrainTime()\r
+{\r
+ return selectTrainTime_;\r
+}\r
+\r
+void BreathModel::SetTrainTime(uint16_t value)\r
+{\r
+ selectTrainTime_ = value;\r
+}\r
+\r
+uint8_t BreathModel::GetRhythm()\r
+{\r
+ return selectRhythm_;\r
+}\r
+\r
+void BreathModel::SetRhythm(uint16_t value)\r
+{\r
+ selectRhythm_ = value;\r
+}\r
+\r
+int32_t BreathModel::GetStartTime()\r
+{\r
+ return startTime_;\r
+}\r
+\r
+void BreathModel::SetStartTime(int32_t value)\r
+{\r
+ startTime_ = value;\r
+}\r
+\r
+int32_t BreathModel::GetBeginTime()\r
+{\r
+ return beginTime_;\r
+}\r
+\r
+void BreathModel::SetBeginTime(int32_t value)\r
+{\r
+ beginTime_ = value;\r
+}\r
+\r
+uint8_t BreathModel::GetFrequencyScore()\r
+{\r
+ if (frequencyScore_ == 0) {\r
+ BreathModel::GetInstance().SetFrequencyScore();\r
+ return frequencyScore_;\r
+ }\r
+ return frequencyScore_;\r
+}\r
+\r
+void BreathModel::SetFrequencyScore()\r
+{\r
+ frequencyScore_ = Frequency_Score_LOWER + rand() % Frequency_Score_RANGE;\r
+}\r
+\r
+std::string BreathModel::GetTrainingDurationTime()\r
+{\r
+ return std::to_string(trainingDurationTime_);\r
+}\r
+\r
+void BreathModel::SetTrainingDurationTime(uint16_t selectTrainTime)\r
+{\r
+ trainingDurationTime_ += selectTrainTime;\r
+}\r
+\r
+std::string BreathModel::GetTrainingCount()\r
+{\r
+ return std::to_string(trainingCount_);\r
+}\r
+\r
+void BreathModel::SetTrainingCount()\r
+{\r
+ trainingCount_++;\r
+}\r
+\r
+uint8_t BreathModel::GetHeartRate()\r
+{\r
+ if (heartRate_ == 0) {\r
+ BreathModel::GetInstance().SetHeartRate();\r
+ return heartRate_;\r
+ }\r
+ return heartRate_;\r
+}\r
+\r
+void BreathModel::SetHeartRate()\r
+{\r
+ heartRate_ = Heart_Rate_LOWER + rand() % Heart_Rate_RANGE;\r
+}\r
+\r
+float BreathModel::GetRotateStep()\r
+{\r
+ switch (selectRhythm_) {\r
+ case FREQUENCY_6:\r
+ return BREATH_ROTETAESTEP_6;\r
+ case FREQUENCY_7:\r
+ return BREATH_ROTETAESTEP_7;\r
+ case FREQUENCY_8:\r
+ return BREATH_ROTETAESTEP_8;\r
+ default:\r
+ return BREATH_ROTETAESTEP_6;\r
+ }\r
+}\r
+\r
+char *BreathModel::GetRhythmText()\r
+{\r
+ if (selectRhythm_ == MINUTE_0_DATA) {\r
+ return SPEED_FASTER_LITTLE;\r
+ } else if (selectRhythm_ == MINUTE_1_DATA) {\r
+ return SPEED_SOOTHING;\r
+ } else if (selectRhythm_ == MINUTE_2_DATA) {\r
+ return SPEED_SLOWING;\r
+ }\r
+ return nullptr;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathPresenter\r
+ * Create: 2025-5-13\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeRegisterManager.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_BREATH, BreathView, BreathPresenter, BREATH_ICON, BREATH_ICON, "呼吸训练");\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathReult\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sstream>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "PageTransitionMgr.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathResultPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr char *BREATH_BUTTON_COMPLETE_ID = "completeButton";\r
+static constexpr char *BREATH_BUTTON_RESTART_ID = "restartButton";\r
+static constexpr uint16_t BREATH_RESULTS_X = 97;\r
+static constexpr uint16_t BREATH_RESULTS_Y = 34;\r
+static constexpr uint16_t BREATH_RESULTS_W = 260;\r
+static constexpr uint16_t BREATH_RESULTS_H = 53;\r
+static constexpr uint16_t BREATH_MAX_FONT_SIZE = 38;\r
+static constexpr uint16_t BREATH_MIN_FONT_SIZE = 28;\r
+static constexpr uint16_t BREATH_SCOUT_FONT_SIZE = 40;\r
+static constexpr uint16_t BREATH_RHYTHM_X = 77;\r
+static constexpr uint16_t BREATH_RHYTHM_Y = 83;\r
+static constexpr uint16_t BREATH_RHYTHM_W = 300;\r
+static constexpr uint16_t BREATH_RHYTHM_H = 30;\r
+static constexpr uint16_t BREATH_SCORES_X = 241;\r
+static constexpr uint16_t BREATH_SCORES_Y = 190;\r
+static constexpr uint16_t BREATH_SCORES_W = 72;\r
+static constexpr uint16_t BREATH_SCORES_H = 32;\r
+static constexpr uint16_t BREATH_COMPLETE_X = 111;\r
+static constexpr uint16_t BREATH_COMPLETE_Y = 730;\r
+static constexpr uint16_t BREATH_RESTART_Y = 815;\r
+static constexpr uint16_t BREATH_COMPLETE_W = 232;\r
+static constexpr uint16_t BREATH_COMPLETE_H = 76;\r
+static constexpr uint16_t BREATH_GUINEAS_SIZE = 100;\r
+static constexpr uint16_t BREATH_NINETY_SIZE = 90;\r
+static constexpr uint16_t BREATH_EIGHTY_NINE_SIZE = 89;\r
+static constexpr uint16_t BREATH_EIGHTY_SIZE = 80;\r
+static constexpr uint16_t BREATH_SEVENTY_NINE_SIZE = 79;\r
+static constexpr uint16_t BREATH_SEVENTY_SIZE = 70;\r
+static constexpr uint16_t BREATH_SIXTY_NINE_SIZE = 69;\r
+static constexpr uint16_t BREATH_SIXTY_SIZE = 60;\r
+static constexpr uint16_t TEXT_OPACITY = 147;\r
+static constexpr uint16_t TEXT_OPACITY_TWO = 220;\r
+static constexpr uint16_t INDEX_0 = 0;\r
+static constexpr uint16_t INDEX_1 = 1;\r
+static constexpr uint16_t INDEX_2 = 2;\r
+static constexpr uint16_t INDEX_3 = 3;\r
+static constexpr uint16_t INDEX_4 = 4;\r
+static constexpr uint16_t BREATH_RESULT_POSY_OFFSET = 118;\r
+static constexpr uint16_t BREATH_RESULT_BUTTON_BG_POSITION_X = 92;\r
+static constexpr uint16_t BREATH_RESULT_BUTTON_BG_POSITION_Y = 132;\r
+static constexpr uint16_t BREATH_RESULT_BUTTON_BG_WIDTH = 270;\r
+static constexpr uint16_t BREATH_RESULT_BUTTON_BG_HEIGHT = 108;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_DES_POSITION_X = 112;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_DES_POSITION_Y = 142;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_DES_WIDTH = 200;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_DES_HEIGHT = 30;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_COUNT_POSITION_X = 112;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_COUNT_POSITION_Y = 182;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_COUNT_WIDTH = 50;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_COUNT_HEIGHT = 44;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_UNIT_POSITION_X = 112;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_UNIT_POSITION_Y = 192;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_UNIT_WIDTH = 70;\r
+static constexpr uint16_t BREATH_RESULT_LABEL_UNIT_HEIGHT = 34;\r
+static constexpr uint16_t BREATH_RESULT_BORDER_RADIUS = 8;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_RESULT_VIEW, BreathResultPage, false);\r
+\r
+BreathResultPage::BreathResultPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathResultPage::BreathResultPage");\r
+}\r
+\r
+BreathResultPage::~BreathResultPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelTimeAndRhythmTitle_ != nullptr) {\r
+ delete labelTimeAndRhythmTitle_;\r
+ labelTimeAndRhythmTitle_ = nullptr;\r
+ }\r
+\r
+ if (scores_ != nullptr) {\r
+ delete scores_;\r
+ scores_ = nullptr;\r
+ }\r
+\r
+ if (pageBgImg_ != nullptr) {\r
+ delete pageBgImg_;\r
+ pageBgImg_ = nullptr;\r
+ }\r
+\r
+ if (buttonComplete_ != nullptr) {\r
+ delete buttonComplete_;\r
+ buttonComplete_ = nullptr;\r
+ }\r
+\r
+ if (buttonRestart_ != nullptr) {\r
+ delete buttonRestart_;\r
+ buttonRestart_ = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ if (buttonBg_[i] != nullptr) {\r
+ delete buttonBg_[i];\r
+ buttonBg_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ if (labelDes_[i] != nullptr) {\r
+ delete labelDes_[i];\r
+ labelDes_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ if (labelValue_[i] != nullptr) {\r
+ delete labelValue_[i];\r
+ labelValue_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ if (labelUnit_[i] != nullptr) {\r
+ delete labelUnit_[i];\r
+ labelUnit_[i] = nullptr;\r
+ }\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathResultPage::~BreathResultPage");\r
+}\r
+\r
+void BreathResultPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+ return;\r
+ }\r
+\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetThrowDrag(true);\r
+ group_->SetScrollBlankSize(BREATH_RESULTS_Y);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ ERROR");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(BREATH_RESULTS_X, BREATH_RESULTS_Y);\r
+ labelTitle_->Resize(BREATH_RESULTS_W, BREATH_RESULTS_H);\r
+ labelTitle_->SetText("训练结果");\r
+ labelTitle_->SetTextColor(Color::White());\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_MAX_FONT_SIZE);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(labelTitle_);\r
+\r
+ labelTimeAndRhythmTitle_ = new UILabel();\r
+ if (labelTimeAndRhythmTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Rhythm ERROR");\r
+ return;\r
+ }\r
+ labelTimeAndRhythmTitle_->SetPosition(BREATH_RHYTHM_X, BREATH_RHYTHM_Y);\r
+ labelTimeAndRhythmTitle_->Resize(BREATH_RHYTHM_W, BREATH_RHYTHM_H);\r
+ labelTimeAndRhythmTitle_->SetTextColor(Color::Green());\r
+ labelTimeAndRhythmTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_MIN_FONT_SIZE);\r
+ labelTimeAndRhythmTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ uint8_t durationTime = BreathModel::GetInstance().GetTrainTime() + 1;\r
+ std::ostringstream oss;\r
+ oss << std::to_string(durationTime) << " 分钟" << " | ";\r
+ if (const char* rhythm = BreathModel::GetInstance().GetRhythmText()) {\r
+ oss << rhythm;\r
+ } else {\r
+ oss << "缓慢"; // 默认值\r
+ }\r
+ \r
+ std::string weatherHumidity = oss.str();\r
+ labelTimeAndRhythmTitle_->SetText(weatherHumidity.c_str());\r
+ group_->Add(labelTimeAndRhythmTitle_);\r
+\r
+ BreathModel::GetInstance().SetFrequencyScore();\r
+ BreathModel::GetInstance().SetHeartRate();\r
+ BreathModel::GetInstance().SetTrainingDurationTime(BreathModel::GetInstance().GetTrainTime() + 1);\r
+ BreathModel::GetInstance().SetTrainingCount();\r
+ InitBtnBg();\r
+ InitLabelDes();\r
+ InitLabelCount();\r
+ InitLabelUnit();\r
+ InitBtn();\r
+ pageBgImg_ = new UIImageView();\r
+ if (pageBgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new pageBgImg_ ERROR");\r
+ return;\r
+ }\r
+ pageBgImg_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(pageBgImg_, BREATH_IMAGE, IMAGE_BREATH_BG2);\r
+ AddViewToPageContainer(pageBgImg_);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathResultPage::InitBtn()\r
+{\r
+ buttonComplete_ = new UIButton();\r
+ if (buttonComplete_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonComplete_ ERROR");\r
+ return;\r
+ }\r
+ buttonComplete_->SetPosition(BREATH_COMPLETE_X, BREATH_COMPLETE_Y);\r
+ buttonComplete_->Resize(BREATH_COMPLETE_W, BREATH_COMPLETE_H);\r
+ buttonComplete_->SetViewId(BREATH_BUTTON_COMPLETE_ID);\r
+ buttonComplete_->SetOnClickListener(this);\r
+ LOADIMG::LoadBtnImage(buttonComplete_, BREATH_IMAGE, IMAGE_BREATH_COMPLETE, IMAGE_BREATH_COMPLETE);\r
+ buttonComplete_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonComplete_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group_->Add(buttonComplete_);\r
+\r
+ buttonRestart_ = new UIButton();\r
+ if (buttonRestart_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonRestart_ ERROR");\r
+ return;\r
+ }\r
+ buttonRestart_->SetPosition(BREATH_COMPLETE_X, BREATH_RESTART_Y);\r
+ buttonRestart_->Resize(BREATH_COMPLETE_W, BREATH_COMPLETE_H);\r
+ buttonRestart_->SetViewId(BREATH_BUTTON_RESTART_ID);\r
+ buttonRestart_->SetOnClickListener(this);\r
+ LOADIMG::LoadBtnImage(buttonRestart_, BREATH_IMAGE, IMAGE_BREATH_RETEST, IMAGE_BREATH_RETEST);\r
+ buttonRestart_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonRestart_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group_->Add(buttonRestart_);\r
+}\r
+\r
+void BreathResultPage::InitBtnBg()\r
+{\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ buttonBg_[i] = new UIButton();\r
+ if (buttonBg_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button ERROR");\r
+ return;\r
+ }\r
+\r
+ int posY = BREATH_RESULT_BUTTON_BG_POSITION_Y + BREATH_RESULT_POSY_OFFSET * i;\r
+ buttonBg_[i]->SetPosition(BREATH_RESULT_BUTTON_BG_POSITION_X, posY, BREATH_RESULT_BUTTON_BG_WIDTH,\r
+ BREATH_RESULT_BUTTON_BG_HEIGHT);\r
+ buttonBg_[i]->SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::PRESSED);\r
+ buttonBg_[i]->SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::INACTIVE);\r
+ buttonBg_[i]->SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::RELEASED);\r
+ buttonBg_[i]->SetStyleForState(STYLE_BORDER_RADIUS, BREATH_RESULT_BORDER_RADIUS, UIButton::PRESSED);\r
+ buttonBg_[i]->SetStyleForState(STYLE_BORDER_RADIUS, BREATH_RESULT_BORDER_RADIUS, UIButton::INACTIVE);\r
+ buttonBg_[i]->SetStyleForState(STYLE_BORDER_RADIUS, BREATH_RESULT_BORDER_RADIUS, UIButton::RELEASED);\r
+ group_->Add(buttonBg_[i]);\r
+ }\r
+}\r
+\r
+void BreathResultPage::InitLabelDes()\r
+{\r
+ std::string strDes[LABEL_COUNT] = {"呼吸频率", "呼吸前心率", "训练时长", "今日累计时长", "今日累计次数"};\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ labelDes_[i] = new UILabel();\r
+ if (labelDes_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button ERROR");\r
+ return;\r
+ }\r
+\r
+ int posY = BREATH_RESULT_LABEL_DES_POSITION_Y + BREATH_RESULT_POSY_OFFSET * i;\r
+ labelDes_[i]->SetPosition(BREATH_RESULT_LABEL_DES_POSITION_X, posY, BREATH_RESULT_LABEL_DES_WIDTH,\r
+ BREATH_RESULT_LABEL_DES_HEIGHT);\r
+ labelDes_[i]->SetText(strDes[i].c_str());\r
+ labelDes_[i]->SetTextColor(Color::White());\r
+ labelDes_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_MIN_FONT_SIZE);\r
+ labelDes_[i]->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ labelDes_[i]->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group_->Add(labelDes_[i]);\r
+ }\r
+}\r
+\r
+void BreathResultPage::InitLabelCount()\r
+{\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ labelValue_[i] = new UILabel();\r
+ if (labelValue_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button ERROR");\r
+ return;\r
+ }\r
+\r
+ int posY = BREATH_RESULT_LABEL_COUNT_POSITION_Y + BREATH_RESULT_POSY_OFFSET * i;\r
+ labelValue_[i]->SetPosition(BREATH_RESULT_LABEL_COUNT_POSITION_X, posY, BREATH_RESULT_LABEL_COUNT_WIDTH,\r
+ BREATH_RESULT_LABEL_COUNT_HEIGHT);\r
+ labelValue_[i]->SetText("20");\r
+ labelValue_[i]->SetTextColor(Color::White());\r
+ labelValue_[i]->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_SCOUT_FONT_SIZE);\r
+ labelValue_[i]->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(labelValue_[i]);\r
+ }\r
+ scores_ = new UIImageView();\r
+ if (scores_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Scores ERROR");\r
+ return;\r
+ }\r
+ scores_->SetPosition(BREATH_SCORES_X, BREATH_SCORES_Y);\r
+ scores_->Resize(BREATH_SCORES_W, BREATH_SCORES_H);\r
+ group_->Add(scores_);\r
+ uint8_t heartRate_ = BreathModel::GetInstance().GetHeartRate();\r
+ uint8_t frequencyScore_ = BreathModel::GetInstance().GetFrequencyScore();\r
+ if (frequencyScore_ >= BREATH_NINETY_SIZE && frequencyScore_ <= BREATH_GUINEAS_SIZE) {\r
+ LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_EXCELLENT);\r
+ } else if (frequencyScore_ >= BREATH_EIGHTY_SIZE && frequencyScore_ <= BREATH_EIGHTY_NINE_SIZE) {\r
+ LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_GOOD);\r
+ } else if (frequencyScore_ >= BREATH_SEVENTY_SIZE && frequencyScore_ <= BREATH_SEVENTY_NINE_SIZE) {\r
+ LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_NORMAL);\r
+ } else if (frequencyScore_ >= BREATH_SIXTY_SIZE && frequencyScore_ <= BREATH_SIXTY_NINE_SIZE) {\r
+ LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_PASS);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(scores_, BREATH_IMAGE, IMAGE_BREATH_BAD);\r
+ }\r
+ labelValue_[INDEX_0]->SetText(std::to_string(heartRate_).c_str());\r
+ labelValue_[INDEX_1]->SetText(std::to_string(frequencyScore_).c_str());\r
+ int selectTime = BreathModel::GetInstance().GetTrainTime() + 1;\r
+ labelValue_[INDEX_2]->SetText(std::to_string(selectTime).c_str());\r
+ labelValue_[INDEX_3]->SetText(BreathModel::GetInstance().GetTrainingDurationTime().c_str());\r
+ labelValue_[INDEX_4]->SetText(BreathModel::GetInstance().GetTrainingCount().c_str());\r
+}\r
+\r
+void BreathResultPage::InitLabelUnit()\r
+{\r
+ std::string strDes[LABEL_COUNT] = {"次/分", "次/分", "分", "分钟", "次"};\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ labelUnit_[i] = new UILabel();\r
+ if (labelUnit_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button ERROR");\r
+ return;\r
+ }\r
+\r
+ int offset = 10;\r
+ int posY = BREATH_RESULT_LABEL_UNIT_POSITION_Y + BREATH_RESULT_POSY_OFFSET * i;\r
+ int posX = BREATH_RESULT_LABEL_UNIT_POSITION_X + labelValue_[i]->GetTextWidth() + offset;\r
+ labelUnit_[i]->SetPosition(posX, posY, BREATH_RESULT_LABEL_UNIT_WIDTH, BREATH_RESULT_LABEL_UNIT_HEIGHT);\r
+ labelUnit_[i]->SetText(strDes[i].c_str());\r
+ labelUnit_[i]->SetTextColor(Color::White());\r
+ labelUnit_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_MIN_FONT_SIZE);\r
+ labelUnit_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelUnit_[i]->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY_TWO);\r
+ labelUnit_[i]->SetWidth(labelUnit_[i]->GetTextWidth());\r
+ group_->Add(labelUnit_[i]);\r
+ }\r
+}\r
+\r
+bool BreathResultPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), BREATH_BUTTON_COMPLETE_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), BREATH_BUTTON_RESTART_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_START_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+#ifdef _WIN32\r
+ struct timeval tv;\r
+ gettimeofday(&tv, NULL);\r
+#else\r
+ struct timeval64 tv;\r
+ gettimeofday64(&tv, NULL);\r
+#endif\r
+ uint32_t remTime = tv.tv_sec;\r
+ BreathModel::GetInstance().SetStartTime(remTime);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BreathResultPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathRhythmSetPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "UiConfig.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#include "breathexercise/BreathModel.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathRhythmSetPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr char *BREATH_RHYTHM_BUTTON_OK_ID = "okButton";\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_X = 100;\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_Y = 38;\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_W = 253;\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_H = 53;\r
+static constexpr uint16_t BREATH_RHYTHM_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_X = 64;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_Y = 109;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_W = 321;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_H = 218;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_FONT_SIZE = 44;\r
+static constexpr uint16_t BREATH_RHYTHM_PICKER_ITEM_H = 80;\r
+static constexpr uint16_t BREATH_RHYTHM_OK_X = 61;\r
+static constexpr uint16_t BREATH_RHYTHM_OK_Y = 362;\r
+static constexpr uint16_t BREATH_RHYTHM_OK_W = 331;\r
+static constexpr uint16_t BREATH_RHYTHM_OK_H = 98;\r
+static constexpr uint16_t BREATH_GROUP_SIZE = 466;\r
+static constexpr uint8_t PICKER_SIZE = 3;\r
+const char *g_rhythmListData[PICKER_SIZE] = {"稍快 8次/分", "舒缓 7次/分", "缓慢 6次/分"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_RHY_VIEW, BreathRhythmSetPage, false);\r
+\r
+BreathRhythmSetPage::BreathRhythmSetPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhythmSetPage::BreathRhythmSetPage");\r
+}\r
+\r
+BreathRhythmSetPage::~BreathRhythmSetPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (lableRhythm_ != nullptr) {\r
+ delete lableRhythm_;\r
+ lableRhythm_ = nullptr;\r
+ }\r
+ if (pickerRhythm_ != nullptr) {\r
+ delete pickerRhythm_;\r
+ pickerRhythm_ = nullptr;\r
+ }\r
+ if (buttonOk_ != nullptr) {\r
+ delete buttonOk_;\r
+ buttonOk_ = nullptr;\r
+ }\r
+ if (pickerImg_ != nullptr) {\r
+ delete pickerImg_;\r
+ pickerImg_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhythmSetPage::~BreathRhythmSetPage");\r
+}\r
+\r
+void BreathRhythmSetPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group_->SetTouchable(false);\r
+ group_->SetDraggable(false);\r
+\r
+ lableRhythm_ = new UILabel();\r
+ if (lableRhythm_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new lableRhythm_ ERROR");\r
+ return;\r
+ }\r
+ lableRhythm_->SetPosition(BREATH_RHYTHM_TITLE_X, BREATH_RHYTHM_TITLE_Y);\r
+ lableRhythm_->Resize(BREATH_RHYTHM_TITLE_W, BREATH_RHYTHM_TITLE_H);\r
+ lableRhythm_->SetText("节奏设置");\r
+ lableRhythm_->SetTextColor(Color::White());\r
+ lableRhythm_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ lableRhythm_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_RHYTHM_TITLE_FONT_SIZE);\r
+ group_->Add(lableRhythm_);\r
+\r
+ pickerRhythm_ = new UIPicker();\r
+ if (pickerRhythm_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new pickerRhythm_ ERROR");\r
+ return;\r
+ }\r
+ pickerRhythm_->SetPosition(BREATH_RHYTHM_PICKER_X, BREATH_RHYTHM_PICKER_Y);\r
+ pickerRhythm_->Resize(BREATH_RHYTHM_PICKER_W, BREATH_RHYTHM_PICKER_H);\r
+ pickerRhythm_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_RHYTHM_PICKER_FONT_SIZE);\r
+ pickerRhythm_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_RHYTHM_PICKER_FONT_SIZE);\r
+ pickerRhythm_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ pickerRhythm_->SetItemHeight(BREATH_RHYTHM_PICKER_ITEM_H);\r
+ pickerRhythm_->SetTextColor(Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff),\r
+ Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff));\r
+ uint8_t selectPick = BreathModel::GetInstance().GetRhythm();\r
+ pickerRhythm_->SetSelected(selectPick);\r
+ pickerRhythm_->RegisterSelectedListener(this);\r
+ pickerRhythm_->SetVisible(true);\r
+ pickerRhythm_->SetOnDragListener(this);\r
+ pickerRhythm_->SetLoopState(false);\r
+ group_->Add(pickerRhythm_);\r
+\r
+ pickerImg_ = new UIImageView();\r
+ if (pickerImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Center ERROR");\r
+ return;\r
+ }\r
+ pickerImg_->SetPosition(BREATH_RHYTHM_PICKER_X, BREATH_RHYTHM_PICKER_Y);\r
+ pickerImg_->Resize(BREATH_RHYTHM_PICKER_W, BREATH_RHYTHM_PICKER_H);\r
+ LOADIMG::LoadImageViewImg(pickerImg_, BREATH_IMAGE, IMAGE_BREATH_CENTER);\r
+ group_->Add(pickerImg_);\r
+\r
+ buttonOk_ = new UIButton();\r
+ if (buttonOk_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonOk_ ERROR");\r
+ return;\r
+ }\r
+ buttonOk_->SetPosition(BREATH_RHYTHM_OK_X, BREATH_RHYTHM_OK_Y);\r
+ buttonOk_->Resize(BREATH_RHYTHM_OK_W, BREATH_RHYTHM_OK_H);\r
+ buttonOk_->SetViewId(BREATH_RHYTHM_BUTTON_OK_ID);\r
+ buttonOk_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ LOADIMG::LoadBtnImage(buttonOk_, BREATH_IMAGE, IMAGE_BREATH_OK, IMAGE_BREATH_OK);\r
+ buttonOk_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonOk_->SetOnClickListener(this);\r
+ group_->Add(buttonOk_);\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathRhythmSetPage::OnResume()\r
+{\r
+ pickerRhythm_->SetValues(g_rhythmListData, PICKER_SIZE);\r
+ GetSlicePageContainer()->SetIntercept(true);\r
+ GetSlicePageContainer()->SetOnDragListener(nullptr);\r
+}\r
+\r
+bool BreathRhythmSetPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), BREATH_RHYTHM_BUTTON_OK_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ BreathModel::GetInstance().SetRhythm(pickerRhythm_->GetSelected());\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BreathRhythmSetPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathStartPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sys/time.h>\r
+#include <iostream>\r
+#include <sstream>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "PageTransitionMgr.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ohos_timer.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "breathexercise/BreathModel.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathStartPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BREATH_START_TITLE_X = 97;\r
+static constexpr uint16_t BREATH_START_TITLE_Y = 40;\r
+static constexpr uint16_t BREATH_START_TITLE_W = 260;\r
+static constexpr uint16_t BREATH_START_TITLE_H = 53;\r
+static constexpr uint16_t BREATH_START_TITLE_FONT_SIZE = 36;\r
+static constexpr uint16_t BREATH_START_CENTERIMG_X = 88;\r
+static constexpr uint16_t BREATH_START_CENTERIMG_Y = 88;\r
+static constexpr uint16_t BREATH_START_CENTERIMG_W = 279;\r
+static constexpr uint16_t BREATH_START_CENTERIMG_H = 280;\r
+static constexpr uint16_t BREATH_START_GUIDE_X = 126;\r
+static constexpr uint16_t BREATH_START_GUIDE_Y = 354;\r
+static constexpr uint16_t BREATH_START_GUIDE_W = 202;\r
+static constexpr uint16_t BREATH_START_GUIDE_H = 68;\r
+static constexpr uint16_t BREATH_START_GUIDE_FONT_SIZE = 24;\r
+static constexpr uint16_t BREATH_GROUP_SIZE = 466;\r
+static constexpr uint16_t TEXT_OPACITY = 147;\r
+static constexpr uint16_t COUNTDOWN = 5;\r
+static constexpr uint16_t SIZE = 64;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_START_VIEW, BreathStartPage, false);\r
+\r
+BreathStartPage::BreathStartPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathStartPage::BreathStartPage");\r
+}\r
+\r
+BreathStartPage::~BreathStartPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (titleLable_ != nullptr) {\r
+ delete titleLable_;\r
+ titleLable_ = nullptr;\r
+ }\r
+\r
+ if (guideLable_ != nullptr) {\r
+ delete guideLable_;\r
+ guideLable_ = nullptr;\r
+ }\r
+\r
+ if (centerImg_ != nullptr) {\r
+ delete centerImg_;\r
+ centerImg_ = nullptr;\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+\r
+ if (animatorCallBack_ != nullptr) {\r
+ delete animatorCallBack_;\r
+ animatorCallBack_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathStartPage::~BreathStartPage");\r
+}\r
+\r
+void BreathStartPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group_->SetTouchable(true);\r
+ group_->SetDraggable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg_ ERROR");\r
+ return;\r
+ }\r
+ bgImg_->SetPosition(0, 0);\r
+ bgImg_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ LOADIMG::LoadImageViewImg(bgImg_, BREATH_IMAGE, IMAGE_BREATH_BG3);\r
+ group_->Add(bgImg_);\r
+\r
+ titleLable_ = new UILabel();\r
+ if (titleLable_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new titleLable_ ERROR");\r
+ return;\r
+ }\r
+ titleLable_->SetPosition(BREATH_START_TITLE_X, BREATH_START_TITLE_Y);\r
+ titleLable_->Resize(BREATH_START_TITLE_W, BREATH_START_TITLE_H);\r
+ titleLable_->SetText("请保持静止");\r
+ titleLable_->SetTextColor(Color::White());\r
+ titleLable_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLable_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_START_TITLE_FONT_SIZE);\r
+ group_->Add(titleLable_);\r
+\r
+ centerImg_ = new UIImageView();\r
+ if (centerImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new centerImg ERROR");\r
+ return;\r
+ }\r
+ centerImg_->SetPosition(BREATH_START_CENTERIMG_X, BREATH_START_CENTERIMG_Y);\r
+ centerImg_->Resize(BREATH_START_CENTERIMG_W, BREATH_START_CENTERIMG_H);\r
+ LOADIMG::LoadImageViewImg(centerImg_, BREATH_IMAGE, IMAGE_BREATH_CENTER1);\r
+ group_->Add(centerImg_);\r
+\r
+ guideLable_ = new UILabel();\r
+ if (guideLable_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new guideLable_ ERROR");\r
+ return;\r
+ }\r
+ guideLable_->SetPosition(BREATH_START_GUIDE_X, BREATH_START_GUIDE_Y);\r
+ guideLable_->Resize(BREATH_START_GUIDE_W, BREATH_START_GUIDE_H);\r
+ guideLable_->SetTextColor(Color::White());\r
+ guideLable_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ guideLable_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_START_GUIDE_FONT_SIZE);\r
+ guideLable_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ guideLable_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group_->Add(guideLable_);\r
+\r
+ animatorCallBack_ = new BreathStartCallback(this);\r
+ if (animatorCallBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animatorCallBack_ ERROR");\r
+ return;\r
+ }\r
+ animator_ = new Animator(animatorCallBack_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ ERROR");\r
+ return;\r
+ }\r
+ animator_->Start();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathStartPage::BreathStartCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+#ifdef _WIN32\r
+ struct timeval tv;\r
+ gettimeofday(&tv, NULL);\r
+#else\r
+ struct timeval64 tv;\r
+ gettimeofday64(&tv, NULL);\r
+#endif\r
+ int32_t start_time = BreathModel::GetInstance().GetStartTime();\r
+ int32_t remTime = COUNTDOWN - (tv.tv_sec - start_time);\r
+ if (remTime <= 0) {\r
+ BreathStartPage->animator_->Stop();\r
+#ifdef _WIN32\r
+ struct timeval time;\r
+ gettimeofday(&time, NULL);\r
+#else\r
+ struct timeval64 time;\r
+ gettimeofday64(&time, NULL);\r
+#endif\r
+ uint32_t breathing_time = time.tv_sec;\r
+ BreathModel::GetInstance().SetBeginTime(breathing_time);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_EXER_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ char szText[SIZE] = "";\r
+ sprintf_s(szText, sizeof(szText), "%d秒后跟随训练指引开始吸气和呼气", remTime);\r
+ BreathStartPage->guideLable_->SetText(szText);\r
+ }\r
+}\r
+\r
+void BreathStartPage::OnPause()\r
+{\r
+ animator_->Stop();\r
+}\r
+\r
+bool BreathStartPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+void BreathStartPage::OnTimer() {}\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathTimeSetPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathTimeSetPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr char *BREATH_TIME_BUTTON_OK_ID = "okButton";\r
+static constexpr uint16_t BREATH_TIME_TITLE_X = 100;\r
+static constexpr uint16_t BREATH_TIME_TITLE_Y = 38;\r
+static constexpr uint16_t BREATH_TIME_TITLE_W = 253;\r
+static constexpr uint16_t BREATH_TIME_TITLE_H = 53;\r
+static constexpr uint16_t BREATH_TIME_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t BREATH_TIME_PICKER_X = 64;\r
+static constexpr uint16_t BREATH_TIME_PICKER_Y = 109;\r
+static constexpr uint16_t BREATH_TIME_PICKER_W = 321;\r
+static constexpr uint16_t BREATH_TIME_PICKER_H = 218;\r
+static constexpr uint16_t BREATH_TIME_PICKER_FONT_SIZE = 44;\r
+static constexpr uint16_t BREATH_TIME_PICKER_ITEM_H = 80;\r
+static constexpr uint16_t BREATH_TIME_OK_X = 61;\r
+static constexpr uint16_t BREATH_TIME_OK_Y = 362;\r
+static constexpr uint16_t BREATH_TIME_OK_W = 331;\r
+static constexpr uint16_t BREATH_TIME_OK_H = 98;\r
+static constexpr uint16_t BREATH_GROUP_SIZE = 466;\r
+static constexpr uint8_t PICKER_SIZE = 3;\r
+const char *g_timeList[PICKER_SIZE] = {"1 分钟", "2 分钟", "3 分钟"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_DUR_VIEW, BreathTimeSetPage, false);\r
+\r
+BreathTimeSetPage::BreathTimeSetPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathTimeSetPage::BreathTimeSetPage");\r
+}\r
+\r
+BreathTimeSetPage::~BreathTimeSetPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+ if (pickerTime_ != nullptr) {\r
+ delete pickerTime_;\r
+ pickerTime_ = nullptr;\r
+ }\r
+ if (buttonOk_ != nullptr) {\r
+ delete buttonOk_;\r
+ buttonOk_ = nullptr;\r
+ }\r
+ if (pickerImg_ != nullptr) {\r
+ delete pickerImg_;\r
+ pickerImg_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathTimeSetPage::~BreathTimeSetPage");\r
+}\r
+\r
+void BreathTimeSetPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new Group ERROR");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ ERROR");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(BREATH_TIME_TITLE_X, BREATH_TIME_TITLE_Y);\r
+ labelTitle_->Resize(BREATH_TIME_TITLE_W, BREATH_TIME_TITLE_H);\r
+ labelTitle_->SetText("时间设置");\r
+ labelTitle_->SetTextColor(Color::White());\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_TIME_TITLE_FONT_SIZE);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(labelTitle_);\r
+\r
+ pickerTime_ = new UIPicker();\r
+ if (pickerTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new pickerTime_ ERROR");\r
+ return;\r
+ }\r
+ pickerTime_->SetPosition(BREATH_TIME_PICKER_X, BREATH_TIME_PICKER_Y);\r
+ pickerTime_->Resize(BREATH_TIME_PICKER_W, BREATH_TIME_PICKER_H);\r
+ pickerTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ pickerTime_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TIME_PICKER_FONT_SIZE);\r
+ pickerTime_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TIME_PICKER_FONT_SIZE);\r
+ pickerTime_->SetItemHeight(BREATH_TIME_PICKER_ITEM_H);\r
+ pickerTime_->SetTextColor(Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff),\r
+ Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff));\r
+ uint8_t selectTime = BreathModel::GetInstance().GetTrainTime();\r
+ pickerTime_->SetSelected(selectTime);\r
+ pickerTime_->SetOnDragListener(this);\r
+ pickerTime_->SetLoopState(false);\r
+ group_->Add(pickerTime_);\r
+\r
+ pickerImg_ = new UIImageView();\r
+ if (pickerImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new pickerImg_ ERROR");\r
+ return;\r
+ }\r
+ pickerImg_->SetPosition(BREATH_TIME_PICKER_X, BREATH_TIME_PICKER_Y);\r
+ pickerImg_->Resize(BREATH_TIME_PICKER_W, BREATH_TIME_PICKER_H);\r
+ LOADIMG::LoadImageViewImg(pickerImg_, BREATH_IMAGE, IMAGE_BREATH_CENTER);\r
+ group_->Add(pickerImg_);\r
+\r
+ buttonOk_ = new UIButton();\r
+ if (buttonOk_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonOk_ ERROR");\r
+ return;\r
+ }\r
+ buttonOk_->SetPosition(BREATH_TIME_OK_X, BREATH_TIME_OK_Y);\r
+ buttonOk_->Resize(BREATH_TIME_OK_W, BREATH_TIME_OK_H);\r
+ buttonOk_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ buttonOk_->SetViewId(BREATH_TIME_BUTTON_OK_ID);\r
+ LOADIMG::LoadBtnImage(buttonOk_, BREATH_IMAGE, IMAGE_BREATH_OK, IMAGE_BREATH_OK);\r
+ buttonOk_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonOk_->SetOnClickListener(this);\r
+ group_->Add(buttonOk_);\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathTimeSetPage::OnResume()\r
+{\r
+ pickerTime_->SetValues(g_timeList, PICKER_SIZE);\r
+ GetSlicePageContainer()->SetIntercept(true);\r
+ GetSlicePageContainer()->SetOnDragListener(nullptr);\r
+}\r
+\r
+bool BreathTimeSetPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), BREATH_TIME_BUTTON_OK_ID) == 0) {\r
+ BreathModel::GetInstance().SetTrainTime(pickerTime_->GetSelected());\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BreathTimeSetPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathTrainingRecordsPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sstream>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "TransitionType.h"\r
+#include "UiConfig.h"\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "wearable_log.h"\r
+#include "breathexercise/BreathView.h"\r
+#include "breathexercise/BreathTrainingRecordsPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_X = 97;\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_Y = 34;\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_W = 260;\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_H = 53;\r
+static constexpr uint16_t BREATH_TRAINING_RECORDS_FONT_SIZE = 38;\r
+static constexpr uint16_t BREATH_TRAINING_TOTALDURATION_X = 236;\r
+static constexpr uint16_t BREATH_TRAINING_TOTALDURATION_Y = 139;\r
+static constexpr uint16_t BREATH_TRAINING_TOTALDURATION_W = 96;\r
+static constexpr uint16_t BREATH_TRAINING_TOTALDURATION_H = 30;\r
+static constexpr uint16_t BREATH_TRAINING_FONT_SIZE = 24;\r
+static constexpr uint16_t BREATH_TRAINING_DURATION_MINUTE_X = 290;\r
+static constexpr uint16_t BREATH_TRAINING_DURATION_MINUTE_Y = 185;\r
+static constexpr uint16_t BREATH_TRAINING_DURATION_MINUTE_W = 48;\r
+static constexpr uint16_t BREATH_TRAINING_DURATION_MINUTE_H = 29;\r
+static constexpr uint16_t BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_X = 236;\r
+static constexpr uint16_t BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_Y = 268;\r
+static constexpr uint16_t BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_W = 96;\r
+static constexpr uint16_t BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_H = 30;\r
+static constexpr uint16_t BREATH_TRAINING_NUMBER_OF_TIMES_X = 290;\r
+static constexpr uint16_t BREATH_TRAINING_NUMBER_OF_TIMES_Y = 315;\r
+static constexpr uint16_t BREATH_TRAINING_NUMBER_OF_TIMES_W = 29;\r
+static constexpr uint16_t BREATH_TRAINING_NUMBER_OF_TIMES_H = 29;\r
+static constexpr uint16_t BREATH_TRAINING_TIME_X = 236;\r
+static constexpr uint16_t BREATH_TRAINING_TIME_Y = 171;\r
+static constexpr uint16_t BREATH_TRAINING_TIME_W = 49;\r
+static constexpr uint16_t BREATH_TRAINING_TIME_H = 49;\r
+static constexpr uint16_t BREATH_TRAINING_FONT_MAX_SIZE = 40;\r
+static constexpr uint16_t BREATH_TRAINING_SCOUR_X = 236;\r
+static constexpr uint16_t BREATH_TRAINING_SCOUR_Y = 303;\r
+static constexpr uint16_t BREATH_TRAINING_SCOUR_W = 49;\r
+static constexpr uint16_t BREATH_TRAINING_SCOUR_H = 49;\r
+static constexpr uint16_t BREATH_TRAINING_SIZE = 454;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND2_X = 65;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND2_Y = 174;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND2_W = 119;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND2_H = 120;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND3_X = 215;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND3_Y = 123;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND3_W = 171;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND3_H = 108;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND4_X = 215;\r
+static constexpr uint16_t BREATH_TRAINING_BACKGROUND4_Y = 252;\r
+static constexpr uint16_t TEXT_OPACITY = 147;\r
+static constexpr uint16_t TEXT_OPACITY_BACK = 27;\r
+static constexpr uint16_t Y_OFFSET = 50;\r
+\r
+REGIST_SLICE_PAGE(VIEW_BREATH, BREATH_PAGE::BREATH_TRAINING_VIEW, BreathTrainingRecordsPage, false);\r
+\r
+BreathTrainingRecordsPage::BreathTrainingRecordsPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathTrainingRecordsPage::BreathTrainingRecordsPage");\r
+}\r
+\r
+BreathTrainingRecordsPage::~BreathTrainingRecordsPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (labelTimeDes_ != nullptr) {\r
+ delete labelTimeDes_;\r
+ labelTimeDes_ = nullptr;\r
+ }\r
+ if (labelTimeUnit_ != nullptr) {\r
+ delete labelTimeUnit_;\r
+ labelTimeUnit_ = nullptr;\r
+ }\r
+ if (labelCountDes_ != nullptr) {\r
+ delete labelCountDes_;\r
+ labelCountDes_ = nullptr;\r
+ }\r
+ if (labelCountUnit_ != nullptr) {\r
+ delete labelCountUnit_;\r
+ labelCountUnit_ = nullptr;\r
+ }\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+ if (labelTimeValue_ != nullptr) {\r
+ delete labelTimeValue_;\r
+ labelTimeValue_ = nullptr;\r
+ }\r
+ if (labelCountValue_ != nullptr) {\r
+ delete labelCountValue_;\r
+ labelCountValue_ = nullptr;\r
+ }\r
+ if (bgImg1_ != nullptr) {\r
+ delete bgImg1_;\r
+ bgImg1_ = nullptr;\r
+ }\r
+ if (bgImg2_ != nullptr) {\r
+ delete bgImg2_;\r
+ bgImg2_ = nullptr;\r
+ }\r
+ if (bgImg3_ != nullptr) {\r
+ delete bgImg3_;\r
+ bgImg3_ = nullptr;\r
+ }\r
+ if (bgImg4_ != nullptr) {\r
+ delete bgImg4_;\r
+ bgImg4_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathTrainingRecordsPage::~BreathTrainingRecordsPage");\r
+}\r
+\r
+void BreathTrainingRecordsPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ ERROR");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group_->SetTouchable(true);\r
+ group_->SetDraggable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ bgImg1_ = new UIImageView();\r
+ if (bgImg1_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg1_ ERROR");\r
+ return;\r
+ }\r
+ bgImg1_->SetPosition(0, 0);\r
+ bgImg1_->Resize(BREATH_TRAINING_SIZE, BREATH_TRAINING_SIZE);\r
+ LOADIMG::LoadImageViewImg(bgImg1_, BREATH_IMAGE, IMAGE_BREATH_BG3);\r
+ group_->Add(bgImg1_);\r
+\r
+ bgImg2_ = new UIImageView();\r
+ if (bgImg2_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg2_ ERROR");\r
+ return;\r
+ }\r
+ bgImg2_->SetPosition(BREATH_TRAINING_BACKGROUND2_X, BREATH_TRAINING_BACKGROUND2_Y);\r
+ bgImg2_->Resize(BREATH_TRAINING_BACKGROUND2_W, BREATH_TRAINING_BACKGROUND2_H);\r
+ LOADIMG::LoadImageViewImg(bgImg2_, BREATH_IMAGE, IMAGE_BREATH_RESULT);\r
+ group_->Add(bgImg2_);\r
+\r
+ bgImg3_ = new UIImageView();\r
+ if (bgImg3_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg3_ ERROR");\r
+ return;\r
+ }\r
+ bgImg3_->SetPosition(BREATH_TRAINING_BACKGROUND3_X, BREATH_TRAINING_BACKGROUND3_Y);\r
+ bgImg3_->Resize(BREATH_TRAINING_BACKGROUND3_W, BREATH_TRAINING_BACKGROUND3_H);\r
+ LOADIMG::LoadImageViewImg(bgImg3_, BREATH_IMAGE, IMAGE_BREATH_BG4);\r
+ bgImg3_->SetStyle(STYLE_BACKGROUND_OPA, TEXT_OPACITY_BACK);\r
+ group_->Add(bgImg3_);\r
+\r
+ bgImg4_ = new UIImageView();\r
+ if (bgImg4_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new bgImg4_ ERROR");\r
+ return;\r
+ }\r
+ bgImg4_->SetPosition(BREATH_TRAINING_BACKGROUND4_X, BREATH_TRAINING_BACKGROUND4_Y);\r
+ bgImg4_->Resize(BREATH_TRAINING_BACKGROUND3_W, BREATH_TRAINING_BACKGROUND3_H);\r
+ LOADIMG::LoadImageViewImg(bgImg4_, BREATH_IMAGE, IMAGE_BREATH_BG4);\r
+ bgImg4_->SetStyle(STYLE_BACKGROUND_OPA, TEXT_OPACITY_BACK);\r
+ group_->Add(bgImg4_);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ ERROR");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(BREATH_TRAINING_RECORDS_X, BREATH_TRAINING_RECORDS_Y);\r
+ labelTitle_->Resize(BREATH_TRAINING_RECORDS_W, BREATH_TRAINING_RECORDS_H);\r
+ labelTitle_->SetText("训练记录");\r
+ labelTitle_->SetTextColor(Color::White());\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_TRAINING_RECORDS_FONT_SIZE);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(labelTitle_);\r
+\r
+ labelTimeDes_ = new UILabel();\r
+ if (labelTimeDes_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTimeDes_ ERROR");\r
+ return;\r
+ }\r
+ labelTimeDes_->SetPosition(BREATH_TRAINING_TOTALDURATION_X, BREATH_TRAINING_TOTALDURATION_Y);\r
+ labelTimeDes_->Resize(BREATH_TRAINING_TOTALDURATION_W, BREATH_TRAINING_TOTALDURATION_H);\r
+ labelTimeDes_->SetText("累计时长");\r
+ labelTimeDes_->SetTextColor(Color::White());\r
+ labelTimeDes_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_SIZE);\r
+ labelTimeDes_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTimeDes_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group_->Add(labelTimeDes_);\r
+\r
+ labelTimeUnit_ = new UILabel();\r
+ if (labelTimeUnit_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTimeUnit_ ERROR");\r
+ return;\r
+ }\r
+ labelTimeUnit_->SetPosition(BREATH_TRAINING_DURATION_MINUTE_X, BREATH_TRAINING_DURATION_MINUTE_Y);\r
+ labelTimeUnit_->Resize(BREATH_TRAINING_DURATION_MINUTE_W, BREATH_TRAINING_DURATION_MINUTE_H);\r
+ labelTimeUnit_->SetText("分钟");\r
+ labelTimeUnit_->SetTextColor(Color::White());\r
+ labelTimeUnit_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_SIZE);\r
+ labelTimeUnit_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTimeUnit_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group_->Add(labelTimeUnit_);\r
+\r
+ labelCountDes_ = new UILabel();\r
+ if (labelCountDes_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelCountDes_ ERROR");\r
+ return;\r
+ }\r
+ labelCountDes_->SetPosition(BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_X, BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_Y);\r
+ labelCountDes_->Resize(BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_W, BREATH_TRAINING_TOTAL_NUMBLE_OF_TIMES_H);\r
+ labelCountDes_->SetText("累计次数");\r
+ labelCountDes_->SetTextColor(Color::White());\r
+ labelCountDes_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_SIZE);\r
+ labelCountDes_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelCountDes_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group_->Add(labelCountDes_);\r
+\r
+ labelCountUnit_ = new UILabel();\r
+ if (labelCountUnit_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelCountUnit_ ERROR");\r
+ return;\r
+ }\r
+ labelCountUnit_->SetPosition(BREATH_TRAINING_NUMBER_OF_TIMES_X, BREATH_TRAINING_NUMBER_OF_TIMES_Y);\r
+ labelCountUnit_->Resize(BREATH_TRAINING_NUMBER_OF_TIMES_W, BREATH_TRAINING_NUMBER_OF_TIMES_H);\r
+ labelCountUnit_->SetText("次");\r
+ labelCountUnit_->SetTextColor(Color::White());\r
+ labelCountUnit_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_SIZE);\r
+ labelCountUnit_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelCountUnit_->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group_->Add(labelCountUnit_);\r
+\r
+ labelTimeValue_ = new UILabel();\r
+ if (labelTimeValue_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTimeValue_ ERROR");\r
+ return;\r
+ }\r
+ labelTimeValue_->SetPosition(BREATH_TRAINING_TIME_X, BREATH_TRAINING_TIME_Y);\r
+ labelTimeValue_->Resize(BREATH_TRAINING_TIME_W, BREATH_TRAINING_TIME_H);\r
+ labelTimeValue_->SetTextColor(Color::White());\r
+ labelTimeValue_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_MAX_SIZE);\r
+ labelTimeValue_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTimeValue_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ group_->Add(labelTimeValue_);\r
+\r
+ labelCountValue_ = new UILabel();\r
+ if (labelCountValue_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelCountValue_ ERROR");\r
+ return;\r
+ }\r
+ labelCountValue_->SetPosition(BREATH_TRAINING_SCOUR_X, BREATH_TRAINING_SCOUR_Y);\r
+ labelCountValue_->Resize(BREATH_TRAINING_SCOUR_W, BREATH_TRAINING_SCOUR_H);\r
+ labelCountValue_->SetTextColor(Color::White());\r
+ labelCountValue_->SetFont(BOLD_VECTOR_FONT_FILENAME, BREATH_TRAINING_FONT_MAX_SIZE);\r
+ labelCountValue_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelCountValue_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ group_->Add(labelCountValue_);\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void BreathTrainingRecordsPage::OnResume()\r
+{\r
+ labelTimeValue_->SetText((BreathModel::GetInstance().GetTrainingDurationTime().c_str()));\r
+ labelCountValue_->SetText((BreathModel::GetInstance().GetTrainingCount().c_str()));\r
+}\r
+\r
+bool BreathTrainingRecordsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) && (event.GetStartPoint().y > Y_OFFSET)) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_PAGE::BREATH_MAIN_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
#include "bts_spp.h"\r
#include "ui_resource_camera.h"\r
#include "camera/CameraView.h"\r
-#include "camera/CameraMainPage.h"\r
#include "camera/CameraPresenter.h"\r
+#include "camera/CameraMainPage.h"\r
\r
namespace OHOS {\r
static CameraMainPage *g_pCameraMainPage = nullptr;\r
-\r
static constexpr uint16_t BLUETOOTH_XPOS = 158;\r
static constexpr uint16_t BLUETOOTH_XPOY = 154;\r
static constexpr uint16_t TITLE_XPOS = 15;\r
static constexpr uint16_t CAMERATITLE_WIDTH = 260;\r
static constexpr uint16_t CAMERATITLE_HIGHT = 53;\r
static constexpr uint16_t CAMERAFIND_XPOS = 123;\r
-static constexpr uint16_t CAMERAFIND_XPOY = 200;\r
+static constexpr uint16_t CAMERAFIND_XPOY = 192;\r
static constexpr uint16_t CAMERAFIND_WIDTH = 250;\r
static constexpr uint16_t CAMERAFIND_HIGHT = 42;\r
-static constexpr uint16_t CAMERATIME_XPOS = 200;\r
+static constexpr uint16_t CAMERATIME_XPOS = 102;\r
static constexpr uint16_t BUTTON_WIDTH = 171;\r
static constexpr uint16_t BUTTON_HIGHT = 171;\r
static constexpr uint16_t COUNTDOWN_TIME = 5;\r
static constexpr uint16_t CAMERA_SIZE = 466;\r
static constexpr uint16_t CAMERA_BUTTON_POSITION_X = 144;\r
static constexpr uint16_t CAMERA_BUTTON_POSITION_Y = 154;\r
-static constexpr uint16_t TIME_FONT_SIZE = 50;\r
-static constexpr uint16_t CAMERATIME_HIGHT = 55;\r
-static constexpr uint16_t ERROR_NUM = 2;\r
+static constexpr uint16_t TIME_FONT_SIZE = 72;\r
+static constexpr uint16_t CAMERATIME_HIGHT = 70;\r
+static constexpr char *TAKEPHOTO_BUTTON = "takePhotoButton";\r
\r
REGIST_SLICE_PAGE(VIEW_CAMERA, CAMERA_PAGES::CAMERA_MAIN_PAGE, CameraMainPage, true);\r
\r
container_ = nullptr;\r
}\r
\r
- if (title != nullptr) {\r
- delete title;\r
- title = nullptr;\r
+ if (disconnectTitle_ != nullptr) {\r
+ delete disconnectTitle_;\r
+ disconnectTitle_ = nullptr;\r
}\r
\r
- if (bluetoothDisconnected != nullptr) {\r
- delete bluetoothDisconnected;\r
- bluetoothDisconnected = nullptr;\r
+ if (btDisconnected_ != nullptr) {\r
+ delete btDisconnected_;\r
+ btDisconnected_ = nullptr;\r
}\r
\r
- if (cameraFind != nullptr) {\r
- delete cameraFind;\r
- cameraFind = nullptr;\r
+ if (cameraFind_ != nullptr) {\r
+ delete cameraFind_;\r
+ cameraFind_ = nullptr;\r
}\r
\r
- if (cameraTitle != nullptr) {\r
- delete cameraTitle;\r
- cameraTitle = nullptr;\r
+ if (cameraTitle_ != nullptr) {\r
+ delete cameraTitle_;\r
+ cameraTitle_ = nullptr;\r
}\r
\r
- if (cameraTime != nullptr) {\r
- delete cameraTime;\r
- cameraTime = nullptr;\r
+ if (cameraTime_ != nullptr) {\r
+ delete cameraTime_;\r
+ cameraTime_ = nullptr;\r
}\r
\r
- if (button != nullptr) {\r
- delete button;\r
- button = nullptr;\r
- }\r
-\r
- if (animator_ != nullptr) {\r
- delete animator_;\r
- animator_ = nullptr;\r
+ if (takePhotoButton_ != nullptr) {\r
+ delete takePhotoButton_;\r
+ takePhotoButton_ = nullptr;\r
}\r
\r
if (callBack_ != nullptr) {\r
delete callBack_;\r
callBack_ = nullptr;\r
}\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
ImageCacheManager::GetInstance().UnloadAllInMultiRes(CAMERA_IMAGE);\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::~CameraMainPage");\r
}\r
\r
void CameraMainPage::OnStart(void *data)\r
{\r
+ container_ = new UIScrollView();\r
if (container_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CameraMainPage::new container fail");\r
- container_ = new UIScrollView();\r
- container_->SetPosition(0, 0, CAMERA_SIZE, CAMERA_SIZE);\r
- container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "container_ is nullptr");\r
+ return;\r
}\r
+ container_->SetPosition(0, 0, CAMERA_SIZE, CAMERA_SIZE);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
container_->SetTouchable(true);\r
container_->SetDraggable(true);\r
container_->SetOnDragListener(this);\r
\r
- bluetoothDisconnected = new UIImageView();\r
- if (bluetoothDisconnected == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothDisconnected is nullptr");\r
+ btDisconnected_ = new UIImageView();\r
+ if (btDisconnected_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "btDisconnected_ is nullptr");\r
return;\r
}\r
- LOADIMG::LoadImageViewImg(bluetoothDisconnected, CAMERA_IMAGE, IMAGE_CONVERTER_TOOL_CAMERA_2);\r
- bluetoothDisconnected->SetPosition(BLUETOOTH_XPOS, BLUETOOTH_XPOY);\r
- bluetoothDisconnected->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
- bluetoothDisconnected->SetVisible(false);\r
- container_->Add(bluetoothDisconnected);\r
-\r
- title = new UILabel();\r
- if (title == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "title is nullptr");\r
+ LOADIMG::LoadImageViewImg(btDisconnected_, CAMERA_IMAGE, IMAGE_CAMERA_DISCONNECT);\r
+ btDisconnected_->SetPosition(BLUETOOTH_XPOS, BLUETOOTH_XPOY);\r
+ btDisconnected_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ btDisconnected_->SetVisible(false);\r
+ container_->Add(btDisconnected_);\r
+\r
+ disconnectTitle_ = new UILabel();\r
+ if (disconnectTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "disconnectTitle_ is nullptr");\r
return;\r
}\r
- title->SetText("蓝牙已断开");\r
- title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
- title->SetPosition(TITLE_XPOS, TITLE_XPOY, TITLE_WIDTH, TITLE_HIGHT);\r
- title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- title->SetVisible(false);\r
- container_->Add(title);\r
-\r
- cameraTitle = new UILabel();\r
- if (cameraTitle == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTitle is nullptr");\r
+ disconnectTitle_->SetText("蓝牙已断开");\r
+ disconnectTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
+ disconnectTitle_->SetPosition(TITLE_XPOS, TITLE_XPOY, TITLE_WIDTH, TITLE_HIGHT);\r
+ disconnectTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ disconnectTitle_->SetVisible(false);\r
+ container_->Add(disconnectTitle_);\r
+\r
+ cameraTitle_ = new UILabel();\r
+ if (cameraTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTitle_ is nullptr");\r
return;\r
}\r
- cameraTitle->SetText("相机");\r
- cameraTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CAMERATITLE_FONT_SIZE);\r
- cameraTitle->SetPosition(CAMERATITLE_XPOS, CAMERATITLE_XPOY, CAMERATITLE_WIDTH, CAMERATITLE_HIGHT);\r
- cameraTitle->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- cameraTitle->SetVisible(false);\r
- container_->Add(cameraTitle);\r
-\r
- cameraFind = new UILabel();\r
- if (cameraFind == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraFind is nullptr");\r
+ cameraTitle_->SetText("相机");\r
+ cameraTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, CAMERATITLE_FONT_SIZE);\r
+ cameraTitle_->SetPosition(CAMERATITLE_XPOS, CAMERATITLE_XPOY, CAMERATITLE_WIDTH, CAMERATITLE_HIGHT);\r
+ cameraTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ cameraTitle_->SetVisible(false);\r
+ container_->Add(cameraTitle_);\r
+\r
+ cameraFind_ = new UILabel();\r
+ if (cameraFind_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraFind_ is nullptr");\r
return;\r
}\r
- cameraFind->SetText("正在连接手机...");\r
- cameraFind->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
- cameraFind->SetPosition(CAMERAFIND_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERAFIND_HIGHT);\r
- cameraFind->SetVisible(false);\r
- container_->Add(cameraFind);\r
-\r
- cameraTime = new UILabel();\r
- if (cameraTime == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTime is nullptr");\r
+ cameraFind_->SetText("正在连接手机...");\r
+ cameraFind_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
+ cameraFind_->SetPosition(CAMERAFIND_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERAFIND_HIGHT);\r
+ cameraFind_->SetVisible(false);\r
+ container_->Add(cameraFind_);\r
+\r
+ cameraTime_ = new UILabel();\r
+ if (cameraTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTime_ is nullptr");\r
return;\r
}\r
- cameraTime->SetText("5s");\r
- cameraTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_FONT_SIZE);\r
- cameraTime->SetPosition(CAMERATIME_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERATIME_HIGHT);\r
- cameraTime->SetVisible(false);\r
- container_->Add(cameraTime);\r
+ cameraTime_->SetText("5s");\r
+ cameraTime_->SetFont(BOLD_VECTOR_FONT_FILENAME, TIME_FONT_SIZE);\r
+ cameraTime_->SetPosition(CAMERATIME_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERATIME_HIGHT);\r
+ cameraTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ cameraTime_->SetVisible(false);\r
+ container_->Add(cameraTime_);\r
SetUpButton();\r
callBack_ = new CameraAnimatorCallback(this);\r
+ if (callBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack_ is nullptr");\r
+ return;\r
+ }\r
animator_ = new Animator(callBack_, nullptr, 0, true);\r
-\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "animator_ is nullptr");\r
+ return;\r
+ }\r
AddViewToPageContainer(container_);\r
InitCameraView();\r
}\r
void CameraMainPage::InitCameraView()\r
{\r
if (GetConnectStatus() == 1) {\r
- cameraTitle->SetVisible(true);\r
- cameraFind->SetVisible(true);\r
- title->SetVisible(false);\r
- bluetoothDisconnected->SetVisible(false);\r
- cameraTime->SetVisible(false);\r
- button->SetVisible(false);\r
- button->SetTouchable(false);\r
+ cameraTitle_->SetVisible(true);\r
+ cameraFind_->SetVisible(true);\r
+ disconnectTitle_->SetVisible(false);\r
+ btDisconnected_->SetVisible(false);\r
+ cameraTime_->SetVisible(false);\r
+ takePhotoButton_->SetVisible(false);\r
+ takePhotoButton_->Disable();\r
+ takePhotoButton_->SetTouchable(false);\r
container_->Invalidate();\r
uint8_t value = 1;\r
errcode_t ret;\r
ret = 0;\r
#else\r
ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
- MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE, &value, sizeof(value));\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE ret = %d", ret);\r
+ MSGCENTER_TYPE_ID_CAMERA_CONNECTING_PHONE, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "connecting phoneCamera ret = %d", ret);\r
#endif\r
} else {\r
- title->SetVisible(true);\r
- bluetoothDisconnected->SetVisible(true);\r
- cameraTitle->SetVisible(false);\r
- cameraFind->SetVisible(false);\r
- cameraTime->SetVisible(false);\r
- button->SetVisible(false);\r
- button->SetTouchable(false);\r
+ disconnectTitle_->SetVisible(true);\r
+ btDisconnected_->SetVisible(true);\r
+ cameraTitle_->SetVisible(false);\r
+ cameraFind_->SetVisible(false);\r
+ cameraTime_->SetVisible(false);\r
+ takePhotoButton_->SetVisible(false);\r
+ takePhotoButton_->Disable();\r
+ takePhotoButton_->SetTouchable(false);\r
container_->Invalidate();\r
}\r
}\r
\r
void CameraMainPage::Refresh_page()\r
{\r
- cameraTitle->SetVisible(true);\r
- button->SetVisible(true);\r
- button->SetTouchable(true);\r
- cameraFind->SetVisible(false);\r
- title->SetVisible(false);\r
- bluetoothDisconnected->SetVisible(false);\r
- cameraTime->SetVisible(false);\r
+ cameraTitle_->SetVisible(true);\r
+ takePhotoButton_->SetVisible(true);\r
+ takePhotoButton_->Enable();\r
+ takePhotoButton_->SetTouchable(true);\r
+ cameraFind_->SetVisible(false);\r
+ disconnectTitle_->SetVisible(false);\r
+ btDisconnected_->SetVisible(false);\r
+ cameraTime_->SetVisible(false);\r
container_->Invalidate();\r
}\r
\r
void CameraMainPage::SetUpButton()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::SetupButton new Label");\r
- if (button == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "button is nullptr");\r
- button = new UILabelButton();\r
+ takePhotoButton_ = new UILabelButton();\r
+ if (takePhotoButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "takePhotoButton_ is nullptr");\r
+ return;\r
}\r
\r
- button->SetPosition(CAMERA_BUTTON_POSITION_X, CAMERA_BUTTON_POSITION_Y);\r
- button->Resize(BUTTON_WIDTH, BUTTON_HIGHT);\r
- button->SetViewId("button1");\r
- button->SetOnClickListener(this);\r
- button->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
- button->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- button->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
- button->SetVisible(false);\r
- button->SetTouchable(false);\r
- LOADIMG::LoadBtnImage(button, CAMERA_IMAGE, IMAGE_CONVERTER_TOOL_CAMERA_1, IMAGE_CONVERTER_TOOL_CAMERA_1);\r
- container_->Add(button);\r
+ takePhotoButton_->SetPosition(CAMERA_BUTTON_POSITION_X, CAMERA_BUTTON_POSITION_Y);\r
+ takePhotoButton_->Resize(BUTTON_WIDTH, BUTTON_HIGHT);\r
+ takePhotoButton_->SetViewId(TAKEPHOTO_BUTTON);\r
+ takePhotoButton_->SetOnClickListener(this);\r
+ takePhotoButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ takePhotoButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ takePhotoButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ takePhotoButton_->SetVisible(false);\r
+ takePhotoButton_->Disable();\r
+ takePhotoButton_->SetTouchable(false);\r
+ LOADIMG::LoadBtnImage(takePhotoButton_, CAMERA_IMAGE, IMAGE_CAMERA_TAKEPHOTO, IMAGE_CAMERA_TAKEPHOTO);\r
+ container_->Add(takePhotoButton_);\r
}\r
\r
void CameraMainPage::OnPause()\r
bool CameraMainPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
UNUSED(event);\r
- if (view.GetViewId() == "button1") {\r
+ if (strcmp(view.GetViewId(), TAKEPHOTO_BUTTON) == 0) {\r
if (GetConnectStatus() == 1) {\r
- button->SetVisible(false);\r
- cameraTime->SetVisible(true);\r
- SetFirstFlag(true);\r
+ takePhotoButton_->SetVisible(false);\r
+ takePhotoButton_->Disable();\r
+ cameraTime_->SetVisible(true);\r
+ SetFirstClickFlag(true);\r
animator_->Start();\r
} else {\r
- title->SetVisible(true);\r
- bluetoothDisconnected->SetVisible(true);\r
- cameraTitle->SetVisible(false);\r
- cameraFind->SetVisible(false);\r
- cameraTime->SetVisible(false);\r
- button->SetVisible(false);\r
- button->SetTouchable(false);\r
+ disconnectTitle_->SetVisible(true);\r
+ btDisconnected_->SetVisible(true);\r
+ cameraTitle_->SetVisible(false);\r
+ cameraFind_->SetVisible(false);\r
+ cameraTime_->SetVisible(false);\r
+ takePhotoButton_->SetVisible(false);\r
+ takePhotoButton_->Disable();\r
+ takePhotoButton_->SetTouchable(false);\r
container_->Invalidate();\r
}\r
}\r
\r
bool CameraMainPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraPresenter::OnDrag");\r
UNUSED(view);\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
uint8_t value = 1;\r
errcode_t ret;\r
#ifdef _WIN32\r
ret = 0;\r
#else\r
ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
- MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT, &value, sizeof(value));\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT ret = %d", ret);\r
+ MSGCENTER_TYPE_ID_PHONE_EXIT_CAMERA, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "notify phone exit camera, ret = %d", ret);\r
#endif\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
}\r
return true;\r
}\r
static int count = 0;\r
static struct timeval start_time;\r
struct timeval current_time;\r
- if (page_->GetFirstFlag()) {\r
+ if (page_->GetFirstClickFlag()) {\r
gettimeofday(&start_time, nullptr);\r
- page_->SetFirstFlag(false);\r
+ page_->SetFirstClickFlag(false);\r
}\r
gettimeofday(¤t_time, nullptr);\r
int time = current_time.tv_sec - start_time.tv_sec;\r
- std::string strTime1 = std::to_string(COUNTDOWN_TIME - time) + "s";\r
page_->SetCameraTime(time);\r
if (time == COUNTDOWN_TIME) {\r
page_->StopAnimator();\r
void CameraMainPage::StopAnimator()\r
{\r
animator_->Stop();\r
- button->SetVisible(true);\r
- cameraTime->SetVisible(false);\r
- cameraTime->SetText("5s");\r
- SetFirstFlag(false);\r
+ takePhotoButton_->SetVisible(true);\r
+ takePhotoButton_->Enable();\r
+ cameraTime_->SetVisible(false);\r
+ cameraTime_->SetText("5s");\r
+ SetFirstClickFlag(false);\r
uint8_t value = 1;\r
errcode_t ret;\r
#ifdef _WIN32\r
- ret = 0;\r
+ ret = 0;\r
#else\r
- ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
- MSGCENTER_TYPE_ID_ON_CAMERA, &value, sizeof(value));\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_ON_CAMERA ret = %d", ret);\r
+ ret = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_ON_CAMERA, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "notify phone take photo ret = %d", ret);\r
#endif\r
}\r
\r
int progressTime = COUNTDOWN_TIME - time;\r
int progressValue = 0;\r
std::string strTime = std::to_string(COUNTDOWN_TIME - time) + "s";\r
- cameraTime->SetText(strTime.c_str());\r
+ cameraTime_->SetText(strTime.c_str());\r
}\r
\r
-bool CameraMainPage::GetFirstFlag()\r
+bool CameraMainPage::GetFirstClickFlag()\r
{\r
- return isFirst;\r
+ return isFirstClick_;\r
}\r
\r
-void CameraMainPage::SetFirstFlag(bool value)\r
+void CameraMainPage::SetFirstClickFlag(bool value)\r
{\r
- isFirst = value;\r
+ isFirstClick_ = value;\r
}\r
}
\ No newline at end of file
#include <sys/time.h>\r
#include "ohos_timer.h"\r
#include "wearable_log.h"\r
-#include "camera/CameraModel.h"\r
#include "camera/CameraView.h"\r
+#include "camera/CameraModel.h"\r
\r
namespace OHOS {\r
-\r
CameraModel::CameraModel() {}\r
\r
CameraModel::~CameraModel() {}\r
#include "camera/CameraPresenter.h"\r
\r
namespace OHOS {\r
-REGIST_MENU(VIEW_CAMERA, CameraView, CameraPresenter, CAMERA_MAIN_ICON, PNG_APPLIST_SETTING_IMAGE, "相机");\r
+REGIST_MENU(VIEW_CAMERA, CameraView, CameraPresenter, CAMERA_ICON, CAMERA_ICON, "相机");\r
}\r
#include "wearable_log.h"
#include "ui_resource_image.h"
#include "common/image_cache_manager.h"
-#include "UICardPageFactory.h"
+#include "UIWatchDialFactory.h"
+#ifdef BUILD_IN_LINUX
+#include "localtime.h"
+#endif
namespace OHOS {
-REGIST_WATCH_DIAL(DIAL_DISPLAY_MODE_AOD, DIAL_CLOCK, AmbientClockView);
+REGIST_WATCH_DIAL(DIAL_DISPLAY_SUPPORT_AOD, DIAL_CLOCK, AmbientClockView, nullptr);
static constexpr uint16_t POINT_POSITION_X = 202;
static constexpr uint16_t POINT_POSITION_Y = 16;
AmbientClockView::AmbientClockView()
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AmbientClockView::AmbientClockView");
- SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
- PreLoad();
}
AmbientClockView::~AmbientClockView()
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AmbientClockView::~AmbientClockView");
- if (viewiInitStatus_) {
- mainSweepClock_->RemoveAll();
- delete secondHand_;
- secondHand_ = nullptr;
- delete minuteHand_;
- minuteHand_ = nullptr;
- delete hourHand_;
- hourHand_ = nullptr;
- delete hand24Hour_;
- hand24Hour_ = nullptr;
- delete bigCircle_;
- bigCircle_ = nullptr;
- delete medCircle_;
- medCircle_ = nullptr;
- delete smallCircle_;
- smallCircle_ = nullptr;
- Remove(mainSweepClock_);
- delete mainSweepClock_;
- mainSweepClock_ = nullptr;
- }
}
bool AmbientClockView::InitCenterCircleView(void)
return true;
}
-void AmbientClockView::PreLoad(void)
+void AmbientClockView::InitDateTime(void)
{
- if (!viewiInitStatus_) {
- InitView();
- viewiInitStatus_ = true;
- }
+ struct tm pTM;
+ time_t seconds;
+ time(&seconds);
+ localtime_r(&seconds, &pTM);
+ mainSweepClock_->SetTime24Hour(pTM.tm_hour, pTM.tm_min, pTM.tm_sec);
+}
+
+void AmbientClockView::Update(void)
+{
+ struct timeval tv;
+ gettimeofday(&tv, nullptr);
+ uint64_t second = tv.tv_sec;
+ uint64_t uSecond = tv.tv_usec;
+ uint64_t minute = second / MIN_TO_HOUR;
+ uint64_t hour = minute / MIN_TO_HOUR + timezone / (MIN_TO_HOUR * MIN_TO_HOUR);
+ uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);
+ uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);
+ uint16_t realMilliSecond = static_cast<uint16_t>((second % MIN_TO_HOUR) *
+ SEC_TO_MILLI + uSecond / USEC_TO_MILLI);
+ mainSweepClock_->SetSweepTime12Hour(realHour, realMinute, realMilliSecond, 1);
}
-bool AmbientClockView::InitView(void)
+void AmbientClockView::OnCreateView(void* data)
{
+ fragmentView_.SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AmbientClockView::InitView");
mainSweepClock_ = new UISweepClock();
if (mainSweepClock_ == nullptr) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSweepClock new fail");
- return false;
+ return;
}
if (!InitSweepClock()) {
- return false;
+ return;
}
- Add(mainSweepClock_);
+ fragmentView_.Add(mainSweepClock_);
mainSweepClock_->SetDragParentInstead(true);
mainSweepClock_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
mainSweepClock_->SetInitTime24Hour(0, 0, 0);
mainSweepClock_->SetWorkMode(UISweepClock::WorkMode::NORMAL);
InitDateTime();
- SetCoverable(true);
- return true;
-}
-
-void AmbientClockView::InitDateTime(void)
-{
- struct tm pTM;
- time_t seconds;
- time(&seconds);
- localtime_r(&seconds, &pTM);
- mainSweepClock_->SetTime24Hour(pTM.tm_hour, pTM.tm_min, pTM.tm_sec);
}
-void AmbientClockView::UpdateTime(void)
+void AmbientClockView::OnDestroyView()
{
- struct timeval tv;
- gettimeofday(&tv, nullptr);
- uint64_t second = tv.tv_sec;
- uint64_t uSecond = tv.tv_usec;
- uint64_t minute = second / MIN_TO_HOUR;
- uint64_t hour = minute / MIN_TO_HOUR + timezone / (MIN_TO_HOUR * MIN_TO_HOUR);
- uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);
- uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);
- uint16_t realMilliSecond = static_cast<uint16_t>((second % MIN_TO_HOUR) *
- SEC_TO_MILLI + uSecond / USEC_TO_MILLI);
- mainSweepClock_->SetSweepTime12Hour(realHour, realMinute, realMilliSecond, 1);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AmbientClockView::OnDestroyView");
+ if (mainSweepClock_ != nullptr) {
+ mainSweepClock_->RemoveAll();
+ delete secondHand_;
+ secondHand_ = nullptr;
+ delete minuteHand_;
+ minuteHand_ = nullptr;
+ delete hourHand_;
+ hourHand_ = nullptr;
+ delete hand24Hour_;
+ hand24Hour_ = nullptr;
+ delete bigCircle_;
+ bigCircle_ = nullptr;
+ delete medCircle_;
+ medCircle_ = nullptr;
+ delete smallCircle_;
+ smallCircle_ = nullptr;
+ fragmentView_.Remove(mainSweepClock_);
+ delete mainSweepClock_;
+ mainSweepClock_ = nullptr;
+ }
}
}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientAodView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "clock/GradientAodView.h"\r
+#include "wearable_log.h"\r
+#include "UIWatchDialFactory.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_WATCH_DIAL(DIAL_DISPLAY_SUPPORT_AOD, GRADIENT_CLOCK, GradientAodView, nullptr);\r
+\r
+static GradientAodView* g_pGradientAodView = nullptr;\r
+\r
+GradientAodView::GradientAodView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientAodView::GradientAodView");\r
+ g_pGradientAodView = this;\r
+}\r
+\r
+GradientAodView::~GradientAodView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientAodView::~GradientAodView");\r
+}\r
+\r
+GradientAodView *GradientAodView::GetInstance(void)\r
+{\r
+ return g_pGradientAodView;\r
+}\r
+\r
+void GradientAodView::Update(void)\r
+{\r
+ if (gradientDateView_ != nullptr) {\r
+ gradientDateView_->UpdateTime();\r
+ }\r
+}\r
+\r
+void GradientAodView::OnCreateView(void* data)\r
+{\r
+ fragmentView_.SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientAodView::OnCreateView");\r
+ gradientDateView_ = new GradientDateView();\r
+ if (!gradientDateView_) {\r
+ GRAPHIC_LOGE("gradientDateView_ malloc memory Failed\n");\r
+ return;\r
+ }\r
+ fragmentView_.Add(gradientDateView_);\r
+ gradientDateView_->InitView();\r
+ Update();\r
+}\r
+\r
+void GradientAodView::OnDestroyView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientAodView::OnDestroyView");\r
+ if (gradientDateView_) {\r
+ gradientDateView_->RemoveAll();\r
+ fragmentView_.Remove(gradientDateView_);\r
+ delete gradientDateView_;\r
+ gradientDateView_ = nullptr;\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientClockView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "clock/GradientClockView.h"\r
+#include "wearable_log.h"\r
+#include "clock/ClockResourceImage.h"\r
+#include "common/screen.h"\r
+#include "sys/time.h"\r
+#include "UIWatchDialFactory.h"\r
+#include "main/DialBinTypesV2.h"\r
+\r
+namespace OHOS {\r
+\r
+const DialInfo dialInfoConfig = {\r
+ GRADIENT_CLOCK, "½¥±ä±íÅÌ", PNG_SET_GRADIENT_CLOCK, DEFAULT_TASK_PERIOD, DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY\r
+ };\r
+\r
+REGIST_WATCH_DIAL(DIAL_DISPLAY_SUPPORT_NORMAL, GRADIENT_CLOCK, GradientClockView, &dialInfoConfig);\r
+static GradientClockView *g_pGradientClockView = nullptr;\r
+\r
+static constexpr float SEC_TO_MILLI = 1000.0f;\r
+static constexpr int16_t USEC_TO_MILLI = 1000;\r
+static constexpr int16_t MIN_TO_HOUR = 60;\r
+static constexpr float SEC_TO_MIN = 60.0f;\r
+static constexpr float SECOND_HAND_RANGE = 160.0f;\r
+static constexpr float MINUTE_HAND_RANGE = 120.0f;\r
+static constexpr float SECOND_START_ANGLE = 200.0f;\r
+static constexpr float MINUTE_START_ANGLE = 240.0f;\r
+static constexpr int16_t ANGLE_DETAL = 3;\r
+static constexpr int16_t USEC_TO_SEC = 60;\r
+static constexpr float ANGEL_MINUTE_STEPS = 6.0f;\r
+static constexpr int16_t CLOCK_RADIUS = HORIZONTAL_RESOLUTION / 2;\r
+static constexpr int16_t CLOCK_RADIUS_RECTANGLE = (VERTICAL_RESOLUTION > HORIZONTAL_RESOLUTION) ?\\r
+ VERTICAL_RESOLUTION / 2 + 75 : HORIZONTAL_RESOLUTION / 2;\r
+static constexpr int16_t MINUTE_RADIUS = CLOCK_RADIUS - static_cast<int16_t>(0.103524 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t MINUTE_RADIUS_RECTANGLE = CLOCK_RADIUS_RECTANGLE;\r
+static constexpr int16_t MARGIN_BG = 10;\r
+static constexpr int16_t CENTER_X = HORIZONTAL_RESOLUTION / 2;\r
+static constexpr int16_t CENTER_Y = VERTICAL_RESOLUTION/ 2;\r
+static constexpr int16_t MINUTE_COUNT = 2;\r
+static ColorStop minutestops[MINUTE_COUNT] = {{0, 0x00FFFAEF}, {0.333, 0xFFFFD383}}; // Alaph 00~FF\r
+static constexpr int16_t SECOND_COUNT = 2;\r
+static ColorStop secondstops[SECOND_COUNT] = {{0, 0x0AF8F5FD}, {0.444, 0xFF7948EA}}; // Alaph 0A~FF\r
+static constexpr int16_t BACKGROUD_COUNT = 3;\r
+ColorStop backgroudstops[BACKGROUD_COUNT] = {{0, 0xFF994EDE}, {0.50974, 0xFFFC62BA}, {1, 0xFFFEC45E}};\r
+\r
+void GradientClockView::SafeDelete(UIView* ptr)\r
+{\r
+ if (ptr != nullptr) {\r
+ Remove(ptr);\r
+ delete ptr;\r
+ ptr = nullptr;\r
+ }\r
+}\r
+\r
+GradientClockView *GradientClockView::GetInstance(void)\r
+{\r
+ return g_pGradientClockView;\r
+}\r
+\r
+GradientClockView::GradientClockView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientClockView::GradientClockView");\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ secondAngle_ = SECOND_START_ANGLE;\r
+ PreLoad();\r
+ g_pGradientClockView = this;\r
+}\r
+\r
+GradientClockView::~GradientClockView()\r
+{\r
+ if (!viewiInitStatus_) {\r
+ return;\r
+ }\r
+ SafeDelete(backgroudCanvas_);\r
+ SafeDelete(secondHandCanvas_);\r
+ SafeDelete(minuteHandCanvas_);\r
+ if (gradientDateView_) {\r
+ gradientDateView_->RemoveAll();\r
+ Remove(gradientDateView_);\r
+ delete gradientDateView_;\r
+ gradientDateView_ = nullptr;\r
+ }\r
+ g_pGradientClockView = nullptr;\r
+}\r
+\r
+bool GradientClockView::InitView(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientClockView::InitView");\r
+\r
+ backgroudCanvas_ = new UICanvasExt();\r
+ if (backgroudCanvas_ != nullptr) {\r
+ PaintExt backPaint;\r
+ backPaint.SetStyle(Paint::PaintStyle::FILL_STYLE);\r
+ backPaint.SetLinearGradient({-MARGIN_BG, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION + MARGIN_BG,\r
+ VERTICAL_RESOLUTION}, backgroudstops, BACKGROUD_COUNT);\r
+ backPaint.SetAntialiased(true);\r
+ backgroudCanvas_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ backgroudCanvas_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ uint16_t radius = (Screen::GetInstance().GetScreenShape() == ScreenShape::RECTANGLE) ?\\r
+ CLOCK_RADIUS_RECTANGLE : CLOCK_RADIUS;\r
+ backgroudCanvas_->DrawCircle({CENTER_X, CENTER_Y}, radius, backPaint);\r
+ Add(backgroudCanvas_);\r
+ }\r
+\r
+ secondHandCanvas_ = new UICanvasExt();\r
+ if (secondHandCanvas_ != nullptr) {\r
+ Add(secondHandCanvas_);\r
+ }\r
+\r
+ minuteHandCanvas_ = new UICanvasExt();\r
+ if (minuteHandCanvas_ != nullptr) {\r
+ Add(minuteHandCanvas_);\r
+ }\r
+\r
+ gradientDateView_ = new GradientDateView();\r
+ if (gradientDateView_ != nullptr) {\r
+ Add(gradientDateView_);\r
+ gradientDateView_->InitView();\r
+ }\r
+\r
+ SetCoverable(true);\r
+ Update();\r
+ viewiInitStatus_ = true;\r
+ return true;\r
+}\r
+\r
+void GradientClockView::PreLoad(void)\r
+{\r
+ if (!viewiInitStatus_) {\r
+ InitView();\r
+ viewiInitStatus_ = true;\r
+ }\r
+}\r
+\r
+void GradientClockView::Update(void)\r
+{\r
+ struct timeval tv;\r
+ gettimeofday(&tv, nullptr);\r
+ uint64_t second = tv.tv_sec;\r
+ uint64_t uSecond = tv.tv_usec;\r
+ uint64_t minute = second / MIN_TO_HOUR;\r
+ uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
+ uint64_t realMilliSecond = static_cast<uint64_t>(uSecond / USEC_TO_MILLI);\r
+ uint8_t realSecond = second % USEC_TO_SEC;\r
+\r
+ if (gradientDateView_ != nullptr) {\r
+ gradientDateView_->UpdateTime();\r
+ }\r
+\r
+ // update all canvas\r
+ UpdateHands(realMinute, realSecond, realMilliSecond);\r
+}\r
+\r
+void GradientClockView::UpdateHands(uint8_t minute, uint8_t second, uint64_t milliSecond)\r
+{\r
+ if (second !=second_) {\r
+ secondAngle_ = second % USEC_TO_SEC * ANGEL_MINUTE_STEPS;\r
+ second_ = second;\r
+ }\r
+\r
+ // update second hand\r
+ float secondAngle = SECOND_START_ANGLE + secondAngle_ + milliSecond / SEC_TO_MILLI * ANGEL_MINUTE_STEPS;\r
+ uint16_t colckRadius = (Screen::GetInstance().GetScreenShape() == ScreenShape::RECTANGLE) ?\\r
+ CLOCK_RADIUS_RECTANGLE :CLOCK_RADIUS;\r
+ sectorInfo sectorStru(secondAngle, SECOND_HAND_RANGE, colckRadius, SECOND_COUNT, secondstops);\r
+ UpdateCanvas(secondHandCanvas_, sectorStru);\r
+\r
+ // update minute hand\r
+ float minuteAngle = MINUTE_START_ANGLE + minute % USEC_TO_SEC * ANGEL_MINUTE_STEPS +\r
+ second / SEC_TO_MIN * ANGEL_MINUTE_STEPS;\r
+ uint16_t minuteRadius = (Screen::GetInstance().GetScreenShape() == ScreenShape::RECTANGLE) ?\\r
+ MINUTE_RADIUS_RECTANGLE : MINUTE_RADIUS;\r
+ sectorInfo minuteStru(minuteAngle, MINUTE_HAND_RANGE, minuteRadius, MINUTE_COUNT, minutestops);\r
+ UpdateCanvas(minuteHandCanvas_, minuteStru);\r
+}\r
+\r
+void GradientClockView::UpdateCanvas(UICanvasExt *canvas, const sectorInfo& sectorInfo)\r
+{\r
+ if (canvas == nullptr) {\r
+ GRAPHIC_LOGE("callback view is not UICanvasExt");\r
+ return;\r
+ }\r
+\r
+ canvas->Clear();\r
+ float sectorEnd = sectorInfo.startAngle + sectorInfo.angleRange;\r
+ PaintExt secPaint;\r
+ secPaint.SetStyle(Paint::PaintStyle::FILL_STYLE);\r
+ secPaint.SetStrokeWidth(1);\r
+ SweepGradient sweep = {CENTER_X, CENTER_Y, sectorInfo.startAngle};\r
+ secPaint.SetSweepGradient(sweep, sectorInfo.colorStop, sectorInfo.stopCount);\r
+ secPaint.SetOpacity(OPA_OPAQUE);\r
+ secPaint.SetAntialiased(true);\r
+ canvas->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ canvas->DrawSector({CENTER_X, CENTER_Y}, sectorInfo.sectorRadius, sectorInfo.startAngle + ANGLE_DETAL,\r
+ sectorEnd, secPaint);\r
+ canvas->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+}\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientDateView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include <vector>\r
+#include "sys/time.h"\r
+#include "clock/GradientDateView.h"\r
+#include "wearable_log.h"\r
+#include "common/image_cache_manager.h"\r
+#include "common/screen.h"\r
+#include "clock/ClockResourceImage.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t MIN_TO_HOUR = 60;\r
+static constexpr int16_t HOURLY_SYSTEM = 24;\r
+static constexpr int16_t NUM2 = 2;\r
+static constexpr int16_t SCREEN_HALF_W = HORIZONTAL_RESOLUTION / NUM2;\r
+static constexpr int16_t SCREEN_HALF_H = VERTICAL_RESOLUTION / NUM2;\r
+static constexpr int16_t TIME_SPLIT_X_DANCE = static_cast<int16_t>(0.015419 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t TIME_SPLIT_Y_DANCE = static_cast<int16_t>(0.096916 * VERTICAL_RESOLUTION);\r
+static constexpr int16_t TIME_SPLIT_X = SCREEN_HALF_W - TIME_SPLIT_X_DANCE;\r
+static constexpr int16_t TIME_SPLIT_Y = SCREEN_HALF_H - TIME_SPLIT_Y_DANCE;\r
+static constexpr int16_t TIME_X_DANCE = static_cast<int16_t>(0.145374 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t TIME_Y_DANCE = static_cast<int16_t>(0.132159 * VERTICAL_RESOLUTION);\r
+static constexpr int16_t TIME_POINT_Y = SCREEN_HALF_H - TIME_Y_DANCE;\r
+static constexpr int16_t HOUR_POINT_X = SCREEN_HALF_W - TIME_X_DANCE;\r
+static constexpr int16_t MINUTE_POINT_X = SCREEN_HALF_W + TIME_X_DANCE;\r
+static constexpr int16_t WEEK_POINT_X_DANCE = static_cast<int16_t>(0.066079 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t WEEK_POINT_Y_DANCE = static_cast<int16_t>(0.127753 * VERTICAL_RESOLUTION);\r
+static constexpr int16_t WEEK_POINT_X = SCREEN_HALF_W - WEEK_POINT_X_DANCE;\r
+static constexpr int16_t WEEK_POINT_Y = SCREEN_HALF_H + WEEK_POINT_Y_DANCE;\r
+static constexpr int16_t WEEK_POINT_Y_RECTANGLE = SCREEN_HALF_H + WEEK_POINT_Y_DANCE\\r
+ - static_cast<int16_t>(0.025974 * VERTICAL_RESOLUTION);\r
+static constexpr int16_t DATE_POINT_Y_DANCE = WEEK_POINT_X_DANCE;\r
+static constexpr int16_t DATE_POINT_Y = SCREEN_HALF_H + DATE_POINT_Y_DANCE;\r
+static constexpr int16_t YEAR_POINT_X = SCREEN_HALF_W - static_cast<int16_t>(0.07489 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t MONTH_POINT_X = SCREEN_HALF_W + static_cast<int16_t>(0.024229 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t DAY_POINT_X = SCREEN_HALF_W + static_cast<int16_t>(0.101322 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t DATE_LEFT_SPLIT_X = SCREEN_HALF_W - static_cast<int16_t>(0.028634 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t DATE_RIGHT_SPLIT_X = SCREEN_HALF_W + static_cast<int16_t>(0.048458 * HORIZONTAL_RESOLUTION);\r
+static constexpr int16_t NUM4 = 4;\r
+static constexpr int16_t SPACE = 0;\r
+\r
+template <typename T>\r
+void SafeDelete(T*& ptr)\r
+{\r
+ if (ptr != nullptr) {\r
+ delete ptr;\r
+ ptr = nullptr;\r
+ }\r
+}\r
+\r
+static const std::vector<int> g_weekVector = {\r
+ PNG_WEEK_SUN,\r
+ PNG_WEEK_MON,\r
+ PNG_WEEK_TUE,\r
+ PNG_WEEK_WED,\r
+ PNG_WEEK_THU,\r
+ PNG_WEEK_FRI,\r
+ PNG_WEEK_SAT,\r
+};\r
+\r
+static const std::vector<int> g_dateVector = {\r
+ PNG_DATA_0,\r
+ PNG_DATA_1,\r
+ PNG_DATA_2,\r
+ PNG_DATA_3,\r
+ PNG_DATA_4,\r
+ PNG_DATA_5,\r
+ PNG_DATA_6,\r
+ PNG_DATA_7,\r
+ PNG_DATA_8,\r
+ PNG_DATA_9,\r
+};\r
+\r
+static const std::vector<int> g_timeVector = {\r
+ PNG_TIME_0,\r
+ PNG_TIME_1,\r
+ PNG_TIME_2,\r
+ PNG_TIME_3,\r
+ PNG_TIME_4,\r
+ PNG_TIME_5,\r
+ PNG_TIME_6,\r
+ PNG_TIME_7,\r
+ PNG_TIME_8,\r
+ PNG_TIME_9,\r
+};\r
+\r
+GradientDateView::GradientDateView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientDateView::GradientDateView");\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+}\r
+\r
+GradientDateView::~GradientDateView()\r
+{\r
+ if (!viewiInitStatus_) {\r
+ return;\r
+ }\r
+\r
+ RemoveAll();\r
+ SafeDelete(yearImgView_);\r
+ SafeDelete(monthImgView_);\r
+ SafeDelete(dayImgView_);\r
+ SafeDelete(hourImgView_);\r
+ SafeDelete(minuteImgView_);\r
+ SafeDelete(backgroudImage_);\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(PNG_GRADIENT_CLOCK_RESOURCE);\r
+ for (auto weekImg : weekInfo_) {\r
+ if (weekImg != nullptr) {\r
+ ImageCacheFree(*weekImg);\r
+ delete weekImg;\r
+ weekImg = nullptr;\r
+ }\r
+ }\r
+ for (auto dateImg : dateNumImgInfo_) {\r
+ if (dateImg != nullptr) {\r
+ ImageCacheFree(*dateImg);\r
+ delete dateImg;\r
+ dateImg = nullptr;\r
+ }\r
+ }\r
+}\r
+\r
+bool GradientDateView::InitView(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GradientDateView::InitView");\r
+ backgroudImage_ = new UIImageView();\r
+ if (backgroudImage_) {\r
+ backgroudImage_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ backgroudImage_->SetResizeMode(UIImageView::FILL);\r
+ LoadClockImageById(backgroudImage_, PNG_TIME_SCALE);\r
+ Add(backgroudImage_);\r
+ }\r
+ InitWeekImgView();\r
+ InitDateImgViews();\r
+ InitTimeImgViews();\r
+ viewiInitStatus_ = true;\r
+ return true;\r
+}\r
+\r
+void GradientDateView::InitWeekImgView(void)\r
+{\r
+ uint16_t length = g_weekVector.size();\r
+ int16_t y = (Screen::GetInstance().GetScreenShape() == ScreenShape::RECTANGLE) ?\\r
+ WEEK_POINT_Y_RECTANGLE : WEEK_POINT_Y;\r
+ weekImgView_.SetPosition(WEEK_POINT_X, y);\r
+ if (!LoadGradientDateImages(weekInfo_, g_weekVector, length)) {\r
+ return;\r
+ }\r
+ Add(&weekImgView_);\r
+}\r
+\r
+void GradientDateView::InitDateImgViews(void)\r
+{\r
+ uint16_t length = g_dateVector.size();\r
+ if (!LoadGradientDateImages(dateNumImgInfo_, g_dateVector, length)) {\r
+ return;\r
+ }\r
+ InitDigitalImgView(yearImgView_, {YEAR_POINT_X, DATE_POINT_Y}, NUM4, dateNumImgInfo_);\r
+ InitDigitalImgView(monthImgView_, {MONTH_POINT_X, DATE_POINT_Y}, NUM2, dateNumImgInfo_);\r
+ InitDigitalImgView(dayImgView_, {DAY_POINT_X, DATE_POINT_Y}, NUM2, dateNumImgInfo_);\r
+\r
+ if (LoadClockImageById(&dateSplitLeft_, PNG_DATA_SPLIT)) {\r
+ dateSplitLeft_.SetPosition(DATE_LEFT_SPLIT_X, DATE_POINT_Y);\r
+ Add(&dateSplitLeft_);\r
+ }\r
+\r
+ if (LoadClockImageById(&dateSplitRight_, PNG_DATA_SPLIT)) {\r
+ dateSplitRight_.SetPosition(DATE_RIGHT_SPLIT_X, DATE_POINT_Y);\r
+ Add(&dateSplitRight_);\r
+ }\r
+}\r
+\r
+void GradientDateView::InitTimeImgViews(void)\r
+{\r
+ uint16_t length = g_timeVector.size();\r
+ if (!LoadGradientDateImages(timeNumImgInfo_, g_timeVector, length)) {\r
+ return;\r
+ }\r
+ InitDigitalImgView(hourImgView_, {HOUR_POINT_X, TIME_POINT_Y}, NUM2, timeNumImgInfo_);\r
+ InitDigitalImgView(minuteImgView_, {MINUTE_POINT_X, TIME_POINT_Y}, NUM2, timeNumImgInfo_);\r
+ if (LoadClockImageById(&timeSplit_, PNG_TIME_SPLIT)) {\r
+ timeSplit_.SetPosition(TIME_SPLIT_X, TIME_SPLIT_Y);\r
+ Add(&timeSplit_);\r
+ }\r
+}\r
+\r
+void GradientDateView::InitDigitalImgView(DialDigitalImgView* &dialView, Point pos,\r
+ uint16_t integerLength, std::vector<ImageInfo*> &numImgInfo)\r
+{\r
+ if (dialView != nullptr) {\r
+ delete dialView;\r
+ dialView = nullptr;\r
+ }\r
+ uint16_t numImgLength = numImgInfo.size();\r
+ if (numImgLength == 0) {\r
+ return;\r
+ }\r
+ dialView = new DialDigitalImgView();\r
+ if (!dialView) {\r
+ GRAPHIC_LOGE("dialView malloc memory Failed\n");\r
+ return;\r
+ }\r
+\r
+ const OHOS::ImageInfo **dataArray = new const OHOS::ImageInfo *[numImgLength];\r
+ if (!dataArray) {\r
+ GRAPHIC_LOGE("dataArray malloc memory Failed\n");\r
+ return;\r
+ }\r
+\r
+ for (size_t i = 0; i < numImgLength; ++i) {\r
+ dataArray[i] = numImgInfo[i];\r
+ }\r
+\r
+ dialView->SetNumRes(dataArray, numImgLength);\r
+\r
+ delete[] dataArray;\r
+ dialView->SetIntegerLength(integerLength);\r
+ dialView->SetParent(this);\r
+ dialView->SetAlignPos(pos);\r
+ dialView->SetAlign(ImgAlign::CENTER);\r
+ dialView->SetSpace(SPACE);\r
+ Add(dialView);\r
+}\r
+\r
+void GradientDateView::UpdateTime(void)\r
+{\r
+ struct timeval tv;\r
+ gettimeofday(&tv, nullptr);\r
+ uint64_t second = tv.tv_sec;\r
+ uint64_t uSecond = tv.tv_usec;\r
+ uint64_t minute = second / MIN_TO_HOUR;\r
+ uint64_t hour = minute / MIN_TO_HOUR + timezone / (MIN_TO_HOUR * MIN_TO_HOUR);\r
+ uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);\r
+ uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
+\r
+ time_t time_struct = second;\r
+ struct tm *local_time = localtime(&time_struct);\r
+ uint16_t year = local_time->tm_year + 1900; // tm_year begin 1900\r
+ uint16_t month = local_time->tm_mon + 1; // tm_mon is 0-11, need + 1\r
+ uint16_t day = local_time->tm_mday;\r
+ uint16_t weekDay = local_time->tm_wday;\r
+ realHour = local_time->tm_hour;\r
+ realMinute = local_time->tm_min;\r
+\r
+ if (weekInfo_.size() > 0) {\r
+ weekImgView_.SetSrc(weekInfo_.at(weekDay));\r
+ }\r
+\r
+ HandleDigitalData(yearImgView_, static_cast<float>(year));\r
+ HandleDigitalData(monthImgView_, static_cast<float>(month));\r
+ HandleDigitalData(dayImgView_, static_cast<float>(day));\r
+ HandleDigitalData(hourImgView_, static_cast<float>(realHour));\r
+ HandleDigitalData(minuteImgView_, static_cast<float>(realMinute));\r
+}\r
+\r
+void GradientDateView::HandleDigitalData(DialDigitalImgView* digitalView, float data)\r
+{\r
+ if (digitalView != nullptr) {\r
+ digitalView->HandleFloatData(data);\r
+ }\r
+}\r
+\r
+bool GradientDateView::LoadClockImageById(UIImageView* view, uint32_t resId)\r
+{\r
+ if (view == nullptr) {\r
+ GRAPHIC_LOGE("view == nullptr, Please check!");\r
+ return false;\r
+ }\r
+ FILE* fp = fopen(PNG_GRADIENT_CLOCK_RESOURCE, "rb");\r
+ if (fp == nullptr) {\r
+ GRAPHIC_LOGE("cannot open file: %s", PNG_GRADIENT_CLOCK_RESOURCE);\r
+ return false;\r
+ }\r
+ ImageInfo* imgInfo = ImageCacheManager::GetInstance().\r
+ LoadOneInMultiRes(resId, PNG_GRADIENT_CLOCK_RESOURCE, fp);\r
+ view->SetSrc(imgInfo);\r
+ fclose(fp);\r
+ return true;\r
+}\r
+\r
+bool GradientDateView::LoadGradientDateImages(std::vector<ImageInfo*> &imgInfos,\r
+ std::vector<int> resIds, uint16_t length)\r
+{\r
+ FILE* fp = fopen(PNG_GRADIENT_CLOCK_RESOURCE, "rb");\r
+ if (fp == nullptr) {\r
+ GRAPHIC_LOGE("cannot open file: %s", PNG_GRADIENT_CLOCK_RESOURCE);\r
+ return false;\r
+ }\r
+\r
+ uint32_t imgSize = sizeof(ImageInfo);\r
+ for (uint16_t i = 0; i < length; i++) {\r
+ ImageInfo* imgInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(resIds[i], PNG_GRADIENT_CLOCK_RESOURCE, fp);\r
+ if (!imgInfo) {\r
+ GRAPHIC_LOGE("LoadOneInMultiRes Failed: resId = %d\n", resIds[i]);\r
+ imgInfos.clear();\r
+ break;\r
+ }\r
+ imgInfos.push_back(imgInfo);\r
+ }\r
+ fclose(fp);\r
+ return true;\r
+}\r
+\r
+}
\ No newline at end of file
#include "wearable_log.h"
#include "ui_resource_image.h"
#include "common/image_cache_manager.h"
-#include "UICardPageFactory.h"
+#include "UIWatchDialFactory.h"
+#include "main/DialBinTypesV2.h"
#include <ctime>
namespace OHOS {
-REGIST_WATCH_DIAL(DIAL_DISPLAY_MODE_MAIN, DIAL_CLOCK, MainClockView);
+const DialInfo dialInfoConfig = {
+ DIAL_CLOCK, "ɨÃë±íÅÌ", PNG_SET_DIAL_CLOCK, DEFAULT_TASK_PERIOD, DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY
+ };
+
+REGIST_WATCH_DIAL(DIAL_DISPLAY_SUPPORT_NORMAL, DIAL_CLOCK, MainClockView, &dialInfoConfig);
static MainClockView *g_pMainClockView = nullptr;
void MainClockView::InitDateTime(void)
{
- UpdateTime();
+ Update();
}
-void MainClockView::UpdateTime(void)
+void MainClockView::Update(void)
{
struct timeval tv;
gettimeofday(&tv, nullptr);
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
}
+CompassControlView::~CompassControlView()
+{
+ UnLoad();
+}
+
void CompassControlView::PreLoad(void)
{
if (compassFragment_ == nullptr) {
compassFragment_->ResumeView();
}
}
+
+void CompassControlView::Update(void)
+{
+ if (compassFragment_ != nullptr) {
+ compassFragment_->Update();
+ }
+}
}
{RIGHT_WEST_UP_293, RIGHT_WESTNORTH_UP_338, "西北"}
};
-void CompassFragment::Callback(void)
+void CompassFragment::Update(void)
{
if (!initialized_) {
return;
void CompassFragment::OnPauseView()
{
- Deinit();
}
void CompassFragment::OnResumeView()
{
- Init();
}
void CompassFragment::OnDestroyView()
{
- Deinit();
fragmentView_.RemoveAll();
if (directionLabel_ != nullptr) {
delete directionLabel_;
UNUSED(view);
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
(event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+ NativeAbility::GetInstance().ChangeSliceToApplist();
}
return true;
}
void MainCompassPresenter::OnResume()
{
+ Init();
if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
view_->compassFragment_->ResumeView();
}
void MainCompassPresenter::OnPause()
{
+ Deinit();
if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
view_->compassFragment_->PauseView();
}
}
+
+void MainCompassPresenter::Callback()
+{
+ if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
+ view_->compassFragment_->Update();
+ }
+}
}
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: DateButtonItemView\r
* Create: 2025-03-23\r
*/\r
\r
-#include "date/DateButtonItemView.h"\r
#include "UiConfig.h"\r
#include "common/image_cache_manager.h"\r
#include "ui_resource_date.h"\r
#include "wearable_log.h"\r
+#include "date/DateButtonItemView.h"\r
\r
namespace OHOS {\r
static constexpr int16_t DATE_ITEM_BUTTON_POSITION_X = 0;\r
-static constexpr int16_t DATE_ITEM_BUTTON_POSITION_Y = 20;\r
+static constexpr int16_t DATE_ITEM_BUTTON_POSITION_Y = 0;\r
static constexpr int16_t DATE_ITEM_BUTTON_WIDTH = 80;\r
static constexpr int16_t DATE_ITEM_BUTTON_HEIGHT = 55;\r
static constexpr int16 DATE_ITEM_FONT_SIZE = 36;\r
-static constexpr int16_t DATE_ITEM_WIDTH = 95;\r
-static constexpr int16_t DATE_ITEM_HEIGHT = 60;\r
\r
DateButtonItemView::DateButtonItemView()\r
{\r
- SetPosition(0, 0, DATE_ITEM_WIDTH, DATE_ITEM_HEIGHT);\r
- SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- SetTouchable(true);\r
- SetUpChild();\r
-\r
- Add(&sLabelButton);\r
+ labelButton_.SetPosition(DATE_ITEM_BUTTON_POSITION_X, DATE_ITEM_BUTTON_POSITION_Y);\r
+ labelButton_.Resize(DATE_ITEM_BUTTON_WIDTH, DATE_ITEM_BUTTON_HEIGHT);\r
+ labelButton_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+ labelButton_.SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ labelButton_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelButton_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ labelButton_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ Add(&labelButton_);\r
}\r
\r
DateButtonItemView::~DateButtonItemView()\r
{\r
- Remove(&sLabelButton);\r
+ Remove(&labelButton_);\r
}\r
\r
void DateButtonItemView::SetItemInfo(const DateButtonItem itemInfo)\r
{\r
- sItemInfo = itemInfo;\r
- sLabelButton.SetText(sItemInfo.button_day);\r
- ImageInfo *image1;\r
- ImageInfo *image2;\r
- if (sItemInfo.isFirst) {\r
- if (sItemInfo.isSelect) {\r
- image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE6, DATE_IMAGE);\r
- sLabelButton.SetTextColor(Color::White());\r
+ itemInfo_ = itemInfo;\r
+ labelButton_.SetText(itemInfo_.buttonDay);\r
+ int imageSrc1;\r
+ int imageSrc2;\r
+ if (itemInfo_.isFirst) {\r
+ if (itemInfo_.isSelect) {\r
+ imageSrc1 = IMAGE_DATE_RED;\r
+ labelButton_.SetTextColor(Color::White());\r
} else {\r
- sLabelButton.SetTextColor(Color::GetColorFromRGBA(0xe0, 0x2d, 0x2f, 0xff));\r
- image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE3, DATE_IMAGE);\r
- }\r
- if (image1 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
- return;\r
- }\r
- image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE6, DATE_IMAGE);\r
- if (image2 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
- return;\r
+ imageSrc1 = IMAGE_DATE_WHITE;\r
+ labelButton_.SetTextColor(Color::GetColorFromRGBA(0xe0, 0x2d, 0x2f, 0xff));\r
}\r
+ imageSrc2 = IMAGE_DATE_RED;\r
} else {\r
- if (sItemInfo.isSelect) {\r
- image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE4, DATE_IMAGE);\r
+ if (itemInfo_.isSelect) {\r
+ imageSrc1 = IMAGE_DATE_SELECT;\r
} else {\r
- image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE2, DATE_IMAGE);\r
- }\r
- if (image1 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
- return;\r
+ imageSrc1 = IMAGE_DATE_GRAY;\r
}\r
- image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE4, DATE_IMAGE);\r
- if (image2 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
- return;\r
- }\r
- sLabelButton.SetTextColor(Color::White());\r
+ imageSrc2 = IMAGE_DATE_SELECT;\r
+ labelButton_.SetTextColor(Color::White());\r
}\r
- sLabelButton.SetImageSrc(image1, image2);\r
+ LOADIMG::LoadBtnImage(&labelButton_, DATE_IMAGE, imageSrc1, imageSrc2);\r
}\r
\r
-void DateButtonItemView::SetUpChild()\r
+DateButtonItem DateButtonItemView::GetItem()\r
{\r
- sLabelButton.SetPosition(DATE_ITEM_BUTTON_POSITION_X, 0);\r
- sLabelButton.Resize(DATE_ITEM_BUTTON_WIDTH, DATE_ITEM_BUTTON_HEIGHT);\r
- sLabelButton.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
- sLabelButton.SetAlign(TEXT_ALIGNMENT_CENTER);\r
- sLabelButton.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- sLabelButton.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
- sLabelButton.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ return itemInfo_;\r
}\r
-\r
-DateButtonItem DateButtonItemView ::GetItem()\r
-{\r
- return sItemInfo;\r
-}\r
-\r
}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "wearable_log.h"\r
+#include "date/DateContentItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DATE_ITEM_LABEL_POSITION_X = 43;\r
+static constexpr int16_t DATE_ITEM_LABEL_POSITION_Y = 22;\r
+static constexpr int16_t DATE_ITEM_LABEL_DES_POSITION_X = 23;\r
+static constexpr int16_t DATE_ITEM_LABEL_DES_POSITION_Y = 60;\r
+static constexpr int16_t DATE_ITEM_LABEL_ADDRESS_POSITION_X = 23;\r
+static constexpr int16_t DATE_ITEM_LABEL_ADDRESS_POSITION_Y = 110;\r
+static constexpr int16_t DATE_ITEM_LABEL_WIDTH = 200;\r
+static constexpr int16_t DATE_ITEM_LABEL_HEIGHT = 40;\r
+static constexpr int16_t DATE_ITEM_LABEL_DES_WIDTH = 314;\r
+static constexpr int16_t DATE_ITEM_LABEL_DES_HEIGHT = 40;\r
+static constexpr int16_t DATE_ITEM_LABEL_ADDRESS_WIDTH = 314;\r
+static constexpr int16_t DATE_ITEM_LABEL_ADDRESS_HEIGHT = 40;\r
+static constexpr int16_t DATE_ITEM_FONT_SIZE = 24;\r
+static constexpr int16_t DATE_ITEM_FONT2_SIZE = 32;\r
+static constexpr int16_t DATE_ITEM_WIDTH = 376;\r
+static constexpr int16_t DATE_ITEM_HEIGHT = 170;\r
+static constexpr int16_t DATE_ITEM_HEIGHT_BORDER = 10;\r
+static constexpr int16_t DATE_ITEM_BORDER_RADIUS = 15;\r
+\r
+DateContentItemView::DateContentItemView()\r
+{\r
+ labelTitle_.Resize(DATE_ITEM_LABEL_WIDTH, DATE_ITEM_LABEL_HEIGHT);\r
+ labelTitle_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+ labelTitle_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ labelTitle_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ labelDes_.Resize(DATE_ITEM_LABEL_DES_WIDTH, DATE_ITEM_LABEL_DES_POSITION_Y);\r
+ labelDes_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+ labelDes_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelDes_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ labelDes_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ labelAddress_.Resize(DATE_ITEM_LABEL_ADDRESS_WIDTH, DATE_ITEM_LABEL_ADDRESS_HEIGHT);\r
+ labelAddress_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+ labelAddress_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelAddress_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ labelAddress_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ signs_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(&signs_, DATE_IMAGE, IMAGE_DATE_SIGNS);\r
+\r
+ backGround_.Disable();\r
+ backGround_.SetPosition(0, 0, DATE_ITEM_WIDTH, DATE_ITEM_HEIGHT - DATE_ITEM_HEIGHT_BORDER);\r
+ backGround_.SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::PRESSED);\r
+ backGround_.SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::INACTIVE);\r
+ backGround_.SetStyleForState(STYLE_BACKGROUND_COLOR, 0X36FFFFFF, UIButton::RELEASED);\r
+ backGround_.SetStyleForState(STYLE_BORDER_RADIUS, DATE_ITEM_BORDER_RADIUS, UIButton::PRESSED);\r
+ backGround_.SetStyleForState(STYLE_BORDER_RADIUS, DATE_ITEM_BORDER_RADIUS, UIButton::INACTIVE);\r
+ backGround_.SetStyleForState(STYLE_BORDER_RADIUS, DATE_ITEM_BORDER_RADIUS, UIButton::RELEASED);\r
+\r
+ Add(&backGround_);\r
+ Add(&labelTitle_);\r
+ Add(&labelDes_);\r
+ Add(&labelAddress_);\r
+ Add(&signs_);\r
+}\r
+\r
+DateContentItemView::~DateContentItemView()\r
+{\r
+ Remove(&backGround_);\r
+ Remove(&labelTitle_);\r
+ Remove(&labelDes_);\r
+ Remove(&labelAddress_);\r
+ Remove(&signs_);\r
+}\r
+\r
+void DateContentItemView::SetItemInfo(const DateItem itemInfo)\r
+{\r
+ itemInfo_ = itemInfo;\r
+ int offsetX1 = 95;\r
+ int offsetY1 = 10;\r
+ int offsetX2 = 30;\r
+ int offsetY2 = 40;\r
+ labelTitle_.SetText(itemInfo.title);\r
+ labelDes_.SetText(itemInfo.describetion);\r
+\r
+ if (!strcmp(itemInfo.address, "no location")) {\r
+ labelAddress_.SetVisible(false);\r
+ backGround_.SetHeight(DATE_ITEM_HEIGHT - offsetY2 - offsetY1);\r
+ SetHeight(DATE_ITEM_HEIGHT - offsetY2);\r
+ } else {\r
+ labelAddress_.SetVisible(true);\r
+ labelAddress_.SetText(itemInfo.address);\r
+ backGround_.SetHeight(DATE_ITEM_HEIGHT - offsetY1);\r
+ SetHeight(DATE_ITEM_HEIGHT);\r
+ }\r
+\r
+ if (itemInfo.visiable) {\r
+ labelTitle_.SetPosition(DATE_ITEM_LABEL_POSITION_X + offsetX1, DATE_ITEM_LABEL_POSITION_Y + offsetY1);\r
+ labelTitle_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelTitle_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT2_SIZE);\r
+ labelDes_.SetPosition(DATE_ITEM_LABEL_DES_POSITION_X + offsetX2, DATE_ITEM_LABEL_DES_POSITION_Y + offsetY2);\r
+ labelDes_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ labelDes_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+ labelAddress_.SetVisible(false);\r
+ } else {\r
+ labelTitle_.SetPosition(DATE_ITEM_LABEL_POSITION_X, DATE_ITEM_LABEL_POSITION_Y);\r
+ labelTitle_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ labelTitle_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+ labelDes_.SetPosition(DATE_ITEM_LABEL_DES_POSITION_X, DATE_ITEM_LABEL_DES_POSITION_Y);\r
+ labelDes_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelDes_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT2_SIZE);\r
+ labelAddress_.SetPosition(DATE_ITEM_LABEL_DES_POSITION_X, DATE_ITEM_LABEL_ADDRESS_POSITION_Y);\r
+ labelAddress_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ labelAddress_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+ signs_.SetPosition(DATE_ITEM_LABEL_DES_POSITION_X, DATE_ITEM_FONT_SIZE);\r
+ }\r
+ signs_.SetVisible(!itemInfo.visiable);\r
+}\r
+\r
+const char *DateContentItemView ::GetViewId()\r
+{\r
+ return itemInfo_.index;\r
+}\r
+bool DateContentItemView::GetVisiable()\r
+{\r
+ return itemInfo_.visiable;\r
+}\r
+\r
+}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: DateMainPage\r
* Created: 2025-4\r
*/\r
\r
-#include "date/DateMainPage.h"\r
-#include "date/DateModel.h"\r
-#include "date/DatePresenter.h"\r
#include "NativeAbility.h"\r
#include "SlicePageFactory.h"\r
#include "UiConfig.h"\r
#include "components/ui_list_nested.h"\r
#include "components/ui_scroll_view_nested.h"\r
#include "ui_resource_date.h"\r
+#include "bts_br_gap.h"\r
+#include "bts_spp.h"\r
+#include "msg_center_device.h"\r
+#include "date/DateModel.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateMainPage.h"\r
\r
static constexpr int16_t DOWNSELECTPOSITION = 100;\r
static constexpr int16_t DOWNCONTENTLIST_POSITION_X = 39;\r
static constexpr int16_t BUTTONCONTENTLIST_HEIGHT = 55;\r
static constexpr int16_t BUTTONCONTENTLIST_SELECT_POSITON = 90;\r
static constexpr uint16_t DATE_MONTH_FONT = 25;\r
-static constexpr uint16_t DATE_MONTH_POS_X = 129;\r
-static constexpr uint16_t DATE_MONTH_POS_Y = 31;\r
+static constexpr uint16_t DATE_MONTH_POS_X = 117;\r
+static constexpr uint16_t DATE_MONTH_POS_Y = 30;\r
static constexpr uint16_t DATE_MONTH_WIDTH = 196;\r
static constexpr uint16_t LIST_POSITION_Y = 155;\r
+static constexpr uint16_t LIST_BLANK_SIZE = 60;\r
static constexpr uint16_t DATE_MONTH_HEIGHT = 50;\r
static constexpr uint8_t FONT_FORTY_SIZE = 36;\r
+static constexpr uint8_t MONTH_ADJUST_THRESHOLD = 3;\r
+static constexpr uint8_t MONTHS_IN_YEAR = 12;\r
+static constexpr uint8_t CENTURY = 100;\r
+static constexpr uint8_t ZELLER_MONTH_FACTOR = 13;\r
+static constexpr uint8_t ZELLER_DIVISOR = 5;\r
+static constexpr uint8_t LEAP_YEAR_INTERVAL = 4;\r
+static constexpr uint8_t DAYS_IN_WEEK = 7;\r
+static constexpr uint8_t CENTURY_OFFSET = 5;\r
+static constexpr int16 INDEX_0 = 0;\r
+static constexpr int16 INDEX_1 = 1;\r
+static constexpr int16 INDEX_2 = 2;\r
+static constexpr int16 INDEX_3 = 3;\r
+static constexpr int16 INDEX_4 = 4;\r
+static constexpr int16 INDEX_5 = 5;\r
+static constexpr int16_t DATE_ITEM_WIDTH = 95;\r
+static constexpr int16_t DATE_ITEM_HEIGHT = 60;\r
+static constexpr int16_t DATE_DOWN_LIST_ITEM_WIDTH = 376;\r
+static constexpr int16_t DATE_DOWN_LIST_ITEM_HEIGHT = 170;\r
+static constexpr char *DATE_LIST = "dateList";\r
+static constexpr char *DETAIL_LIST = "detailList";\r
\r
namespace OHOS {\r
REGIST_SLICE_PAGE(VIEW_DATE, DATE_PAGES::DATE_MAIN_PAGE, DateMainPage, true);\r
+static DateMainPage *g_pDateMainPage = nullptr;\r
\r
DateMainPage::DateMainPage()\r
{\r
+ g_pDateMainPage = this;\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::DateMainPage");\r
}\r
\r
DateMainPage::~DateMainPage()\r
{\r
- if (uiScrollView != nullptr) {\r
- uiScrollView->RemoveAll();\r
- delete uiScrollView;\r
- uiScrollView = nullptr;\r
+ g_pDateMainPage = nullptr;\r
+ if (uiScrollView_ != nullptr) {\r
+ uiScrollView_->RemoveAll();\r
+ delete uiScrollView_;\r
+ uiScrollView_ = nullptr;\r
}\r
\r
- if (listAdapter != nullptr) {\r
- delete listAdapter;\r
- listAdapter = nullptr;\r
+ dateList_->ClearAll();\r
+ if (dateList_ != nullptr) {\r
+ delete dateList_;\r
+ dateList_ = nullptr;\r
}\r
\r
- if (buttonAdapter != nullptr) {\r
- delete buttonAdapter;\r
- buttonAdapter = nullptr;\r
+ detailList_->ClearAll();\r
+ if (detailList_ != nullptr) {\r
+ delete detailList_;\r
+ detailList_ = nullptr;\r
}\r
\r
- if (buttonContentList != nullptr) {\r
- delete buttonContentList;\r
- buttonContentList = nullptr;\r
+ if (titlLabel_ != nullptr) {\r
+ delete titlLabel_;\r
+ titlLabel_ = nullptr;\r
}\r
\r
- if (downContentList != nullptr) {\r
- delete downContentList;\r
- downContentList = nullptr;\r
+ if (bgImage_ != nullptr) {\r
+ delete bgImage_;\r
+ bgImage_ = nullptr;\r
}\r
\r
- if (title != nullptr) {\r
- delete title;\r
- title = nullptr;\r
- }\r
-\r
- if (image1 != nullptr) {\r
- delete image1;\r
- image1 = nullptr;\r
+ int reset = DateModel::GetInstance().resetPage_;\r
+ if (reset == PAGE_STATUS_0 || reset == PAGE_STATUS_2) {\r
+ DateModel::GetInstance().selectButton_ = "";\r
}\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(DATE_IMAGE);\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::~DateMainPage");\r
}\r
\r
+DateMainPage *DateMainPage::GetInstance()\r
+{\r
+ return g_pDateMainPage;\r
+}\r
+\r
void DateMainPage::OnStart(void *data)\r
{\r
- uiScrollView = new UIScrollView();\r
- if (uiScrollView == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::scrollView is nullptr");\r
- return;\r
- }\r
- uiScrollView->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
- uiScrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- uiScrollView->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
- uiScrollView->SetThrowDrag(true);\r
- uiScrollView->SetOnDragListener(this);\r
- uiScrollView->SetThrowDrag(true);\r
- image1 = new UIImageView();\r
- if (image1 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::image1 is nullptr");\r
+ uiScrollView_ = new UIScrollView();\r
+ if (uiScrollView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scrollView is nullptr");\r
return;\r
}\r
- image1->SetPosition(0, 0);\r
- image1->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
- ImageInfo *imgSrc = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE7, DATE_IMAGE);\r
- if (imgSrc == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
- "DateMainPage::OnStart LoadOneInMultiRes IMAGE_CONVERTER_TOOL_DATE8 fail");\r
+ uiScrollView_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ uiScrollView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ uiScrollView_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ uiScrollView_->SetThrowDrag(true);\r
+ uiScrollView_->SetOnDragListener(this);\r
+ uiScrollView_->SetThrowDrag(true);\r
+ bgImage_ = new UIImageView();\r
+ if (bgImage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImage_ is nullptr");\r
return;\r
}\r
- image1->SetSrc(imgSrc);\r
- uiScrollView->Add(image1);\r
+ bgImage_->SetPosition(0, 0);\r
+ bgImage_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(bgImage_, DATE_IMAGE, IMAGE_DATE_BG1);\r
+ uiScrollView_->Add(bgImage_);\r
\r
DateModel::GetInstance().InitDate();\r
- title = new UILabel();\r
- if (title == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::title is nullptr");\r
+ titlLabel_ = new UILabel();\r
+ if (titlLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "titlLabel_ is nullptr");\r
return;\r
}\r
- title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MONTH_FONT);\r
std::stringstream ss;\r
- title->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT, UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT);\r
- title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);\r
- title->SetPosition(DATE_MONTH_POS_X, DATE_MONTH_POS_Y, DATE_MONTH_WIDTH, DATE_MONTH_HEIGHT);\r
- uiScrollView->Add(title);\r
- InitDownList();\r
- AddViewToPageContainer(uiScrollView);\r
+ titlLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT, UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT);\r
+ titlLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);\r
+ titlLabel_->SetPosition(DATE_MONTH_POS_X, DATE_MONTH_POS_Y, DATE_MONTH_WIDTH, DATE_MONTH_HEIGHT);\r
+ uiScrollView_->Add(titlLabel_);\r
+ InitList();\r
+ if (DateModel::GetInstance().GetConnectStatus()) {\r
+ errcode_t result;\r
+ uint8_t value = 1;\r
+#ifdef _WIN32\r
+ result = 0;\r
+#else\r
+ result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SYNC_DATE_REQ, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "sync data request result:%d ", result);\r
+#endif\r
+ }\r
+ AddViewToPageContainer(uiScrollView_);\r
+}\r
+\r
+void DateMainPage::ReloadPage()\r
+{\r
+ DateModel::GetInstance().InitDate();\r
+ RefreshListData();\r
}\r
\r
-void DateMainPage::InitDownList()\r
+void DateMainPage::RefreshListData()\r
{\r
- if (buttonContentList == nullptr) {\r
- buttonContentList = new UIList(0);\r
+ std::string strSelect = DateModel::GetInstance().selectButton_;\r
+ if (strSelect == "") {\r
+ SetDateButtonList(listTop_[0].buttonViewId);\r
+ RefreshDateMsg(listTop_[0].buttonViewId);\r
+ } else {\r
+ for (int i = 0; i < listTop_.Size(); i++) {\r
+ if (listTop_[i].buttonViewId == strSelect) {\r
+ SetDateButtonList(listTop_[i].buttonViewId);\r
+ RefreshDateMsg(listTop_[i].buttonViewId);\r
+ break;\r
+ }\r
+ }\r
}\r
- buttonAdapter = new DateButtonAdapter();\r
- if (buttonAdapter == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::listAdapter is nullptr");\r
+}\r
+\r
+void DateMainPage::InitList()\r
+{\r
+ dateList_ = new UISimpleList();\r
+ if (dateList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dateList_ is nullptr");\r
return;\r
}\r
- buttonAdapter->SetItemClickListener(this);\r
- buttonContentList->SetViewId("buttonList");\r
- buttonContentList->SetPosition(BUTTONCONTENTLIST_POSITION_X, BUTTONCONTENTLIST_POSITION_Y, BUTTONCONTENTLIST_WIDTH,\r
+ dateList_->SetViewId(DATE_LIST);\r
+ dateList_->SetPosition(BUTTONCONTENTLIST_POSITION_X, BUTTONCONTENTLIST_POSITION_Y, BUTTONCONTENTLIST_WIDTH,\r
BUTTONCONTENTLIST_HEIGHT);\r
- buttonContentList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- buttonContentList->SetSelectPosition(BUTTONCONTENTLIST_SELECT_POSITON);\r
- buttonContentList->SetDraggable(true);\r
- buttonContentList->SetThrowDrag(true);\r
- buttonContentList->EnableAutoAlign(true);\r
- buttonContentList->ScrollTo(0);\r
- buttonContentList->SetAdapter(buttonAdapter);\r
- buttonContentList->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);\r
- InitDateTop();\r
- RefreshButtonListDate(0);\r
- if (downContentList == nullptr) {\r
- downContentList = new UIList();\r
- }\r
+ dateList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ dateList_->SetSelectPosition(BUTTONCONTENTLIST_SELECT_POSITON);\r
+ dateList_->SetDraggable(true);\r
+ dateList_->SetThrowDrag(true);\r
+ dateList_->EnableAutoAlign(true);\r
+ dateList_->SetIntercept(true);\r
+ dateList_->ScrollTo(0);\r
+ dateList_->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);\r
+ dateList_->SetDirection(0);\r
+ InitListTopDate();\r
\r
- listAdapter = new DateAdapter();\r
- if (listAdapter == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::listAdapter is nullptr");\r
+ detailList_ = new UISimpleList();\r
+ if (detailList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "detailList_ is nullptr");\r
return;\r
}\r
- listAdapter->SetItemClickListener(this);\r
- SetDownListAdapter();\r
- downContentList->SetViewId("downList");\r
- downContentList->SetPosition(DOWNCONTENTLIST_POSITION_X, DOWNCONTENTLIST_POSITION_Y);\r
- downContentList->Resize(DOWNCONTENTLIST_WIDTH, DOWNCONTENTLIST_HEIGHT); // 364: height\r
- downContentList->SetSelectPosition(DOWNSELECTPOSITION);\r
- downContentList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- downContentList->SetDraggable(true);\r
- downContentList->SetThrowDrag(true);\r
- downContentList->EnableAutoAlign(true);\r
- downContentList->SetElastic(true);\r
- downContentList->ScrollTo(0);\r
- downContentList->SetAdapter(listAdapter);\r
- UpdateMsg(listTop.front().button_viewId);\r
- uiScrollView->Add(downContentList);\r
- uiScrollView->Add(buttonContentList);\r
+\r
+ detailList_->SetViewId(DETAIL_LIST);\r
+ detailList_->SetPosition(DOWNCONTENTLIST_POSITION_X, DOWNCONTENTLIST_POSITION_Y);\r
+ detailList_->Resize(DOWNCONTENTLIST_WIDTH, DOWNCONTENTLIST_HEIGHT);\r
+ detailList_->SetSelectPosition(DOWNSELECTPOSITION);\r
+ detailList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ detailList_->SetDraggable(true);\r
+ detailList_->SetThrowDrag(true);\r
+ detailList_->EnableAutoAlign(true);\r
+ detailList_->SetElastic(true);\r
+ detailList_->ScrollTo(0);\r
+ detailList_->SetScrollBlankSize(LIST_BLANK_SIZE);\r
+ SetContentListDate();\r
+ RefreshListData();\r
+ uiScrollView_->Add(detailList_);\r
+ uiScrollView_->Add(dateList_);\r
}\r
\r
-int calculateWeekday(int year, int month, int day)\r
+int CalculateWeekday(int year, int month, int day)\r
{\r
- if (month < SET_THREE) {\r
- month += SET_TWELVE;\r
+ if (month < MONTH_ADJUST_THRESHOLD) {\r
+ month += MONTHS_IN_YEAR;\r
year--;\r
}\r
- int K = year % SET_HUNDRED;\r
- int J = year / SET_HUNDRED;\r
- int h = (day + SET_THIRTEEN * (month + SET_ONE) / SET_FIVE + K + K / SET_FOUR + J / SET_FOUR + SET_FIVE * J) %\r
- SET_SEVEN;\r
- return h;\r
+ int lastTwoDigitsOfYear = year % CENTURY;\r
+ int century = year / CENTURY;\r
+ int dayOfWeek =\r
+ (day + ZELLER_MONTH_FACTOR * (month + 1) / ZELLER_DIVISOR + lastTwoDigitsOfYear +\r
+ lastTwoDigitsOfYear / LEAP_YEAR_INTERVAL + century / LEAP_YEAR_INTERVAL + CENTURY_OFFSET * century) %\r
+ DAYS_IN_WEEK;\r
+ return dayOfWeek;\r
}\r
\r
// 刷新List数据\r
-void DateMainPage::UpdateMsg(std::string dateMsg)\r
+void DateMainPage::RefreshDateMsg(std::string dateMsg)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateView::UpdateMsg:%s", dateMsg.c_str());\r
- listAdapter->ClearListItem(); // 清空list数据\r
DateModel::GetInstance().InitDateVec(dateMsg);\r
- SetDownListAdapter(); // 将设置的数据写入list\r
+ SetContentListDate(); // 将设置的数据写入list\r
int year;\r
int month;\r
int day;\r
int ret = sscanf_s(dateMsg.c_str(), "%d-%d-%d", &year, &month, &day);\r
- if (ret != SET_THREE) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateMainPage::OnStart strDate");\r
+ if (ret != DATE_UNIT_COUNT) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateMainPage strDate_ error");\r
return;\r
}\r
std::string weekDay[] = {"星期六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五"};\r
- int today = calculateWeekday(year, month, day);\r
+ int today = CalculateWeekday(year, month, day);\r
std::string titleDay;\r
- if (dateMsg == listTop.front().button_viewId) {\r
+ if (dateMsg == listTop_.Front().buttonViewId) {\r
titleDay = "今天 ";\r
} else {\r
titleDay = std::to_string(month) + "月 ";\r
}\r
titleDay += weekDay[today];\r
- DateModel::GetInstance().titleName = titleDay;\r
- title->SetText(titleDay.c_str());\r
- downContentList->ScrollTo(SET_ZERO);\r
- downContentList->RefreshList();\r
+ DateModel::GetInstance().titleName_ = titleDay;\r
+ titlLabel_->SetText(titleDay.c_str());\r
+ detailList_->ScrollTo(0);\r
+ detailList_->RefreshList();\r
+}\r
+\r
+static UIView* CreateContetListViewCb(uint8_t type)\r
+{\r
+ DateContentItemView* item = new DateContentItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, DATE_DOWN_LIST_ITEM_WIDTH, DATE_DOWN_LIST_ITEM_HEIGHT);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_pDateMainPage);\r
+ return item;\r
+}\r
+\r
+static void UpdateContentListViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ DateContentItemView* item = dynamic_cast<DateContentItemView*>(view);\r
+ if (view == nullptr || data == nullptr || item == nullptr) {\r
+ return;\r
+ }\r
+ DateItem* content = static_cast<DateItem *>(data);\r
+ item->SetItemInfo(*content);\r
}\r
\r
-void DateMainPage::SetDownListAdapter()\r
+void DateMainPage::SetContentListDate()\r
{\r
- for (const auto &item : DateModel::GetInstance().listDate) {\r
- listAdapter->AddListItem(item);\r
+ detailList_->ClearAll();\r
+ int count = DateModel::GetInstance().listDate_.size();\r
+ for (int i = 0; i < count; i++) {\r
+ Contents content;\r
+ content.createFunc = CreateContetListViewCb;\r
+ content.updateFunc = UpdateContentListViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&DateModel::GetInstance().listDate_[i]);\r
+ detailList_->AddContent(content);\r
}\r
+ detailList_->RefreshList();\r
}\r
\r
-void DateMainPage::RefreshButtonListDate(int value)\r
+static UIView* CreateViewCb(uint8_t type)\r
{\r
- buttonAdapter->ClearListItem();\r
- for (auto &item : listTop) {\r
- if (item.index == value) {\r
- item.isSelect = true;\r
+ DateButtonItemView* item = new DateButtonItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+\r
+ item->SetPosition(0, 0, DATE_ITEM_WIDTH, DATE_ITEM_HEIGHT);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_pDateMainPage);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ DateButtonItemView* item = dynamic_cast<DateButtonItemView*>(view);\r
+ if (view == nullptr || data == nullptr || item == nullptr) {\r
+ return;\r
+ }\r
+ DateButtonItem* content = static_cast<DateButtonItem *>(data);\r
+ item->SetItemInfo(*content);\r
+}\r
+\r
+void DateMainPage::SetDateButtonList(std::string viewId)\r
+{\r
+ dateList_->ClearAll();\r
+ int count = listTop_.Size();\r
+ for (int i = 0;i < count; i++) {\r
+ if (listTop_[i].buttonViewId == viewId) {\r
+ listTop_[i].isSelect = true;\r
} else {\r
- item.isSelect = false;\r
+ listTop_[i].isSelect = false;\r
}\r
- buttonAdapter->AddListItem(item);\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&listTop_[i]);\r
+ dateList_->AddContent(content);\r
}\r
- buttonContentList->RefreshList();\r
+ dateList_->RefreshList();\r
}\r
\r
-bool DateMainPage::InitDateTop()\r
+bool DateMainPage::InitListTopDate()\r
{\r
- listTop.clear();\r
- for (int i = 0; i < SET_SEVEN; ++i) {\r
- strDate[i] = GetFutureDate(i);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::OnStart strDate[%d]:%s", i, strDate[i].c_str());\r
- strDay[i] = strDate[i].substr(strDate[i].length() - SET_TWO);\r
+ listTop_.Clear();\r
+ for (int i = 0; i < WEEK_DYAS; ++i) {\r
+ strDate_[i] = GetFutureDate(i);\r
+ strDay_[i] = strDate_[i].substr(strDate_[i].length() - INDEX_2);\r
if (i == 0) {\r
- listTop.push_back({strDate[i].c_str(), strDay[i].c_str(), i, true, true});\r
+ listTop_.PushBack({strDate_[i].c_str(), strDay_[i].c_str(), true, true});\r
} else {\r
- listTop.push_back({strDate[i].c_str(), strDay[i].c_str(), i, false, false});\r
+ listTop_.PushBack({strDate_[i].c_str(), strDay_[i].c_str(), false, false});\r
}\r
}\r
return true;\r
{\r
time_t now = time(nullptr);\r
time_t future_time = now + (days_ahead * HOUR_COUNT * NUM_TIME_MIN * NUM_TIME_MIN);\r
- tm *tm = localtime(&future_time);\r
- char buffer[80]; // 存储格式化后的日期字符串\r
+ tm *tm = localtime(&future_time); // 检查返回值长度\r
+ char buffer[11]; // 11:2025-08-14字符串长度\r
strftime(buffer, sizeof(buffer), "%Y-%m-%d", tm);\r
return std::string(buffer);\r
}\r
UNUSED(view);\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ DateModel::GetInstance().resetPage_ = PAGE_STATUS_0;\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
}\r
return true;\r
}\r
\r
bool DateMainPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
- int posY = event.GetCurrentPos().y;\r
- if (posY > LIST_POSITION_Y) {\r
- DateItemView *dateItemView = static_cast<DateItemView *>(&view);\r
- std::string view_id = dateItemView->GetViewId();\r
+ if(strcmp(view.GetParent()->GetViewId(), DATE_LIST) == 0) {\r
+ DateButtonItemView *dateButtonItemView = dynamic_cast<DateButtonItemView *>(&view);\r
+ DateButtonItem item = dateButtonItemView->GetItem();\r
+ DateModel::GetInstance().selectButton_ = item.buttonViewId;\r
+ SetDateButtonList(item.buttonViewId);\r
+ RefreshDateMsg(item.buttonViewId);\r
+ } else if (strcmp(view.GetParent()->GetViewId(), DETAIL_LIST) == 0) {\r
+ DateContentItemView *dateItemView = dynamic_cast<DateContentItemView *>(&view);\r
bool visiable = dateItemView->GetVisiable();\r
if (visiable) {\r
return false;\r
}\r
- DateModel::GetInstance().messageIndex = view_id;\r
- NativeAbility::GetInstance().SwitchPageInSlice(DATE_PAGES::DATE_MESSAGE_PAGE, nullptr,\r
- TransitionType::TRANSITION_INVALID, true);\r
- } else {\r
- DateButtonItemView *dateButtonItemView = static_cast<DateButtonItemView *>(&view);\r
- DateButtonItem item = dateButtonItemView->GetItem();\r
- RefreshButtonListDate(item.index);\r
- UpdateMsg(item.button_viewId);\r
+ DateModel::GetInstance().messageIndex_ = dateItemView->GetViewId();\r
+ DateModel::GetInstance().resetPage_ = PAGE_STATUS_1;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(DATE_PAGES::DATE_MESSAGE_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
UNUSED(event);\r
return true;\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: DateMessagePage\r
* Create: 2025-03-15\r
*/\r
\r
-#include "date/DateMessagePage.h"\r
-#include "date/DateModel.h"\r
-#include "date/DatePresenter.h"\r
-#include "date/DateView.h"\r
#include "NativeAbility.h"\r
#include "SlicePageFactory.h"\r
#include "UiConfig.h"\r
#include "components/ui_list_nested.h"\r
#include "components/ui_scroll_view_nested.h"\r
#include "ui_resource_date.h"\r
+#include "date/DateModel.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateView.h"\r
+#include "date/DateMessagePage.h"\r
\r
namespace OHOS {\r
static constexpr uint16_t DATE_MONTH_WIDTH = 221;\r
static constexpr uint16_t DATE_MESSAGE_WIDTH = 180;\r
static constexpr uint16_t DATE_MESSAGE_HEIGHT = 50;\r
static constexpr uint16_t DATE_MESSAGE_POSITON_X = 117;\r
-static constexpr uint16_t DATE_MESSAGE_POSITON_Y = 20;\r
+static constexpr uint16_t DATE_MESSAGE_POSITON_Y = 30;\r
static constexpr uint16_t DATE_MESSAGE_POSITON_X1 = 137;\r
static constexpr uint16_t DATE_MESSAGE_FRONT_SIZE_ONE = 36;\r
static constexpr uint16_t DATE_MESSAGE_FRONT_SIZE_TWO = 32;\r
static constexpr uint16_t DATE_MESSAGE_TWO_POSITION_X = 31;\r
-static constexpr uint16_t DATE_MESSAGE_TWO_POSITION_Y = 100;\r
+static constexpr uint16_t DATE_MESSAGE_TWO_POSITION_Y = 120;\r
static constexpr uint16_t DATE_MESSAGE_TWO_WIDTH = 392;\r
static constexpr uint16_t DATE_MESSAGE_TWO_HEIGHT = 120;\r
static constexpr uint16_t DATE_MESSAGE_MAX_LINE_HEIGHT = 140;\r
+static constexpr uint16_t DATE_MESSAGE_ADDRESS_WIDTH = 392;\r
+static constexpr uint16_t DATE_MESSAGE_ADDRESS_HEIGHT = 120;\r
+static constexpr uint16_t DATE_MESSAGE_TIME_POS_Y = 400;\r
+static constexpr uint16_t DATE_MESSAGE_BLANK_SIZE = 30;\r
\r
REGIST_SLICE_PAGE(VIEW_DATE, DATE_PAGES::DATE_MESSAGE_PAGE, DateMessagePage, false);\r
\r
\r
DateMessagePage::~DateMessagePage()\r
{\r
- if (group != nullptr) {\r
- group->RemoveAll();\r
- delete group;\r
- group = nullptr;\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (bgImage_ != nullptr) {\r
+ delete bgImage_;\r
+ bgImage_ = nullptr;\r
}\r
\r
- if (image1 != nullptr) {\r
- delete image1;\r
- image1 = nullptr;\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
}\r
\r
- if (labelTitle != nullptr) {\r
- delete labelTitle;\r
- labelTitle = nullptr;\r
+ if (labelMessage_ != nullptr) {\r
+ delete labelMessage_;\r
+ labelMessage_ = nullptr;\r
}\r
\r
- if (labelMessage != nullptr) {\r
- delete labelMessage;\r
- labelMessage = nullptr;\r
+ if (labelTime_ != nullptr) {\r
+ delete labelTime_;\r
+ labelTime_ = nullptr;\r
}\r
\r
- if (labelTime != nullptr) {\r
- delete labelTime;\r
- labelTime = nullptr;\r
+ if (labelAddress_ != nullptr) {\r
+ delete labelAddress_;\r
+ labelAddress_ = nullptr;\r
}\r
+\r
+ if (DateModel::GetInstance().resetPage_ == PAGE_STATUS_0) {\r
+ DateModel::GetInstance().selectButton_ = "";\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(DATE_IMAGE);\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMessagePage::~DateMessagePage");\r
}\r
\r
void DateMessagePage::OnStart(void *data)\r
{\r
- group = new UIViewGroup();\r
- group->SetPosition(0, 0);\r
- group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
- image1 = new UIImageView;\r
- if (image1 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+ DateModel::GetInstance().resetPage_ = PAGE_STATUS_0;\r
+ group_ = new UIScrollView();\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetThrowDrag(true);\r
+ group_->SetScrollBlankSize(DATE_MESSAGE_BLANK_SIZE);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ bgImage_ = new UIImageView;\r
+ if (bgImage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImage_ is nullptr");\r
return;\r
}\r
- image1->SetPosition(0, 0);\r
- image1->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
- ImageInfo *imgSrc = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE8, DATE_IMAGE);\r
+ bgImage_->SetPosition(0, 0);\r
+ bgImage_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ ImageInfo *imgSrc = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DATE_BG2, DATE_IMAGE);\r
if (imgSrc == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "imgSrc fail");\r
+ return;\r
}\r
- image1->SetSrc(imgSrc);\r
- group->Add(image1);\r
+ bgImage_->SetSrc(imgSrc);\r
+ InitLabel();\r
+ AddViewToPageContainer(bgImage_);\r
+ AddViewToPageContainer(group_);\r
+}\r
\r
- labelTitle = new UILabel();\r
- if (labelTitle == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+void DateMessagePage::InitLabel()\r
+{\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "title is nullptr");\r
return;\r
}\r
- labelTitle->SetPosition(DATE_MESSAGE_POSITON_X, DATE_MESSAGE_POSITON_Y, DATE_MONTH_WIDTH, DATE_MESSAGE_HEIGHT);\r
- labelTitle->SetStyle(STYLE_TEXT_COLOR, Color::Purple().full);\r
- labelTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
- labelTitle->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- labelTitle->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- labelTitle->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- group->Add(labelTitle);\r
-\r
- labelMessage = new UILabel();\r
- if (labelMessage == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+ labelTitle_->SetPosition(DATE_MESSAGE_POSITON_X, DATE_MESSAGE_POSITON_Y, DATE_MONTH_WIDTH, DATE_MESSAGE_HEIGHT);\r
+ labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::Purple().full);\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ std::string strTitle = DateModel::GetInstance().titleName_;\r
+ labelTitle_->SetText(strTitle.c_str());\r
+ group_->Add(labelTitle_);\r
+\r
+ labelMessage_ = new UILabel();\r
+ if (labelMessage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelMessage_ is nullptr");\r
return;\r
}\r
- labelMessage->SetPosition(DATE_MESSAGE_TWO_POSITION_X, DATE_MESSAGE_TWO_POSITION_Y, DATE_MESSAGE_TWO_WIDTH,\r
+ labelMessage_->SetPosition(DATE_MESSAGE_TWO_POSITION_X, DATE_MESSAGE_TWO_POSITION_Y, DATE_MESSAGE_TWO_WIDTH,\r
DATE_MESSAGE_TWO_HEIGHT);\r
- labelMessage->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- labelMessage->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- labelMessage->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- labelMessage->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- labelMessage->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
- labelMessage->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
- labelMessage->SetRollSpeed(0);\r
- group->Add(labelMessage);\r
-\r
- labelTime = new UILabel();\r
- if (labelTime == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+ labelMessage_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelMessage_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelMessage_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelMessage_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelMessage_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
+ labelMessage_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ labelMessage_->SetRollSpeed(0);\r
+ group_->Add(labelMessage_);\r
+\r
+ labelTime_ = new UILabel();\r
+ if (labelTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTime_ is nullptr");\r
return;\r
}\r
- labelTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- labelTime->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- labelTime->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- labelTime->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
- labelTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_TWO);\r
- group->Add(labelTime);\r
-\r
- std::string strTitle = DateModel::GetInstance().titleName;\r
- labelTitle->SetText(strTitle.c_str());\r
- for (const auto &item : DateModel::GetInstance().listDate) {\r
- std::string strIndex = DateModel::GetInstance().messageIndex;\r
- if (strIndex == item.index) {\r
- labelTime->SetText(item.label_1);\r
- labelMessage->SetText(item.label_2);\r
+ labelTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTime_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelTime_->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ labelTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_TWO);\r
+ group_->Add(labelTime_);\r
+\r
+ labelAddress_ = new UILabel();\r
+ if (labelAddress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTime_ is nullptr");\r
+ return;\r
+ }\r
+ labelAddress_->SetPosition(DATE_MESSAGE_TWO_POSITION_X, DATE_MESSAGE_TWO_POSITION_Y, DATE_MESSAGE_ADDRESS_WIDTH,\r
+ DATE_MESSAGE_ADDRESS_HEIGHT);\r
+ labelAddress_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelAddress_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelAddress_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelAddress_->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ labelAddress_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_TWO);\r
+ group_->Add(labelAddress_);\r
+\r
+ for (const auto &item : DateModel::GetInstance().listDate_) {\r
+ std::string index = DateModel::GetInstance().messageIndex_;\r
+ if (!strcmp(index.c_str(), item.index)) {\r
+ labelTime_->SetText(item.title);\r
+ labelMessage_->SetText(item.describetion);\r
+ labelAddress_->SetText(item.address);\r
+ break;\r
}\r
}\r
- int posTextHeight = labelMessage->GetTextHeight();\r
+ int posTextHeight = labelMessage_->GetTextHeight();\r
int posHeight = DATE_MESSAGE_TWO_POSITION_Y;\r
+ labelMessage_->SetY(DATE_MESSAGE_TWO_POSITION_Y);\r
+ labelMessage_->SetHeight(posTextHeight);\r
int pos = 0;\r
- if (posTextHeight < DATE_MESSAGE_MAX_LINE_HEIGHT) {\r
- int offsetY = 50;\r
- pos = DATE_MESSAGE_TWO_POSITION_Y + posTextHeight + offsetY;\r
- labelMessage->SetY(DATE_MESSAGE_TWO_POSITION_Y + offsetY);\r
+ int offset = 10;\r
+ int pageHeight;\r
+ pos = DATE_MESSAGE_TWO_POSITION_Y + posTextHeight + offset;\r
+ if (labelAddress_->GetText() != nullptr && (!strcmp(labelAddress_->GetText(), "no location"))) {\r
+ labelAddress_->SetVisible(false);\r
+ int pageH = 454;\r
+ int half = 2;\r
+ int posY = (pageH - posTextHeight) / half;\r
+ labelMessage_->SetY(posY);\r
+ labelTime_->SetPosition(DATE_MESSAGE_POSITON_X1, pos, DATE_MESSAGE_WIDTH, DATE_MESSAGE_HEIGHT);\r
+ pageHeight = labelMessage_->GetY() + labelMessage_->GetHeight();\r
} else {\r
- pos = DATE_MESSAGE_TWO_POSITION_Y + posTextHeight;\r
- labelMessage->SetY(DATE_MESSAGE_TWO_POSITION_Y);\r
- }\r
- labelMessage->SetHeight(posTextHeight);\r
- labelTime->SetPosition(DATE_MESSAGE_POSITON_X1, pos, DATE_MESSAGE_WIDTH, DATE_MESSAGE_HEIGHT);\r
- group->SetOnDragListener(this);\r
- group->SetDraggable(true);\r
- AddViewToPageContainer(group);\r
+ int addressHeight = labelAddress_->GetTextHeight();\r
+ labelAddress_->SetY(pos);\r
+ labelAddress_->SetHeight(labelAddress_->GetTextHeight());\r
+ pos = labelAddress_->GetY() + labelAddress_->GetHeight() + offset;\r
+ labelTime_->SetPosition(DATE_MESSAGE_POSITON_X1, pos, DATE_MESSAGE_WIDTH, DATE_MESSAGE_HEIGHT);\r
+ pageHeight = labelAddress_->GetY() + labelAddress_->GetHeight();\r
+ }\r
+ if (pageHeight <= DATE_MESSAGE_TIME_POS_Y) {\r
+ int timeOffsetY = 364;\r
+ labelTime_->SetY(timeOffsetY);\r
+ }\r
}\r
\r
bool DateMessagePage::OnDrag(UIView &view, const DragEvent &event)\r
UNUSED(view);\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DatePresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ DateModel::GetInstance().resetPage_ = PAGE_STATUS_2;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(DATE_PAGES::DATE_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
return true;\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: DateModel\r
* Create: 2025-03-23\r
*/\r
\r
-#include "date/DateModel.h"\r
-#include "date/DatePresenter.h"\r
-#include "phoneservice/PhoneService.h"\r
+#include "bts_br_gap.h"\r
+#include "bts_spp.h"\r
+#include "msg_center_customer.h"\r
+#include "msg_center_device.h"\r
#include "ohos_timer.h"\r
-#include "wearable_log.h"\r
+#include "phone_msg_notification.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateModel.h"\r
\r
namespace OHOS {\r
-static constexpr int16 DATE_COUNT = 24;\r
-static constexpr int16 DATE_HOUR = 12;\r
+static constexpr int16 INDEX_0 = 0;\r
+static constexpr int16 INDEX_1 = 1;\r
+static constexpr int16 INDEX_2 = 2;\r
+static constexpr int16 INDEX_3 = 3;\r
+static constexpr int16 INDEX_4 = 4;\r
+static constexpr int16 INDEX_5 = 5;\r
+static const char *DATE_FILE = DATE_PATH "/calendar.json";\r
\r
DateModel::DateModel() {}\r
\r
bool DateModel::InitDateVec(std::string dateStr)\r
{\r
int index = 0;\r
- listDate.clear();\r
- if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
- listDate.push_back({"无日程", "请连接手机,同步日程信息", "0", true});\r
+ listDate_.clear();\r
+ if (GetConnectStatus() == 0) {\r
+ listDate_.push_back({"无日程", "请连接手机,同步日程信息", "0", "0", true});\r
} else {\r
- for (const auto &msg : keyValues) {\r
+ for (const auto &msg : keyValues_) {\r
+ if (msg.first != dateStr) {\r
+ continue;\r
+ }\r
for (const auto &item : msg.second) {\r
- if (msg.first == dateStr) {\r
- index++;\r
- strIndex = std::to_string(index);\r
- listDate.push_back({item.hour.c_str(), item.eventTitle.c_str(), strIndex.c_str(), false});\r
- }\r
+ listDate_.push_back(\r
+ {item.hour.c_str(), item.eventTitle.c_str(), item.address.c_str(), item.index.c_str(), false});\r
}\r
}\r
- if (listDate.size() == 0) {\r
- listDate.push_back({"无日程", "请前往手机日历创建日程", "0", true});\r
+ \r
+ if (listDate_.size() == 0) {\r
+ listDate_.push_back({"无日程", "请前往手机日历创建日程", "0", "0", true});\r
}\r
}\r
return true;\r
}\r
\r
+uint8_t DateModel::GetConnectStatus()\r
+{\r
+ uint8_t conn_status = 0;\r
+#ifdef _WIN32\r
+ conn_status = 1;\r
+#else\r
+ if (msg_center_get_trans_channel() == DIAG_FRAME_FID_PHONE) {\r
+ conn_status = is_spp_connected(0) == true ? 1 : 0;\r
+ } else if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+ conn_status = msg_center_get_ble_conn_state();\r
+ }\r
+#endif\r
+ return conn_status;\r
+}\r
+\r
bool DateModel::InitDate()\r
{\r
- keyValues.clear();\r
- std::ifstream file("/user/app/user/ace/data/com.vendor.Weather/calendar.json");\r
+ keyValues_.clear();\r
+ dateClockVec_.clear();\r
+ std::ifstream file(DATE_FILE);\r
if (!file.is_open()) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cannot open file");\r
return false;\r
cJSON *date = cJSON_GetObjectItemCaseSensitive(dateSum, std::to_string(i).c_str());\r
if (!cJSON_IsObject(date)) {\r
cJSON_Delete(root);\r
- continue;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error date");\r
+ return false;\r
}\r
- std::string hour = cJSON_GetObjectItemCaseSensitive(date, "hour")->valuestring;\r
- std::string eventTitle = cJSON_GetObjectItemCaseSensitive(date, "eventTitle")->valuestring;\r
- std::string startTime = cJSON_GetObjectItemCaseSensitive(date, "startTime")->valuestring;\r
- std::string time = cJSON_GetObjectItemCaseSensitive(date, "time")->valuestring;\r
- std::string week = cJSON_GetObjectItemCaseSensitive(date, "week")->valuestring;\r
- DateMsg item = {hour, eventTitle, startTime, week};\r
- keyValues[time].push_back(item);\r
+\r
+ std::string time = "测试time";\r
+ if (!cJSON_GetObjectItemCaseSensitive(date, "time")) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error time:");\r
+ } else {\r
+ time = cJSON_GetObjectItemCaseSensitive(date, "time")->valuestring;\r
+ }\r
+\r
+ std::string hour = "测试hour";\r
+ if (!cJSON_GetObjectItemCaseSensitive(date, "hour")) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error hour:");\r
+ } else {\r
+ hour = cJSON_GetObjectItemCaseSensitive(date, "hour")->valuestring;\r
+ }\r
+\r
+ std::string eventTitle = "测试eventTitle";\r
+ if (!cJSON_GetObjectItemCaseSensitive(date, "eventTitle")) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error eventTitle:");\r
+ } else {\r
+ eventTitle = cJSON_GetObjectItemCaseSensitive(date, "eventTitle")->valuestring;\r
+ }\r
+\r
+ std::string address = "no location";\r
+ if (!cJSON_GetObjectItemCaseSensitive(date, "location")) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error location:");\r
+ } else {\r
+ address = cJSON_GetObjectItemCaseSensitive(date, "location")->valuestring;\r
+ }\r
+ std::string index = std::to_string(i);\r
+ DateMsg item = {hour, eventTitle, address, index};\r
+ keyValues_[time].push_back(item);\r
+ std::string start_time = hour.substr(0, INDEX_5);\r
+ std::string result_time = time + " " + start_time;\r
+ eventTitle = hour + "\r\n" + eventTitle;\r
+ CalcClockTime(result_time, eventTitle);\r
+ }\r
+ cJSON_Delete(root);\r
+ return true;\r
+}\r
+\r
+void DateModel::CalcClockTime(std::string result_time, std::string eventTitle)\r
+{\r
+ std::tm tm = {};\r
+ std::istringstream ss("2025-06-18 15:20");\r
+ ss >> std::get_time(&tm, "%Y-%m-%d %H:%M");\r
+ if (ss.fail()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CalcClockTime cannot open file");\r
+ return;\r
+ }\r
+ DateToMessage item;\r
+ item.time = result_time;\r
+ item.eventTitle = eventTitle;\r
+ dateClockVec_.push_back(item);\r
+}\r
+\r
+void DateModel::Init()\r
+{\r
+ InitDateTimer();\r
+}\r
+\r
+bool HasFileChanged(const std::string &filePath, time_t &lastModTime, std::string &lastContent)\r
+{\r
+ struct stat fileStat;\r
+ if (stat(filePath.c_str(), &fileStat) != 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cat file fail");\r
+ return false;\r
+ }\r
+\r
+ if (fileStat.st_mtime == lastModTime) {\r
+ return false;\r
+ }\r
+\r
+ std::ifstream file(filePath);\r
+ if (!file.is_open()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cannot open file");\r
+ return false;\r
+ }\r
+\r
+ std::string currentContent((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());\r
+ if (currentContent == lastContent) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "updateLastModTime");\r
+ lastModTime = fileStat.st_mtime;\r
+ return false;\r
}\r
+\r
+ lastModTime = fileStat.st_mtime;\r
+ lastContent = currentContent;\r
return true;\r
}\r
+\r
+std::vector<int> parseTime(const std::string &s)\r
+{\r
+ int year = 0;\r
+ int month = 0;\r
+ int day = 0;\r
+ int hour = 0;\r
+ int minute = 0;\r
+ int second = 0;\r
+ char sep;\r
+ std::istringstream ss(s);\r
+ ss >> year >> sep >> month >> sep >> day >> hour >> sep >> minute;\r
+ if (s.size() > TIME_END) {\r
+ ss >> sep >> second;\r
+ }\r
+ return {year, month, day, hour, minute, second};\r
+}\r
+\r
+void CmpClock()\r
+{\r
+ std::time_t now = std::time(nullptr);\r
+ std::tm *local = std::localtime(&now);\r
+ char buffer[20];\r
+ std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);\r
+ std::string time_str(buffer);\r
+ for (auto item = DateModel::GetInstance().dateClockVec_.begin();\r
+ item != DateModel::GetInstance().dateClockVec_.end();) {\r
+ auto vsec = parseTime(item->time);\r
+ auto localtime = parseTime(time_str);\r
+ if (vsec[INDEX_0] < localtime[INDEX_0]) {\r
+ item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+ continue;\r
+ } else if (vsec[INDEX_0] > localtime[INDEX_0]) {\r
+ ++item;\r
+ continue;\r
+ }\r
+\r
+ if (vsec[INDEX_1] < localtime[INDEX_1]) {\r
+ item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+ continue;\r
+ } else if (vsec[INDEX_1] > localtime[INDEX_1]) {\r
+ ++item;\r
+ continue;\r
+ }\r
+\r
+ if (vsec[INDEX_2] < localtime[INDEX_2]) {\r
+ item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+ continue;\r
+ } else if (vsec[INDEX_2] > localtime[INDEX_2]) {\r
+ ++item;\r
+ continue;\r
+ }\r
+ auto diff = (vsec[INDEX_3] - localtime[INDEX_3]) * NUM_TIME_HOUR +\r
+ (vsec[INDEX_4] - localtime[INDEX_4]) * NUM_TIME_MIN + (vsec[INDEX_5] - localtime[INDEX_5]);\r
+ if (diff <= NUM_TIME_MIN && diff > 0) {\r
+#ifdef _WIN32\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PostGraphicEvent date msg");\r
+#else\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&PhoneMsgView::ShowDateMsg, "日历", "日历通知", item->eventTitle));\r
+ item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+#endif\r
+ } else if (diff < 0) {\r
+ item = DateModel::GetInstance().dateClockVec_.erase(item);\r
+ } else {\r
+ ++item;\r
+ }\r
+ }\r
+}\r
+\r
+void DateModel::ClearData()\r
+{\r
+ std::remove(DATE_FILE);\r
+}\r
+\r
+/* 定时器回调函数 */\r
+void DateTimerCallback(void *data)\r
+{\r
+ (void)data;\r
+ static time_t lastModTime = 0;\r
+ static std::string lastContent;\r
+ bool change = HasFileChanged(DATE_FILE, lastModTime, lastContent);\r
+ if (change) {\r
+ DateModel::GetInstance().InitDate();\r
+ }\r
+ if (DateModel::GetInstance().dateClockVec_.size() > 0) {\r
+ CmpClock();\r
+ }\r
+}\r
+\r
+/* 开启定时器 */\r
+void DateModel::InitDateTimer()\r
+{\r
+ if (startCount_ != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DatePhoneMenuPhoneMainPage already exists!!");\r
+ return;\r
+ }\r
+ uint32 tick = GetOSTick(NUM_THIRTY * MS_ONE_SECONDS);\r
+ startCount_ = new GraphicTimer(tick, DateTimerCallback, nullptr, true);\r
+ if (startCount_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DatePhoneMenuPhoneMainPage new GraphicTimer failed!!");\r
+ return;\r
+ }\r
+ bool retTimer = startCount_->Start();\r
+ if (!retTimer) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DatePhoneMenuPhoneMainPage osTimerStart failed!!");\r
+ if (startCount_ != nullptr) {\r
+ delete startCount_;\r
+ startCount_ = nullptr;\r
+ }\r
+ return;\r
+ }\r
+}\r
+\r
+/* 关闭定时器 */\r
+void DateModel::DisableDatePhoneTimer()\r
+{\r
+ if (startCount_ != nullptr) {\r
+ startCount_->Stop();\r
+ delete startCount_;\r
+ startCount_ = nullptr;\r
+ }\r
+}\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: DatePresenter\r
* Create: 2025-03-23\r
*/\r
\r
-#include "date/DatePresenter.h"\r
-#include "date/DateModel.h"\r
-#include "date/DateView.h"\r
#include "NativeRegisterManager.h"\r
#include "uiservice/ui_service.h"\r
#include "wearable_log.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateModel.h"\r
+#include "date/DateView.h"\r
\r
namespace OHOS {\r
-REGIST_MENU(VIEW_DATE, DateView, DatePresenter, DATE_MAIN_ICON, DATE_MAIN_ICON, "日程");\r
+REGIST_MENU(VIEW_DATE, DateView, DatePresenter, DATE_ICON, DATE_ICON, "日历");\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: EmptyPage\r
- * Create: 2025-04-24\r
+ * Create: 2025-06-06\r
*/\r
\r
-#include "emptypage/EmptyPage.h"\r
-#include "emptypage/EmptyPresenter.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_empty.h"\r
#include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
#include "wearable_log.h"\r
#include "AppViewIDs.h"\r
#include "NativeAbility.h"\r
+#include "emptypage/EmptyPresenter.h"\r
+#include "emptypage/EmptyPage.h"\r
\r
namespace OHOS {\r
-static const uint16_t MEM_LABEL_FONT_SIZE = 40;\r
-static uint32_t EMPTY_PAGE = 1;\r
+static constexpr uint16_t EMPTY_PAGE = 1;\r
+static constexpr uint16_t MEM_LABEL_X = 121;\r
+static constexpr uint16_t MEM_LABEL_W = 193;\r
+static constexpr uint16_t MEM_LABEL_H = 40;\r
+static constexpr uint16_t MEM_LABEL_FONT = 32;\r
+static constexpr uint16_t MEM_USED_LABEL_Y = 161;\r
+static constexpr uint16_t MEM_FREE_LABEL_Y = 272;\r
+\r
REGIST_SLICE_PAGE(VIEW_EMPTY, EMPTY_PAGE, EmptyPage, true);\r
+\r
void EmptyPage::OnStart(void *data)\r
{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage OnStart");\r
+ bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(EMPTY_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadEmptyImage fail");\r
+ return;\r
+ }\r
+ container_ = new UIViewGroup();\r
if (container_ == nullptr) {\r
- container_ = new UIScrollView();\r
- container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
- // 设置界面组件回调函数\r
- container_->SetOnDragListener(this);\r
- container_->SetOnClickListener(this);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EmptyPage container_ new fail");\r
+ return;\r
+ }\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetOnDragListener(this);\r
+ container_->SetDraggable(true);\r
+ container_->SetTouchable(true);\r
+\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EmptyPage bgImg_ new fail");\r
+ return;\r
}\r
+ bgImg_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(bgImg_, EMPTY_IMAGE, IMAGE_EMPTY_BG);\r
+ container_->Add(bgImg_);\r
+\r
+ uint32_t memUsed = 0;\r
+ uint32_t memFree = 0;\r
#if !defined(_WIN32)\r
- test_get_mem_info(1, &used_, &free_);\r
+ test_get_mem_info(&memUsed, &memFree);\r
#endif\r
- // Add Label to App\r
- if (memLabel_ == nullptr) {\r
- memLabel_ = new UILabel();\r
+ memUsedLabel_ = new UILabel();\r
+ if (memUsedLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EmptyPage memUsedLabel_ new fail");\r
+ return;\r
+ }\r
+ memUsedLabel_->SetPosition(MEM_LABEL_X, MEM_USED_LABEL_Y, MEM_LABEL_W, MEM_LABEL_H);\r
+ memUsedLabel_->SetText(std::to_string(memUsed).c_str());\r
+ memUsedLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ memUsedLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MEM_LABEL_FONT);\r
+ container_->Add(memUsedLabel_);\r
+\r
+ memFreeLabel_ = new UILabel();\r
+ if (memFreeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EmptyPage memFreeLabel_ new fail");\r
+ return;\r
}\r
- memLabel_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
- std::string memInfo = "Used : " + std::to_string(used_) + "\n" + "Free : " + std::to_string(free_);\r
- memLabel_->SetText(memInfo.c_str());\r
- memLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- memLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MEM_LABEL_FONT_SIZE);\r
- container_->Add(memLabel_);\r
+ memFreeLabel_->SetPosition(MEM_LABEL_X, MEM_FREE_LABEL_Y, MEM_LABEL_W, MEM_LABEL_H);\r
+ memFreeLabel_->SetText(std::to_string(memFree).c_str());\r
+ memFreeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ memFreeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MEM_LABEL_FONT);\r
+ container_->Add(memFreeLabel_);\r
AddViewToPageContainer(container_);\r
}\r
\r
+EmptyPage::EmptyPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage::EmptyPage");\r
+}\r
+\r
EmptyPage::~EmptyPage()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage::~EmptyPage");\r
if (container_ != nullptr) {\r
container_->RemoveAll();\r
delete container_;\r
container_ = nullptr;\r
}\r
- if (memLabel_ != nullptr) {\r
- delete memLabel_;\r
- memLabel_ = nullptr;\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+ if (memUsedLabel_ != nullptr) {\r
+ delete memUsedLabel_;\r
+ memUsedLabel_ = nullptr;\r
+ }\r
+ if (memFreeLabel_ != nullptr) {\r
+ delete memFreeLabel_;\r
+ memFreeLabel_ = nullptr;\r
}\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(EMPTY_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage::~EmptyPage");\r
}\r
\r
bool EmptyPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
return false;\r
}\r
-\r
-bool EmptyPage::OnClick(UIView &view, const ClickEvent &event)\r
-{\r
- return false;\r
}\r
-}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: EmptyPresenter\r
- * Create: 2025-04-24\r
+ * Create: 2025-06-06\r
*/\r
\r
+#include "NativeRegisterManager.h"\r
#include "emptypage/EmptyView.h"\r
#include "emptypage/EmptyPresenter.h"\r
-#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
-REGIST_MENU(VIEW_EMPTY, EmptyView, EmptyPresenter, FLASHLIGHT_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG, "空页面");\r
+REGIST_MENU(VIEW_EMPTY, EmptyView, EmptyPresenter, EMPTY_ICON, EMPTY_ICON, "空页面");\r
}\r
* Create: 2025-03-23\r
*/\r
\r
-#include "phoneservice/PhoneService.h"\r
#include "UiConfig.h"\r
+#include "bts_br_gap.h"\r
#include "bts_spp.h"\r
#include "common/image_cache_manager.h"\r
#include "main/LoadImg.h"\r
+#include "msg_center_device.h"\r
#include "ui_resource_findPhone.h"\r
#include "uiservice/ui_service.h"\r
#include "ui_test_group.h"\r
-#include "wearable_onlinelog.h"\r
-#include "msg_center_protocol.h"\r
-#include "msg_center_device.h"\r
-#include "findphone/FindPhoneMainPage.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
#include "findphone/FindPhonePresenter.h"\r
#include "findphone/FindPhoneView.h"\r
+#include "findphone/FindPhoneMainPage.h"\r
\r
-static uint8_t data = 0;\r
namespace OHOS {\r
-\r
static FindPhoneMainPage *g_pFindPhoneMainPage = nullptr;\r
static constexpr uint16_t FIND_PHONE_IMAGE_WIDTH = 500;\r
static constexpr uint16_t FIND_PHONE_IMAGE_HEIGHT = 500;\r
static constexpr uint16_t FIND_PHONE_RTYBUTTON_POSITION_Y = 289;\r
static constexpr uint16_t FIND_PHONE_RTYBUTTON = 96;\r
static constexpr uint16_t FIND_PHONE_SIZE = 466;\r
-static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_POSITION_X = 170;\r
-static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_POSITION_Y = 170;\r
-static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_WIDTH = 100;\r
-static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_HEIGHT = 100;\r
static constexpr uint16_t FONT_DEFAULT_SIZE_1 = 36;\r
static constexpr uint16_t FONT_DEFAULT_SIZE_2 = 38;\r
static constexpr uint16_t FIND_PHONE_INITIAL = 0;\r
-static constexpr uint16_t FIND_PHONE_TITLDE_X = 140;\r
-static constexpr uint16_t FIND_PHONE_TITLDE_Y = 345;\r
-static constexpr uint16_t FIND_PHONE_TITLDE_WIDTH = 314;\r
+static constexpr uint16_t FIND_PHONE_TITLE_X = 140;\r
+static constexpr uint16_t FIND_PHONE_TITLE_Y = 345;\r
+static constexpr uint16_t FIND_PHONE_TITLE_WIDTH = 314;\r
+static constexpr uint16_t FIND_PHONE_TITLE_HEIGHT = 100;\r
static constexpr uint16_t FIND_PHONE_FINDTITLE_X = 150;\r
static constexpr uint16_t FIND_PHONE_FINDTITLE_Y = 31;\r
static constexpr uint16_t FIND_PHONE_FINDTITLE_WIDTH = 253;\r
static constexpr uint16_t FIND_PHONE_FINDTITLE_HEIGHT = 53;\r
-static constexpr uint16_t FIND_PHONE_RINGING_X = 200;\r
-static constexpr uint16_t FIND_PHONE_RINGING2_X = 156;\r
static constexpr uint16_t FIND_PHONE_RINGING_Y = 353;\r
-static constexpr uint16_t FIND_PHONE_RINGING_WIDTH = 93;\r
-static constexpr uint16_t FIND_PHONE_RINGING2_WIDTH = 144;\r
+static constexpr uint16_t FIND_PHONE_RINGING_WIDTH = 454;\r
static constexpr uint16_t FIND_PHONE_RINGING_HEIGHT = 42;\r
static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_X = 50;\r
static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_Y = 185;\r
static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_WIDTH = 424;\r
static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_HEIGHT = 50;\r
-static constexpr uint16_t FIND_PHONE_DURATION_TIME = 60;\r
static constexpr uint16_t IMAGE_SIZE = 500;\r
-static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 28;\r
+static constexpr uint16_t IMAGE_OPA = 100;\r
static constexpr uint16_t IMAGEANIMATOERVIEW_TIME = 60;\r
static constexpr uint16_t FIND_PHONE_IMAGE_X = 5;\r
-static constexpr uint16_t FIND_PHONE_IMAGE_y = 1;\r
-static constexpr uint16_t FIND_PHONE_PIXELBYTE_SIZE = 4;\r
-static constexpr uint16_t FIND_PHONE_PIXELBYTEH = 100;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_Y = 1;\r
+static constexpr uint16_t FINDPHONE_TIMEOUT = 60;\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
+static constexpr char *FIND_BUTTON = "findButton";\r
+static constexpr char *RETRY_BUTTON = "retryButton";\r
+static constexpr uint32_t g_imageAnimatorInfo[FINDPHONE_IMAGE_COUNT] = {\r
+ IMAGE_FINDPHONE_FRAME01, IMAGE_FINDPHONE_FRAME02, IMAGE_FINDPHONE_FRAME03, IMAGE_FINDPHONE_FRAME04,\r
+ IMAGE_FINDPHONE_FRAME05, IMAGE_FINDPHONE_FRAME06, IMAGE_FINDPHONE_FRAME07, IMAGE_FINDPHONE_FRAME08,\r
+ IMAGE_FINDPHONE_FRAME09, IMAGE_FINDPHONE_FRAME10, IMAGE_FINDPHONE_FRAME11, IMAGE_FINDPHONE_FRAME12,\r
+ IMAGE_FINDPHONE_FRAME13, IMAGE_FINDPHONE_FRAME14, IMAGE_FINDPHONE_FRAME15, IMAGE_FINDPHONE_FRAME16,\r
+ IMAGE_FINDPHONE_FRAME17, IMAGE_FINDPHONE_FRAME18, IMAGE_FINDPHONE_FRAME19, IMAGE_FINDPHONE_FRAME20,\r
+ IMAGE_FINDPHONE_FRAME21, IMAGE_FINDPHONE_FRAME22, IMAGE_FINDPHONE_FRAME23, IMAGE_FINDPHONE_FRAME24,\r
+ IMAGE_FINDPHONE_FRAME25, IMAGE_FINDPHONE_FRAME26, IMAGE_FINDPHONE_FRAME27, IMAGE_FINDPHONE_FRAME28,\r
+};\r
\r
REGIST_SLICE_PAGE(VIEW_FIND_PHONE, FIND_PHONE_PAGES::FIND_PHONE_MAIN_PAGE, FindPhoneMainPage, true);\r
\r
-const int g_imageAnimatorInfo[IMAGEANIMATOERVIEW_SIZE] = {\r
- IMAGE_CONVERTER_TOOL_FINDPHONE001, IMAGE_CONVERTER_TOOL_FINDPHONE002, IMAGE_CONVERTER_TOOL_FINDPHONE003,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE004, IMAGE_CONVERTER_TOOL_FINDPHONE005, IMAGE_CONVERTER_TOOL_FINDPHONE006,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE007, IMAGE_CONVERTER_TOOL_FINDPHONE008, IMAGE_CONVERTER_TOOL_FINDPHONE009,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE010, IMAGE_CONVERTER_TOOL_FINDPHONE011, IMAGE_CONVERTER_TOOL_FINDPHONE012,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE013, IMAGE_CONVERTER_TOOL_FINDPHONE014, IMAGE_CONVERTER_TOOL_FINDPHONE015,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE016, IMAGE_CONVERTER_TOOL_FINDPHONE017, IMAGE_CONVERTER_TOOL_FINDPHONE018,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE019, IMAGE_CONVERTER_TOOL_FINDPHONE020, IMAGE_CONVERTER_TOOL_FINDPHONE021,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE022, IMAGE_CONVERTER_TOOL_FINDPHONE023, IMAGE_CONVERTER_TOOL_FINDPHONE024,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE025, IMAGE_CONVERTER_TOOL_FINDPHONE026, IMAGE_CONVERTER_TOOL_FINDPHONE027,\r
- IMAGE_CONVERTER_TOOL_FINDPHONE028,\r
-};\r
-\r
FindPhoneMainPage::FindPhoneMainPage()\r
{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::FindPhoneMainPage");\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::FindPhoneMainPage");\r
g_pFindPhoneMainPage = this;\r
}\r
\r
container_ = nullptr;\r
}\r
\r
- if (buttonFind != nullptr) {\r
- delete buttonFind;\r
- buttonFind = nullptr;\r
+ if (buttonFind_ != nullptr) {\r
+ delete buttonFind_;\r
+ buttonFind_ = nullptr;\r
}\r
\r
- if (mainImage != nullptr) {\r
- delete mainImage;\r
- mainImage = nullptr;\r
+ if (labelDisconnect_ != nullptr) {\r
+ delete labelDisconnect_;\r
+ labelDisconnect_ = nullptr;\r
}\r
\r
- if (labelUnder != nullptr) {\r
- delete labelUnder;\r
- labelUnder = nullptr;\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
}\r
\r
- if (labelFindTitle != nullptr) {\r
- delete labelFindTitle;\r
- labelFindTitle = nullptr;\r
+ if (labelRing_ != nullptr) {\r
+ delete labelRing_;\r
+ labelRing_ = nullptr;\r
}\r
\r
- if (labelRing != nullptr) {\r
- delete labelRing;\r
- labelRing = nullptr;\r
+ if (buttonRetry_ != nullptr) {\r
+ delete buttonRetry_;\r
+ buttonRetry_ = nullptr;\r
}\r
\r
- if (buttonRty != nullptr) {\r
- delete buttonRty;\r
- buttonRty = nullptr;\r
+ if (startCount_ != nullptr) {\r
+ delete startCount_;\r
+ startCount_ = nullptr;\r
}\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::~FindPhoneMainPage");\r
+\r
+ if (imageAnimator_ != nullptr) {\r
+ delete imageAnimator_;\r
+ imageAnimator_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(FINDPHONE_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::~FindPhoneMainPage");\r
}\r
\r
FindPhoneMainPage *FindPhoneMainPage::GetInstance()\r
{\r
if (imageAnimator_->GetState() == true) {\r
DisableFindPhoneTimer();\r
-#ifndef _WIN32\r
- errcode_t result =\r
- uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnStop::uapi_diag_service_send_log OFF result:%d ", result);\r
+ uint8_t value = 1;\r
+ errcode_t result;\r
+#ifdef _WIN32\r
+ result = 0;\r
+#else\r
+ result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_STOP_FIND_PHONE, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnStop stop find phone result:%d ", result);\r
#endif\r
- ImageCacheManager::GetInstance().UnloadAllInMultiRes(FINDPHONE_IMAGE);\r
}\r
- data = 0;\r
}\r
\r
void FindPhoneMainPage::OnStart(void *data)\r
{\r
+ container_ = new UIViewGroup();\r
if (container_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new container_ fail");\r
- container_ = new UIViewGroup();\r
- container_->SetPosition(FIND_PHONE_INITIAL, FIND_PHONE_INITIAL, FIND_PHONE_SIZE, FIND_PHONE_SIZE);\r
- container_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new container_ fail");\r
+ return;\r
}\r
+ container_->SetPosition(FIND_PHONE_INITIAL, FIND_PHONE_INITIAL, FIND_PHONE_SIZE, FIND_PHONE_SIZE);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
container_->SetTouchable(true);\r
container_->SetDraggable(true);\r
container_->SetOnDragListener(this);\r
\r
- if (mainImage == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new mainImage fail");\r
- mainImage = new UIImageView();\r
- }\r
- mainImage->SetPosition(FIND_PHONE_INITIAL, FIND_PHONE_INITIAL);\r
- LOADIMG::LoadImageViewImg(mainImage, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_2);\r
- container_->Add(mainImage);\r
-\r
- SetUpImageAnimator();\r
- SetupButton();\r
+ InitImageAnimator();\r
+ InitButton();\r
\r
- labelUnder = new UILabel();\r
- if (labelUnder == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelUnder fail");\r
+ labelDisconnect_ = new UILabel();\r
+ if (labelDisconnect_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelDisconnect_ fail");\r
return;\r
}\r
- labelUnder->SetText("蓝牙已断开");\r
- labelUnder->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
- labelUnder->SetPosition(FIND_PHONE_TITLDE_X, FIND_PHONE_TITLDE_Y, FIND_PHONE_TITLDE_WIDTH,\r
- FIND_PHONE_IMAGEANIMATOR_HEIGHT);\r
- container_->Add(labelUnder);\r
- labelFindTitle = new UILabel();\r
- if (labelFindTitle == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelFindTitle fail");\r
+ labelDisconnect_->SetText("蓝牙已断开");\r
+ labelDisconnect_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+ labelDisconnect_->SetPosition(FIND_PHONE_TITLE_X, FIND_PHONE_TITLE_Y, FIND_PHONE_TITLE_WIDTH,\r
+ FIND_PHONE_TITLE_HEIGHT);\r
+ container_->Add(labelDisconnect_);\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
return;\r
}\r
- labelFindTitle->SetText("查找手机");\r
- labelFindTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_2);\r
- labelFindTitle->SetPosition(FIND_PHONE_FINDTITLE_X, FIND_PHONE_FINDTITLE_Y, FIND_PHONE_FINDTITLE_WIDTH,\r
- FIND_PHONE_FINDTITLE_HEIGHT);\r
- container_->Add(labelFindTitle);\r
+ labelTitle_->SetText("查找手机");\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_2);\r
+ labelTitle_->SetPosition(FIND_PHONE_FINDTITLE_X, FIND_PHONE_FINDTITLE_Y, FIND_PHONE_FINDTITLE_WIDTH,\r
+ FIND_PHONE_FINDTITLE_HEIGHT);\r
+ container_->Add(labelTitle_);\r
\r
- labelRing = new UILabel();\r
- if (labelRing == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelRing fail");\r
+ labelRing_ = new UILabel();\r
+ if (labelRing_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelRing_ fail");\r
return;\r
}\r
- labelRing->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
- container_->Add(labelRing);\r
+ labelRing_->SetText("响铃");\r
+ labelRing_->SetPosition(0, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING_WIDTH, FIND_PHONE_RINGING_HEIGHT);\r
+ labelRing_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+ labelRing_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelRing_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ container_->Add(labelRing_);\r
if (GetConnectStatus() == 1) {\r
- labelRing->SetVisible(true);\r
- labelUnder->SetVisible(false);\r
- LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
- IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
- buttonFind->Enable();\r
+ labelRing_->SetVisible(true);\r
+ labelDisconnect_->SetVisible(false);\r
+ LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_CONNECT, IMAGE_FINDPHONE_CONNECT);\r
+ buttonFind_->Enable();\r
} else {\r
- LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4,\r
- IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4);\r
- buttonFind->Disable();\r
- labelUnder->SetVisible(true);\r
- labelRing->SetVisible(false);\r
+ LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_DISCONNECT, IMAGE_FINDPHONE_DISCONNECT);\r
+ buttonFind_->Disable();\r
+ labelDisconnect_->SetVisible(true);\r
+ labelRing_->SetVisible(false);\r
}\r
imageAnimator_->Stop();\r
imageAnimator_->SetVisible(false);\r
AddViewToPageContainer(container_);\r
}\r
\r
-void FindPhoneMainPage::SetUpImageAnimator()\r
+void FindPhoneMainPage::InitImageAnimator()\r
{\r
imageAnimator_ = new UIImageAnimatorView();\r
if (imageAnimator_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
- "FindPhoneMainPage::UIImageAnimatorView new Label SetUpImageAnimator fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "imageAnimator_ new fail");\r
return;\r
}\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::SetUpImageAnimator ");\r
- imageAnimator_ = new UIImageAnimatorView();\r
- for (data; data < IMAGEANIMATOERVIEW_SIZE; data++) {\r
- searchImageInfo[data].imageInfo =\r
- ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[data], FINDPHONE_IMAGE);\r
- ;\r
- searchImageInfo[data].imageType = IMG_SRC_IMAGE_INFO;\r
- searchImageInfo[data].pos.x = FIND_PHONE_IMAGE_X;\r
- searchImageInfo[data].pos.y = FIND_PHONE_IMAGE_y;\r
- searchImageInfo[data].width = IMAGE_SIZE;\r
- searchImageInfo[data].height = IMAGE_SIZE;\r
- }\r
- imageAnimator_->SetPosition(FIND_PHONE_IMAGE_X, FIND_PHONE_IMAGE_y, FIND_PHONE_IMAGE_WIDTH,\r
- FIND_PHONE_IMAGE_HEIGHT); // 50 : offset 50 : offset 200 : offset 200: offset\r
- int imageNumber = IMAGEANIMATOERVIEW_SIZE;\r
- int ImageUpdate = IMAGEANIMATOERVIEW_TIME;\r
- imageAnimator_->SetImageAnimatorSrc(searchImageInfo, imageNumber,\r
- ImageUpdate); // 4: the number of images, 100: updating time\r
+ for (int i = 0; i < FINDPHONE_IMAGE_COUNT; i++) {\r
+ searchImageInfo_[i].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[i], FINDPHONE_IMAGE);\r
+ searchImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;\r
+ searchImageInfo_[i].pos.x = FIND_PHONE_IMAGE_X;\r
+ searchImageInfo_[i].pos.y = FIND_PHONE_IMAGE_Y;\r
+ searchImageInfo_[i].width = IMAGE_SIZE;\r
+ searchImageInfo_[i].height = IMAGE_SIZE;\r
+ }\r
+ imageAnimator_->SetPosition(FIND_PHONE_IMAGE_X, FIND_PHONE_IMAGE_Y, FIND_PHONE_IMAGE_WIDTH,\r
+ FIND_PHONE_IMAGE_HEIGHT);\r
+ imageAnimator_->SetImageAnimatorSrc(searchImageInfo_, FINDPHONE_IMAGE_COUNT, IMAGEANIMATOERVIEW_TIME);\r
imageAnimator_->Stop();\r
imageAnimator_->LayoutCenterOfParent();\r
imageAnimator_->SetDraggable(true);\r
imageAnimator_->SetOnDragListener(this);\r
container_->Add(imageAnimator_);\r
- InitImageInfo();\r
}\r
\r
-void FindPhoneMainPage::SetupButton()\r
+void FindPhoneMainPage::InitButton()\r
{\r
- // Add Button to App\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::SetupButton new Label");\r
- if (buttonFind == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new buttonFind fail");\r
- buttonFind = new UIButton();\r
+ buttonFind_ = new UIButton();\r
+ if (buttonFind_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonFind_ fail");\r
+ return;\r
}\r
- buttonFind->SetPosition(FIND_PHONE_BUTTON_POSITION_X, FIND_PHONE_BUTTON_POSITION_Y);\r
- buttonFind->Resize(FIND_PHONE_BUTTON_WIDTH, FIND_PHONE_BUTTON_HEIGHT);\r
- buttonFind->SetViewId("button1");\r
- buttonFind->SetOnClickListener(this);\r
- buttonFind->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);\r
- buttonFind->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- buttonFind->SetVisible(true);\r
- LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
- IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
- if (buttonRty == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new buttonRty fail");\r
- buttonRty = new UIButton();\r
+ buttonFind_->SetPosition(FIND_PHONE_BUTTON_POSITION_X, FIND_PHONE_BUTTON_POSITION_Y);\r
+ buttonFind_->Resize(FIND_PHONE_BUTTON_WIDTH, FIND_PHONE_BUTTON_HEIGHT);\r
+ buttonFind_->SetViewId(FIND_BUTTON);\r
+ buttonFind_->SetOnClickListener(this);\r
+ buttonFind_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ buttonFind_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonFind_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ buttonFind_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_CONNECT, IMAGE_FINDPHONE_CONNECT);\r
+ buttonRetry_ = new UIButton();\r
+ if (buttonRetry_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new buttonRetry_ fail");\r
+ return;\r
}\r
- buttonRty->SetPosition(FIND_PHONE_RTYBUTTON_POSITION_X, FIND_PHONE_RTYBUTTON_POSITION_Y);\r
- buttonRty->Resize(FIND_PHONE_RTYBUTTON, FIND_PHONE_RTYBUTTON);\r
- buttonRty->SetViewId("buttonRty");\r
- buttonRty->SetOnClickListener(this);\r
- buttonRty->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);\r
- buttonRty->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- LOADIMG::LoadBtnImage(buttonRty, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7,\r
- IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7);\r
- buttonRty->SetVisible(false);\r
- // Add to rootView\r
- container_->Add(buttonRty);\r
- container_->Add(buttonFind);\r
+ buttonRetry_->SetPosition(FIND_PHONE_RTYBUTTON_POSITION_X, FIND_PHONE_RTYBUTTON_POSITION_Y);\r
+ buttonRetry_->Resize(FIND_PHONE_RTYBUTTON, FIND_PHONE_RTYBUTTON);\r
+ buttonRetry_->SetViewId(RETRY_BUTTON);\r
+ buttonRetry_->SetOnClickListener(this);\r
+ buttonRetry_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);\r
+ buttonRetry_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadBtnImage(buttonRetry_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_RESET, IMAGE_FINDPHONE_RESET);\r
+ buttonRetry_->SetVisible(false);\r
+ container_->Add(buttonRetry_);\r
+ container_->Add(buttonFind_);\r
}\r
\r
bool FindPhoneMainPage::ClickButtonChange()\r
{\r
-#ifndef _WIN32\r
errcode_t result;\r
+ uint8_t value = 1;\r
if (imageAnimator_->GetState() == true) {\r
- // 关闭定时器\r
- result =\r
- uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log OFF result:%d ", result);\r
+#ifdef _WIN32\r
+ result = 0;\r
+#else\r
+ result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_STOP_FIND_PHONE, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ClickButtonChange stop find phone result:%d ", result);\r
+#endif\r
if (result == 0) {\r
DisableFindPhoneTimer();\r
- LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
- IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
+ LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_CONNECT, IMAGE_FINDPHONE_CONNECT);\r
imageAnimator_->Stop();\r
imageAnimator_->SetVisible(false);\r
- buttonFind->SetOpaScale(OPA_OPAQUE);\r
- mainImage->SetVisible(true);\r
- labelRing->SetText("响铃");\r
- labelRing->SetPosition(FIND_PHONE_RINGING_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING_WIDTH,\r
- FIND_PHONE_RINGING_HEIGHT);\r
+ buttonFind_->SetOpaScale(OPA_OPAQUE);\r
+ labelRing_->SetText("响铃");\r
return true;\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OFF send to phone fail:%d ", result);\r
- return false;\r
}\r
} else {\r
- // 开启定时器\r
- result =\r
- uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_ON_FIND_PHONE, nullptr, 0);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log ON result:%d ", result);\r
+#ifdef _WIN32\r
+ result = 0;\r
+#else\r
+ result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_START_FIND_PHONE, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ClickButtonChange start find phone result:%d ", result);\r
+#endif\r
if (result == 0) {\r
InitFindPhoneTimer();\r
- g_startCount->Start();\r
imageAnimator_->Start();\r
imageAnimator_->SetVisible(true);\r
- buttonFind->SetOpaScale(OPA_TRANSPARENT);\r
- mainImage->SetVisible(false);\r
- labelRing->SetText("停止响铃");\r
- labelRing->SetPosition(FIND_PHONE_RINGING2_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING2_WIDTH,\r
- FIND_PHONE_RINGING_HEIGHT);\r
+ buttonFind_->SetOpaScale(OPA_TRANSPARENT);\r
+ labelRing_->SetText("停止响铃");\r
return true;\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ON send to phone fail:%d ", result);\r
- return false;\r
}\r
}\r
-#endif\r
return true;\r
}\r
\r
void FindPhoneMainPage::ShowReset()\r
{\r
// rtybutton、title显示,findTitle、button隐藏,imageAnimator停止\r
- labelUnder->SetText("查找手机超时,请重试");\r
- labelUnder->SetPosition(FIND_PHONE_SEARCHTIMEOUT_X, FIND_PHONE_SEARCHTIMEOUT_Y, FIND_PHONE_SEARCHTIMEOUT_WIDTH,\r
- FIND_PHONE_SEARCHTIMEOUT_HEIGHT);\r
- labelUnder->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
- labelUnder->SetVisible(true);\r
- buttonRty->SetVisible(true);\r
- labelFindTitle->SetVisible(false);\r
- labelRing->SetVisible(false);\r
- buttonFind->SetVisible(false);\r
- mainImage->SetVisible(false);\r
+#ifdef _WIN32\r
+#else\r
+ uint8_t value = 1;\r
+ uint8_t result = 0;\r
+ result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_STOP_FIND_PHONE, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ShowReset stop find phone result:%d ", result);\r
+#endif\r
+ labelDisconnect_->SetText("查找手机超时,请重试");\r
+ labelDisconnect_->SetPosition(FIND_PHONE_SEARCHTIMEOUT_X, FIND_PHONE_SEARCHTIMEOUT_Y,\r
+ FIND_PHONE_SEARCHTIMEOUT_WIDTH, FIND_PHONE_SEARCHTIMEOUT_HEIGHT);\r
+ labelDisconnect_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+ labelDisconnect_->SetVisible(true);\r
+ buttonRetry_->SetVisible(true);\r
+ labelTitle_->SetVisible(false);\r
+ labelRing_->SetVisible(false);\r
+ buttonFind_->SetVisible(false);\r
imageAnimator_->Stop();\r
imageAnimator_->SetVisible(false);\r
DisableFindPhoneTimer();\r
\r
bool FindPhoneMainPage::StopFindPhone()\r
{\r
-#ifndef _WIN32\r
- errcode_t result;\r
if (imageAnimator_->GetState() == true) {\r
- // 关闭定时器\r
- result =\r
- uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log OFF result:%d ", result);\r
- if (result == 0) {\r
- DisableFindPhoneTimer();\r
- LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
- IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
- imageAnimator_->Stop();\r
- imageAnimator_->SetVisible(false);\r
- buttonFind->SetOpaScale(OPA_OPAQUE);\r
- mainImage->SetVisible(true);\r
- labelRing->SetText("响铃");\r
- labelRing->SetPosition(FIND_PHONE_RINGING_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING_WIDTH,\r
- FIND_PHONE_RINGING_HEIGHT);\r
- return true;\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OFF send to phone fail:%d ", result);\r
- return false;\r
- }\r
- } else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::imageAnimator is stop");\r
+ DisableFindPhoneTimer();\r
+ LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_CONNECT, IMAGE_FINDPHONE_CONNECT);\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->SetVisible(false);\r
+ buttonFind_->SetOpaScale(OPA_OPAQUE);\r
+ labelRing_->SetText("响铃");\r
+ return true;\r
}\r
-#endif\r
return true;\r
}\r
\r
bool FindPhoneMainPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
-#ifndef _WIN32\r
UNUSED(event);\r
- if (view.GetViewId() == "buttonRty") {\r
+ if (strcmp(view.GetViewId(), RETRY_BUTTON) == 0) {\r
// rtybutton、title隐藏,findTitle、button显示,imageAnimator播放\r
- InitFindPhoneTimer();\r
- static uint8_t buffer[1024] = {16};\r
- errcode_t result =\r
- uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_ON_FIND_PHONE, buffer, 16);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log ON result:%d ", result);\r
+ uint8_t value = 1;\r
+ errcode_t result;\r
+#ifdef _WIN32\r
+ result = 0;\r
+#else\r
+ result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_START_FIND_PHONE, &value, sizeof(value));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnClick start find phone result:%d ", result);\r
+#endif\r
if (result == 0) {\r
- buttonRty->SetVisible(false);\r
- labelUnder->SetVisible(false);\r
- mainImage->SetVisible(false);\r
- buttonFind->SetVisible(true);\r
- labelFindTitle->SetVisible(true);\r
+ buttonRetry_->SetVisible(false);\r
+ labelDisconnect_->SetVisible(false);\r
+ buttonFind_->SetVisible(true);\r
+ labelTitle_->SetVisible(true);\r
+ InitFindPhoneTimer();\r
imageAnimator_->Start();\r
imageAnimator_->SetVisible(true);\r
- buttonFind->SetOpaScale(OPA_TRANSPARENT);\r
- labelRing->SetVisible(true);\r
- labelRing->SetText("停止响铃");\r
- labelRing->SetPosition(FIND_PHONE_RINGING2_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING2_WIDTH,\r
- FIND_PHONE_RINGING_HEIGHT);\r
+ buttonFind_->SetOpaScale(OPA_TRANSPARENT);\r
+ labelRing_->SetVisible(true);\r
+ labelRing_->SetText("停止响铃");\r
return true;\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "try send to phone fail:%d ", result);\r
- return false;\r
}\r
- } else {\r
+ } else if (strcmp(view.GetViewId(), FIND_BUTTON) == 0) {\r
ClickButtonChange();\r
}\r
-#endif\r
return true;\r
}\r
\r
bool FindPhoneMainPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnDrag");\r
UNUSED(view);\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
}\r
- return false;\r
+ return true;\r
}\r
\r
uint8_t FindPhoneMainPage::GetConnectStatus()\r
{\r
uint8_t conn_status = 0;\r
-#ifndef _WIN32\r
+#ifdef _WIN32\r
+ conn_status = 1;\r
+#else\r
if (msg_center_get_trans_channel() == DIAG_FRAME_FID_PHONE) {\r
conn_status = is_spp_connected(0) == true ? 1 : 0;\r
} else if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
\r
void FindPhoneMainPage::ChangeToDisConnect()\r
{\r
- LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4,\r
- IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4);\r
+ LOADIMG::LoadBtnImage(buttonFind_, FINDPHONE_IMAGE, IMAGE_FINDPHONE_DISCONNECT, IMAGE_FINDPHONE_DISCONNECT);\r
+ DisableFindPhoneTimer();\r
imageAnimator_->Stop();\r
imageAnimator_->SetVisible(false);\r
- buttonFind->SetOpaScale(OPA_OPAQUE);\r
- buttonFind->Disable();\r
- labelFindTitle->SetVisible(false);\r
- labelUnder->SetVisible(true);\r
- labelRing->SetVisible(false);\r
+ buttonFind_->SetOpaScale(OPA_OPAQUE);\r
+ buttonFind_->Disable();\r
+ labelDisconnect_->SetVisible(true);\r
+ labelRing_->SetVisible(false);\r
}\r
\r
/* 定时器回调函数 */\r
void FindPhoneTimerCallback(void *data)\r
{\r
(void)data;\r
- timeCount++;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::timeCount:%d", timeCount);\r
- if (timeCount == FIND_PHONE_DURATION_TIME) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Searching for phone timed out!!");\r
- FindPhoneMainPage::GetInstance()->ShowReset();\r
- timeCount = 0;\r
- }\r
- if (FindPhoneMainPage::GetInstance()->GetConnectStatus() != 1) {\r
- FindPhoneMainPage::GetInstance()->ChangeToDisConnect();\r
- }\r
+ FindPhoneMainPage::GetInstance()->ShowReset();\r
}\r
\r
/* 开启定时器 */\r
void FindPhoneMainPage::InitFindPhoneTimer()\r
{\r
- if (g_startCount != nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage already exists!!");\r
+ if (startCount_ != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "already exists!!");\r
return;\r
}\r
- uint32 tick = GetOSTick(MS_ONE_SECONDS);\r
- g_startCount = new GraphicTimer(tick, FindPhoneTimerCallback, nullptr, true);\r
- if (g_startCount == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage new GraphicTimer failed!!");\r
+ uint32 tick = GetOSTick(FINDPHONE_TIMEOUT * MS_ONE_SECONDS);\r
+ startCount_ = new GraphicTimer(tick, FindPhoneTimerCallback, nullptr, true);\r
+ if (startCount_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new GraphicTimer failed!!");\r
return;\r
}\r
- bool retTimer = g_startCount->Start();\r
+ SettingDisplayModel::GetInstance().EnableSteadyOn();\r
+ bool retTimer = startCount_->Start();\r
if (!retTimer) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage osTimerStart failed!!");\r
- if (g_startCount != nullptr) {\r
- delete g_startCount;\r
- g_startCount = nullptr;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerStart failed!!");\r
+ if (startCount_ != nullptr) {\r
+ delete startCount_;\r
+ startCount_ = nullptr;\r
}\r
return;\r
}\r
/* 关闭定时器 */\r
void FindPhoneMainPage::DisableFindPhoneTimer()\r
{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "CameraModel::DisableFindPhoneTimer!!");\r
- if (g_startCount != nullptr) {\r
- g_startCount->Stop();\r
- delete g_startCount;\r
- g_startCount = nullptr;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraModel::DisableFindPhoneTimer delete g_startCount!!");\r
- }\r
- timeCount = 0;\r
-}\r
-\r
-void FindPhoneMainPage::InitImageInfo()\r
-{\r
- const uint16_t pixelByteSize = FIND_PHONE_PIXELBYTE_SIZE; // 4: bytes per pixel\r
- const uint16_t width = FIND_PHONE_PIXELBYTEH; // 100: image's width\r
- const uint16_t height = FIND_PHONE_PIXELBYTEH; // 100: image's height\r
- uint32_t dataSize = width * height * pixelByteSize;\r
- uint8_t *srcData1 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
- if (srcData1 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData1 fail");\r
- return;\r
- }\r
- for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
- srcData1[i] = SET_INT_MAX; // 255: pixel value\r
- srcData1[i + 1] = 0; // 1: set green channel\r
- srcData1[i + SET_TWO] = 0; // 2: set red channel\r
- srcData1[i + SET_THREE] = OPA_OPAQUE; // 3: set alpha channel\r
- }\r
- imageInfo1_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
- if (imageInfo1_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo1_ fail");\r
- UIFree(srcData1);\r
- return;\r
- }\r
-\r
- imageInfo1_->header.width = width;\r
- imageInfo1_->header.height = height;\r
- imageInfo1_->header.colorMode = ColorMode::ARGB8888;\r
- imageInfo1_->dataSize = dataSize;\r
- imageInfo1_->data = srcData1;\r
-\r
- uint8_t *srcData2 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
- if (srcData2 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData2 fail");\r
- UIFree(imageInfo1_);\r
- UIFree(srcData1);\r
- return;\r
- }\r
- for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
- srcData2[i] = 0; // set blue channel\r
- srcData2[i + 1] = SET_INT_MAX; // 1: set green channel 255: pixel value\r
- srcData2[i + SET_TWO] = 0; // 2: set red channel\r
- srcData2[i + SET_THREE] = OPA_OPAQUE; // 3: set alpha channel\r
- }\r
-\r
- imageInfo2_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
- if (imageInfo2_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo2_ fail");\r
- UIFree(srcData2);\r
- UIFree(imageInfo1_);\r
- UIFree(srcData1);\r
- return;\r
- }\r
- imageInfo2_->header.width = width;\r
- imageInfo2_->header.height = height;\r
- imageInfo2_->header.colorMode = ARGB8888;\r
- imageInfo2_->dataSize = dataSize;\r
- imageInfo2_->data = srcData2;\r
-\r
- uint8_t *srcData3 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
- if (srcData3 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData3 fail");\r
- UIFree(imageInfo2_);\r
- UIFree(srcData2);\r
- UIFree(imageInfo1_);\r
- UIFree(srcData1);\r
- return;\r
- }\r
- for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
- srcData3[i] = 0; // set blue channel\r
- srcData3[i + 1] = 0; // 1: set green channel\r
- srcData3[i + SET_TWO] = SET_INT_MAX; // 2: set red channel 255: pixel value\r
- srcData3[i + SET_THREE] = OPA_OPAQUE; // 3: set alpha channel\r
- }\r
-\r
- imageInfo3_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
- if (imageInfo3_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo3_ fail");\r
- UIFree(srcData3);\r
- UIFree(imageInfo2_);\r
- UIFree(srcData2);\r
- UIFree(imageInfo1_);\r
- UIFree(srcData1);\r
- return;\r
+ SettingDisplayModel::GetInstance().DisableSteadyOn();\r
+ if (startCount_ != nullptr) {\r
+ startCount_->Stop();\r
+ delete startCount_;\r
+ startCount_ = nullptr;\r
}\r
- imageInfo3_->header.width = width;\r
- imageInfo3_->header.height = height;\r
- imageInfo3_->header.colorMode = ARGB8888;\r
- imageInfo3_->dataSize = dataSize;\r
- imageInfo3_->data = srcData3;\r
-\r
- imageAnimatorImageInfo_[0].imageInfo = imageInfo1_;\r
- imageAnimatorImageInfo_[0].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
- imageAnimatorImageInfo_[0].width = FIND_PHONE_IMAGEANIMATOR_WIDTH; // 100: width value\r
- imageAnimatorImageInfo_[0].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT; // 100: height value\r
- imageAnimatorImageInfo_[0].imageType = IMG_SRC_IMAGE_INFO;\r
-\r
- imageAnimatorImageInfo_[1].imageInfo = imageInfo2_;\r
- imageAnimatorImageInfo_[1].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
- imageAnimatorImageInfo_[1].width = FIND_PHONE_IMAGEANIMATOR_WIDTH; // 100: width value\r
- imageAnimatorImageInfo_[1].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT; // 100: height value\r
- imageAnimatorImageInfo_[1].imageType = IMG_SRC_IMAGE_INFO;\r
-\r
- imageAnimatorImageInfo_[SET_TWO].imageInfo = imageInfo3_; // 2: image index\r
- imageAnimatorImageInfo_[SET_TWO].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
- imageAnimatorImageInfo_[SET_TWO].width = FIND_PHONE_IMAGEANIMATOR_WIDTH; // 2: image index, 100: width value\r
- imageAnimatorImageInfo_[SET_TWO].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT; // 2: image index, 100: height value\r
- imageAnimatorImageInfo_[SET_TWO].imageType = IMG_SRC_IMAGE_INFO; // 2: image index\r
}\r
}\r
\r
#include "ohos_timer.h"\r
#include "wearable_log.h"\r
-#include "findphone/FindPhoneModel.h"\r
#include "findphone/FindPhoneView.h"\r
+#include "findphone/FindPhoneModel.h"\r
\r
namespace OHOS {\r
-static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
-static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
-static constexpr uint16_t NUM_TEN = 10;\r
-static constexpr uint16_t NUM_TIME_MIN = 60;\r
-static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
-static constexpr int32_t NUM_TIME_DAY = 86400;\r
-static constexpr int16_t MIN_TO_HOUR = 60;\r
-static constexpr int16_t HOURLY_SYSTEM = 24;\r
FindPhoneModel::FindPhoneModel() {}\r
\r
FindPhoneModel::~FindPhoneModel() {}\r
\r
#include "NativeRegisterManager.h"\r
#include "uiservice/ui_service.h"\r
-#include "findphone/FindPhonePresenter.h"\r
#include "findphone/FindPhoneModel.h"\r
#include "findphone/FindPhoneView.h"\r
+#include "findphone/FindPhonePresenter.h"\r
\r
namespace OHOS {\r
-REGIST_MENU(VIEW_FIND_PHONE, FindPhoneView, FindPhonePresenter, FINDPHONE_MAIN_ICON, FINDPHONE_MAIN_ICON, "查找手机");\r
+REGIST_MENU(VIEW_FIND_PHONE, FindPhoneView, FindPhonePresenter, FINDPHONE_ICON, FINDPHONE_ICON, "查找手机");\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: FlashLightBlinkPage\r
* Create: 2025-04-24\r
*/\r
\r
-#include "flashlight/FlashLightBlinkPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
#include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
#include "AppViewIDs.h"\r
#include "wearable_log.h"\r
#include "NativeAbility.h"\r
-#include "flashlight/FlashLightModel.h"\r
#include "main/LoadImg.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "ui_resource_flashlight.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightBlinkPage.h"\r
+\r
namespace OHOS {\r
-static const uint16_t BLINK_PICKER_POS_X = 106;\r
-static const uint16_t BLINK_PICKER_POS_Y = 113;\r
-static const uint16_t BLINK_PICKER_WIDTH = 254;\r
-static const uint16_t BLINK_PICKER_HEIGHT = 218;\r
-static const uint16_t BLINK_PICKER_BACKGROUND_FONT_SIZE = 38;\r
-static const uint16_t BLINK_PICKER_HIGHLIGHT_FONT_SIZE = 44;\r
-static const uint16_t BLINK_PICKER_ITEM_HEIGHT = 73;\r
-static const uint16_t BLINK_PICKER_NUM = 3;\r
-static const uint16_t BLINK_BUTTON_POS_X = 59;\r
-static const uint16_t BLINK_BUTTON_POS_Y = 358;\r
-static const uint16_t BLINK_BUTTON_WIDTH = 337;\r
-static const uint16_t BLINK_BUTTON_HEIGHT = 96;\r
-static const uint16_t BLINK_TEXT_POS_X = 100;\r
-static const uint16_t BLINK_TEXT_POS_Y = 38;\r
-static const uint16_t BLINK_TEXT_WIDTH = 253;\r
-static const uint16_t BLINK_TEXT_HEIGHT = 53;\r
-static const uint16_t BLINK_TEXT_FONT_SIZE = 38;\r
-static const std::string START_BLINK_BUTTON_ID = "startBlink";\r
+static constexpr uint16_t BLINK_PICKER_POS_X = 106;\r
+static constexpr uint16_t BLINK_PICKER_POS_Y = 113;\r
+static constexpr uint16_t BLINK_PICKER_WIDTH = 254;\r
+static constexpr uint16_t BLINK_PICKER_HEIGHT = 218;\r
+static constexpr uint16_t BLINK_PICKER_BACKGROUND_FONT_SIZE = 38;\r
+static constexpr uint16_t BLINK_PICKER_HIGHLIGHT_FONT_SIZE = 44;\r
+static constexpr uint16_t BLINK_PICKER_ITEM_HEIGHT = 73;\r
+static constexpr uint16_t BLINK_PICKER_NUM = 3;\r
+static constexpr uint16_t BLINK_BUTTON_POS_X = 59;\r
+static constexpr uint16_t BLINK_BUTTON_POS_Y = 358;\r
+static constexpr uint16_t BLINK_BUTTON_WIDTH = 337;\r
+static constexpr uint16_t BLINK_BUTTON_HEIGHT = 96;\r
+static constexpr uint16_t BLINK_TEXT_POS_X = 100;\r
+static constexpr uint16_t BLINK_TEXT_POS_Y = 38;\r
+static constexpr uint16_t BLINK_TEXT_WIDTH = 253;\r
+static constexpr uint16_t BLINK_TEXT_HEIGHT = 53;\r
+static constexpr uint16_t BLINK_TEXT_FONT_SIZE = 38;\r
+static constexpr char *START_BLINK_BUTTON_ID = "startBlink";\r
\r
REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_BLINK_VIEW, FlashLightBlinkPage, false);\r
void FlashLightBlinkPage::OnStart(void *data)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnStart");\r
if (container_ == nullptr) {\r
container_ = new UIScrollView();\r
container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
blinkLabel_->SetText("闪烁频率");\r
blinkLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
blinkLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- blinkLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLINK_TEXT_FONT_SIZE);\r
+ blinkLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, BLINK_TEXT_FONT_SIZE);\r
container_->Add(blinkLabel_);\r
blinkLabel_->SetVisible(true);\r
\r
- // Add Picker to App\r
if (blinkPicker_ == nullptr) {\r
blinkPicker_ = new UIPicker();\r
}\r
container_->Add(blinkPicker_);\r
blinkPicker_->SetVisible(true);\r
\r
- // Add LabelButtonExt to App\r
if (blinkButton_ == nullptr) {\r
blinkButton_ = new UILabelButtonExt();\r
}\r
blinkButton_->SetPosition(BLINK_BUTTON_POS_X, BLINK_BUTTON_POS_Y, BLINK_BUTTON_WIDTH, BLINK_BUTTON_HEIGHT);\r
- blinkButton_->SetViewId(START_BLINK_BUTTON_ID.c_str());\r
- LOADIMG::LoadBtnImage(blinkButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_BLINKBUTTON,\r
- IMAGE_CONVERTER_TOOL_BLINKBUTTON);\r
+ blinkButton_->SetViewId(START_BLINK_BUTTON_ID);\r
+ LOADIMG::LoadBtnImage(blinkButton_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_BLINKBUTTON, IMAGE_FLASHLIGHT_BLINKBUTTON);\r
blinkButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
blinkButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
container_->Add(blinkButton_);\r
AddViewToPageContainer(container_);\r
}\r
\r
+FlashLightBlinkPage::FlashLightBlinkPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::FlashLightBlinkPage");\r
+}\r
+\r
FlashLightBlinkPage::~FlashLightBlinkPage()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::~FlashLightBlinkPage");\r
if (container_ != nullptr) {\r
container_->RemoveAll();\r
delete container_;\r
blinkButton_ = nullptr;\r
}\r
ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::~FlashLightBlinkPage");\r
}\r
\r
bool FlashLightBlinkPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnDrag");\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
}\r
\r
bool FlashLightBlinkPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
- std::string viewId = view.GetViewId();\r
uint16_t itemIndex = blinkPicker_->GetSelected();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnClick [%s], itemIndex : [%d] ", viewId.c_str(),\r
- itemIndex);\r
- if (viewId == START_BLINK_BUTTON_ID) {\r
+ if (strcmp(view.GetViewId(), START_BLINK_BUTTON_ID) == 0) {\r
FlashLightModel::GetInstance().SetBlinkFrequency((FlashLightBlinkFrequency)itemIndex);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnClick [Invalid]");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
}\r
}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: FlashLightColorPage\r
* Create: 2025-04-24\r
*/\r
\r
-#include "flashlight/FlashLightColorPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
#include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
#include "AppViewIDs.h"\r
#include "wearable_log.h"\r
#include "NativeAbility.h"\r
-#include "flashlight/FlashLightModel.h"\r
#include "main/LoadImg.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "ui_resource_flashlight.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightColorPage.h"\r
+\r
namespace OHOS {\r
-static const uint16_t COLOR_LABEL_POS_X = 100;\r
-static const uint16_t COLOR_LABEL_POS_Y = 38;\r
-static const uint16_t COLOR_LABEL_WIDTH = 253;\r
-static const uint16_t COLOR_LABEL_HEIGHT = 53;\r
-static const uint16_t COLOR_LABEL_FONT_SIZE = 38;\r
-static const uint16_t CONTAINER_BLANK_SIZE = 100;\r
+static constexpr uint16_t COLOR_LABEL_POS_X = 100;\r
+static constexpr uint16_t COLOR_LABEL_POS_Y = 38;\r
+static constexpr uint16_t COLOR_LABEL_WIDTH = 253;\r
+static constexpr uint16_t COLOR_LABEL_HEIGHT = 53;\r
+static constexpr uint16_t COLOR_LABEL_FONT_SIZE = 38;\r
+static constexpr uint16_t CONTAINER_BLANK_SIZE = 100;\r
// 行坐标\r
-const uint16_t FIRST_ROW_COLOR_BUTTON_POS_Y = 104;\r
-const uint16_t SECOND_ROW_COLOR_BUTTON_POS_Y = 225;\r
-const uint16_t THIRD_ROW_COLOR_BUTTON_POS_Y = 346;\r
+static constexpr uint16_t FIRST_ROW_COLOR_BUTTON_POS_Y = 104;\r
+static constexpr uint16_t SECOND_ROW_COLOR_BUTTON_POS_Y = 225;\r
+static constexpr uint16_t THIRD_ROW_COLOR_BUTTON_POS_Y = 346;\r
// 列坐标\r
-const uint16_t FIRST_COLUMN_COLOR_BUTTON_POS_X = 46;\r
-const uint16_t SECOND_COLUMN_COLOR_BUTTON_POS_X = 169;\r
-const uint16_t THIRD_COLUMN_COLOR_BUTTON_POS_X = 290;\r
+static constexpr uint16_t FIRST_COLUMN_COLOR_BUTTON_POS_X = 46;\r
+static constexpr uint16_t SECOND_COLUMN_COLOR_BUTTON_POS_X = 169;\r
+static constexpr uint16_t THIRD_COLUMN_COLOR_BUTTON_POS_X = 290;\r
// 按钮大小\r
-const uint16_t COLOR_BUTTON_WIDTH = 117;\r
-const uint16_t COLOR_BUTTON_HEIGHT = 117;\r
-static const uint32_t SELECT_COLOR_BUTTON_RES[10] = {\r
+static constexpr uint16_t COLOR_BUTTON_WIDTH = 117;\r
+static constexpr uint16_t COLOR_BUTTON_HEIGHT = 117;\r
+// 选中按钮偏移值\r
+static constexpr uint16_t COLOR_BUTTON_OFFSET = 8;\r
+static constexpr uint32_t g_selectColorButtonRes[] = {\r
0,\r
- IMAGE_CONVERTER_TOOL_COLOR1PRESSBUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR2PRESSBUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR3PRESSBUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR4PRESSBUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR5PRESSBUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR6PRESSBUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR7PRESSBUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR8PRESSBUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR9PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_WHITE_PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_RED_PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_ORANGE_PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_YELLOW_PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_GREEN_PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_LIGHT_BLUE_PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_DARK_BLUE_PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_PURPLE_PRESSBUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_MULTI_PRESSBUTTON,\r
};\r
-static const std::string COLOR1_BUTTON_ID = "color1Button";\r
-static const std::string COLOR2_BUTTON_ID = "color2Button";\r
-static const std::string COLOR3_BUTTON_ID = "color3Button";\r
-static const std::string COLOR4_BUTTON_ID = "color4Button";\r
-static const std::string COLOR5_BUTTON_ID = "color5Button";\r
-static const std::string COLOR6_BUTTON_ID = "color6Button";\r
-static const std::string COLOR7_BUTTON_ID = "color7Button";\r
-static const std::string COLOR8_BUTTON_ID = "color8Button";\r
-static const std::string COLOR9_BUTTON_ID = "color9Button";\r
+static constexpr char *COLOR_WHITE_BUTTON_ID = "colorWhiteButton";\r
+static constexpr char *COLOR_RED_BUTTON_ID = "colorRedButton";\r
+static constexpr char *COLOR_ORANGE_BUTTON_ID = "colorOrangeButton";\r
+static constexpr char *COLOR_YELLOW_BUTTON_ID = "colorYellowButton";\r
+static constexpr char *COLOR_GREEN_BUTTON_ID = "colorGreenButton";\r
+static constexpr char *COLOR_LIGHT_BLUE_BUTTON_ID = "colorLightBlueButton";\r
+static constexpr char *COLOR_DARK_BLUE_BUTTON_ID = "colorDarkBlueButton";\r
+static constexpr char *COLOR_PURPLE_BUTTON_ID = "colorPurpleButton";\r
+static constexpr char *COLOR_MULTI_BUTTON_ID = "colorMultiButton";\r
+\r
REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_COLOR_VIEW, FlashLightColorPage, false);\r
void FlashLightColorPage::OnStart(void *data)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnStart");\r
- uint32_t COLOR_BUTTON_RES[10] = {\r
+ uint32_t colorButtonRes[] = {\r
0,\r
- IMAGE_CONVERTER_TOOL_COLOR1BUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR2BUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR3BUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR4BUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR5BUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR6BUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR7BUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR8BUTTON,\r
- IMAGE_CONVERTER_TOOL_COLOR9BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_WHITE_BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_RED_BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_ORANGE_BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_YELLOW_BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_GREEN_BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_LIGHT_BLUE_BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_DARK_BLUE_BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_PURPLE_BUTTON,\r
+ IMAGE_FLASHLIGHT_COLOR_MULTI_BUTTON,\r
};\r
- uint16_t selectColor = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
- COLOR_BUTTON_RES[selectColor] = SELECT_COLOR_BUTTON_RES[selectColor];\r
+\r
+ uint16_t selectColor = (uint16_t)FlashLightModel::GetInstance().GetViewColorId();\r
+ colorButtonRes[selectColor] = g_selectColorButtonRes[selectColor];\r
if (container_ == nullptr) {\r
container_ = new UIScrollView();\r
container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
colorLabel_->SetText("灯光颜色");\r
colorLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
colorLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- colorLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, COLOR_LABEL_FONT_SIZE);\r
+ colorLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, COLOR_LABEL_FONT_SIZE);\r
container_->Add(colorLabel_);\r
colorLabel_->SetVisible(true);\r
// 第一行颜色按钮\r
- if (color1Button_ == nullptr) {\r
- color1Button_ = new UILabelButtonExt();\r
- }\r
- color1Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color1Button_->SetViewId(COLOR1_BUTTON_ID.c_str());\r
- color1Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color1Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color1Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color1Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[WHITE_COLOR], COLOR_BUTTON_RES[WHITE_COLOR]);\r
- container_->Add(color1Button_);\r
- color1Button_->SetVisible(true);\r
+ if (colorWhiteButton_ == nullptr) {\r
+ colorWhiteButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == WHITE_COLOR) {\r
+ colorWhiteButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ FIRST_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorWhiteButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y,\r
+ COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+ }\r
+ colorWhiteButton_->SetViewId(COLOR_WHITE_BUTTON_ID);\r
+ colorWhiteButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorWhiteButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorWhiteButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorWhiteButton_, FLASHLIGHT_IMAGE, colorButtonRes[WHITE_COLOR],\r
+ colorButtonRes[WHITE_COLOR]);\r
+ container_->Add(colorWhiteButton_);\r
+ colorWhiteButton_->SetVisible(true);\r
\r
- if (color2Button_ == nullptr) {\r
- color2Button_ = new UILabelButtonExt();\r
- }\r
- color2Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color2Button_->SetViewId(COLOR2_BUTTON_ID.c_str());\r
- color2Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color2Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color2Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color2Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[RED_COLOR], COLOR_BUTTON_RES[RED_COLOR]);\r
- container_->Add(color2Button_);\r
- color2Button_->SetVisible(true);\r
+ if (colorRedButton_ == nullptr) {\r
+ colorRedButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == RED_COLOR) {\r
+ colorRedButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ FIRST_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorRedButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ }\r
+ colorRedButton_->SetViewId(COLOR_RED_BUTTON_ID);\r
+ colorRedButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorRedButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorRedButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorRedButton_, FLASHLIGHT_IMAGE, colorButtonRes[RED_COLOR], colorButtonRes[RED_COLOR]);\r
+ container_->Add(colorRedButton_);\r
+ colorRedButton_->SetVisible(true);\r
\r
- if (color3Button_ == nullptr) {\r
- color3Button_ = new UILabelButtonExt();\r
- }\r
- color3Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color3Button_->SetViewId(COLOR3_BUTTON_ID.c_str());\r
- color3Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color3Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color3Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color3Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[ORANGE_COLOR],\r
- COLOR_BUTTON_RES[ORANGE_COLOR]);\r
- container_->Add(color3Button_);\r
- color3Button_->SetVisible(true);\r
+ if (colorOrangeButton_ == nullptr) {\r
+ colorOrangeButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == ORANGE_COLOR) {\r
+ colorOrangeButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ FIRST_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorOrangeButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y,\r
+ COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+ }\r
+ colorOrangeButton_->SetViewId(COLOR_ORANGE_BUTTON_ID);\r
+ colorOrangeButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorOrangeButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorOrangeButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorOrangeButton_, FLASHLIGHT_IMAGE, colorButtonRes[ORANGE_COLOR],\r
+ colorButtonRes[ORANGE_COLOR]);\r
+ container_->Add(colorOrangeButton_);\r
+ colorOrangeButton_->SetVisible(true);\r
\r
// 第二行颜色按钮\r
- if (color4Button_ == nullptr) {\r
- color4Button_ = new UILabelButtonExt();\r
- }\r
- color4Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color4Button_->SetViewId(COLOR4_BUTTON_ID.c_str());\r
- color4Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color4Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color4Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color4Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[YELLOW_COLOR],\r
- COLOR_BUTTON_RES[YELLOW_COLOR]);\r
- container_->Add(color4Button_);\r
- color4Button_->SetVisible(true);\r
+ if (colorYellowButton_ == nullptr) {\r
+ colorYellowButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == YELLOW_COLOR) {\r
+ colorYellowButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ SECOND_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorYellowButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y,\r
+ COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+ }\r
+ colorYellowButton_->SetViewId(COLOR_YELLOW_BUTTON_ID);\r
+ colorYellowButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorYellowButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorYellowButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorYellowButton_, FLASHLIGHT_IMAGE, colorButtonRes[YELLOW_COLOR],\r
+ colorButtonRes[YELLOW_COLOR]);\r
+ container_->Add(colorYellowButton_);\r
+ colorYellowButton_->SetVisible(true);\r
\r
- if (color5Button_ == nullptr) {\r
- color5Button_ = new UILabelButtonExt();\r
- }\r
- color5Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color5Button_->SetViewId(COLOR5_BUTTON_ID.c_str());\r
- color5Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color5Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color5Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color5Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[GREEN_COLOR], COLOR_BUTTON_RES[GREEN_COLOR]);\r
- container_->Add(color5Button_);\r
- color5Button_->SetVisible(true);\r
+ if (colorGreenButton_ == nullptr) {\r
+ colorGreenButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == GREEN_COLOR) {\r
+ colorGreenButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ SECOND_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorGreenButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y,\r
+ COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+ }\r
\r
- if (color6Button_ == nullptr) {\r
- color6Button_ = new UILabelButtonExt();\r
- }\r
- color6Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color6Button_->SetViewId(COLOR6_BUTTON_ID.c_str());\r
- color6Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color6Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color6Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color6Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[LIGHT_BLUE_COLOR],\r
- COLOR_BUTTON_RES[LIGHT_BLUE_COLOR]);\r
+ colorGreenButton_->SetViewId(COLOR_GREEN_BUTTON_ID);\r
+ colorGreenButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorGreenButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorGreenButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorGreenButton_, FLASHLIGHT_IMAGE, colorButtonRes[GREEN_COLOR],\r
+ colorButtonRes[GREEN_COLOR]);\r
+ container_->Add(colorGreenButton_);\r
+ colorGreenButton_->SetVisible(true);\r
\r
- container_->Add(color6Button_);\r
- color6Button_->SetVisible(true);\r
+ if (colorLightBlueButton_ == nullptr) {\r
+ colorLightBlueButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == LIGHT_BLUE_COLOR) {\r
+ colorLightBlueButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ SECOND_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorLightBlueButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y,\r
+ COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+ }\r
+ colorLightBlueButton_->SetViewId(COLOR_LIGHT_BLUE_BUTTON_ID);\r
+ colorLightBlueButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorLightBlueButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorLightBlueButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorLightBlueButton_, FLASHLIGHT_IMAGE, colorButtonRes[LIGHT_BLUE_COLOR],\r
+ colorButtonRes[LIGHT_BLUE_COLOR]);\r
+\r
+ container_->Add(colorLightBlueButton_);\r
+ colorLightBlueButton_->SetVisible(true);\r
\r
// 第三行颜色按钮\r
- if (color7Button_ == nullptr) {\r
- color7Button_ = new UILabelButtonExt();\r
- }\r
- color7Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color7Button_->SetViewId(COLOR7_BUTTON_ID.c_str());\r
- color7Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color7Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color7Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color7Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[DARK_BLUE_COLOR],\r
- COLOR_BUTTON_RES[DARK_BLUE_COLOR]);\r
- container_->Add(color7Button_);\r
- color7Button_->SetVisible(true);\r
+ if (colorDarkBlueButton_ == nullptr) {\r
+ colorDarkBlueButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == DARK_BLUE_COLOR) {\r
+ colorDarkBlueButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ THIRD_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorDarkBlueButton_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y,\r
+ COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+ }\r
+ colorDarkBlueButton_->SetViewId(COLOR_DARK_BLUE_BUTTON_ID);\r
+ colorDarkBlueButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorDarkBlueButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorDarkBlueButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorDarkBlueButton_, FLASHLIGHT_IMAGE, colorButtonRes[DARK_BLUE_COLOR],\r
+ colorButtonRes[DARK_BLUE_COLOR]);\r
+ container_->Add(colorDarkBlueButton_);\r
+ colorDarkBlueButton_->SetVisible(true);\r
\r
- if (color8Button_ == nullptr) {\r
- color8Button_ = new UILabelButtonExt();\r
- }\r
- color8Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color8Button_->SetViewId(COLOR8_BUTTON_ID.c_str());\r
- color8Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color8Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color8Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color8Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[PURPLE_COLOR],\r
- COLOR_BUTTON_RES[PURPLE_COLOR]);\r
- container_->Add(color8Button_);\r
- color8Button_->SetVisible(true);\r
+ if (colorPurpleButton_ == nullptr) {\r
+ colorPurpleButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == PURPLE_COLOR) {\r
+ colorPurpleButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ THIRD_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorPurpleButton_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y,\r
+ COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+ }\r
+ colorPurpleButton_->SetViewId(COLOR_PURPLE_BUTTON_ID);\r
+ colorPurpleButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorPurpleButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorPurpleButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorPurpleButton_, FLASHLIGHT_IMAGE, colorButtonRes[PURPLE_COLOR],\r
+ colorButtonRes[PURPLE_COLOR]);\r
+ container_->Add(colorPurpleButton_);\r
+ colorPurpleButton_->SetVisible(true);\r
\r
- if (color9Button_ == nullptr) {\r
- color9Button_ = new UILabelButtonExt();\r
- }\r
- color9Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
- COLOR_BUTTON_HEIGHT);\r
- color9Button_->SetViewId(COLOR9_BUTTON_ID.c_str());\r
- color9Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- color9Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- color9Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
- LOADIMG::LoadBtnImage(color9Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[MULTI_COLOR], COLOR_BUTTON_RES[MULTI_COLOR]);\r
- container_->Add(color9Button_);\r
- color9Button_->SetVisible(true);\r
+ if (colorMultiButton_ == nullptr) {\r
+ colorMultiButton_ = new UILabelButtonExt();\r
+ }\r
+ if (selectColor == MULTI_COLOR) {\r
+ colorMultiButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X - COLOR_BUTTON_OFFSET,\r
+ THIRD_ROW_COLOR_BUTTON_POS_Y - COLOR_BUTTON_OFFSET, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ } else {\r
+ colorMultiButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y,\r
+ COLOR_BUTTON_WIDTH, COLOR_BUTTON_HEIGHT);\r
+ }\r
+ colorMultiButton_->SetViewId(COLOR_MULTI_BUTTON_ID);\r
+ colorMultiButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ colorMultiButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ colorMultiButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(colorMultiButton_, FLASHLIGHT_IMAGE, colorButtonRes[MULTI_COLOR],\r
+ colorButtonRes[MULTI_COLOR]);\r
+ container_->Add(colorMultiButton_);\r
+ colorMultiButton_->SetVisible(true);\r
\r
// 设置界面组件回调函数\r
container_->SetOnDragListener(this);\r
// 设置手电筒多个颜色按钮回调函数\r
- color3Button_->SetOnClickListener(this);\r
- color1Button_->SetOnClickListener(this);\r
- color2Button_->SetOnClickListener(this);\r
- color6Button_->SetOnClickListener(this);\r
- color5Button_->SetOnClickListener(this);\r
- color4Button_->SetOnClickListener(this);\r
- color9Button_->SetOnClickListener(this);\r
- color8Button_->SetOnClickListener(this);\r
- color7Button_->SetOnClickListener(this);\r
+ colorOrangeButton_->SetOnClickListener(this);\r
+ colorWhiteButton_->SetOnClickListener(this);\r
+ colorRedButton_->SetOnClickListener(this);\r
+ colorLightBlueButton_->SetOnClickListener(this);\r
+ colorGreenButton_->SetOnClickListener(this);\r
+ colorYellowButton_->SetOnClickListener(this);\r
+ colorMultiButton_->SetOnClickListener(this);\r
+ colorPurpleButton_->SetOnClickListener(this);\r
+ colorDarkBlueButton_->SetOnClickListener(this);\r
AddViewToPageContainer(container_);\r
}\r
\r
+FlashLightColorPage::FlashLightColorPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::FlashLightColorPage");\r
+}\r
+\r
FlashLightColorPage::~FlashLightColorPage()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::~FlashLightColorPage");\r
if (container_ != nullptr) {\r
container_->RemoveAll();\r
delete container_;\r
delete colorLabel_;\r
colorLabel_ = nullptr;\r
}\r
- if (color1Button_ != nullptr) {\r
- delete color1Button_;\r
- color1Button_ = nullptr;\r
+ if (colorWhiteButton_ != nullptr) {\r
+ delete colorWhiteButton_;\r
+ colorWhiteButton_ = nullptr;\r
}\r
- if (color2Button_ != nullptr) {\r
- delete color2Button_;\r
- color2Button_ = nullptr;\r
+ if (colorRedButton_ != nullptr) {\r
+ delete colorRedButton_;\r
+ colorRedButton_ = nullptr;\r
}\r
- if (color3Button_ != nullptr) {\r
- delete color3Button_;\r
- color3Button_ = nullptr;\r
+ if (colorOrangeButton_ != nullptr) {\r
+ delete colorOrangeButton_;\r
+ colorOrangeButton_ = nullptr;\r
}\r
- if (color4Button_ != nullptr) {\r
- delete color4Button_;\r
- color4Button_ = nullptr;\r
+ if (colorYellowButton_ != nullptr) {\r
+ delete colorYellowButton_;\r
+ colorYellowButton_ = nullptr;\r
}\r
- if (color5Button_ != nullptr) {\r
- delete color5Button_;\r
- color5Button_ = nullptr;\r
+ if (colorGreenButton_ != nullptr) {\r
+ delete colorGreenButton_;\r
+ colorGreenButton_ = nullptr;\r
}\r
- if (color6Button_ != nullptr) {\r
- delete color6Button_;\r
- color6Button_ = nullptr;\r
+ if (colorLightBlueButton_ != nullptr) {\r
+ delete colorLightBlueButton_;\r
+ colorLightBlueButton_ = nullptr;\r
}\r
- if (color7Button_ != nullptr) {\r
- delete color7Button_;\r
- color7Button_ = nullptr;\r
+ if (colorDarkBlueButton_ != nullptr) {\r
+ delete colorDarkBlueButton_;\r
+ colorDarkBlueButton_ = nullptr;\r
}\r
- if (color8Button_ != nullptr) {\r
- delete color8Button_;\r
- color8Button_ = nullptr;\r
+ if (colorPurpleButton_ != nullptr) {\r
+ delete colorPurpleButton_;\r
+ colorPurpleButton_ = nullptr;\r
}\r
- if (color9Button_ != nullptr) {\r
- delete color9Button_;\r
- color9Button_ = nullptr;\r
+ if (colorMultiButton_ != nullptr) {\r
+ delete colorMultiButton_;\r
+ colorMultiButton_ = nullptr;\r
}\r
ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::~FlashLightColorPage");\r
}\r
\r
bool FlashLightColorPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
}\r
\r
bool FlashLightColorPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
- std::string viewId = view.GetViewId();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnClick [%s]", viewId.c_str());\r
- if (viewId == COLOR1_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::WHITE_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else if (viewId == COLOR2_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::RED_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else if (viewId == COLOR3_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::ORANGE_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else if (viewId == COLOR4_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::YELLOW_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else if (viewId == COLOR5_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::GREEN_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else if (viewId == COLOR6_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::LIGHT_BLUE_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else if (viewId == COLOR7_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::DARK_BLUE_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else if (viewId == COLOR8_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::PURPLE_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else if (viewId == COLOR9_BUTTON_ID) {\r
- FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::MULTI_COLOR);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnClick [Invalid]");\r
+ if (strcmp(view.GetViewId(), COLOR_WHITE_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::WHITE_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), COLOR_RED_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::RED_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), COLOR_ORANGE_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::ORANGE_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), COLOR_YELLOW_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::YELLOW_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), COLOR_GREEN_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::GREEN_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), COLOR_LIGHT_BLUE_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::LIGHT_BLUE_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), COLOR_DARK_BLUE_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::DARK_BLUE_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), COLOR_PURPLE_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::PURPLE_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), COLOR_MULTI_BUTTON_ID) == 0) {\r
+ FlashLightModel::GetInstance().SetViewColorId(FlashLightColorAttribute::MULTI_COLOR);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
}\r
}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: FlashLightModel\r
* Create: 2025-04-24\r
*/\r
-#include "flashlight/FlashLightModel.h"\r
+\r
#ifdef BUILD_IN_LINUX\r
#include "localtime.h"\r
#endif\r
+#include "flashlight/FlashLightModel.h"\r
\r
namespace OHOS {\r
-static const uint32_t TIME_DISPLAY_NUM = 10;\r
+static constexpr uint32_t TIME_DISPLAY_NUM = 10;\r
FlashLightModel::FlashLightModel(FlashLightColorAttribute color, FlashLightBlinkFrequency blinkFrequency)\r
{\r
color_ = color;\r
return instance;\r
}\r
\r
-FlashLightColorAttribute FlashLightModel::GetViewColor()\r
+FlashLightColorAttribute FlashLightModel::GetViewColorId()\r
{\r
return color_;\r
}\r
\r
-void FlashLightModel::SetViewColor(FlashLightColorAttribute color)\r
+void FlashLightModel::SetViewColorId(FlashLightColorAttribute color)\r
{\r
color_ = color;\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: FlashLightPage\r
* Create: 2025-04-24\r
*/\r
+\r
#include <string>\r
-#include "flashlight/FlashLightPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "flashlight/FlashLightModel.h"\r
#include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
#include "AppViewIDs.h"\r
#include "wearable_log.h"\r
#include "main/LoadImg.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "ui_resource_flashlight.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightPage.h"\r
\r
namespace OHOS {\r
-static const uint16_t SWITCH_BUTTON_POS_X = 168;\r
-static const uint16_t SWITCH_BUTTON_POS_Y = 168;\r
-static const uint16_t SWITCH_BUTTON_WIDTH = 119;\r
-static const uint16_t SWITCH_BUTTON_HEIGHT = 119;\r
-static const uint16_t SWITCH_LABEL_POS_X = 168;\r
-static const uint16_t SWITCH_LABEL_POS_Y = 308;\r
-static const uint16_t SWITCH_LABEL_WIDTH = 128;\r
-static const uint16_t SWITCH_LABEL_HEIGHT = 46;\r
-static const uint16_t SWITCH_LABEL_FONT_SIZE = 32;\r
-static const uint16_t TIME_LABEL_FONT_SIZE = 38;\r
-static const uint16_t IMAGE_VIEW_POS_X = 213;\r
-static const uint16_t IMAGE_VIEW_POS_Y = 414;\r
-static const uint16_t TIME_TEXT_POS_X = 151;\r
-static const uint16_t TIME_TEXT_POS_Y = 31;\r
-static const uint16_t TIME_TEXT_WIDTH = 153;\r
-static const uint16_t TIME_TEXT_HEIGHT = 53;\r
-static const uint16_t Y_OFFSET = 300;\r
-static const std::string SWITCH_BUTTON_ID = "switch";\r
+static constexpr uint16_t SWITCH_BUTTON_POS_X = 168;\r
+static constexpr uint16_t SWITCH_BUTTON_POS_Y = 168;\r
+static constexpr uint16_t SWITCH_BUTTON_WIDTH = 119;\r
+static constexpr uint16_t SWITCH_BUTTON_HEIGHT = 119;\r
+static constexpr uint16_t SWITCH_LABEL_POS_X = 168;\r
+static constexpr uint16_t SWITCH_LABEL_POS_Y = 308;\r
+static constexpr uint16_t SWITCH_LABEL_WIDTH = 128;\r
+static constexpr uint16_t SWITCH_LABEL_HEIGHT = 46;\r
+static constexpr uint16_t SWITCH_LABEL_FONT_SIZE = 32;\r
+static constexpr uint16_t TIME_LABEL_FONT_SIZE = 38;\r
+static constexpr uint16_t IMAGE_VIEW_POS_X = 213;\r
+static constexpr uint16_t IMAGE_VIEW_POS_Y = 414;\r
+static constexpr uint16_t TIME_TEXT_POS_X = 151;\r
+static constexpr uint16_t TIME_TEXT_POS_Y = 31;\r
+static constexpr uint16_t TIME_TEXT_WIDTH = 153;\r
+static constexpr uint16_t TIME_TEXT_HEIGHT = 53;\r
+static constexpr uint16_t Y_OFFSET = 300;\r
+static constexpr char *SWITCH_BUTTON_ID = "switch";\r
\r
-REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW, FlashLightPage, true);\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_VIEW, FlashLightPage, true);\r
void FlashLightPage::OnStart(void *data)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnStart");\r
if (container_ == nullptr) {\r
container_ = new UIScrollView();\r
container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
}\r
\r
- if (OnLabel_ == nullptr) {\r
- OnLabel_ = new UILabel();\r
- }\r
- OnLabel_->SetPosition(SWITCH_LABEL_POS_X, SWITCH_LABEL_POS_Y, SWITCH_LABEL_WIDTH, SWITCH_LABEL_HEIGHT);\r
- OnLabel_->SetText("点击照明");\r
- OnLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- OnLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SWITCH_LABEL_FONT_SIZE);\r
- OnLabel_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
- OnLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- OnLabel_->SetVisible(true);\r
- container_->Add(OnLabel_);\r
+ if (tipsLabel_ == nullptr) {\r
+ tipsLabel_ = new UILabel();\r
+ }\r
+ tipsLabel_->SetPosition(SWITCH_LABEL_POS_X, SWITCH_LABEL_POS_Y, SWITCH_LABEL_WIDTH, SWITCH_LABEL_HEIGHT);\r
+ tipsLabel_->SetText("点击照明");\r
+ tipsLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ tipsLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SWITCH_LABEL_FONT_SIZE);\r
+ tipsLabel_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+ tipsLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ tipsLabel_->SetVisible(true);\r
+ container_->Add(tipsLabel_);\r
\r
- if (flashLightOn_ == nullptr) {\r
- flashLightOn_ = new UILabelButton();\r
- }\r
- flashLightOn_->SetPosition(SWITCH_BUTTON_POS_X, SWITCH_BUTTON_POS_Y, SWITCH_BUTTON_WIDTH, SWITCH_BUTTON_HEIGHT);\r
- flashLightOn_->SetViewId(SWITCH_BUTTON_ID.c_str());\r
- flashLightOn_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- flashLightOn_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
- LOADIMG::LoadBtnImage(flashLightOn_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_FLASHLIGHTON,\r
- IMAGE_CONVERTER_TOOL_FLASHLIGHTON);\r
- flashLightOn_->SetVisible(true);\r
- container_->Add(flashLightOn_);\r
+ if (flashLightButtonOn_ == nullptr) {\r
+ flashLightButtonOn_ = new UILabelButton();\r
+ }\r
+ flashLightButtonOn_->SetPosition(SWITCH_BUTTON_POS_X, SWITCH_BUTTON_POS_Y,\r
+ SWITCH_BUTTON_WIDTH, SWITCH_BUTTON_HEIGHT);\r
+ flashLightButtonOn_->SetViewId(SWITCH_BUTTON_ID);\r
+ flashLightButtonOn_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ flashLightButtonOn_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ LOADIMG::LoadBtnImage(flashLightButtonOn_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_FLASHLIGHTON,\r
+ IMAGE_FLASHLIGHT_FLASHLIGHTON);\r
+ flashLightButtonOn_->SetVisible(true);\r
+ container_->Add(flashLightButtonOn_);\r
\r
// 创建时间显示组件\r
if (systemTime_ == nullptr) {\r
}\r
timeAnimator_->Start();\r
\r
- // Add ImageView to App\r
if (imageArrow_ == nullptr) {\r
imageArrow_ = new UIImageView();\r
}\r
imageArrow_->SetPosition(IMAGE_VIEW_POS_X, IMAGE_VIEW_POS_Y);\r
container_->Add(imageArrow_);\r
imageArrow_->SetVisible(true);\r
- LOADIMG::LoadImageViewImg(imageArrow_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_DOWNARROW);\r
+ LOADIMG::LoadImageViewImg(imageArrow_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_DOWNARROW);\r
\r
- flashLightOn_->SetOnClickListener(this);\r
+ flashLightButtonOn_->SetOnClickListener(this);\r
container_->SetOnDragListener(this);\r
AddViewToPageContainer(container_);\r
}\r
\r
+FlashLightPage::FlashLightPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::FlashLightPage");\r
+}\r
+\r
FlashLightPage::~FlashLightPage()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::~FlashLightPage");\r
- if (timeAnimator_ != nullptr) {\r
- timeAnimator_->Stop();\r
- }\r
if (container_ != nullptr) {\r
container_->RemoveAll();\r
delete container_;\r
container_ = nullptr;\r
}\r
- if (flashLightOn_ != nullptr) {\r
- delete flashLightOn_;\r
- flashLightOn_ = nullptr;\r
+ if (flashLightButtonOn_ != nullptr) {\r
+ delete flashLightButtonOn_;\r
+ flashLightButtonOn_ = nullptr;\r
}\r
if (systemTime_ != nullptr) {\r
delete systemTime_;\r
systemTime_ = nullptr;\r
}\r
+ if (tipsLabel_ != nullptr) {\r
+ delete tipsLabel_;\r
+ tipsLabel_ = nullptr;\r
+ }\r
if (imageArrow_ != nullptr) {\r
delete imageArrow_;\r
imageArrow_ = nullptr;\r
}\r
- if (timeAnimator_ != nullptr) {\r
- delete timeAnimator_;\r
- timeAnimator_ = nullptr;\r
- }\r
if (timeCallback_ != nullptr) {\r
delete timeCallback_;\r
timeCallback_ = nullptr;\r
}\r
+ if (timeAnimator_ != nullptr) {\r
+ delete timeAnimator_;\r
+ timeAnimator_ = nullptr;\r
+ }\r
ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::~FlashLightPage");\r
}\r
\r
bool FlashLightPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
} else if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) &&\r
(event.GetStartPoint().y > Y_OFFSET)) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
}\r
\r
bool FlashLightPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
- std::string viewId = view.GetViewId();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnClick [%s]", viewId.c_str());\r
- if (viewId == SWITCH_BUTTON_ID) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
- } else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnClick [Invalid]");\r
- }\r
- return false;\r
+ if (strcmp(view.GetViewId(), SWITCH_BUTTON_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_PLAY_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
}\r
\r
void FlashLightPage::TimeAnimatorCallback::Callback(UIView *view)\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: FlashLightPlayPage\r
* Create: 2025-04-24\r
*/\r
\r
-#include "flashlight/FlashLightPlayPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
#include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
#include "wearable_log.h"\r
#include "AppViewIDs.h"\r
#include "NativeAbility.h"\r
#include "main/LoadImg.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightPlayPage.h"\r
\r
namespace OHOS {\r
-static const uint32_t FLASHLIGHT_PAGE_RES[10] = {\r
- IMAGE_CONVERTER_TOOL_PLAYBLACKPAGE, IMAGE_CONVERTER_TOOL_PLAY1PAGE, IMAGE_CONVERTER_TOOL_PLAY2PAGE,\r
- IMAGE_CONVERTER_TOOL_PLAY3PAGE, IMAGE_CONVERTER_TOOL_PLAY4PAGE, IMAGE_CONVERTER_TOOL_PLAY5PAGE,\r
- IMAGE_CONVERTER_TOOL_PLAY6PAGE, IMAGE_CONVERTER_TOOL_PLAY7PAGE, IMAGE_CONVERTER_TOOL_PLAY8PAGE,\r
- IMAGE_CONVERTER_TOOL_PLAY9PAGE,\r
+static constexpr uint32_t g_flashLightPageRes[] = {\r
+ IMAGE_FLASHLIGHT_PLAY_BLACK_PAGE, IMAGE_FLASHLIGHT_PLAY_WHITE_PAGE, IMAGE_FLASHLIGHT_PLAY_RED_PAGE,\r
+ IMAGE_FLASHLIGHT_PLAY_ORANGE_PAGE, IMAGE_FLASHLIGHT_PLAY_YELLOW_PAGE, IMAGE_FLASHLIGHT_PLAY_GREEN_PAGE,\r
+ IMAGE_FLASHLIGHT_PLAY_LIGHT_BLUE_PAGE, IMAGE_FLASHLIGHT_PLAY_DARK_BLUE_PAGE, IMAGE_FLASHLIGHT_PLAY_PURPLE_PAGE,\r
+ IMAGE_FLASHLIGHT_PLAY_MULTI_PAGE,\r
};\r
-static const uint32_t FLASHLIGHT_BLINK_FREQ[3] = {500, 100, 0};\r
-static const uint32_t IMAGE_NUM = 2;\r
-static const std::string PLAY_VIEW_ID = "flashLightPlayPage";\r
+static constexpr uint32_t g_flashLightBlinkFreq[] = {500, 100, 0};\r
+static constexpr char *PLAY_VIEW_ID = "flashLightPlayPage";\r
\r
REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW, FlashLightPlayPage, false);\r
void FlashLightPlayPage::OnStart(void *data)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::OnStart");\r
if (container_ == nullptr) {\r
container_ = new UIScrollView();\r
container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
- container_->SetViewId(PLAY_VIEW_ID.c_str());\r
+ container_->SetViewId(PLAY_VIEW_ID);\r
}\r
- uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+ uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColorId();\r
uint16_t blinkIndex = (uint16_t)FlashLightModel::GetInstance().GetBlinkFrequency();\r
- if (playImageAnimal == nullptr) {\r
- playImageAnimal = new UIImageAnimatorView();\r
+ if (playImageAnimal_ == nullptr) {\r
+ playImageAnimal_ = new UIImageAnimatorView();\r
}\r
- playImageInfo[0].imageInfo =\r
- ImageCacheManager::GetInstance().LoadOneInMultiRes(FLASHLIGHT_PAGE_RES[colorIndex], FLASHLIGHT_IMAGE);\r
- playImageInfo[0].imageType = IMG_SRC_IMAGE_INFO;\r
- playImageInfo[0].pos.x = 0;\r
- playImageInfo[0].pos.y = 0;\r
- playImageInfo[0].width = HORIZONTAL_RESOLUTION;\r
- playImageInfo[0].height = VERTICAL_RESOLUTION;\r
- playImageInfo[1].imageInfo =\r
- ImageCacheManager::GetInstance().LoadOneInMultiRes(FLASHLIGHT_PAGE_RES[0], FLASHLIGHT_IMAGE);\r
- playImageInfo[1].imageType = IMG_SRC_IMAGE_INFO;\r
- playImageInfo[1].pos.x = 0;\r
- playImageInfo[1].pos.y = 0;\r
- playImageInfo[1].width = HORIZONTAL_RESOLUTION;\r
- playImageInfo[1].height = VERTICAL_RESOLUTION;\r
- playImageAnimal->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
- playImageAnimal->SetImageAnimatorSrc(playImageInfo, IMAGE_NUM, FLASHLIGHT_BLINK_FREQ[blinkIndex]);\r
- playImageAnimal->SetRepeat(true);\r
- playImageAnimal->SetAutoEnable(false);\r
- playImageAnimal->SetResizeMode(UIImageView::FILL);\r
- container_->Add(playImageAnimal);\r
+ playImageInfo_[0].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_flashLightPageRes[colorIndex], FLASHLIGHT_IMAGE);\r
+ playImageInfo_[0].imageType = IMG_SRC_IMAGE_INFO;\r
+ playImageInfo_[0].pos.x = 0;\r
+ playImageInfo_[0].pos.y = 0;\r
+ playImageInfo_[0].width = HORIZONTAL_RESOLUTION;\r
+ playImageInfo_[0].height = VERTICAL_RESOLUTION;\r
+ playImageInfo_[1].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_flashLightPageRes[0], FLASHLIGHT_IMAGE);\r
+ playImageInfo_[1].imageType = IMG_SRC_IMAGE_INFO;\r
+ playImageInfo_[1].pos.x = 0;\r
+ playImageInfo_[1].pos.y = 0;\r
+ playImageInfo_[1].width = HORIZONTAL_RESOLUTION;\r
+ playImageInfo_[1].height = VERTICAL_RESOLUTION;\r
+ playImageAnimal_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ playImageAnimal_->SetImageAnimatorSrc(playImageInfo_, IMAGE_NUM, g_flashLightBlinkFreq[blinkIndex]);\r
+ playImageAnimal_->SetRepeat(true);\r
+ playImageAnimal_->SetAutoEnable(false);\r
+ playImageAnimal_->SetResizeMode(UIImageView::FILL);\r
+ container_->Add(playImageAnimal_);\r
\r
- playImageAnimal->Start();\r
+ playImageAnimal_->Start();\r
container_->SetOnDragListener(this);\r
container_->SetOnClickListener(this);\r
AddViewToPageContainer(container_);\r
}\r
\r
+FlashLightPlayPage::FlashLightPlayPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::FlashLightPlayPage");\r
+}\r
+\r
FlashLightPlayPage::~FlashLightPlayPage()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::~FlashLightPlayPage");\r
if (container_ != nullptr) {\r
container_->RemoveAll();\r
delete container_;\r
container_ = nullptr;\r
}\r
- if (playImageAnimal != nullptr) {\r
- playImageAnimal->Stop();\r
- delete playImageAnimal;\r
- playImageAnimal = nullptr;\r
+ if (playImageAnimal_ != nullptr) {\r
+ playImageAnimal_->Stop();\r
+ delete playImageAnimal_;\r
+ playImageAnimal_ = nullptr;\r
}\r
ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::~FlashLightPlayPage");\r
}\r
\r
bool FlashLightPlayPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- std::string id = view.GetViewId();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag [%s]", id.c_str());\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
}\r
- return false;\r
+ return true;\r
}\r
\r
bool FlashLightPlayPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
- std::string viewId = view.GetViewId();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::OnClick [%s]", viewId.c_str());\r
- if (viewId == PLAY_VIEW_ID) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW);\r
+ if (strcmp(view.GetViewId(), PLAY_VIEW_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
}\r
}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: FlashLightPresenter\r
* Create: 2025-04-24\r
*/\r
#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
-REGIST_MENU(VIEW_FLASHLIGHT, FlashLightView, FlashLightPresenter, FLASHLIGHT_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG,\r
- "手电筒");\r
+REGIST_MENU(VIEW_FLASHLIGHT, FlashLightView, FlashLightPresenter, FLASHLIGHT_ICON, FLASHLIGHT_ICON, "手电筒");\r
}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightRecoverPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "SlicePageFactory.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_flashlight.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightRecoverPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t RECOVER_LABEL_POS_X = 15;\r
+static constexpr uint16_t RECOVER_LABEL_POS_Y = 185;\r
+static constexpr uint16_t RECOVER_LABEL_WIDTH = 424;\r
+static constexpr uint16_t RECOVER_LABEL_HEIGHT = 50;\r
+static constexpr uint16_t RECOVER_LABEL_FONT_SIZE = 36;\r
+static constexpr uint16_t CANCLE_BUTTON_POS_X = 115;\r
+static constexpr uint16_t CANCLE_BUTTON_POS_Y = 300;\r
+static constexpr uint16_t CONFIRM_BUTTON_POS_X = 255;\r
+static constexpr uint16_t CONFIRM_BUTTON_POS_Y = 300;\r
+static constexpr uint16_t CANCLE_BUTTON_WIDTH = 85;\r
+static constexpr uint16_t CANCLE_BUTTON_HEIGHT = 85;\r
+static constexpr char *CANCLE_BUTTON_ID = "cancle";\r
+static constexpr char *CONFIRM_BUTTON_ID = "confirm";\r
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_RECOVER_VIEW, FlashLightRecoverPage, false);\r
+void FlashLightRecoverPage::OnStart(void *data)\r
+{\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ }\r
+\r
+ if (recoverLabel_ == nullptr) {\r
+ recoverLabel_ = new UILabel();\r
+ }\r
+ recoverLabel_->SetPosition(RECOVER_LABEL_POS_X, RECOVER_LABEL_POS_Y, RECOVER_LABEL_WIDTH, RECOVER_LABEL_HEIGHT);\r
+ recoverLabel_->SetText("是否恢复默认设置");\r
+ recoverLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ recoverLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ recoverLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, RECOVER_LABEL_FONT_SIZE);\r
+ // Add to rootView\r
+ container_->Add(recoverLabel_);\r
+ recoverLabel_->SetVisible(true);\r
+\r
+ if (cancelButton_ == nullptr) {\r
+ cancelButton_ = new UILabelButtonExt();\r
+ }\r
+ cancelButton_->SetPosition(CANCLE_BUTTON_POS_X, CANCLE_BUTTON_POS_Y, CANCLE_BUTTON_WIDTH, CANCLE_BUTTON_HEIGHT);\r
+ cancelButton_->SetViewId(CANCLE_BUTTON_ID);\r
+ LOADIMG::LoadBtnImage(cancelButton_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_RECOVERCANCLE,\r
+ IMAGE_FLASHLIGHT_RECOVERCANCLE);\r
+ cancelButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ cancelButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ container_->Add(cancelButton_);\r
+ cancelButton_->SetVisible(true);\r
+\r
+ if (confirmButton_ == nullptr) {\r
+ confirmButton_ = new UILabelButtonExt();\r
+ }\r
+ confirmButton_->SetPosition(CONFIRM_BUTTON_POS_X, CONFIRM_BUTTON_POS_Y, CANCLE_BUTTON_WIDTH, CANCLE_BUTTON_HEIGHT);\r
+ confirmButton_->SetViewId(CONFIRM_BUTTON_ID);\r
+ LOADIMG::LoadBtnImage(confirmButton_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_RECOVERCONFIRM,\r
+ IMAGE_FLASHLIGHT_RECOVERCONFIRM);\r
+ confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ container_->Add(confirmButton_);\r
+ confirmButton_->SetVisible(true);\r
+\r
+ // 设置界面组件回调函数\r
+ container_->SetOnDragListener(this);\r
+ cancelButton_->SetOnClickListener(this);\r
+ confirmButton_->SetOnClickListener(this);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightRecoverPage::FlashLightRecoverPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightRecoverPage::FlashLightRecoverPage");\r
+}\r
+\r
+FlashLightRecoverPage::~FlashLightRecoverPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightRecoverPage::~FlashLightRecoverPage");\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (recoverLabel_ != nullptr) {\r
+ delete recoverLabel_;\r
+ recoverLabel_ = nullptr;\r
+ }\r
+ if (cancelButton_ != nullptr) {\r
+ delete cancelButton_;\r
+ cancelButton_ = nullptr;\r
+ }\r
+ if (confirmButton_ != nullptr) {\r
+ delete confirmButton_;\r
+ confirmButton_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+bool FlashLightRecoverPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool FlashLightRecoverPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), CONFIRM_BUTTON_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ FlashLightModel::GetInstance().SetDefault();\r
+ } else if (strcmp(view.GetViewId(), CANCLE_BUTTON_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_SET_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: FlashLightSetItemView\r
* Create: 2025-02-15\r
*/\r
\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "flashlight/FlashLightSetItemView.h"\r
#include "screensetting/ScreenModels.h"\r
#include "main/LoadImg.h"\r
#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
\r
namespace OHOS {\r
static constexpr uint16_t ITEM_X = 0;\r
FlashLightSetItemView::FlashLightSetItemView()\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetItemView");\r
- SetPosition(ITEM_X, ITEM_Y, ITEM_W, ITEM_H);\r
- SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
- SetTouchable(true);\r
-\r
- sIcon.SetPosition(ICON_X, ICON_Y);\r
- sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ sIcon_.SetPosition(ICON_X, ICON_Y);\r
+ sIcon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
\r
- sLabel.SetPosition(LABEL_X, LABEL_Y);\r
- sLabel.Resize(LABEL_W, LABEL_H);\r
- sLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
- sLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
- sLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- sLabel.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- sLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- sLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ sLabel_.SetPosition(LABEL_X, LABEL_Y);\r
+ sLabel_.Resize(LABEL_W, LABEL_H);\r
+ sLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ sLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ sLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ sLabel_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
\r
- itemLabel.SetPosition(ITEM_LABEL_X, ITEM_LABEL_Y);\r
- itemLabel.Resize(ITEM_LABEL_W, ITEM_LABEL_H);\r
- itemLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_LABEL_FONT);\r
- itemLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
- itemLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- itemLabel.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
- itemLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- itemLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ itemLabel_.SetPosition(ITEM_LABEL_X, ITEM_LABEL_Y);\r
+ itemLabel_.Resize(ITEM_LABEL_W, ITEM_LABEL_H);\r
+ itemLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_LABEL_FONT);\r
+ itemLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ itemLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ itemLabel_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ itemLabel_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ itemLabel_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
\r
- sNextImage.SetPosition(IMAGE_X, IMAGE_Y);\r
- sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
- LOADIMG::LoadImageViewImg(&sNextImage, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RIGHTARROW);\r
+ sNextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+ sNextImage_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(&sNextImage_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_RIGHTARROW);\r
\r
- Add(&sIcon);\r
- Add(&sLabel);\r
- Add(&itemLabel);\r
- Add(&sNextImage);\r
+ Add(&sIcon_);\r
+ Add(&sLabel_);\r
+ Add(&itemLabel_);\r
+ Add(&sNextImage_);\r
}\r
\r
FlashLightSetItemView::~FlashLightSetItemView()\r
{\r
- Remove(&sIcon);\r
- Remove(&sLabel);\r
- Remove(&itemLabel);\r
- Remove(&sNextImage);\r
+ Remove(&sIcon_);\r
+ Remove(&sLabel_);\r
+ Remove(&itemLabel_);\r
+ Remove(&sNextImage_);\r
ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
}\r
\r
void FlashLightSetItemView::SetItemInfo(const FlashLightSetItem itemInfo)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetItemView::SetItemInfo %[s]", itemInfo.viewId.c_str());\r
- sItemInfo = itemInfo;\r
- sLabel.SetText(itemInfo.label.c_str());\r
- itemLabel.SetText(itemInfo.itemLabel.c_str());\r
- LOADIMG::LoadImageViewImg(&sIcon, FLASHLIGHT_IMAGE, itemInfo.resId);\r
-}\r
-\r
-const char *FlashLightSetItemView::GetViewId() const\r
-{\r
- return sItemInfo.viewId.c_str();\r
+ itemInfo_ = itemInfo;\r
+ sLabel_.SetText(itemInfo.label.c_str());\r
+ itemLabel_.SetText(itemInfo.itemLabel.c_str());\r
+ SetViewId(itemInfo_.viewId.c_str());\r
+ LOADIMG::LoadImageViewImg(&sIcon_, FLASHLIGHT_IMAGE, itemInfo.resId);\r
}\r
}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: FlashLightSetPage\r
* Create: 2025-04-24\r
*/\r
\r
-#include "flashlight/FlashLightSetPage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "SlicePageFactory.h"\r
-#include "flashlight/FlashLightView.h"\r
-#include "flashlight/FlashLightModel.h"\r
#include "AppViewIDs.h"\r
#include "wearable_log.h"\r
#include "NativeAbility.h"\r
-#include <iostream>\r
#include "main/LoadImg.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightSetPage.h"\r
\r
namespace OHOS {\r
+static constexpr uint16_t SET_LABEL_POS_X = 117;\r
+static constexpr uint16_t SET_LABEL_POS_Y = 31;\r
+static constexpr uint16_t SET_LABEL_WIDTH = 220;\r
+static constexpr uint16_t SET_LABEL_HEIGHT = 53;\r
+static constexpr uint16_t SET_LABEL_FONT_SIZE = 38;\r
+static constexpr uint16_t SET_LIST_POS_X = 59;\r
+static constexpr uint16_t SET_LIST_POS_Y = 127;\r
+static constexpr uint16_t SET_LIST_WIDTH = 340;\r
+static constexpr uint16_t SET_LIST_HEIGHT = 244;\r
+static constexpr uint16_t RECOVER_BUTTON_POS_X = 120;\r
+static constexpr uint16_t RECOVER_BUTTON_POS_Y = 408;\r
+static constexpr uint16_t RECOVER_BUTTON_WIDTH = 220;\r
+static constexpr uint16_t RECOVER_BUTTON_HEIGHT = 80;\r
+static constexpr uint16_t RECOVER_BUTTON_FONT_SIZE = 36;\r
+static constexpr uint16_t CONTAINER_BLANK_SIZE = 100;\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 340;\r
+static constexpr uint16_t ITEM_H = 122;\r
+static constexpr char *COLOR__BUTTON_ID = "setColorItem";\r
+static constexpr char *BLINK_BUTTON_ID = "setBlinkItem";\r
+static constexpr char *RECOVER_BUTTON_ID = "recoverDefault";\r
+static std::string g_blinkItemContent[] = {"慢", "快", "不闪烁"};\r
+static std::string g_colorItemContent[] = {"黑色", "白色", "红色", "橙色", "黄色",\r
+ "绿色", "浅蓝色", "深蓝色", "紫色", "彩色"};\r
+static FlashLightSetItem g_listItem[] = {\r
+ {IMAGE_FLASHLIGHT_COLORITEM, "灯光颜色", "", ""},\r
+ {IMAGE_FLASHLIGHT_BLINKITEM, "闪烁频率", "", ""}\r
+};\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW, FlashLightSetPage, false);\r
+static FlashLightSetPage *g_pFlashLightSetPage = nullptr;\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+ FlashLightSetItemView* item = new FlashLightSetItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
\r
-static const uint16_t SET_LABEL_POS_X = 117;\r
-static const uint16_t SET_LABEL_POS_Y = 31;\r
-static const uint16_t SET_LABEL_WIDTH = 220;\r
-static const uint16_t SET_LABEL_HEIGHT = 53;\r
-static const uint16_t SET_LABEL_FONT_SIZE = 38;\r
-static const uint16_t SET_LIST_POS_X = 59;\r
-static const uint16_t SET_LIST_POS_Y = 127;\r
-static const uint16_t SET_LIST_WIDTH = 340;\r
-static const uint16_t SET_LIST_HEIGHT = 244;\r
-static const uint16_t RECOVER_BUTTON_POS_X = 120;\r
-static const uint16_t RECOVER_BUTTON_POS_Y = 408;\r
-static const uint16_t RECOVER_BUTTON_WIDTH = 220;\r
-static const uint16_t RECOVER_BUTTON_HEIGHT = 80;\r
-static const uint16_t RECOVER_BUTTON_FONT_SIZE = 36;\r
-static const uint16_t CONTAINER_BLANK_SIZE = 100;\r
-static const std::string COLOR__BUTTON_ID = "setColorItem";\r
-static const std::string BLINK_BUTTON_ID = "setBlinkItem";\r
-static const std::string RECOVER_BUTTON_ID = "recoverDefault";\r
-static std::string BLINK_ITEM_CONTENT[3] = {"慢", "快", "不闪烁"};\r
-static std::string COLOR_ITEM_CONTENT[10] = {"黑色", "白色", "红色", "橙色", "黄色",\r
- "绿色", "浅蓝色", "深蓝色", "紫色", "彩色"};\r
+ item->SetPosition(ITEM_X, ITEM_Y, ITEM_W, ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_pFlashLightSetPage);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ FlashLightSetItemView* item = dynamic_cast<FlashLightSetItemView*>(view);\r
+ if (view == nullptr || data == nullptr || item == nullptr) {\r
+ return;\r
+ }\r
+ FlashLightSetItem* content = static_cast<FlashLightSetItem *>(data);\r
+ item->SetItemInfo(*content);\r
+}\r
\r
-REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW, FlashLightSetPage, false);\r
void FlashLightSetPage::OnStart(void *data)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnStart");\r
+ g_pFlashLightSetPage = this;\r
if (container_ == nullptr) {\r
container_ = new UIScrollView();\r
container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
}\r
\r
- if (setLabel_ == nullptr) {\r
- setLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ titleLabel_ = new UILabel();\r
}\r
- setLabel_->SetPosition(SET_LABEL_POS_X, SET_LABEL_POS_Y, SET_LABEL_WIDTH, SET_LABEL_HEIGHT);\r
- setLabel_->SetText("手电筒设置");\r
- setLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- setLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- setLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SET_LABEL_FONT_SIZE);\r
- container_->Add(setLabel_);\r
- setLabel_->SetVisible(true);\r
+ titleLabel_->SetPosition(SET_LABEL_POS_X, SET_LABEL_POS_Y, SET_LABEL_WIDTH, SET_LABEL_HEIGHT);\r
+ titleLabel_->SetText("手电筒设置");\r
+ titleLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SET_LABEL_FONT_SIZE);\r
+ container_->Add(titleLabel_);\r
+ titleLabel_->SetVisible(true);\r
\r
if (setItemList_ == nullptr) {\r
- setItemList_ = new UIList();\r
+ setItemList_ = new UISimpleList();\r
}\r
setItemList_->SetPosition(SET_LIST_POS_X, SET_LIST_POS_Y, SET_LIST_WIDTH, SET_LIST_HEIGHT);\r
setItemList_->SetLoopState(false);\r
setItemList_->EnableAutoAlign(true);\r
- if (setItemAdapter_ == nullptr) {\r
- setItemAdapter_ = new FlashLightSetItemAdapter();\r
- }\r
- uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+ setItemList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ setItemList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+ uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColorId();\r
uint16_t blinkIndex = (uint16_t)FlashLightModel::GetInstance().GetBlinkFrequency();\r
- colorItem_.itemLabel = COLOR_ITEM_CONTENT[colorIndex];\r
- colorItem_.viewId = COLOR__BUTTON_ID;\r
- blinkItem_.itemLabel = BLINK_ITEM_CONTENT[blinkIndex];\r
- blinkItem_.viewId = BLINK_BUTTON_ID;\r
- setItemAdapter_->AddListItem(colorItem_);\r
- setItemAdapter_->AddListItem(blinkItem_);\r
- setItemAdapter_->SetItemClickListener(this);\r
- setItemList_->SetAdapter(setItemAdapter_);\r
+\r
+ g_listItem[0].itemLabel = g_colorItemContent[colorIndex];\r
+ g_listItem[0].viewId = COLOR__BUTTON_ID;\r
+ g_listItem[1].itemLabel = g_blinkItemContent[blinkIndex];\r
+ g_listItem[1].viewId = BLINK_BUTTON_ID;\r
+\r
+ for (uint8_t i = 0; i < (sizeof(g_listItem) / sizeof(FlashLightSetItem)); ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.data = reinterpret_cast<void *>(&g_listItem[i]);\r
+ setItemList_->AddContent(content);\r
+ }\r
+ setItemList_->RefreshList();\r
+\r
container_->Add(setItemList_);\r
setItemList_->SetVisible(true);\r
\r
}\r
recoverButton_->SetPosition(RECOVER_BUTTON_POS_X, RECOVER_BUTTON_POS_Y, RECOVER_BUTTON_WIDTH,\r
RECOVER_BUTTON_HEIGHT);\r
- recoverButton_->SetViewId(RECOVER_BUTTON_ID.c_str());\r
+ recoverButton_->SetViewId(RECOVER_BUTTON_ID);\r
recoverButton_->SetText("恢复默认\n");\r
recoverButton_->SetTextColor(Color::Red());\r
recoverButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
recoverButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, RECOVER_BUTTON_FONT_SIZE);\r
- LOADIMG::LoadBtnImage(recoverButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RECOVERBUTTON,\r
- IMAGE_CONVERTER_TOOL_RECOVERBUTTON);\r
+ LOADIMG::LoadBtnImage(recoverButton_, FLASHLIGHT_IMAGE, IMAGE_FLASHLIGHT_RECOVERBUTTON,\r
+ IMAGE_FLASHLIGHT_RECOVERBUTTON);\r
recoverButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
recoverButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
container_->Add(recoverButton_);\r
AddViewToPageContainer(container_);\r
}\r
\r
+FlashLightSetPage::FlashLightSetPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::FlashLightSetPage");\r
+}\r
+\r
FlashLightSetPage::~FlashLightSetPage()\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::~FlashLightSetPage");\r
delete container_;\r
container_ = nullptr;\r
}\r
- if (setLabel_ != nullptr) {\r
- delete setLabel_;\r
- setLabel_ = nullptr;\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
}\r
if (recoverButton_ != nullptr) {\r
delete recoverButton_;\r
recoverButton_ = nullptr;\r
}\r
if (setItemList_ != nullptr) {\r
+ setItemList_->ClearAll();\r
delete setItemList_;\r
setItemList_ = nullptr;\r
}\r
- if (setItemAdapter_ != nullptr) {\r
- delete setItemAdapter_;\r
- setItemAdapter_ = nullptr;\r
- }\r
ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
}\r
\r
bool FlashLightSetPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
}\r
\r
bool FlashLightSetPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
- uint8_t viewType = view.GetViewType();\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnClick [%d]", viewType);\r
- if (viewType == UIViewType::UI_VIEW_GROUP) {\r
- FlashLightSetItemView *itemView = static_cast<FlashLightSetItemView *>(&view);\r
- std::string viewId = itemView->GetViewId();\r
- if (viewId == COLOR__BUTTON_ID) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_COLOR_VIEW);\r
- } else if (viewId == BLINK_BUTTON_ID) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_BLINK_VIEW);\r
- }\r
- } else if (viewType == UIViewType::UI_LABEL_BUTTON_EXT && view.GetViewId() == RECOVER_BUTTON_ID) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_DEFAULT_VIEW);\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnClick [Invalid]");\r
+ if (strcmp(view.GetViewId(), COLOR__BUTTON_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_COLOR_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), BLINK_BUTTON_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_BLINK_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), RECOVER_BUTTON_ID) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(FlashLightAllView::FLASH_LIGHT_RECOVER_VIEW,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
+}\r
}\r
-}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateMainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <chrono>\r
+#include <sstream>\r
+#include <string>\r
+#include <iomanip>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_heartRate.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+#include "heartrate/HeartRateView.h"\r
+#include "heartrate/HeartRateModel.h"\r
+#include "heartrate/HeartRateMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEART_BUTTON_POSITION_X = 116;\r
+static constexpr uint16_t HEART_BUTTON_HEIGHT = 76;\r
+static constexpr uint16_t HEART_TITLE_POSITION_X = 195;\r
+static constexpr uint16_t HEART_TITLE_POSITION_Y = 40;\r
+static constexpr uint16_t HEART_TITLE_WIDTH = 260;\r
+static constexpr uint16_t HEART_TITLE_HEIGHT = 53;\r
+static constexpr uint16_t HEART_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t HEART_BUTTON_TWO_POSITION_Y = 330;\r
+static constexpr uint16_t HEART_BUTTON_TWO_WIDTH = 232;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_X = 138;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_Y = 281;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH_ONE = 250;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT_ONE = 36;\r
+static constexpr uint16_t HEART_RATE_LIMIT_FONT_SIZE_TWO = 24;\r
+static constexpr uint16_t VIDEO_WIDTH = 454;\r
+static constexpr uint16_t VIDEO_HEIGHT = 454;\r
+static constexpr uint16_t STRIDE_ALIGNMENT_VALUE = 128;\r
+static constexpr uint16_t BUFFER_QUEUE_SIZE = 3;\r
+static constexpr uint16_t JPEG_HEIGHT_DIVISOR = 2;\r
+static constexpr uint16_t JPEG_WIDTH_BYTE_ALIGNMENT = 128;\r
+static constexpr uint16_t JPEG_HEIGHT_BYTE_ALIGNMENT = 16;\r
+static constexpr uint16_t HEART_BUTTON_FONT_SIZE = 35;\r
+static constexpr uint16_t HEART_DATE_TIME_ONE = 90;\r
+static constexpr uint16_t HEART_DATE_TIME_TWO = 3000;\r
+static constexpr uint16_t HEART_DATE_TIME_THREE = 60;\r
+static constexpr uint16_t HEART_DATE_TIME_FOUR = 3600;\r
+static constexpr uint16_t HEART_DATE_MAX = 454;\r
+static constexpr uint16_t HEART_DATE_WIDTH = 2;\r
+static constexpr char *HEART_START_BUTTON = "startButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_HEARTRATE, HeartRateAllView::HEARTRATE_MAIN_PAGE, HeartRateMainPage, true);\r
+\r
+HeartRateMainPage::HeartRateMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateMainPage::HeartRateMainPage");\r
+}\r
+\r
+HeartRateMainPage::~HeartRateMainPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (button_ != nullptr) {\r
+ delete button_;\r
+ button_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelPreTest_ != nullptr) {\r
+ delete labelPreTest_;\r
+ labelPreTest_ = nullptr;\r
+ }\r
+\r
+ if (videoPlay_ != nullptr) {\r
+ videoPlay_->StopVideoPlay();\r
+ delete videoPlay_;\r
+ videoPlay_ = nullptr;\r
+ }\r
+\r
+ if (surfaceView_ != nullptr) {\r
+ delete surfaceView_;\r
+ surfaceView_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_RATE_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateMainPage::~HeartRateMainPage");\r
+}\r
+\r
+void HeartRateMainPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ InitImageAnimator();\r
+\r
+ button_ = new UILabelButton();\r
+ if (button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button_ fail");\r
+ return;\r
+ }\r
+ button_->SetPosition(HEART_BUTTON_POSITION_X, HEART_BUTTON_TWO_POSITION_Y);\r
+ button_->Resize(HEART_BUTTON_TWO_WIDTH, HEART_BUTTON_HEIGHT);\r
+ button_->SetViewId(HEART_START_BUTTON);\r
+ button_->SetOnClickListener(this);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::PRESSED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0x14FFFFFF, UIButton::INACTIVE);\r
+ button_->SetText("开始测量");\r
+ button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_BUTTON_FONT_SIZE);\r
+ button_->SetVisible(true);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(HEART_TITLE_POSITION_X, HEART_TITLE_POSITION_Y, HEART_TITLE_WIDTH, HEART_TITLE_HEIGHT);\r
+ labelTitle_->SetText("心率");\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, HEART_TITLE_FONT_SIZE);\r
+ SetTestTime();\r
+ group_->Add(button_);\r
+ group_->Add(labelPreTest_);\r
+ group_->Add(labelTitle_);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void HeartRateMainPage::OnResume()\r
+{\r
+ videoPlay_->StartVideoPlay();\r
+}\r
+\r
+void HeartRateMainPage::OnPause()\r
+{\r
+ videoPlay_->StopVideoPlay();\r
+}\r
+\r
+void HeartRateMainPage::SetTestTime()\r
+{\r
+ labelPreTest_ = new UILabel();\r
+ if (labelPreTest_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelPreTest_ fail");\r
+ return;\r
+ }\r
+ labelPreTest_->SetPosition(BOTTOM_TEXT_ONE_X, BOTTOM_TEXT_ONE_Y, BOTTOM_TEXT_WIDTH_ONE, BOTTOM_TEXT_HEIGHT_ONE);\r
+ labelPreTest_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_LIMIT_FONT_SIZE_TWO);\r
+ labelPreTest_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+ labelPreTest_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelPreTest_->SetVisible(false);\r
+ heartRateMeasurementInfo info = HeartRateModel::GetInstance().GetHeartRate();\r
+ struct timeval current_time;\r
+ if (info.heartRate == 0) {\r
+ info.heartRate = HEART_DATE_TIME_ONE;\r
+ gettimeofday(¤t_time, nullptr);\r
+ int64_t now = current_time.tv_sec;\r
+ struct timeval time1;\r
+ time1.tv_sec = now - HEART_DATE_TIME_TWO;\r
+ info.time = time1;\r
+ }\r
+ if (info.heartRate != 0) {\r
+ struct timeval tv = info.time;\r
+ std::time_t time = tv.tv_sec;\r
+ std::tm *tm_info = std::localtime(&time);\r
+ std::stringstream ss;\r
+ if (IsToday(tv)) {\r
+ gettimeofday(¤t_time, nullptr);\r
+ int64_t now = current_time.tv_sec;\r
+ int64_t diff_seconds = now - tv.tv_sec;\r
+ if (diff_seconds < 0) {\r
+ ss << info.heartRate << "次/分 ("\r
+ << "刚刚)";\r
+ } else if (diff_seconds < HEART_DATE_TIME_THREE) {\r
+ ss << info.heartRate << "次/分 ("\r
+ << "刚刚)";\r
+ } else if (diff_seconds < HEART_DATE_TIME_FOUR) {\r
+ int minutes = diff_seconds / HEART_DATE_TIME_THREE;\r
+ ss << info.heartRate << "次/分 (" << minutes << "分钟前)";\r
+ } else {\r
+ int hours = diff_seconds / HEART_DATE_TIME_FOUR;\r
+ ss << info.heartRate << "次/分 (" << hours << "小时前)";\r
+ }\r
+ } else {\r
+ ss << info.heartRate << "次/分 " << (tm_info->tm_mon + 1) << "/" << tm_info->tm_mday;\r
+ }\r
+ labelPreTest_->SetText(ss.str().c_str());\r
+ labelPreTest_->SetText(ss.str().c_str());\r
+ int textWidth = labelPreTest_->GetTextWidth();\r
+ int posX = (HEART_DATE_MAX - textWidth) / HEART_DATE_WIDTH;\r
+ labelPreTest_->SetX(posX);\r
+ labelPreTest_->SetVisible(true);\r
+ }\r
+}\r
+\r
+bool HeartRateMainPage::IsToday(const struct timeval &tv)\r
+{\r
+ time_t now = time(nullptr);\r
+ std::tm *now_tm = localtime(&now);\r
+ std::time_t given_time = tv.tv_sec;\r
+ std::tm *given_tm = std::localtime(&given_time);\r
+\r
+ return (now_tm->tm_year == given_tm->tm_year) && (now_tm->tm_mon == given_tm->tm_mon) &&\r
+ (now_tm->tm_mday == given_tm->tm_mday);\r
+}\r
+\r
+bool HeartRateMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool HeartRateMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), HEART_START_BUTTON) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(HeartRateAllView::HEARTRATE_READY_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+\r
+void HeartRateMainPage::InitImageAnimator()\r
+{\r
+ surfaceView_ = new UILiteSurfaceView();\r
+ if (surfaceView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new surfaceView_ fail");\r
+ return;\r
+ }\r
+ colorKey_.full = 0xff202020;\r
+ surfaceView_->SetPosition(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);\r
+ surfaceView_->SetPreview(\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_HEART_RATE_PREVIEW1, HEART_RATE_IMAGE));\r
+ surfaceView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ surfaceView_->SetSurfaceColorkey(colorKey_);\r
+ group_->Add(surfaceView_);\r
+\r
+ Surface *surface = surfaceView_->GetSurface();\r
+ surface->SetStrideAlignment(STRIDE_ALIGNMENT_VALUE);\r
+ surface->SetWidthAndHeight(VIDEO_WIDTH, VIDEO_HEIGHT);\r
+ surface->SetQueueSize(BUFFER_QUEUE_SIZE);\r
+ surface->SetFormat(PIXEL_FMT_YCBCR_420_SP);\r
+\r
+ int32_t ySize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) * VIDEO_HEIGHT;\r
+ int32_t uvSize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) *\r
+ ALIGN_BYTE(VIDEO_HEIGHT, JPEG_HEIGHT_BYTE_ALIGNMENT) / JPEG_HEIGHT_DIVISOR;\r
+ int32_t bufferSize = ySize + uvSize;\r
+ surface->SetSize(bufferSize);\r
+ std::string uri("/user/res/video/heartBackGround.mp4");\r
+ videoPlay_ = new MediaVideoPlay(surface, nullptr, uri, false);\r
+ if (videoPlay_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new videoPlay_ fail");\r
+ return;\r
+ }\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateMeasurePage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <random>\r
+#include <chrono>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "ui_resource_heartRate.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+#include "heartrate/HeartRateModel.h"\r
+#include "heartrate/HeartRateMeasurePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEARTRATE_BUTTON_TWO_POSITION_X = 142;\r
+static constexpr uint16_t HEARTRATE_BUTTON_TWO_POSITION_Y = 370;\r
+static constexpr uint16_t HEARTRATE_LABEL_FRONT = 40;\r
+static constexpr uint16_t HEARTRATE_LABEL_FRONT_BOTTOM = 36;\r
+static constexpr uint16_t HEARTRATE_LABEL2_POSITION_X = 133;\r
+static constexpr uint16_t HEARTRATE_LABEL2_POSITION_Y = 200;\r
+static constexpr uint16_t HEARTRATE_LABEL2_WIDTH = 180;\r
+static constexpr uint16_t HEARTRATE_LABEL2_HEIGHT = 62;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_POSITION_X = 195;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_POSITION_Y = 40;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_WIDTH = 260;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_HEIGHT = 53;\r
+static constexpr uint16_t HEARTRATE_LABLE_TITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_FONT_SIZE = 30;\r
+static constexpr uint16_t VIDEO_WIDTH = 454;\r
+static constexpr uint16_t VIDEO_HEIGHT = 454;\r
+static constexpr uint16_t STRIDE_ALIGNMENT_VALUE = 128;\r
+static constexpr uint16_t BUFFER_QUEUE_SIZE = 3;\r
+static constexpr uint16_t JPEG_HEIGHT_DIVISOR = 2;\r
+static constexpr uint16_t JPEG_WIDTH_BYTE_ALIGNMENT = 128;\r
+static constexpr uint16_t JPEG_HEIGHT_BYTE_ALIGNMENT = 16;\r
+static constexpr uint16_t HEART_TIME_NUM = 15;\r
+\r
+REGIST_SLICE_PAGE(VIEW_HEARTRATE, HeartRateAllView::HEARTRATE_MEASUREMENT_PAGE, HeartRateMeasurePage, false);\r
+\r
+HeartRateMeasurePage::HeartRateMeasurePage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateMeasurePage::HeartRateMeasurePage");\r
+}\r
+\r
+HeartRateMeasurePage::~HeartRateMeasurePage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelTimeOrResult_ != nullptr) {\r
+ delete labelTimeOrResult_;\r
+ labelTimeOrResult_ = nullptr;\r
+ }\r
+\r
+ if (labelTips_ != nullptr) {\r
+ delete labelTips_;\r
+ labelTips_ = nullptr;\r
+ }\r
+\r
+ if (callBack_ != nullptr) {\r
+ delete callBack_;\r
+ callBack_ = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+\r
+ if (videoPlay_ != nullptr) {\r
+ videoPlay_->StopVideoPlay();\r
+ delete videoPlay_;\r
+ videoPlay_ = nullptr;\r
+ }\r
+\r
+ if (surfaceView_ != nullptr) {\r
+ delete surfaceView_;\r
+ surfaceView_ = nullptr;\r
+ }\r
+\r
+ if (chartLineResultGroup_ != nullptr) {\r
+ delete chartLineResultGroup_;\r
+ chartLineResultGroup_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_RATE_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateMeasurePage::~HeartRateMeasurePage");\r
+}\r
+\r
+void HeartRateMeasurePage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ InitVideoView();\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(HEARTRATE_LABLE_TITLE_POSITION_X, HEARTRATE_LABLE_TITLE_POSITION_Y,\r
+ HEARTRATE_LABLE_TITLE_WIDTH, HEARTRATE_LABLE_TITLE_HEIGHT);\r
+ labelTitle_->SetText("心率");\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, HEARTRATE_LABLE_TITLE_FONT_SIZE);\r
+\r
+ labelTimeOrResult_ = new UILabel();\r
+ if (labelTimeOrResult_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTimeOrResult_ fail");\r
+ return;\r
+ }\r
+ labelTimeOrResult_->SetPosition(HEARTRATE_LABEL2_POSITION_X,\r
+ HEARTRATE_LABEL2_POSITION_Y);\r
+ labelTimeOrResult_->Resize(HEARTRATE_LABEL2_WIDTH, HEARTRATE_LABEL2_HEIGHT);\r
+ labelTimeOrResult_->SetStyle(STYLE_TEXT_FONT, HEARTRATE_LABEL_FRONT);\r
+ labelTimeOrResult_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ labelTimeOrResult_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTimeOrResult_->SetFont(BOLD_VECTOR_FONT_FILENAME, HEARTRATE_LABEL_FRONT);\r
+\r
+ labelTips_ = new UILabel();\r
+ if (labelTips_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTips_ fail");\r
+ return;\r
+ }\r
+ labelTips_->SetPosition(HEARTRATE_BUTTON_TWO_POSITION_X, HEARTRATE_BUTTON_TWO_POSITION_Y);\r
+ labelTips_->Resize(HEARTRATE_LABEL2_WIDTH, HEARTRATE_LABEL2_HEIGHT);\r
+ labelTips_->SetStyle(STYLE_TEXT_FONT, HEARTRATE_LABEL_FRONT_BOTTOM);\r
+ labelTips_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ labelTips_->SetText("正在测量");\r
+ labelTips_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTRATE_LABEL_FRONT_BOTTOM);\r
+ group_->Add(labelTimeOrResult_);\r
+ group_->Add(labelTips_);\r
+\r
+ InitAnimator();\r
+ gettimeofday(&startTime_, nullptr);\r
+ group_->Add(labelTitle_);\r
+\r
+ AddViewToPageContainer(group_);\r
+ animator_->Start();\r
+\r
+ SetTestStatus(false);\r
+}\r
+\r
+void HeartRateMeasurePage::OnResume()\r
+{\r
+ videoPlay_->StartVideoPlay();\r
+ SettingDisplayModel::GetInstance().EnableSteadyOn();\r
+}\r
+\r
+void HeartRateMeasurePage::OnPause()\r
+{\r
+ videoPlay_->StopVideoPlay();\r
+ SettingDisplayModel::GetInstance().DisableSteadyOn();\r
+}\r
+\r
+void HeartRateMeasurePage::InitAnimator()\r
+{\r
+ callBack_ = new HeartAnimatorCallback(this);\r
+ if (callBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new callBack_ fail");\r
+ return;\r
+ }\r
+ animator_ = new Animator(callBack_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+void HeartRateMeasurePage::SetTimeAndResultText(std::string str)\r
+{\r
+ labelTimeOrResult_->SetText(str.c_str());\r
+}\r
+\r
+void HeartRateMeasurePage::SetTestStatus(bool value)\r
+{\r
+ measureStatus_ = value;\r
+}\r
+\r
+void HeartRateMeasurePage::HeartAnimatorCallback::Callback(UIView *view)\r
+{\r
+ (void)view;\r
+ if (page_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "page_ is nullptr");\r
+ return;\r
+ }\r
+ static int count = 0;\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ int time = current_time.tv_sec - page_->startTime_.tv_sec;\r
+ std::string strTime;\r
+ // 测量结束,修改文本,显示当前心率\r
+ if (time >= HEART_TIME_NUM) {\r
+ page_->StopAnimator();\r
+ heartRateMeasurementInfo info;\r
+ info.heartRate = 80; // 80:心率打桩数据\r
+ info.time = current_time;\r
+ strTime = std::to_string(info.heartRate) + "次/分";\r
+ HeartRateModel::GetInstance().SetHeartRate(info);\r
+ page_->SetTestStatus(true);\r
+ page_->labelTips_->SetText("当前心率");\r
+ std::string strHeartRate = std::to_string(info.heartRate);\r
+ if (page_->chartLineResultGroup_ == nullptr) {\r
+ page_->chartLineResultGroup_ = new HeartRateResultGroup();\r
+ if (page_->chartLineResultGroup_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chartLineResultGroup_ fail");\r
+ return;\r
+ }\r
+ }\r
+ page_->chartLineResultGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ page_->chartLineResultGroup_->SetVisible(false);\r
+ page_->group_->Add(page_->chartLineResultGroup_);\r
+ page_->chartLineResultGroup_->labelHeartRateValue_->SetText(strHeartRate.c_str());\r
+ page_->chartLineResultGroup_->SetVisible(true);\r
+ } else {\r
+ // 测量中,文本仅更新倒计时\r
+ strTime = std::to_string(HEART_TIME_NUM - time) + "s";\r
+ }\r
+ page_->SetTimeAndResultText(strTime);\r
+}\r
+\r
+void HeartRateMeasurePage::StopAnimator()\r
+{\r
+ animator_->Stop();\r
+}\r
+\r
+bool HeartRateMeasurePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ // 在测量完成后 才能拉起心率线状图\r
+ if (measureStatus_) {\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+ chartLineResultGroup_->SetVisible(false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+ chartLineResultGroup_->SetVisible(true);\r
+ }\r
+ }\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+ StopAnimator();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(HeartRateAllView::HEARTRATE_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+void HeartRateMeasurePage::InitVideoView()\r
+{\r
+ surfaceView_ = new UILiteSurfaceView();\r
+ if (surfaceView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new surfaceView_ fail");\r
+ return;\r
+ }\r
+ colorKey_.full = 0xff202020;\r
+ surfaceView_->SetPosition(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);\r
+ surfaceView_->SetPreview(\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_HEART_RATE_PREVIEW2, HEART_RATE_IMAGE));\r
+ surfaceView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ surfaceView_->SetSurfaceColorkey(colorKey_);\r
+ group_->Add(surfaceView_);\r
+\r
+ Surface *surface = surfaceView_->GetSurface();\r
+ surface->SetStrideAlignment(STRIDE_ALIGNMENT_VALUE);\r
+ surface->SetWidthAndHeight(VIDEO_WIDTH, VIDEO_HEIGHT);\r
+ surface->SetQueueSize(BUFFER_QUEUE_SIZE);\r
+ surface->SetFormat(PIXEL_FMT_YCBCR_420_SP);\r
+\r
+ int32_t ySize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) * VIDEO_HEIGHT;\r
+ int32_t uvSize = ALIGN_BYTE(VIDEO_WIDTH, JPEG_WIDTH_BYTE_ALIGNMENT) *\r
+ ALIGN_BYTE(VIDEO_HEIGHT, JPEG_HEIGHT_BYTE_ALIGNMENT) / JPEG_HEIGHT_DIVISOR;\r
+ int32_t bufferSize = ySize + uvSize;\r
+ surface->SetSize(bufferSize);\r
+ std::string uri("/user/res/video/heart.mp4");\r
+ videoPlay_ = new MediaVideoPlay(surface, nullptr, uri, false);\r
+ if (videoPlay_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new videoPlay_ fail");\r
+ return;\r
+ }\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateModel\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "heartrate/HeartRateView.h"\r
+#include "heartrate/HeartRateModel.h"\r
+\r
+namespace OHOS {\r
+HeartRateModel::HeartRateModel() {}\r
+\r
+HeartRateModel::~HeartRateModel() {}\r
+\r
+HeartRateModel &HeartRateModel::GetInstance()\r
+{\r
+ static HeartRateModel instance;\r
+ return instance;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRatePresenter\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+#include "wearable_log.h"\r
+#include "heartrate/HeartRateView.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_HEARTRATE, HeartRateView, HeartRatePresenter, HEART_RATE_ICON, HEART_RATE_ICON, "心率");\r
+static HeartRatePresenter *g_pHeartRatePresenter = nullptr;\r
+HeartRatePresenter *HeartRatePresenter::GetInstance()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRatePresenter GetInstance");\r
+ return g_pHeartRatePresenter;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateReadyPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <cmath>\r
+#include "ui_test_group.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_heartRate.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+#include "heartrate/HeartRateReadyPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEARTRATE_BUTTON_POSITION_X = 188;\r
+static constexpr uint16_t HEARTRATE_BUTTON_WIDTH = 96;\r
+static constexpr uint16_t HEARTRATE_BUTTON_HEIGHT = 96;\r
+static constexpr uint16_t HEARTRATE_BUTTON_TWO_POSITION_Y = 288;\r
+static constexpr uint16_t HEARTRATE_LABEL3_POSITION_X = 65;\r
+static constexpr uint16_t HEARTRATE_LABEL3_POSITION_Y = 150;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_POSITION_X = 110;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_POSITION_Y = 200;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_WIDTH = 424;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_HEIGHT = 424;\r
+static constexpr uint16_t HEARTRATE_LABLETIPSSATRT_FONT_SIZE = 36;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_POSITION_X = 218;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_POSITION_Y = 318;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_WIDTH = 50;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_HEIGHT = 50;\r
+static constexpr uint16_t HEARTRATE_LABLEBACK_FONT_SIZE = 30;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_POSITION_X = 140;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_POSITION_Y = 250;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_WIDTH = 172;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_HEIGHT = 172;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_VENTER_POSITION = 86;\r
+static constexpr uint32_t HEARTRATE_PLAYBACK_RANGE = 100000;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_RADIUS = 48;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_START_ANGLE = 360;\r
+static constexpr uint16_t HEARTRATE_PLAYBACK_STYLE_LINE_WIDTH = 12;\r
+static constexpr uint16_t HEARTRATE_TIME_NUM = 3;\r
+static constexpr uint16_t HEARTRATE_PROGRESS_TIME = 3;\r
+static constexpr uint16_t HEARTRATE_TIME_USEC = 1000;\r
+static constexpr char *HEART_START_BUTTON = "startButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_HEARTRATE, HeartRateAllView::HEARTRATE_READY_PAGE, HeartRateReadyPage, false);\r
+\r
+HeartRateReadyPage::HeartRateReadyPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateReadyPage::HeartRateReadyPage");\r
+}\r
+\r
+HeartRateReadyPage::~HeartRateReadyPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (button_ != nullptr) {\r
+ delete button_;\r
+ button_ = nullptr;\r
+ }\r
+\r
+ if (labelTips_ != nullptr) {\r
+ delete labelTips_;\r
+ labelTips_ = nullptr;\r
+ }\r
+\r
+ if (timeProgress_ != nullptr) {\r
+ delete timeProgress_;\r
+ timeProgress_ = nullptr;\r
+ }\r
+\r
+ if (labelProgressTime_ != nullptr) {\r
+ delete labelProgressTime_;\r
+ labelProgressTime_ = nullptr;\r
+ }\r
+\r
+ if (callBack_ != nullptr) {\r
+ delete callBack_;\r
+ callBack_ = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_RATE_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateReadyPage::~HeartRateReadyPage");\r
+}\r
+\r
+void HeartRateReadyPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetOnDragListener(this);\r
+\r
+ button_ = new UILabelButton();\r
+ if (button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new button_ fail");\r
+ return;\r
+ }\r
+ button_->SetPosition(HEARTRATE_BUTTON_POSITION_X, HEARTRATE_BUTTON_TWO_POSITION_Y);\r
+ button_->Resize(HEARTRATE_BUTTON_WIDTH, HEARTRATE_BUTTON_HEIGHT);\r
+ LOADIMG::LoadBtnImage(button_, HEART_RATE_IMAGE, IMAGE_HEART_RATE_RESET, IMAGE_HEART_RATE_RESET);\r
+ button_->SetViewId(HEART_START_BUTTON);\r
+ button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ button_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ button_->SetVisible(true);\r
+ button_->SetOnClickListener(this);\r
+\r
+ labelTips_ = new UILabel();\r
+ if (labelTips_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTips_ fail");\r
+ return;\r
+ }\r
+ labelTips_->SetPosition(HEARTRATE_LABLETIPSSATRT_POSITION_X, HEARTRATE_LABLETIPSSATRT_POSITION_Y,\r
+ HEARTRATE_LABLETIPSSATRT_WIDTH, HEARTRATE_LABLETIPSSATRT_HEIGHT);\r
+ labelTips_->SetText("请佩戴手表测量");\r
+ labelTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTRATE_LABLETIPSSATRT_FONT_SIZE);\r
+ labelTips_->SetVisible(true);\r
+\r
+ InitCircleProgress();\r
+\r
+ InitAnimator();\r
+\r
+ group_->Add(button_);\r
+ group_->Add(labelTips_);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void HeartRateReadyPage::InitAnimator()\r
+{\r
+ callBack_ = new HeartAnimatorCallback(this);\r
+ if (callBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new callBack_ fail");\r
+ return;\r
+ }\r
+ animator_ = new Animator(callBack_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+int HeartRateReadyPage::InitCircleProgress()\r
+{\r
+ labelProgressTime_ = new UILabel();\r
+ if (labelProgressTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelProgressTime_ fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ labelProgressTime_->SetPosition(HEARTRATE_LABLEBACK_POSITION_X, HEARTRATE_LABLEBACK_POSITION_Y,\r
+ HEARTRATE_LABLEBACK_WIDTH, HEARTRATE_LABLEBACK_HEIGHT);\r
+ labelProgressTime_->SetText("3");\r
+ labelProgressTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTRATE_LABLEBACK_FONT_SIZE);\r
+ labelProgressTime_->SetVisible(false);\r
+ group_->Add(labelProgressTime_);\r
+\r
+ timeProgress_ = new UICircleProgress();\r
+ if (timeProgress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timeProgress_ fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ timeProgress_->SetPosition(HEARTRATE_PLAYBACK_POSITION_X, HEARTRATE_PLAYBACK_POSITION_Y,\r
+ HEARTRATE_PLAYBACK_WIDTH, HEARTRATE_PLAYBACK_HEIGHT);\r
+ timeProgress_->SetCenterPosition(HEARTRATE_PLAYBACK_VENTER_POSITION, HEARTRATE_PLAYBACK_VENTER_POSITION);\r
+ timeProgress_->SetRange(HEARTRATE_PLAYBACK_RANGE, 0);\r
+ timeProgress_->SetRadius(HEARTRATE_PLAYBACK_RADIUS);\r
+ timeProgress_->SetStartAngle(HEARTRATE_PLAYBACK_START_ANGLE);\r
+ timeProgress_->SetEndAngle(0);\r
+ timeProgress_->SetValue(0);\r
+ timeProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xFF491010);\r
+ timeProgress_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ timeProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFFD72C2E);\r
+ timeProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, HEARTRATE_PLAYBACK_STYLE_LINE_WIDTH);\r
+ timeProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, HEARTRATE_PLAYBACK_STYLE_LINE_WIDTH);\r
+ timeProgress_->SetVisible(false);\r
+ group_->Add(timeProgress_);\r
+ return OHOS_SUCCESS;\r
+}\r
+\r
+void HeartRateReadyPage::HeartAnimatorCallback::Callback(UIView *view)\r
+{\r
+ (void)view;\r
+ static int count = 0;\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ long seconds = current_time.tv_sec - page_->startTime_.tv_sec;\r
+ long micros = current_time.tv_usec - page_->startTime_.tv_usec;\r
+ long time = (seconds * HEARTRATE_TIME_USEC) + (micros / HEARTRATE_TIME_USEC);\r
+ page_->SetLabelProgressTime(time);\r
+ if ((time / HEARTRATE_TIME_USEC) == HEARTRATE_TIME_NUM) {\r
+ page_->StopAnimator();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(HeartRateAllView::HEARTRATE_MEASUREMENT_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+}\r
+\r
+void HeartRateReadyPage::StopAnimator()\r
+{\r
+ button_->SetVisible(false);\r
+ labelTips_->SetVisible(false);\r
+ timeProgress_->SetVisible(false);\r
+ labelProgressTime_->SetVisible(false);\r
+ animator_->Stop();\r
+}\r
+\r
+void HeartRateReadyPage::SetLabelProgressTime(int time)\r
+{\r
+ int progressTime = HEARTRATE_PROGRESS_TIME - (time / HEARTRATE_TIME_USEC);\r
+ std::string strTime = std::to_string(progressTime);\r
+ labelProgressTime_->SetText(strTime.c_str());\r
+ double percentage = static_cast<double>(time) / (HEARTRATE_TIME_NUM * HEARTRATE_TIME_USEC);\r
+ double value = round(percentage * 100000);\r
+ timeProgress_->SetValue(value);\r
+}\r
+\r
+bool HeartRateReadyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ StopAnimator();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(HeartRateAllView::HEARTRATE_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool HeartRateReadyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), HEART_START_BUTTON) == 0) {\r
+ labelTips_->SetVisible(false);\r
+ labelTips_->SetPosition(HEARTRATE_LABEL3_POSITION_X, HEARTRATE_LABEL3_POSITION_Y);\r
+ labelTips_->SetText("请屏幕朝上偏紧佩戴, 保持静止");\r
+ labelTips_->SetVisible(true);\r
+ button_->SetVisible(false);\r
+ animator_->Start();\r
+ timeProgress_->SetVisible(true);\r
+ labelProgressTime_->SetVisible(true);\r
+ gettimeofday(&startTime_, nullptr);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateResultGroup\r
+ * Create: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_chart.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "common/image_cache_manager.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "AppViewIDs.h"\r
+#include "ui_resource_heartRate.h"\r
+#include "heartrate/HeartRatePresenter.h"\r
+#include "heartrate/HeartRateModel.h"\r
+#include "heartrate/HeartRateResultGroup.h"\r
+\r
+static constexpr uint16_t PERSEC_HEART_RATE_FONT_SIZE = 38;\r
+static constexpr uint16_t PERSEC_HEART_RATE_X = 195;\r
+static constexpr uint16_t PERSEC_HEART_RATE_Y = 40;\r
+static constexpr uint16_t PERSEC_HEART_RATE_WIDTH = 260;\r
+static constexpr uint16_t PERSEC_HEART_RATE_HEIGHT = 53;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_FONT_SIZE = 56;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_X = 188;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_Y = 96;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_WIDTH = 80;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_HEIGHT = 64;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_FONT_SIZE_ONE = 21;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_ONE_X = 259;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_ONE_Y = 128;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_WIDTH_ONE = 55;\r
+static constexpr uint16_t PERSEC_HEART_TEXT_HEIGHT_ONE = 24;\r
+static constexpr uint16_t COORDINATE_POINT_X = 70;\r
+static constexpr uint16_t COORDINATE_POINT_Y = 207;\r
+static constexpr uint16_t COORDINATE_HEIGHT = 156;\r
+static constexpr uint16_t COORDINATE_WIDTH = 330;\r
+static constexpr uint16_t HEART_RATE_LIMIT_FONT_SIZE = 25;\r
+static constexpr uint16_t HEART_RATE_X_FONT_SIZE = 16;\r
+static constexpr uint16_t TOP_TEXT_WIDTH = 52;\r
+static constexpr uint16_t TOP_TEXT_HEIGHT = 36;\r
+static constexpr uint16_t TOP_TEXT_X = 177;\r
+static constexpr uint16_t TOP_TEXT_Y = 392;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH = 35;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT = 36;\r
+static constexpr uint16_t BOTTOM_TEXT_X = 274;\r
+static constexpr uint16_t BOTTOM_TEXT_Y = 392;\r
+static constexpr uint16_t HEART_RATE_LIMIT_FONT_SIZE_ONE = 24;\r
+static constexpr uint16_t BOTTOM_TEXT_WIDTH_ONE = 89;\r
+static constexpr uint16_t BOTTOM_TEXT_HEIGHT_ONE = 29;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_X = 188;\r
+static constexpr uint16_t BOTTOM_TEXT_ONE_Y = 160;\r
+static constexpr uint16_t ANIMATOR_IMAGE_X = 120;\r
+static constexpr uint16_t ANIMATOR_IMAGE_Y = 98;\r
+static constexpr uint16_t ANIMATOR_IMAGE_WIDTH = 60;\r
+static constexpr uint16_t ANIMATOR_IMAGE_HEIGHT = 60;\r
+static constexpr uint16_t HEART_LABLE_ONE_POSION_X = 63;\r
+static constexpr uint16_t HEART_LABLE_THREE_POSION_X = 210;\r
+static constexpr uint16_t HEART_LABLE_FIVE_POSION_X = 350;\r
+static constexpr uint16_t HEART_LABLE_POSION_X = 10;\r
+static constexpr uint16_t HEART_LABLE_POSION_Y = 369;\r
+static constexpr uint16_t HEART_LABLE1_POSION_Y = 320;\r
+static constexpr uint16_t HEART_LABLE2_POSION_Y = 290;\r
+static constexpr uint16_t HEART_LABLE3_POSION_Y = 260;\r
+static constexpr uint16_t HEART_LABLE4_POSION_Y = 230;\r
+static constexpr uint16_t IMAGE_RED_TEXT_X = 157;\r
+static constexpr uint16_t IMAGE_RED_TEXT_Y = 407;\r
+static constexpr uint16_t IMAGE_BACK_TEXT_X = 254;\r
+static constexpr uint16_t IMAGE_BACK_TEXT_Y = 407;\r
+static constexpr uint16_t XAXIS_SETMARKNUM = 40;\r
+static constexpr uint16_t XAXIS_LINENUM = 3;\r
+static constexpr uint16_t YAXIS_SETMARKNUM = 5;\r
+static constexpr uint16_t XAXIS_SETDATARANGE = 45;\r
+static constexpr uint16_t YAXIS_SETDATARANGE = 200;\r
+static constexpr uint16_t CHART_LINE_NUM_ONE = 10;\r
+static constexpr uint16_t CHART_LINE_NUM_TWO = 60;\r
+\r
+namespace OHOS {\r
+const int g_imageAnimatorInfo[HEARTRATE_ANIMATOR_IMAGE_NUM] = {\r
+ IMAGE_HEART_RATE_FRAME00, IMAGE_HEART_RATE_FRAME01, IMAGE_HEART_RATE_FRAME02, IMAGE_HEART_RATE_FRAME03,\r
+ IMAGE_HEART_RATE_FRAME04, IMAGE_HEART_RATE_FRAME05, IMAGE_HEART_RATE_FRAME06, IMAGE_HEART_RATE_FRAME07,\r
+ IMAGE_HEART_RATE_FRAME08, IMAGE_HEART_RATE_FRAME09, IMAGE_HEART_RATE_FRAME10, IMAGE_HEART_RATE_FRAME11,\r
+ IMAGE_HEART_RATE_FRAME12, IMAGE_HEART_RATE_FRAME13, IMAGE_HEART_RATE_FRAME14, IMAGE_HEART_RATE_FRAME15,\r
+ IMAGE_HEART_RATE_FRAME16, IMAGE_HEART_RATE_FRAME17, IMAGE_HEART_RATE_FRAME18, IMAGE_HEART_RATE_FRAME19,\r
+ IMAGE_HEART_RATE_FRAME20, IMAGE_HEART_RATE_FRAME21, IMAGE_HEART_RATE_FRAME22, IMAGE_HEART_RATE_FRAME23,\r
+ IMAGE_HEART_RATE_FRAME24, IMAGE_HEART_RATE_FRAME25, IMAGE_HEART_RATE_FRAME26, IMAGE_HEART_RATE_FRAME27,\r
+ IMAGE_HEART_RATE_FRAME28, IMAGE_HEART_RATE_FRAME29,\r
+};\r
+\r
+HeartRateResultGroup::HeartRateResultGroup()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateResultGroup::HeartRateResultGroup");\r
+ InitPage();\r
+}\r
+\r
+void HeartRateResultGroup::InitPage()\r
+{\r
+ SetPosition(0, 0);\r
+ Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+ mainImg_ = new UIImageView();\r
+ if (mainImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new mainImg_ fail");\r
+ return;\r
+ }\r
+ mainImg_->SetPosition(0, 0);\r
+ mainImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(mainImg_, HEART_RATE_IMAGE, IMAGE_HEART_RATE_BG2);\r
+ Add(mainImg_);\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetText("心率");\r
+ labelTitle_->SetPosition(PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y, PERSEC_HEART_RATE_WIDTH,\r
+ PERSEC_HEART_RATE_HEIGHT);\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, PERSEC_HEART_RATE_FONT_SIZE);\r
+ Add(labelTitle_);\r
+\r
+ labelHeartRateValue_ = new UILabel();\r
+ if (labelHeartRateValue_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelHeartRateValue_ fail");\r
+ return;\r
+ }\r
+ labelHeartRateValue_->SetPosition(PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y, PERSEC_HEART_TEXT_WIDTH,\r
+ PERSEC_HEART_TEXT_HEIGHT);\r
+ labelHeartRateValue_->SetFont(BOLD_VECTOR_FONT_FILENAME, PERSEC_HEART_TEXT_FONT_SIZE);\r
+ heartRateMeasurementInfo info = HeartRateModel::GetInstance().GetHeartRate();\r
+ std::string strHeartRate = std::to_string(info.heartRate);\r
+ labelHeartRateValue_->SetText(strHeartRate.c_str());\r
+ Add(labelHeartRateValue_);\r
+\r
+ labelUnitText_ = new UILabel();\r
+ if (labelUnitText_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelUnitText_ fail");\r
+ return;\r
+ }\r
+ labelUnitText_->SetText("次/分");\r
+ labelUnitText_->SetPosition(PERSEC_HEART_TEXT_ONE_X, PERSEC_HEART_TEXT_ONE_Y, PERSEC_HEART_TEXT_WIDTH_ONE,\r
+ PERSEC_HEART_TEXT_HEIGHT_ONE);\r
+ labelUnitText_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERSEC_HEART_TEXT_FONT_SIZE_ONE);\r
+ Add(labelUnitText_);\r
+\r
+ dataSerial_ = new UIChartDataSerial();\r
+ if (dataSerial_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new dataSerial_ fail");\r
+ return;\r
+ }\r
+ dataSerial_->SetMaxDataCount(XAXIS_SETDATARANGE);\r
+ // 打桩数据,真实测量数据的存储和更新需要客户自实现\r
+ Point pointArray[XAXIS_SETDATARANGE] = {\r
+ {0, 100}, {1, 110}, {2, 112}, {3, 114}, {4, 116}, {5, 118}, {6, 120}, {7, 122}, {8, 124},\r
+ {9, 126}, {10, 128}, {11, 140}, {12, 140}, {13, 160}, {14, 160}, {15, 160}, {16, 176}, {17, 180},\r
+ {18, 192}, {19, 160}, {20, 176}, {21, 172}, {22, 172}, {23, 148}, {24, 146}, {25, 144}, {26, 120},\r
+ {27, 110}, {28, 110}, {29, 108}, {30, 106}, {31, 104}, {32, 102}, {33, 88}, {34, 86}, {35, 78},\r
+ {36, 78}, {37, 78}, {38, 80}, {39, 80}, {40, 82}, {41, 82}, {42, 88}, {43, 90}, {44, 96}};\r
+ dataSerial_->AddPoints(pointArray, XAXIS_SETDATARANGE);\r
+ dataSerial_->SetLineColor(Color::Red());\r
+ dataSerial_->SetFillColor(Color::Red());\r
+ dataSerial_->EnableGradient(true);\r
+\r
+ chartPolyline_ = new UIChartPolyline();\r
+ if (chartPolyline_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new chartPolyline_ fail");\r
+ return;\r
+ }\r
+ chartPolyline_->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y);\r
+ chartPolyline_->SetWidth(COORDINATE_WIDTH);\r
+ chartPolyline_->SetHeight(COORDINATE_HEIGHT);\r
+ chartPolyline_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ chartPolyline_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ chartPolyline_->SetStyle(STYLE_LINE_WIDTH, XAXIS_LINENUM);\r
+\r
+ UIXAxis &xAxis = chartPolyline_->GetXAxis();\r
+ UIYAxis &yAxis = chartPolyline_->GetYAxis();\r
+ xAxis.SetDataRange(0, XAXIS_SETDATARANGE);\r
+ yAxis.SetDataRange(0, YAXIS_SETDATARANGE);\r
+ xAxis.SetMarkNum(XAXIS_SETMARKNUM);\r
+ yAxis.SetMarkNum(YAXIS_SETMARKNUM);\r
+ xAxis.SetStyle(STYLE_LINE_COLOR, 0x14FF5F5F5);\r
+ yAxis.SetStyle(STYLE_LINE_COLOR, 0x14FF5F5F5);\r
+ chartPolyline_->SetGradientOpacity(CHART_LINE_NUM_ONE, CHART_LINE_NUM_TWO);\r
+ chartPolyline_->AddDataSerial(dataSerial_);\r
+ Add(chartPolyline_);\r
+\r
+ labelXAxisPointOne_ = new UILabel();\r
+ if (labelXAxisPointOne_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointOne_ fail");\r
+ return;\r
+ }\r
+ labelXAxisPointOne_->SetText("00:00");\r
+ labelXAxisPointOne_->SetPosition(HEART_LABLE_ONE_POSION_X, HEART_LABLE_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+ labelXAxisPointOne_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+ Add(labelXAxisPointOne_);\r
+\r
+ labelXAxisPointTwo_ = new UILabel();\r
+ if (labelXAxisPointTwo_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointTwo_ fail");\r
+ return;\r
+ }\r
+ labelXAxisPointTwo_->SetText("12:00");\r
+ labelXAxisPointTwo_->SetPosition(HEART_LABLE_THREE_POSION_X, HEART_LABLE_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+ labelXAxisPointTwo_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+ Add(labelXAxisPointTwo_);\r
+ labelXAxisPointThree_ = new UILabel();\r
+ if (labelXAxisPointThree_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelXAxisPointThree_ fail");\r
+ return;\r
+ }\r
+ labelXAxisPointThree_->SetText("24:00");\r
+ labelXAxisPointThree_->SetPosition(HEART_LABLE_FIVE_POSION_X, HEART_LABLE_POSION_Y, TOP_TEXT_WIDTH,\r
+ TOP_TEXT_HEIGHT);\r
+ labelXAxisPointThree_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+ Add(labelXAxisPointThree_);\r
+\r
+ labelYAxisPointOne_ = new UILabel();\r
+ if (labelYAxisPointOne_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelYAxisPointOne_ fail");\r
+ return;\r
+ }\r
+ labelYAxisPointOne_->SetText("50");\r
+ labelYAxisPointOne_->SetPosition(HEART_LABLE_POSION_X, HEART_LABLE1_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+ labelYAxisPointOne_->SetAlign(TEXT_ALIGNMENT_RIGHT);\r
+ labelYAxisPointOne_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+ Add(labelYAxisPointOne_);\r
+\r
+ labelYAxisPointTwo_ = new UILabel();\r
+ if (labelYAxisPointTwo_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelYAxisPointTwo_ fail");\r
+ return;\r
+ }\r
+ labelYAxisPointTwo_->SetText("100");\r
+ labelYAxisPointTwo_->SetPosition(HEART_LABLE_POSION_X, HEART_LABLE2_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+ labelYAxisPointTwo_->SetAlign(TEXT_ALIGNMENT_RIGHT);\r
+ labelYAxisPointTwo_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+ Add(labelYAxisPointTwo_);\r
+\r
+ labelYAxisPointThree_ = new UILabel();\r
+ if (labelYAxisPointThree_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelYAxisPointThree_ fail");\r
+ return;\r
+ }\r
+ labelYAxisPointThree_->SetText("150");\r
+ labelYAxisPointThree_->SetPosition(HEART_LABLE_POSION_X, HEART_LABLE3_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+ labelYAxisPointThree_->SetAlign(TEXT_ALIGNMENT_RIGHT);\r
+ labelYAxisPointThree_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+ Add(labelYAxisPointThree_);\r
+\r
+ labelYAxisPointFour_ = new UILabel();\r
+ if (labelYAxisPointFour_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelYAxisPointFour_ fail");\r
+ return;\r
+ }\r
+ labelYAxisPointFour_->SetText("200");\r
+ labelYAxisPointFour_->SetPosition(HEART_LABLE_POSION_X, HEART_LABLE4_POSION_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+ labelYAxisPointFour_->SetAlign(TEXT_ALIGNMENT_RIGHT);\r
+ labelYAxisPointFour_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_X_FONT_SIZE);\r
+ Add(labelYAxisPointFour_);\r
+\r
+ labelMaxValue_ = new UILabel();\r
+ if (labelMaxValue_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelMaxValue_ fail");\r
+ return;\r
+ }\r
+ \r
+ // 打桩数据,后续需要根据测量结果修改最大值显示\r
+ labelMaxValue_->SetText("148");\r
+ labelMaxValue_->SetPosition(TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT);\r
+ labelMaxValue_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_LIMIT_FONT_SIZE);\r
+ Add(labelMaxValue_);\r
+\r
+ imageRedArrow_ = new UIImageView();\r
+ if (imageRedArrow_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imageRedArrow_ fail");\r
+ return;\r
+ }\r
+ imageRedArrow_->SetPosition(IMAGE_RED_TEXT_X, IMAGE_RED_TEXT_Y);\r
+ imageRedArrow_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(imageRedArrow_, HEART_RATE_IMAGE, IMAGE_HEART_RATE_UP);\r
+ Add(imageRedArrow_);\r
+ labelMinValue_ = new UILabel();\r
+ if (labelMinValue_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelMinValue_ fail");\r
+ return;\r
+ }\r
+\r
+ // 打桩数据,后续需要根据测量结果修改最小值显示\r
+ labelMinValue_->SetText("59");\r
+ labelMinValue_->SetPosition(BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH, BOTTOM_TEXT_HEIGHT);\r
+ labelMinValue_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_LIMIT_FONT_SIZE);\r
+ Add(labelMinValue_);\r
+\r
+ imageBlackArrow_ = new UIImageView();\r
+ if (imageBlackArrow_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imageBlackArrow_ fail");\r
+ return;\r
+ }\r
+ imageBlackArrow_->SetPosition(IMAGE_BACK_TEXT_X, IMAGE_BACK_TEXT_Y);\r
+ imageBlackArrow_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(imageBlackArrow_, HEART_RATE_IMAGE, IMAGE_HEART_RATE_DOWN);\r
+ Add(imageBlackArrow_);\r
+\r
+ labelLastMeasureTime_ = new UILabel();\r
+ if (labelLastMeasureTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelLastMeasureTime_ fail");\r
+ return;\r
+ }\r
+ labelLastMeasureTime_->SetText("刚刚");\r
+ labelLastMeasureTime_->SetPosition(BOTTOM_TEXT_ONE_X, BOTTOM_TEXT_ONE_Y, BOTTOM_TEXT_WIDTH_ONE,\r
+ BOTTOM_TEXT_HEIGHT_ONE);\r
+ labelLastMeasureTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEART_RATE_LIMIT_FONT_SIZE_ONE);\r
+ labelLastMeasureTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelLastMeasureTime_->SetStyle(STYLE_TEXT_COLOR, 0xFFCCCCCC);\r
+ labelLastMeasureTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ Add(labelLastMeasureTime_);\r
+\r
+ SetDraggable(true);\r
+ SetTouchable(true);\r
+ InitImageAnimator();\r
+}\r
+\r
+HeartRateResultGroup::~HeartRateResultGroup()\r
+{\r
+ RemoveAll();\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+ if (labelHeartRateValue_ != nullptr) {\r
+ delete labelHeartRateValue_;\r
+ labelHeartRateValue_ = nullptr;\r
+ }\r
+ if (chartPolyline_ != nullptr) {\r
+ delete chartPolyline_;\r
+ chartPolyline_ = nullptr;\r
+ }\r
+ if (labelLastMeasureTime_ != nullptr) {\r
+ delete labelLastMeasureTime_;\r
+ labelLastMeasureTime_ = nullptr;\r
+ }\r
+ if (labelMaxValue_ != nullptr) {\r
+ delete labelMaxValue_;\r
+ labelMaxValue_ = nullptr;\r
+ }\r
+ if (labelMinValue_ != nullptr) {\r
+ delete labelMinValue_;\r
+ labelMinValue_ = nullptr;\r
+ }\r
+ if (labelUnitText_ != nullptr) {\r
+ delete labelUnitText_;\r
+ labelUnitText_ = nullptr;\r
+ }\r
+ if (imageAnimator_ != nullptr) {\r
+ delete imageAnimator_;\r
+ imageAnimator_ = nullptr;\r
+ }\r
+ if (dataSerial_ != nullptr) {\r
+ delete dataSerial_;\r
+ dataSerial_ = nullptr;\r
+ }\r
+ if (imageRedArrow_ != nullptr) {\r
+ delete imageRedArrow_;\r
+ imageRedArrow_ = nullptr;\r
+ }\r
+ if (imageBlackArrow_ != nullptr) {\r
+ delete imageBlackArrow_;\r
+ imageBlackArrow_ = nullptr;\r
+ }\r
+ if (labelXAxisPointOne_ != nullptr) {\r
+ delete labelXAxisPointOne_;\r
+ labelXAxisPointOne_ = nullptr;\r
+ }\r
+ if (labelXAxisPointTwo_ != nullptr) {\r
+ delete labelXAxisPointTwo_;\r
+ labelXAxisPointTwo_ = nullptr;\r
+ }\r
+ if (labelXAxisPointThree_ != nullptr) {\r
+ delete labelXAxisPointThree_;\r
+ labelXAxisPointThree_ = nullptr;\r
+ }\r
+ if (labelYAxisPointOne_ != nullptr) {\r
+ delete labelYAxisPointOne_;\r
+ labelYAxisPointOne_ = nullptr;\r
+ }\r
+ if (labelYAxisPointTwo_ != nullptr) {\r
+ delete labelYAxisPointTwo_;\r
+ labelYAxisPointTwo_ = nullptr;\r
+ }\r
+ if (labelYAxisPointThree_ != nullptr) {\r
+ delete labelYAxisPointThree_;\r
+ labelYAxisPointThree_ = nullptr;\r
+ }\r
+ if (labelYAxisPointFour_ != nullptr) {\r
+ delete labelYAxisPointFour_;\r
+ labelYAxisPointFour_ = nullptr;\r
+ }\r
+ if (mainImg_ != nullptr) {\r
+ delete mainImg_;\r
+ mainImg_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_RATE_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateResultGroup::~HeartRateResultGroup");\r
+}\r
+\r
+void HeartRateResultGroup::InitImageAnimator()\r
+{\r
+ imageAnimator_ = new UIImageAnimatorView();\r
+ if (imageAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new imageAnimator_ fail");\r
+ return;\r
+ }\r
+ for (uint8_t i = 0; i < HEARTRATE_ANIMATOR_IMAGE_NUM; i++) {\r
+ imageAnimatorImageInfo_[i].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[i], HEART_RATE_IMAGE);\r
+ imageAnimatorImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;\r
+ imageAnimatorImageInfo_[i].pos.x = ANIMATOR_IMAGE_X;\r
+ imageAnimatorImageInfo_[i].pos.y = ANIMATOR_IMAGE_Y;\r
+ imageAnimatorImageInfo_[i].width = ANIMATOR_IMAGE_WIDTH;\r
+ imageAnimatorImageInfo_[i].height = ANIMATOR_IMAGE_HEIGHT;\r
+ }\r
+\r
+ imageAnimator_->SetPosition(PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y);\r
+ imageAnimator_->SetImageAnimatorSrc(imageAnimatorImageInfo_, HEARTRATE_ANIMATOR_IMAGE_NUM,\r
+ HEARTRATE_ANIMATOR_IMAGE_UPDATE);\r
+ imageAnimator_->SetRepeat(true);\r
+ imageAnimator_->SetAutoEnable(false);\r
+ imageAnimator_->SetResizeMode(UIImageView::FILL);\r
+ imageAnimator_->Start();\r
+ imageAnimator_->LayoutCenterOfParent();\r
+ imageAnimator_->SetDraggable(true);\r
+ Add(imageAnimator_);\r
+}\r
+}
\ No newline at end of file
#include "font/ui_font_bitmap.h"\r
#include "font/ui_font.h"\r
#include "graphic_config.h"\r
-#include "main/ModelListenerSample.h"\r
#include "activity/ActivityModel.h"\r
#include "activity/ActivityPresenter.h"\r
#include "activity/ActivityWeekView.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_digital_clock.h"\r
#include "gfx_utils/graphic_log.h"\r
-#include "main/ModelListenerSample.h"\r
#include "alarm/AlarmCloseRingView.h"\r
#include "alarm/AlarmRingView.h"\r
#include "alarm/AlarmPopUpView.h"\r
#include "alarm/AlarmClockModel.h"\r
#include "wearable_log.h"\r
+#include "common/task.h"\r
\r
namespace OHOS {\r
#define SET_TIME "settime"\r
\r
class AlarmPopUpView;\r
class AlarmPopUpPresenter : public Presenter<AlarmPopUpView>, public UIView::OnClickListener,\r
- public UIView::OnDragListener, public ModelListenerSample {\r
+ public UIView::OnDragListener, public Task {\r
public:\r
AlarmPopUpPresenter();\r
~AlarmPopUpPresenter() override;\r
bool OnClick(UIView &view, const ClickEvent &event) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
- void Notify() override;\r
+ void Callback() override;\r
void CancelAlarmRing(void);\r
void DelayAlarmRing(void);\r
+ void OnPause() override;\r
+ void OnResume() override;\r
private:\r
bool isStartCalcu{true};\r
uint16_t calcuNotifyNums{0};\r
#include "aod_view/AodView.h"
#include "components/ui_view.h"
#include "key/KeyInputListener.h"
-#include "main/ModelListenerSample.h"
+#include "common/task.h"
namespace OHOS {
class AodView;
class AodModel;
-class AodPresenter : public Presenter<AodView>, public ModelListenerSample {
+class AodPresenter : public Presenter<AodView>, public Task {
public:
AodPresenter() {}
~AodPresenter() override {}
AodPresenter(const AodPresenter &) = delete;
AodPresenter &operator=(const AodPresenter &) = delete;
- void Notify() override;
+ void OnResume() override;
+ void OnPause() override;
+ void Callback() override;
}; // AodPresenter
} // OHOS
#define AODVIEW_H
#include "View.h"
#include "main/MainModel.h"
-#include "set_dial/SetDialInfo.h"
#include "main/DialBinTypesV2.h"
#include "components/ui_view.h"
#include "components/ui_card_page.h"
+#include "components/ui_fragment.h"
namespace OHOS {
class AodPresenter;
void OnStart() override;
void OnStop() override;
- void PeriodicUpdate();
+ void Update();
private:
UIViewGroup *InitAodDial(DialSetting &setting);
UIViewGroup *InitDefaultAod();
bool isLoaded_ = false;
- UIViewGroup *clockDial_;
+ UIViewGroup *clockDial_{nullptr};
+ UIFragment *clockDialFragment_{nullptr};
};
} // OHOS
#endif // AODVIEW_H
\ No newline at end of file
UILabelExt label_;
AppItem itemInfo_;
};
-
-class HexagonsItemView : public UIImageView {
-public:
- explicit HexagonsItemView();
- ~HexagonsItemView();
- void SetItemInfo(const AppItem &itemInfo);
- AppViewId GetViewId();
- const char *GetAppUid();
-private:
- HexagonsItemView(const HexagonsItemView &);
- HexagonsItemView &operator = (const HexagonsItemView &);
- AppItem itemInfo_;
-};
-
-class FootballItemView : public UIImageView {
-public:
- explicit FootballItemView() {}
- ~FootballItemView();
- void SetItemInfo(const AppItem &itemInfo);
- AppViewId GetViewId();
- const char *GetAppUid();
-private:
- FootballItemView(const FootballItemView &);
- FootballItemView &operator = (const FootballItemView &);
- AppItem itemInfo_;
-};
-
-
-class WaterfallItemView : public UIImageView {
-public:
- explicit WaterfallItemView() {}
- ~WaterfallItemView();
- void SetItemInfo(const AppItem &itemInfo);
- AppViewId GetViewId();
- const char *GetAppUid();
-private:
- WaterfallItemView(const WaterfallItemView &);
- WaterfallItemView &operator = (const WaterfallItemView &);
- AppItem itemInfo_;
-};
}
#endif
uid(uid) {}
};
-enum AppListStyle {
- APPLIST_STYLE,
- HEXAGONS_STYLE,
- FOOTBALL_STYLE,
- WATERFALL_STYLE
-};
-
class ApplistPresenter;
class ApplistModel {
public:
void ResolvingJSAppItems(void);
void SetStartIndex(uint16_t index);
uint16_t GetStartIndex(void);
+ void SetLastOffset(int16_t x, int16_t y);
+ void GetLastOffset(int16_t& x, int16_t& y);
void SetHeadItemY(int index);
int GetHeadItemY(void);
void ApplistUpdate(void);
void SetPresenter(ApplistPresenter *p);
- AppListStyle GetCurrentStyle(void);
void SetInitFlag(bool flag);
+ void CleanupApplistStrings(uint8_t nativeAppNumTotal);
private:
ApplistModel();
BundleInfo *bundleInfos = nullptr;
int32 bundleLen = 0;
uint8 appLen = 0;
-
+ uint8 nativeAppNumTotal = 0;
uint16_t startIndex = 0;
int headItemY = 0;
+ int16_t lastOffsetX = 0;
+ int16_t lastOffsetY = 0;
bool initFlag{false};
};
}
#define APPLIST_PRESENTER_H
#include "Presenter.h"
-#include "ohos_types.h"
-#include "applist/AppItemView.h"
-#include "applist/ApplistView.h"
-#include "applist/ApplistModel.h"
-#include "components/root_view.h"
+#include "ApplistView.h"
+#include "ApplistModel.h"
namespace OHOS {
- class ApplistPresenter : public Presenter<ApplistView>, public UIView::OnClickListener,
- public ListScrollListener, public UIView::OnRotateListener {
- public:
- ApplistPresenter();
- ~ApplistPresenter() override;
+class ApplistPresenter : public Presenter<ApplistView> {
+public:
+ ApplistPresenter();
+ ~ApplistPresenter() override;
+ void OnStart() override;
+ void OnResume() override;
+ ApplistView* GetAppListView();
- void OnStart() override;
- void OnResume() override;
- bool OnRotate(UIView& view, const RotateEvent& event) override;
- bool OnClick(UIView &view, const ClickEvent &event) override;
- void OnItemSelected(int16 index, UIView *view) override;
- void SetStartIndex(uint16_t index);
- uint16_t GetStartIndex(void);
- void SetHeadItemY(int y);
- int GetHeadItemY(void);
- uint8_t GetListItemNum(void);
- ApplistView* GetAppListView();
- AppListStyle GetCurrentStyle(void);
-
- private:
- AppItemView *itemViewSele{nullptr};
- AppItemView *preItemViewSele{nullptr};
- ApplistModel *model{nullptr};
- };
+private:
+ ApplistModel *model{nullptr};
+};
}
#endif // APPLIST_PRESENTER_H
#define APPLIST_VIEW_H
#include "View.h"
-#include "animator/animator_manager.h"
-#include "components/root_view.h"
-#include "components/ui_view_group.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_label.h"
-#include "components/ui_list.h"
-#include "components/ui_custom_hexagons_list.h"
-#include "components/ui_waterfall_list.h"
-#include "components/ui_icosahedron_view.h"
-#include "gfx_utils/list.h"
-#include "ohos_types.h"
-#include "applist/ApplistAdapter.h"
-#include "ChangeSliceListener.h"
-#include "drag_event.h"
-#include "UiConfig.h"
+#include "UIDesktopFragment.h"
namespace OHOS {
-class AppListOnDragListener : public UIView::OnDragListener {
-public:
- AppListOnDragListener()
- {
- continueDrag = false;
- }
- ~AppListOnDragListener() override {}
- bool OnDragStart(UIView& view, const DragEvent& event) override
- {
- UNUSED(view);
- UNUSED(event);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondragstart!!");
- continueDrag = true;
- return false;
- }
-
- bool OnDrag(UIView& view, const DragEvent& event) override
- {
- UNUSED(view);
- if (!continueDrag) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppList : Can not continue drag!!");
- return false;
- }
- if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
- (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondrag!!");
- NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM);
- }
-
- return false;
- }
-
- bool OnDragEnd(UIView& view, const DragEvent& event) override
- {
- UNUSED(view);
- UNUSED(event);
- return false;
- }
-private:
- bool continueDrag{false};
-};
-
-class FootballAnimatorCallback : public AnimatorCallback {
-public:
- explicit FootballAnimatorCallback(UIView* view, int16_t startPos, int16_t endPos)
- : startPos_(startPos),
- endPos_(endPos),
- startTime_(0),
- animator_(new Animator(this, view, 1000, false)) {} // 1000:duration of animator_, in milliseconds.
-
- ~FootballAnimatorCallback() override
- {
- if (animator_ != nullptr) {
- delete animator_;
- animator_ = nullptr;
- }
- }
-
- void Callback(UIView* view) override;
-
- Animator* GetAnimator() const
- {
- return animator_;
- }
-
- void SetStartTime(uint32_t time)
- {
- isStartAnim_ = false;
- startTime_ = time;
- }
-protected:
- int16_t startPos_;
- int16_t endPos_;
- uint32_t startTime_;
- bool isStartAnim_ = false;
- Animator* animator_;
-};
-
class ApplistPresenter;
class ApplistView : public View<ApplistPresenter> {
public:
- ApplistView();
- ~ApplistView() override;
+ ApplistView() {};
+ ~ApplistView() override {};
void OnStart() override;
void OnStop() override;
-
- void LoadAppIconImage(UIImageView *view, const uint32_t id, const char *path);
+ void OnResume();
void AddAppItemToList(const AppItem &item);
void ClearAppItemToList();
- void RefreshAppList(void);
- void StartFootBallAnimator();
- void ResumeWaterFallDraggable();
+ void RefreshAppList();
private:
- /* for list style */
- void ListStyleOnStart();
- void ListStyleOnStop();
- ApplistAdapter *listAdapter_{nullptr};
- UIList *contentList_{nullptr};
- UIView::OnDragListener *dragListener_{nullptr};
-
- /* for hexagons style */
- void HexagonsStyleOnStart();
- void HexagonsStyleOnStop();
- UICustomHexagonsList* hexagonsList_{nullptr};
- List<HexagonsItemView*> listHexagonsView_;
- uint16_t imgSize_ = 0;
- uint16_t imgDistance_ = 0;
-
- /* for football style */
- void FootballStyleOnStart();
- void FootballStyleOnStop();
- UIIcosahedronView* footballList_ = nullptr;
- List<FootballItemView*> footballItemList_;
- ImageInfo* footballDefaultImg_ = nullptr;
- FootballAnimatorCallback* callback_ = nullptr;
- Animator* enterAnimator_ = nullptr;
-
- /* for waterfall style */
- void WaterfallStyleOnStart();
- void WaterfallStyleOnStop();
- UIWaterfallList* waterfallList_{nullptr};
- List<WaterfallItemView*> waterfallItemList_;
+ UIDesktopFragment *desktopFragment_ = nullptr;
};
}
-#endif // APPLIST_VIEW_H
\ No newline at end of file
+#endif // APPLIST_VIEW_H
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: DesktopFactory
+ * Author:
+ * Create: 2025-07
+ */
+
+#ifndef DESKTOP_FACTORY_H
+#define DESKTOP_FACTORY_H
+
+#include <unordered_map>
+#include "UIDesktopFragment.h"
+
+namespace OHOS {
+class DesktopInterface;
+class DesktopFactory {
+public:
+ static DesktopFactory& GetInstance()
+ {
+ static DesktopFactory instance;
+ return instance;
+ }
+ void RegisterDesktopStyle(const uint16_t style, DesktopInterface* desktop);
+ UIDesktopFragment* CreateDesktopStyle(uint16_t style);
+
+private:
+ DesktopFactory() {};
+ ~DesktopFactory() {};
+ DesktopFactory(const DesktopFactory&) = delete;
+ DesktopFactory &operator=(const DesktopFactory&) = delete;
+ std::unordered_map<uint16_t, DesktopInterface*> desktops_;
+};
+
+class DesktopStyleRegister {
+public:
+ DesktopStyleRegister(const uint16_t style, DesktopInterface* uiCardPage)
+ {
+ DesktopFactory::GetInstance().RegisterDesktopStyle(style, uiCardPage);
+ }
+};
+
+class DesktopInterface {
+public:
+ virtual UIDesktopFragment* CreateDesktop() = 0;
+ DesktopInterface() = default;
+ virtual ~DesktopInterface() = default;
+ DesktopInterface(const DesktopInterface&) = delete;
+ DesktopInterface& operator=(const DesktopInterface&) = delete;
+ DesktopInterface(DesktopInterface&&) = delete;
+ DesktopInterface& operator=(DesktopInterface&&) = delete;
+};
+
+template <class D>
+class DesktopProxy : public DesktopInterface {
+public:
+ UIDesktopFragment* CreateDesktop() override
+ {
+ D* d = new D();
+ UIDesktopFragment* fragment = dynamic_cast<UIDesktopFragment*>(d);
+ if (fragment == nullptr) {
+ delete d;
+ }
+ return fragment;
+ }
+};
+} // namespace OHOS
+
+#define REGIST_DESKTOP_STYLE(style, D) \
+ const static OHOS::DesktopStyleRegister (STATIC_VAR)(static_cast<uint16_t>(style), new DesktopProxy<D>())
+
+#endif // DESKTOP_FACTORY_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: FootballDesktopFragment.h
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#ifndef FOOTBALL_DESKTOP_FRAGMENT_H
+#define FOOTBALL_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_icosahedron_view.h"
+
+namespace OHOS {
+class FootballAnimatorCallback;
+class FootballItemView;
+class FootballDesktopFragment : public UIDesktopFragment {
+public:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ void AddAppItemToList(const AppItem &item) override;
+ void ClearAppItemToList() override;
+ void RefreshAppList() override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+ void OnResumeView() override;
+
+private:
+ UIIcosahedronView* footballList_ = nullptr;
+ List<FootballItemView*> footballItemList_;
+ ImageInfo* footballDefaultImg_ = nullptr;
+ FootballAnimatorCallback* callback_ = nullptr;
+ Animator* enterAnimator_ = nullptr;
+};
+
+class FootballAnimatorCallback : public AnimatorCallback {
+public:
+ explicit FootballAnimatorCallback(UIView* view, int16_t startPos, int16_t endPos)
+ : startPos_(startPos),
+ endPos_(endPos),
+ startTime_(0),
+ animator_(new Animator(this, view, 1000, false)) {} // 1000:duration of animator_, in milliseconds.
+
+ ~FootballAnimatorCallback() override
+ {
+ if (animator_ != nullptr) {
+ delete animator_;
+ animator_ = nullptr;
+ }
+ }
+
+ void Callback(UIView* view) override;
+
+ Animator* GetAnimator() const
+ {
+ return animator_;
+ }
+
+ void SetStartTime(uint32_t time)
+ {
+ isStartAnim_ = false;
+ startTime_ = time;
+ }
+protected:
+ int16_t startPos_;
+ int16_t endPos_;
+ uint32_t startTime_;
+ bool isStartAnim_ = false;
+ Animator* animator_;
+};
+
+class FootballItemView : public UIImageView {
+public:
+ explicit FootballItemView() {}
+ ~FootballItemView() override;
+ bool SetItemInfo(const AppItem &itemInfo);
+ AppViewId GetViewId();
+ const char *GetAppUid();
+private:
+ FootballItemView(const FootballItemView &);
+ FootballItemView &operator = (const FootballItemView &);
+ AppItem itemInfo_;
+};
+}
+
+#endif // FOOTBALL_DESKTOP_FRAGMENT_H
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: HexagonsDesktopFragment.h
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#ifndef HEXAGONS_DESKTOP_FRAGMENT_H
+#define HEXAGONS_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_custom_hexagons_list.h"
+
+namespace OHOS {
+class HexagonsItemView;
+class HexagonsDesktopFragment : public UIDesktopFragment {
+public:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ bool OnRotate(UIView& view, const RotateEvent& event) override;
+ void AddAppItemToList(const AppItem &item) override;
+ void ClearAppItemToList() override;
+ void RefreshAppList() override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+
+private:
+ UICustomHexagonsList* hexagonsList_{nullptr};
+ List<HexagonsItemView*> listHexagonsView_;
+};
+
+class HexagonsItemView : public UIImageView {
+public:
+ explicit HexagonsItemView() {};
+ ~HexagonsItemView();
+ bool SetItemInfo(const AppItem &itemInfo);
+ AppViewId GetViewId();
+ const char *GetAppUid();
+private:
+ HexagonsItemView(const HexagonsItemView &);
+ HexagonsItemView &operator = (const HexagonsItemView &);
+ AppItem itemInfo_;
+};
+}
+
+#endif // HEXAGONS_DESKTOP_FRAGMENT_H
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: ListDesktopFragment.h
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#ifndef LIST_DESKTOP_FRAGMENT_H
+#define LIST_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "ApplistAdapter.h"
+#include "ChangeSliceListener.h"
+#include "components/ui_list.h"
+#include "drag_event.h"
+
+namespace OHOS {
+class ListDesktopFragment : public UIDesktopFragment {
+public:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ void OnItemSelected(int16 index, UIView *view) override;
+ void AddAppItemToList(const AppItem &item) override;
+ void ClearAppItemToList() override;
+ void RefreshAppList() override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+
+private:
+ ApplistAdapter *listAdapter_{nullptr};
+ UIList *contentList_{nullptr};
+ UIView::OnDragListener *dragListener_{nullptr};
+ AppItemView *itemViewSele{nullptr};
+ AppItemView *preItemViewSele{nullptr};
+};
+
+class AppListOnDragListener : public UIView::OnDragListener {
+public:
+ AppListOnDragListener()
+ {
+ continueDrag_ = false;
+ }
+ ~AppListOnDragListener() override {}
+ bool OnDragStart(UIView& view, const DragEvent& event) override
+ {
+ UNUSED(view);
+ UNUSED(event);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondragstart!!");
+ continueDrag_ = true;
+ return false;
+ }
+
+ bool OnDrag(UIView& view, const DragEvent& event) override
+ {
+ UNUSED(view);
+ if (!continueDrag_) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppList : Can not continue drag!!");
+ return false;
+ }
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Applist Ondrag!!");
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM);
+ }
+
+ return false;
+ }
+
+ bool OnDragEnd(UIView& view, const DragEvent& event) override
+ {
+ UNUSED(view);
+ UNUSED(event);
+ return false;
+ }
+private:
+ bool continueDrag_{false};
+};
+}
+
+#endif // LIST_DESKTOP_FRAGMENT_H
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlanetDesktop
+ * Created: 2025-07-29
+ */
+
+#ifndef PLANET_DESKTOP_FRAGMENT_H
+#define PLANET_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_custom_planet_list.h"
+
+namespace OHOS {
+class PlanetItemView;
+class PlanetDesktopFragment : public UIDesktopFragment {
+public:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ void AddAppItemToList(const AppItem &item) override;
+ void ClearAppItemToList() override;
+ void RefreshAppList() override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+
+private:
+ UICustomPlanetList* planetList_{nullptr};
+ List<PlanetItemView*> pltItemList_;
+ List<UILabel*> pltLabelList_;
+};
+
+class PlanetItemView : public UIImageView {
+public:
+ explicit PlanetItemView() {}
+ ~PlanetItemView() {}
+ void SetItemInfo(const AppItem &itemInfo);
+ AppViewId GetViewId();
+ const char *GetAppUid();
+ const char *GetAppLabel();
+
+private:
+ PlanetItemView(const PlanetItemView &) = delete;
+ PlanetItemView &operator = (const PlanetItemView &) = delete;
+ AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+};
+}
+
+#endif // PLANET_DESKTOP_FRAGMENT_H
--- /dev/null
+ /*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: SphereDesktopFragment
+ * Author: Hisi Graphic Team
+ * Created: 2025-09
+ */
+
+#ifndef SPHERE_DESKTOP_FRAGMENT_H
+#define SPHERE_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_sphere_view.h"
+#include "components/ui_transform_group.h"
+
+namespace OHOS {
+class SphereAnimatorCallback;
+class SphereItemView;
+class SphereDesktopFragment : public UIDesktopFragment {
+public:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ bool OnRotate(UIView& view, const RotateEvent& event) override;
+ void AddAppItemToList(const AppItem &item) override;
+ void ClearAppItemToList() override;
+ void RefreshAppList() override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+ void OnResumeView() override;
+
+private:
+ UISphereView* sphereView_{nullptr};
+ List<SphereItemView*> listSphereView_;
+ SphereAnimatorCallback* callback_ = nullptr;
+ Animator* enterAnimator_ = nullptr;
+};
+
+class SphereAnimatorCallback : public AnimatorCallback {
+public:
+ explicit SphereAnimatorCallback(UIView* view, int16_t width, int16_t height)
+ : width_(width),
+ height_(height),
+ startTime_(0),
+ passTime_(0),
+ angle_(0),
+ animator_(new Animator(this, view, 600, false)) {} // 600 ms:duration of animator_
+
+ ~SphereAnimatorCallback() override
+ {
+ if (animator_ != nullptr) {
+ delete animator_;
+ animator_ = nullptr;
+ }
+ }
+
+ void Callback(UIView* view) override;
+
+ Animator* GetAnimator() const
+ {
+ return animator_;
+ }
+
+ void SetStartTime(uint32_t time)
+ {
+ isStartAnim_ = false;
+ startTime_ = time;
+ }
+protected:
+ int16_t width_;
+ int16_t height_;
+ uint32_t startTime_;
+ uint32_t passTime_;
+ bool isStartAnim_ = false;
+ int16_t angle_;
+ Animator* animator_;
+};
+
+class SphereItemView : public UITransformGroup {
+public:
+ explicit SphereItemView() {};
+ ~SphereItemView();
+ bool SetItemInfo(const AppItem &itemInfo);
+ AppViewId GetViewId();
+ const char *GetAppUid();
+private:
+ SphereItemView(const SphereItemView &);
+ SphereItemView &operator = (const SphereItemView &);
+ UIImageView* imageView_{nullptr};
+ AppItem itemInfo_;
+};
+}
+
+#endif // SPHERE_DESKTOP_FRAGMENT_H
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: UIDesktopFragment.h
+ * Author:
+ * Create: 2025-07-07
+ */
+
+#ifndef UI_DESKTOP_FRAGMENT_H
+#define UI_DESKTOP_FRAGMENT_H
+
+#include "applist/AppItemView.h"
+#include "components/ui_fragment.h"
+#include "components/ui_list.h"
+#include "components/ui_view_group.h"
+#include "components/ui_scroll_view.h"
+#include "settings/model/SettingDesktopModel.h"
+#include "TransitionType.h"
+#include "ohos_types.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+class UIDesktopFragment : public UIFragment, public UIView::OnClickListener,
+ public ListScrollListener, public UIView::OnRotateListener {
+public:
+ virtual void AddAppItemToList(const AppItem &item) = 0;
+ virtual void ClearAppItemToList() = 0;
+ virtual void RefreshAppList() = 0;
+ void SetPosition(int16_t x, int16_t y, int16_t width, int16_t height);
+
+protected:
+ uint16_t imgSize_ = 0;
+ uint16_t imgDistance_ = 0;
+ void OnCreateView(void* data) override {};
+ void OnDestroyView() override {};
+ bool SwitchView(AppViewId viewId, char *uid, TransitionType type, DesktopStyle style);
+};
+}
+#endif // UI_DESKTOP_FRAGMENT_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: WaterfallDesktopFragment.h
+ * Author:
+ * Create: 2025-07-04
+ */
+
+#ifndef WATERFALL_DESKTOP_FRAGMENT_H
+#define WATERFALL_DESKTOP_FRAGMENT_H
+
+#include "UIDesktopFragment.h"
+#include "components/ui_waterfall_list.h"
+
+namespace OHOS {
+class WaterfallItemView;
+class WaterfallDesktopFragment : public UIDesktopFragment {
+public:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ void AddAppItemToList(const AppItem &item) override;
+ void ClearAppItemToList() override;
+ void RefreshAppList() override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+ void OnResumeView() override;
+
+private:
+ UIWaterfallList* waterfallList_{nullptr};
+ List<WaterfallItemView*> waterfallItemList_;
+};
+
+class WaterfallItemView : public UIImageView {
+public:
+ explicit WaterfallItemView() {}
+ ~WaterfallItemView();
+ bool SetItemInfo(const AppItem &itemInfo);
+ AppViewId GetViewId();
+ const char *GetAppUid();
+private:
+ WaterfallItemView(const WaterfallItemView &);
+ WaterfallItemView &operator = (const WaterfallItemView &);
+ AppItem itemInfo_;
+};
+}
+
+#endif // WATERFALL_DESKTOP_FRAGMENT_H
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodChartPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_CHART_PAGE_H\r
+#define BLOOD_CHART_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_chart.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "BloodView.h"\r
+#include "BloodPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t HEART_AVE_NUM = 360;\r
+static constexpr uint8_t BLOOD_ANIMATOR_IMAGE_NUM = 30;\r
+static constexpr uint8_t BLOOD_ANIMATOR_IMAGE_UPDATE = 40;\r
+static constexpr uint8_t INDEX_1 = 1;\r
+static constexpr uint8_t INDEX_2 = 2;\r
+static constexpr uint8_t INDEX_3 = 3;\r
+static constexpr uint8_t DATA_SERIAL_COUNT = 4;\r
+class BloodPresenter;\r
+class BloodChartPage : public SlicePage<BloodPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BloodChartPage();\r
+ ~BloodChartPage() override;\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void InitImageAnimator();\r
+ \r
+private:\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UILabel *labelTestTime_ = nullptr;\r
+ UILabel *labelXAxisPointOne_ = nullptr;\r
+ UILabel *labelXAxisPointTwo_ = nullptr;\r
+ UILabel *labelXAxisPointThree_ = nullptr;\r
+ UILabelButton *labelButtonRetest_ = nullptr;\r
+ UIChartDataSerial *dataSerial_{nullptr};\r
+ UIChartPillar *chartPillar_ = nullptr;\r
+ UIImageView *mainImg_ = nullptr;\r
+ UIImageView *chartImg_ = nullptr;\r
+ UIImageAnimatorView *imageAnimator_ = nullptr;\r
+ ImageAnimatorInfo imageAnimatorImageInfo_[BLOOD_ANIMATOR_IMAGE_NUM];\r
+};\r
+}\r
+#endif // BLOOD_CHART_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodExplainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_EXPLAIN_PAGE_H\r
+#define BLOOD_EXPLAIN_PAGE_H\r
+\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "BloodView.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t LABEL_DES_COUNT = 4;\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodExplainPage : public SlicePage<BloodPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BloodExplainPage();\r
+ ~BloodExplainPage() override;\r
+ static BloodExplainPage *GetInstance();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool InitSimilarLabel(int16 num, int16 labelX, int16 labelY, const char *labelText);\r
+private:\r
+ UIScrollView *scrollGroup_ = nullptr;\r
+ UIImageView *imgNormal_ = nullptr;\r
+ UIImageView *imgGeneral_ = nullptr;\r
+ UIImageView *imgAbnormal_ = nullptr;\r
+ UILabel *labelNormal_ = nullptr;\r
+ UILabel *labelGeneral_ = nullptr;\r
+ UILabel *labelAbnormal_ = nullptr;\r
+ UILabel *labelDes_[LABEL_DES_COUNT]{nullptr};\r
+};\r
+}\r
+#endif // BLOOD_EXPLAIN_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodMainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_MAIN_PAGE_H\r
+#define BLOOD_MAIN_PAGE_H\r
+\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "layout/grid_layout.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "video_play_wrapper.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+#include "BloodView.h"\r
+\r
+namespace OHOS {\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodMainPage : public SlicePage<BloodPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BloodMainPage();\r
+ ~BloodMainPage() override;\r
+ static BloodMainPage *GetInstance();\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ void InitImageAnimator();\r
+ bool IsToday(const struct timeval &tv);\r
+ void SetTestTime();\r
+private:\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabelButton *buttonStart_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UILabel *labelPreTest_ = nullptr;\r
+ UILiteSurfaceView *surfaceView_ = nullptr;\r
+ MediaVideoPlay *videoPlay_ = nullptr;\r
+ ColorType colorKey_;\r
+};\r
+}\r
+#endif // BLOOD_MAIN_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodMeasurementPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_MEASUREMENT_PAGE_H\r
+#define BLOOD_MEASUREMENT_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "layout/grid_layout.h"\r
+#include "animator/animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "video_play_wrapper.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+#include "BloodView.h"\r
+\r
+\r
+namespace OHOS {\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodMeasurementPage : public SlicePage<BloodPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BloodMeasurementPage();\r
+ ~BloodMeasurementPage() override;\r
+ void OnStart(void *data) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ void InitImageAnimator();\r
+ void InitAnimator();\r
+ void SetLabelTime(std::string str);\r
+ void StopAnimator();\r
+ void ShowOnMeasurement();\r
+ void StartAnimator();\r
+private:\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UILabel *labelTips_ = nullptr;\r
+ UILabel *labelTime_ = nullptr;\r
+ UILiteSurfaceView *surfaceView_ = nullptr;\r
+ MediaVideoPlay *videoPlay_ = nullptr;\r
+ ColorType colorKey_;\r
+ struct timeval startTime_;\r
+ class BloodAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ explicit BloodAnimatorCallback(BloodMeasurementPage *page) : page_(page) {}\r
+ ~BloodAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+ private:\r
+ BloodMeasurementPage *page_{nullptr};\r
+ };\r
+ Animator *animator_ = nullptr;\r
+ BloodAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // BLOOD_MEASUREMENT_PAGE_H
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: SettingModel.h\r
- * Author:\r
- * Create: 2025-03-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodModel\r
+ * Create: 2025-06\r
*/\r
\r
#ifndef BLOOD_MODEL_H\r
\r
#include <string>\r
#include <list>\r
+#include <sys/time.h>\r
#include "graphic_timer.h"\r
\r
namespace OHOS {\r
- class BloodModel {\r
- public:\r
- static BloodModel &GetInstance(void);\r
- bool GetbuttonStatus();\r
- void SetbuttonStatus(bool status);\r
- std::string GetCurrentTimeString();\r
- void StartCurrentTimeTimer();\r
- void PauseCurrentTimeTimer();\r
- private:\r
- virtual ~BloodModel();\r
- BloodModel();\r
- BloodModel(const BloodModel &);\r
- void InitCurrentTimeTimer();\r
- void DisableCurrentTimeTimer();\r
- BloodModel &operator=(const BloodModel &);\r
- bool buttonStatus = 0;\r
- GraphicTimer *pCurrentTimeTimer_ = nullptr;\r
+typedef struct {\r
+ uint16_t blood;\r
+ struct timeval time;\r
+} bloodMeasurementInfo;\r
+class BloodModel {\r
+public:\r
+ static BloodModel &GetInstance(void);\r
+ void SetBlood(bloodMeasurementInfo value)\r
+ {\r
+ blood = value;\r
};\r
+ bloodMeasurementInfo GetBlood()\r
+ {\r
+ return blood;\r
+ };\r
+\r
+private:\r
+ BloodModel();\r
+ BloodModel(const BloodModel &);\r
+ BloodModel &operator=(const BloodModel &);\r
+ virtual ~BloodModel();\r
+ bloodMeasurementInfo blood = {0, 0};\r
+};\r
}\r
-#endif // BLOOD_MODEL_H
\ No newline at end of file
+#endif // BLOOD_MODEL_H
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: SettingPresenter.h\r
- * Author:\r
- * Create: 2025-03-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodPresenter\r
+ * Create: 2025-06\r
*/\r
\r
#ifndef BLOOD_PRESENTER_H\r
#include "components/ui_view.h"\r
\r
namespace OHOS {\r
-typedef enum {\r
- BLOOD_START,\r
- BLOOD_TEST,\r
- BLOOD_MORE,\r
- MAX_BLOOD_PAGE,\r
-} PageId;\r
-constexpr short SET_ZERO = 0;\r
-constexpr short SET_ONE = 1;\r
-constexpr short SET_TWO = 2;\r
-constexpr short SET_THREE = 3;\r
-constexpr short SET_FOUR = 4;\r
-constexpr short SET_FIVE = 5;\r
-constexpr short TEMP_SET_SIX = 6;\r
-constexpr short SET_SEVEN = 7;\r
-constexpr short SET_EIGHT = 8;\r
-constexpr short SET_NINE = 9;\r
-constexpr short SET_HUNDRED = 100;\r
-constexpr short SET_INT_MAX = 255;\r
class BloodView;\r
-class BloodModel;\r
-class BloodPresenter : public Presenter<BloodView>,\r
- public UIView::OnClickListener,\r
- public UIView::OnDragListener {\r
-public:\r
- BloodPresenter();\r
- ~BloodPresenter() override;\r
- static BloodPresenter *GetInstance();\r
-\r
- void OnResume() override;\r
- bool OnClick(UIView &view, const ClickEvent &event) override;\r
- bool OnDrag(UIView& view, const DragEvent& event) override;\r
- void OnPause() override;\r
- bool ClickFuncId(const char *buttonName);\r
-\r
-private:\r
- BloodModel *findPhoneModel;\r
-};\r
+class BloodPresenter : public Presenter<BloodView> {};\r
}\r
-\r
-#endif // BLOOD_PRESENTER_H
\ No newline at end of file
+#endif // BLOOD_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodReadyPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_READY_PAGE_H\r
+#define BLOOD_READY_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "layout/grid_layout.h"\r
+#include "animator/animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "video_play_wrapper.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+#include "BloodView.h"\r
+\r
+\r
+namespace OHOS {\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodReadyPage : public SlicePage<BloodPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BloodReadyPage();\r
+ ~BloodReadyPage() override;\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void InitAnimator();\r
+ void SetLabelProgressTime(int value);\r
+ void StopAnimator();\r
+ void ShowOnMeasurement();\r
+ int InitCircleProgress();\r
+ \r
+private:\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabel *labelTips_ = nullptr;\r
+ UILabelButton *buttonStart_ = nullptr;\r
+ UICircleProgress *timeProgress_ = nullptr;\r
+ UILabel *labelProgressTime_ = nullptr;\r
+ class BloodAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ explicit BloodAnimatorCallback(BloodReadyPage *page) : page_(page) {}\r
+ ~BloodAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+\r
+ private:\r
+ BloodReadyPage *page_{nullptr};\r
+ };\r
+ struct timeval startTime_;\r
+ Animator *animator_ = nullptr;\r
+ BloodAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // BLOOD_READY_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodResultPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef BLOOD_RESULT_PAGE_H\r
+#define BLOOD_RESULT_PAGE_H\r
+\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "BloodView.h"\r
+#include "BloodModel.h"\r
+#include "BloodPresenter.h"\r
+\r
+namespace OHOS {\r
+class BloodPresenter;\r
+class BloodModel;\r
+class BloodResultPage : public SlicePage<BloodPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BloodResultPage();\r
+ ~BloodResultPage() override;\r
+ static BloodResultPage *GetInstance();\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+private:\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UILabel *labelData_ = nullptr;\r
+ UILabel *labelBloodOxygen_ = nullptr;\r
+ UILabelButton *buttonMore_ = nullptr;\r
+ UIImageView *mainImg_ = nullptr;\r
+ UIImageView *levelImg_ = nullptr;\r
+};\r
+}\r
+#endif // BLOOD_RESULT_PAGE_H\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: SettingView.h\r
- * Author:\r
- * Create: 2025-03-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BloodView\r
+ * Create: 2025-06\r
*/\r
\r
#ifndef BLOOD_VIEW_H\r
#define BLOOD_VIEW_H\r
\r
#include "View.h"\r
-#include "components/root_view.h"\r
-#include "components/ui_view_group.h"\r
-#include "components/ui_scroll_view.h"\r
-#include "components/ui_digital_clock.h"\r
-#include "components/ui_label.h"\r
-#include "components/ui_list.h"\r
-#include "components/ui_image_animator.h"\r
-#include "ChangeSliceListener.h"\r
-#include "test_case_list_adapter.h"\r
-#include "UiConfig.h"\r
-#include "blood/BloodModel.h"\r
-#include "blood/BloodPresenter.h"\r
-#include "layout/grid_layout.h"\r
-#include "ui_test.h"\r
namespace OHOS {\r
-class BloodPresenter;\r
-\r
-class BloodModel;\r
-class BloodView : public View<BloodPresenter> {\r
-public:\r
- BloodView();\r
- ~BloodView() override;\r
-\r
- static BloodView *GetInstance();\r
-\r
- void OnStart() override;\r
- void OnStop() override;\r
- bool ClickButtonChange(bool status);\r
- void SetupCurrentTime();\r
- void SetupImageAnimator();\r
- void UpdateCurrentTimeLabel(const char *currentTime);\r
- bool IsCurrentTimeLabelValid();\r
- void SetUpImageAnimator();\r
- void SetupButton();\r
- void InitImageInfo();\r
-\r
- void InitStart();\r
- void InitTest();\r
- void InitMore();\r
- bool TempInitLabel(void);\r
- bool InitSimilarLabel(int16 num, int16 labelY, const char *labelText);\r
- void ChangeView(int16 hideView, int16 showView);\r
-\r
- void DropView(UIView& view, int type);\r
- bool ClickFunc(int16 interf);\r
- bool ChangeBloodStart(int16_t thisView);\r
- bool ChangeBloodTest(int16_t thisView);\r
- bool ChangeBloodMore(int16_t thisView);\r
-private:\r
- UIView::OnDragListener *dragListener_ = nullptr;\r
- TestCaseListAdapter* adapter_ = nullptr;\r
- BloodModel *findPhoneModel;\r
- UILabel *currentTime_{nullptr};\r
- GridLayout* layout_ = nullptr;\r
-\r
- UIViewGroup* container[MAX_BLOOD_PAGE] = {nullptr};\r
- UIViewGroup *group = nullptr;\r
- UIViewGroup *groupTest = nullptr;\r
- UIScrollView *scrollGroup = nullptr;\r
- UILabelButton* button = nullptr;\r
- UILabelButton* buttonMore = nullptr;\r
- UILabel *label1_ = nullptr;\r
- UILabel *label2_ = nullptr;\r
-\r
- ImageInfo* imageInfo1_ = nullptr;\r
- ImageInfo* imageInfo2_ = nullptr;\r
- ImageInfo* imageInfo3_ = nullptr;\r
- ImageAnimatorInfo imageAnimatorImageInfo_[3] = { 0 };\r
- UIImageAnimatorView* imageAnimator_ = nullptr;\r
-\r
- UILabel *tempTitle{nullptr};\r
- UILabel *tempLabel[SET_THREE]{nullptr};\r
+enum BLOOD_PAGES {\r
+ BLOOD_MAIN_PAGE = 1, // 0 is invalid\r
+ BLOOD_READY_PAGE = 2,\r
+ BLOOD_MEASUREMENT_PAGE = 3,\r
+ BLOOD_RESULT_PAGE = 4,\r
+ BLOOD_CHART_PAGE = 5,\r
+ BLOOD_EXPLAIN_PAGE = 6,\r
};\r
+class BloodPresenter;\r
+class BloodView : public View<BloodPresenter> {};\r
}\r
-#endif // BLOOD_VIEW_H\r
+#endif // BLOOD_VIEW_H
\ No newline at end of file
#include "bts_def.h"\r
#include "bts_gatt_stru.h"\r
#include "bts_gatt_server.h"\r
+#include "bts_gatt_client.h"\r
#include "bts_le_gap.h"\r
\r
#ifdef __cplusplus\r
#endif\r
\r
errcode_t wrapper_gap_ble_register_callbacks(gap_ble_callbacks_t *func);\r
+errcode_t wrapper_gattc_register_client(bt_uuid_t *uuid, uint8_t *clientId);\r
errcode_t wrapper_gatts_register_callbacks(gatts_callbacks_t *func);\r
+errcode_t wrapper_gattc_register_callbacks(gattc_callbacks_t *func);\r
void wrapper_ble_register(void);\r
errcode_t wrapper_gatts_register_server(bt_uuid_t *app_uuid, uint8_t *server_id);\r
errcode_t wrapper_gatts_add_service(uint8_t server_id, bt_uuid_t *service_uuid, bool is_primary);\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathExerPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_EXER_PAGE_H\r
+#define BREATH_EXER_PAGE_H\r
+\r
+#include "layout/grid_layout.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_animator.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "power_display_service.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+int32_t g_StartTime;\r
+class BreathExerPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathExerPage();\r
+ ~BreathExerPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnPause() override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void SetUpImageAnimator();\r
+ void UpdateTextOpa();\r
+ void UpdateImageRotate();\r
+ class BreathExerPageCallback : public AnimatorCallback {\r
+ public:\r
+ BreathExerPageCallback(BreathExerPage* page) : BreathExerPage(page) {}\r
+ virtual ~BreathExerPageCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ BreathExerPage* BreathExerPage{nullptr};\r
+ };\r
+ BreathExerPageCallback* animatorCallBack_{nullptr};\r
+ Animator *animator_ = nullptr;\r
+private:\r
+ UIViewGroup *group_ = nullptr;\r
+ UIImageView* mainImg_ = nullptr;\r
+ UIImageView* romataImg_ = nullptr;\r
+ UIImageView* romataImgVirtual_ = nullptr;\r
+ UILabel *breathInhale_ = nullptr;\r
+ UILabel *breathExhale_ = nullptr;\r
+ float scale_ = 0;\r
+ float angle_ = 0;\r
+ bool flag_ = true;\r
+ float rotateStep_ = 0.0f;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathMainPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_MAIN_PAGE_H\r
+#define BREATH_MAIN_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_animator.h"\r
+#include "View.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "BreathView.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+\r
+class BreathMainPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathMainPage();\r
+ ~BreathMainPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+private:\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UIButton *buttonTime_ = nullptr;\r
+ UIButton *buttonSetting_ = nullptr;\r
+ UIButton *buttonStart_ = nullptr;\r
+ UILabel *lableSetting_ = nullptr;\r
+ UILabel *lableTime_ = nullptr;\r
+ UIImageView *bgImg_ = nullptr;\r
+ UIImageView *center_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathModel\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_MODEL_H\r
+#define BREATH_MODEL_H\r
+\r
+#include <string>\r
+#include "gfx_utils/graphic_math.h"\r
+namespace OHOS {\r
+class BreathModel {\r
+public:\r
+ static BreathModel &GetInstance();\r
+ virtual ~BreathModel();\r
+\r
+ uint8_t GetTrainTime();\r
+ void SetTrainTime(uint16_t value); // 设置呼吸训练时间\r
+ uint8_t GetRhythm();\r
+ void SetRhythm(uint16_t value); // 设置呼吸节奏\r
+ int32_t GetStartTime();\r
+ void SetStartTime(int32_t value); // 设置呼吸准备页面开始时间\r
+ int32_t GetBeginTime();\r
+ void SetBeginTime(int32_t value); // 设置呼吸训练开始时间\r
+ uint8_t GetFrequencyScore();\r
+ void SetFrequencyScore(); // 调用传感器接口实现呼吸数据,客户自实现\r
+ uint8_t GetHeartRate();\r
+ void SetHeartRate(); // 调用传感器接口实现心率数据,客户自实现\r
+ std::string GetTrainingDurationTime();\r
+ void SetTrainingDurationTime(uint16_t data); // 增加训练总时长\r
+ std::string GetTrainingCount();\r
+ void SetTrainingCount(); // 增加训练总次数\r
+ float GetRotateStep(); // 获取图片旋转步频\r
+ char *GetRhythmText(); // 获取呼吸频率节奏文本\r
+\r
+private:\r
+ BreathModel();\r
+ BreathModel(const BreathModel &);\r
+ BreathModel &operator=(const BreathModel &);\r
+ uint8_t selectTrainTime_ = 0;\r
+ uint8_t selectRhythm_ = 0;\r
+ uint8_t trainingDurationTime_ = 0;\r
+ uint8_t trainingCount_ = 0;\r
+ int32_t startTime_ = 0; // 用于记录五秒倒计时开始时间\r
+ int32_t beginTime_ = 0; // 用于记录训练倒计时开始时间\r
+ uint8_t frequencyScore_ = 0;\r
+ uint8_t heartRate_ = 0;\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathPresenter\r
+ * Create: 2025-5-23\r
+ */\r
+\r
+#ifndef Breath_PRESENTER_H\r
+#define Breath_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class BreathView;\r
+class BreathPresenter : public Presenter<BreathView> {};\r
+}\r
+\r
+#endif // Breath_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathResult\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_RESULT_PAGE_H\r
+#define BREATH_RESULT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "View.h"\r
+#include "power_display_service.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_COUNT = 5;\r
+\r
+class BreathResultPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathResultPage();\r
+ ~BreathResultPage() override;\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ void InitBtn();\r
+ void InitBtnBg();\r
+ void InitLabelDes();\r
+ void InitLabelCount();\r
+ void InitLabelUnit();\r
+ uint8_t GetTimeScour();\r
+private:\r
+ UIScrollView *group_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UILabel *labelTimeAndRhythmTitle_ = nullptr;\r
+ UIButton *buttonBg_[LABEL_COUNT]{nullptr};\r
+ UILabel *labelDes_[LABEL_COUNT]{nullptr};\r
+ UILabel *labelValue_[LABEL_COUNT]{nullptr};\r
+ UILabel *labelUnit_[LABEL_COUNT]{nullptr};\r
+ UIImageView *scores_ = nullptr;\r
+ UIImageView *pageBgImg_ = nullptr;\r
+ UIButton *buttonComplete_ = nullptr;\r
+ UIButton *buttonRestart_ = nullptr;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathRhythmSetPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_RHYTHM_SET_PAGE_H\r
+#define BREATH_RHYTHM_SET_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+class BreathRhythmSetPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ public UIPicker::SelectedListener {\r
+public:\r
+ BreathRhythmSetPage();\r
+ ~BreathRhythmSetPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+private:\r
+ UILabel *lableRhythm_ = nullptr;\r
+ UIPicker *pickerRhythm_ = nullptr;\r
+ UIButton *buttonOk_ = nullptr;\r
+ UIViewGroup *group_ = nullptr;\r
+ UIImageView *pickerImg_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathStartPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_START_PAGE_H\r
+#define BREATH_START_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "View.h"\r
+#include "power_display_service.h"\r
+#include "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+class BreathStartPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathStartPage();\r
+ ~BreathStartPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnTimer();\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void OnPause() override;\r
+private:\r
+ UILabel *titleLable_ = nullptr;\r
+ UILabel *guideLable_ = nullptr;\r
+ UIImageView *centerImg_ = nullptr;\r
+ UIViewGroup *group_ = nullptr;\r
+ UIImageView *bgImg_ = nullptr;\r
+\r
+ class BreathStartCallback : public AnimatorCallback {\r
+ public:\r
+ BreathStartCallback(BreathStartPage* page) : BreathStartPage(page) {}\r
+ virtual ~BreathStartCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ BreathStartPage* BreathStartPage{nullptr};\r
+ };\r
+ BreathStartCallback* animatorCallBack_{nullptr};\r
+ Animator *animator_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathTimeSetPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_TIME_SET_PAGE_H\r
+#define BREATH_TIME_SET_PAGE_H\r
+\r
+#include <string>\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+class BreathTimeSetPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathTimeSetPage();\r
+ ~BreathTimeSetPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+private:\r
+ UILabel *labelTitle_ = nullptr;\r
+ UIPicker *pickerTime_ = nullptr;\r
+ UIButton *buttonOk_ = nullptr;\r
+ UIViewGroup *group_ = nullptr;\r
+ UIImageView *pickerImg_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathTrainingRecordsPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_TRAINING_PAGE_H\r
+#define BREATH_TRAINING_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "BreathModel.h"\r
+#include "BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+class BreathTrainingRecordsPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathTrainingRecordsPage();\r
+ ~BreathTrainingRecordsPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+private:\r
+ UILabel *labelTitle_ = nullptr;\r
+ UILabel *labelTimeDes_ = nullptr;\r
+ UILabel *labelTimeUnit_ = nullptr;\r
+ UILabel *labelTimeValue_ = nullptr;\r
+ UILabel *labelCountDes_ = nullptr;\r
+ UILabel *labelCountUnit_ = nullptr;\r
+ UILabel *labelCountValue_ = nullptr;\r
+ UIViewGroup *group_ = nullptr;\r
+ UIImageView *bgImg1_ = nullptr;\r
+ UIImageView *bgImg2_ = nullptr;\r
+ UIImageView *bgImg3_ = nullptr;\r
+ UIImageView *bgImg4_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathView\r
+ * Create: 2025-5-14\r
+ */\r
+\r
+#ifndef BREATH_VIEW_H\r
+#define BREATH_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum BREATH_PAGE {\r
+ BREATH_MAIN_VIEW = 1,\r
+ BREATH_DUR_VIEW = 2,\r
+ BREATH_EXER_VIEW = 3,\r
+ BREATH_RHY_VIEW = 4,\r
+ BREATH_START_VIEW = 5,\r
+ BREATH_RESULT_VIEW = 6,\r
+ BREATH_TRAINING_VIEW = 7,\r
+};\r
+\r
+class BreathPresenter;\r
+class BreathView : public View<BreathPresenter> {};\r
+}\r
+#endif // BREATH_VIEW_H
\ No newline at end of file
#include "camera/CameraPresenter.h"\r
\r
namespace OHOS {\r
-\r
class CameraPresenter;\r
-\r
class CameraModel;\r
class CameraMainPage : public SlicePage<CameraPresenter>,\r
public UIView::OnClickListener,\r
public:\r
CameraMainPage();\r
~CameraMainPage() override;\r
-\r
static CameraMainPage *GetInstance();\r
-\r
void OnStart(void* data) override;\r
uint8_t GetConnectStatus();\r
bool OnClick(UIView &view, const ClickEvent &event) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
void OnPause() override;\r
- \r
- bool GetFirstFlag();\r
- void SetFirstFlag(bool value);\r
+ bool GetFirstClickFlag();\r
+ void SetFirstClickFlag(bool value);\r
void SetUpButton();\r
void InitCameraTimer();\r
void InitCameraView();\r
void StopAnimator();\r
void PhotoTaken();\r
void Refresh_page();\r
+\r
private:\r
- UILabel *title = nullptr;\r
- UILabel *cameraFind = nullptr;\r
- UILabel *cameraTitle = nullptr;\r
- UILabel *cameraTime = nullptr;\r
- UIButton *button = nullptr;\r
- bool isFirst;\r
+ UILabel *disconnectTitle_ = nullptr;\r
+ UILabel *cameraFind_ = nullptr;\r
+ UILabel *cameraTitle_ = nullptr;\r
+ UILabel *cameraTime_ = nullptr;\r
+ UIButton *takePhotoButton_ = nullptr;\r
UIScrollView* container_ = nullptr;\r
- UIImageView *bluetoothDisconnected = nullptr;\r
+ UIImageView *btDisconnected_ = nullptr;\r
+ bool isFirstClick_;\r
\r
class CameraAnimatorCallback : public AnimatorCallback {\r
public:\r
CameraAnimatorCallback *callBack_ = nullptr;\r
};\r
}\r
-#endif // CAMERA_VIEW_H\r
+#endif // CAMERA_MAIN_PAGE_H\r
CameraModel(const CameraModel &);\r
CameraModel &operator=(const CameraModel &);\r
virtual ~CameraModel();\r
- bool buttonStatus = 0;\r
};\r
}\r
\r
#include "components/ui_view.h"\r
\r
namespace OHOS {\r
-\r
class CameraView;\r
class CameraPresenter : public Presenter<CameraView> {\r
};\r
#include "main/HealthModel.h"
#include "activity/ActivityModel.h"
#include "UiConfig.h"
-#include "components/ui_card_page.h"
+#include "components/ui_fragment.h"
#include "animator/animator_manager.h"
#include "sys/time.h"
+#include "common/periodicupdate_interface.h"
namespace OHOS {
-class AmbientClockView : public UICardPage {
+class AmbientClockView : public UIFragment, public PeriodicUpdateInterface {
public:
AmbientClockView();
~AmbientClockView() override;
AmbientClockView(const AmbientClockView &) = delete;
AmbientClockView &operator=(const AmbientClockView &) = delete;
-
- bool InitView(void);
- void PreLoad(void) override;
- void UpdateTime(void);
- uint32_t GetPeriod(void) const
+ void Update(void) override;
+ uint32_t GetPeriod(void) override
{
return 1000; // 1000: ms
}
private:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
bool InitCenterCircleView(void);
bool InitHandView(void);
void InitDateTime(void);
Image *bigCircle_{nullptr};
Image *medCircle_{nullptr};
Image *smallCircle_{nullptr};
- bool viewiInitStatus_{false};
}; // class AmbientClockView
} // namespace OHOS
#endif // AMBIENT_VIEW_GROUP_H
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ClockResourceImage\r
+ * Author:\r
+ * Create: 2025-05-06\r
+ */\r
+\r
+#ifndef CLOCK_RESOURCE_IMAGE_H\r
+#define CLOCK_RESOURCE_IMAGE_H\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+ static constexpr const char *PNG_GRADIENT_CLOCK_RESOURCE = APP_RES_PATH"/GRADIENT_CLOCK_IMAGES.bin";\r
+\r
+ static const int PNG_DATA_0 = 0x100001;\r
+ static const int PNG_DATA_1 = 0x100002;\r
+ static const int PNG_DATA_2 = 0x100003;\r
+ static const int PNG_DATA_3 = 0x100004;\r
+ static const int PNG_DATA_4 = 0x100005;\r
+ static const int PNG_DATA_5 = 0x100006;\r
+ static const int PNG_DATA_6 = 0x100007;\r
+ static const int PNG_DATA_7 = 0x100008;\r
+ static const int PNG_DATA_8 = 0x100009;\r
+ static const int PNG_DATA_9 = 0x10000a;\r
+ static const int PNG_DATA_SPLIT = 0x10000b;\r
+ static const int PNG_TIME_0 = 0x10000c;\r
+ static const int PNG_TIME_1 = 0x10000d;\r
+ static const int PNG_TIME_2 = 0x10000e;\r
+ static const int PNG_TIME_3 = 0x10000f;\r
+ static const int PNG_TIME_4 = 0x100010;\r
+ static const int PNG_TIME_5 = 0x100011;\r
+ static const int PNG_TIME_6 = 0x100012;\r
+ static const int PNG_TIME_7 = 0x100013;\r
+ static const int PNG_TIME_8 = 0x100014;\r
+ static const int PNG_TIME_9 = 0x100015;\r
+ static const int PNG_TIME_SCALE = 0x100016;\r
+ static const int PNG_TIME_SPLIT = 0x100017;\r
+ static const int PNG_WEEK_FRI = 0x100018;\r
+ static const int PNG_WEEK_MON = 0x100019;\r
+ static const int PNG_WEEK_SAT = 0x10001a;\r
+ static const int PNG_WEEK_SUN = 0x10001b;\r
+ static const int PNG_WEEK_THU = 0x10001c;\r
+ static const int PNG_WEEK_TUE = 0x10001d;\r
+ static const int PNG_WEEK_WED = 0x10001e;\r
+} // OHOS\r
+\r
+#endif // CLOCK_RESOURCE_IMAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientAodView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GRADIENT_AOD_VIEW_H\r
+#define GRADIENT_AOD_VIEW_H\r
+\r
+#include "components/ui_card_page.h"\r
+#include "GradientDateView.h"\r
+#include "components/ui_fragment.h"\r
+#include "common/periodicupdate_interface.h"\r
+\r
+namespace OHOS {\r
+\r
+class GradientAodView : public UIFragment, public PeriodicUpdateInterface {\r
+public:\r
+ GradientAodView();\r
+ ~GradientAodView() override;\r
+ GradientAodView(const GradientAodView &) = delete;\r
+ static GradientAodView* GetInstance(void);\r
+ GradientAodView &operator=(const GradientAodView &) = delete;\r
+ void Update(void) override;\r
+ uint32_t GetPeriod(void) override\r
+ {\r
+ return 1000; // 1000: ms\r
+ }\r
+\r
+private:\r
+ void OnCreateView(void* data) override;\r
+ void OnDestroyView() override;\r
+ GradientDateView* gradientDateView_{nullptr};\r
+}; // class GradientAodView\r
+\r
+} // namespace OHOS\r
+\r
+#endif // GRADIENT_AOD_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientClockView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GRADIENT_CLOCK_VIEW_H\r
+#define GRADIENT_CLOCK_VIEW_H\r
+\r
+#include <ctime>\r
+#include "View.h"\r
+#include "components/ui_canvas_ext.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_card_page.h"\r
+#include "GradientDateView.h"\r
+#include "common/periodicupdate_interface.h"\r
+\r
+namespace OHOS {\r
+\r
+struct sectorInfo {\r
+ float startAngle;\r
+ float angleRange;\r
+ uint16_t sectorRadius;\r
+ uint16_t stopCount;\r
+ ColorStop* colorStop;\r
+\r
+ sectorInfo(float start, float angle, uint16_t radius, uint16_t count, ColorStop* color = nullptr):\r
+ startAngle(start), angleRange(angle), sectorRadius(radius), stopCount(count), colorStop(color)\r
+ {}\r
+};\r
+\r
+class GradientClockView : public UICardPage, public PeriodicUpdateInterface {\r
+public:\r
+ GradientClockView();\r
+ static GradientClockView *GetInstance(void);\r
+ ~GradientClockView() override;\r
+ GradientClockView(const GradientClockView &) = delete;\r
+ GradientClockView &operator=(const GradientClockView &) = delete;\r
+ bool InitView(void);\r
+ void PreLoad(void) override;\r
+ void Update(void) override;\r
+ uint32_t GetPeriod(void) override\r
+ {\r
+ return DEFAULT_TASK_PERIOD;\r
+ }\r
+\r
+private:\r
+ void UpdateHands(uint8_t minute, uint8_t second, uint64_t milliSecond);\r
+ void UpdateCanvas(UICanvasExt* canvas, const sectorInfo& sectorInfo);\r
+ void SafeDelete(UIView* ptr);\r
+ UICanvasExt* backgroudCanvas_;\r
+ UICanvasExt* secondHandCanvas_;\r
+ UICanvasExt* minuteHandCanvas_;\r
+ bool viewiInitStatus_{false};\r
+ uint8_t second_ = 0xFF;\r
+ float secondAngle_;\r
+ GradientDateView* gradientDateView_{nullptr};\r
+}; // class GradientClockView\r
+} // namespace OHOS\r
+\r
+#endif // GRADIENT_CLOCK_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GradientDateView\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GRADIENT_DATE_VIEW_H\r
+#define GRADIENT_DATE_VIEW_H\r
+\r
+#include <vector>\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "main/dial/DialDigitalImgView.h"\r
+\r
+namespace OHOS {\r
+\r
+class GradientDateView : public UIViewGroup {\r
+public:\r
+ GradientDateView();\r
+ ~GradientDateView();\r
+ GradientDateView(const GradientDateView &) = delete;\r
+ GradientDateView &operator=(const GradientDateView &) = delete;\r
+ bool InitView(void);\r
+ void UpdateTime(void);\r
+\r
+private:\r
+ bool LoadClockImageById(UIImageView* view, uint32_t resId);\r
+ bool LoadGradientDateImages(std::vector<ImageInfo*> &imgInfos, std::vector<int> resIds, uint16_t length);\r
+ void InitDigitalImgView(DialDigitalImgView* &dialView, Point pos, uint16_t integerLength,\r
+ std::vector<ImageInfo*> &numImgInfo);\r
+ void HandleDigitalData(DialDigitalImgView* digitalView, float data);\r
+ void InitWeekImgView(void);\r
+ void InitDateImgViews(void);\r
+ void InitTimeImgViews(void);\r
+ UIImageView weekImgView_;\r
+ std::vector<ImageInfo*> weekInfo_;\r
+ DialDigitalImgView* yearImgView_{nullptr};\r
+ DialDigitalImgView* monthImgView_{nullptr};\r
+ DialDigitalImgView* dayImgView_{nullptr};\r
+ UIImageView dateSplitLeft_;\r
+ UIImageView dateSplitRight_;\r
+ std::vector<ImageInfo*> dateNumImgInfo_;\r
+ DialDigitalImgView* hourImgView_{nullptr};\r
+ DialDigitalImgView* minuteImgView_{nullptr};\r
+ std::vector<ImageInfo*> timeNumImgInfo_;\r
+ UIImageView timeSplit_;\r
+ UIImageView* backgroudImage_;\r
+ bool viewiInitStatus_{false};\r
+}; // class GradientDateView\r
+\r
+} // namespace OHOS\r
+\r
+#endif // GRADIENT_DATE_VIEW_H
\ No newline at end of file
#include "animator/animator_manager.h"
#include <ctime>
#include "sys/time.h"
+#include "common/periodicupdate_interface.h"
namespace OHOS {
-class MainClockView : public UICardPage {
+class MainClockView : public UICardPage, public PeriodicUpdateInterface {
public:
MainClockView();
~MainClockView() override;
void RefreshHeartRate(int value);
void ClockAnimatorStart(void);
void ClockAnimatorStop(void);
- void UpdateTime(void);
+ void Update(void) override;
+ uint32_t GetPeriod(void) override
+ {
+ return DEFAULT_TASK_PERIOD;
+ }
private:
void InitStepValue();
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: CompassCalibrationView.h\r
+ * Author:\r
+ * Create: 2022-04-02\r
+ */\r
+\r
+#ifndef COMPASS_CALIBRATION_VIEW_H\r
+#define COMPASS_CALIBRATION_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "View.h"\r
+#include "ohos_types.h"\r
+#include "AppGroupView.h"\r
+#include "components/ui_image_view.h"\r
+\r
+namespace OHOS {\r
+class CompassCalibrationView : public AppGroupView {\r
+public:\r
+ CompassCalibrationView();\r
+ ~CompassCalibrationView() override;\r
+\r
+ bool CreateUIViewGroup(void);\r
+ static CompassCalibrationView *GetInstance(void);\r
+ bool InitView(void *caller) override;\r
+private:\r
+ UILabel *labelOne{nullptr};\r
+ UILabel *labelTwo{nullptr};\r
+ UIImageView *imageView{nullptr};\r
+\r
+ void ClearAll(void);\r
+};\r
+}\r
+#endif
\ No newline at end of file
\r
#include "components/ui_card_page.h"\r
#include "compass/CompassFragment.h"\r
+#include "common/periodicupdate_interface.h"\r
\r
namespace OHOS {\r
\r
-class CompassControlView : public UICardPage {\r
+class CompassControlView : public UICardPage, public PeriodicUpdateInterface {\r
public:\r
CompassControlView();\r
+ ~CompassControlView() override;\r
void PreLoad(void) override;\r
void UnLoad(void) override;\r
void OnPause(void) override;\r
void OnActive(void) override;\r
void ScrollBegin(bool isActive) override;\r
void ScrollEnd(bool isActive) override;\r
+ void Update(void) override;\r
+ uint32_t GetPeriod(void) override\r
+ {\r
+ return DEFAULT_TASK_PERIOD; // DEFAULT_TASK_PERIOD: ms\r
+ }\r
+\r
private:\r
CompassFragment *compassFragment_{nullptr};\r
};\r
#include "components/ui_label.h"
#include "components/ui_image_view.h"
#include "components/ui_fragment.h"
-#include "common/task.h"
namespace OHOS {
-class CompassFragment : public UIFragment, public Task {
+class CompassFragment : public UIFragment {
public:
void OnCreateView(void* data) override;
void OnResumeView() override;
void OnPauseView() override;
void OnDestroyView() override;
- void Callback() override;
+ void Update(void);
private:
bool InitCompassImage(void);
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: CompassPresenter.h\r
+ * Author:\r
+ * Create: 2021-12-21\r
+ */\r
+#ifndef COMPASS_PRESENTER_H\r
+#define COMPASS_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "ohos_types.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "CompassView.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint16_t beginAngle;\r
+ uint16_t endAngle;\r
+ const char *dir;\r
+} CompassItem;\r
+\r
+class CompassView;\r
+class CompassPresenter {\r
+public:\r
+ CompassPresenter();\r
+ virtual ~CompassPresenter();\r
+\r
+ static CompassPresenter *GetInstance(void);\r
+ void DisplayAngleDir(uint16_t angle);\r
+ void DetermineToRotate(void);\r
+ void InScopeRotate(void);\r
+ void TimeCreateRandomNum(void);\r
+ void DisplayAngleRight(uint16_t angle);\r
+\r
+private:\r
+ int16_t lastRotateAngle{0};\r
+ int16_t currentRotateAngle{0};\r
+ int16_t angleDiff{0};\r
+ bool getAngleStatus{false};\r
+ bool initDisplayStatus{true};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: CompassView.h\r
+ * Author:\r
+ * Create: 2021-12-21\r
+ */\r
+\r
+#ifndef COMPASS_VIEW_H\r
+#define COMPASS_VIEW_H\r
+\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "AppGroupView.h"\r
+#include "CompassCalibrationView.h"\r
+\r
+namespace OHOS {\r
+static constexpr float VIEW_CENTERS = 227;\r
+\r
+class CompassView : public AppGroupView {\r
+public:\r
+ CompassView();\r
+ ~CompassView() override;\r
+\r
+ void DirectionSetText(const char *text, const char *angle);\r
+ static CompassView *GetInstance(void);\r
+ void CompassStartRotate(int16_t numb);\r
+ bool InitPage(void);\r
+ bool InitView(void *caller) override;\r
+ bool GetInitViewState(void);\r
+ bool InitCompassImage(void);\r
+\r
+private:\r
+ bool LoadCompassImage(UIImageView *view, uint32_t resId);\r
+ void ClearAll(void);\r
+ UILabel *directionLabel{nullptr};\r
+ UILabel *angledLabel{nullptr};\r
+ UIImageView *backGround{nullptr};\r
+ UIImageView *rotateShaft{nullptr};\r
+ UIImageView *triangulation{nullptr};\r
+ const Vector2<float> VIEW_CENTER = {VIEW_CENTERS, VIEW_CENTERS};\r
+};\r
+}\r
+#endif
\ No newline at end of file
#include "Presenter.h"\r
#include "compass/MainCompassView.h"\r
#include "compass/CompassModel.h"\r
+#include "common/task.h"\r
\r
namespace OHOS {\r
class MainCompassView;\r
-class MainCompassPresenter : public Presenter<MainCompassView>, public UIView::OnDragListener {\r
+class MainCompassPresenter : public Presenter<MainCompassView>, public UIView::OnDragListener, public Task {\r
public:\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
\r
void OnResume() override;\r
\r
void OnPause() override;\r
+\r
+ void Callback() override;\r
};\r
}\r
#endif
\ No newline at end of file
#ifndef DATE_BUTTON_ITEM_VIEW_H\r
#define DATE_BUTTON_ITEM_VIEW_H\r
\r
-#include "date/DateModel.h"\r
+#include "DateModel.h"\r
#include "UiConfig.h"\r
#include "components/ui_canvas.h"\r
#include "components/ui_image_view.h"\r
explicit DateButtonItemView();\r
~DateButtonItemView() override;\r
virtual void SetItemInfo(const DateButtonItem itemInfo);\r
- virtual void SetUpChild();\r
DateButtonItem GetItem();\r
\r
private:\r
- static bool flag;\r
- UILabelButton sLabelButton;\r
- DateButtonItem sItemInfo = {nullptr, 0, false, false};\r
+ UILabelButton labelButton_;\r
+ DateButtonItem itemInfo_ = {"", nullptr, false, false};\r
};\r
}\r
\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateContentItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_CONTENT_ITEM_VIEW_H\r
+#define DATE_CONTENT_ITEM_VIEW_H\r
+\r
+#include "DateModel.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+class DateContentItemView : public UIViewGroup {\r
+public:\r
+ explicit DateContentItemView();\r
+ ~DateContentItemView() override;\r
+ virtual void SetItemInfo(const DateItem itemInfo);\r
+ const char *GetViewId();\r
+ bool GetVisiable();\r
+\r
+private:\r
+ UILabel labelTitle_;\r
+ UILabel labelDes_;\r
+ UILabel labelAddress_;\r
+ UIImageView signs_;\r
+ UIButton backGround_;\r
+ DateItem itemInfo_ = {nullptr, nullptr, nullptr, nullptr, false};\r
+};\r
+}\r
+\r
+#endif\r
#include <iomanip>\r
#include <string>\r
#include <sys/time.h>\r
+#include "gfx_utils/vector.h"\r
#include "components/ui_scroll_view.h"\r
#include "components/ui_label.h"\r
-#include "components/ui_list.h"\r
-#include "date/DateAdapter.h"\r
-#include "date/DateButtonAdapter.h"\r
-#include "date/DatePresenter.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_simple_list.h"\r
+#include "DateButtonItemView.h"\r
+#include "DateContentItemView.h"\r
+#include "DatePresenter.h"\r
#include "SlicePage.h"\r
#include "UiConfig.h"\r
-#include "date/DateView.h"\r
-#include "components/ui_button.h"\r
+#include "DateView.h"\r
\r
namespace OHOS {\r
-#define LABEL_COUNT 4\r
-static constexpr int16_t START_YEAR = 1900;\r
+static constexpr int16_t WEEK_DYAS = 7;\r
\r
class DatePresenter;\r
class DateMainPage : public SlicePage<DatePresenter>,\r
public:\r
DateMainPage();\r
~DateMainPage() override;\r
+ static DateMainPage *GetInstance();\r
void OnStart(void* data) override;\r
bool OnClick(UIView &view, const ClickEvent &event) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
- void InitDownList();\r
- void UpdateMsg(std::string dateMsg);\r
- void SetDownListAdapter();\r
- bool InitDateTop();\r
+ void InitList();\r
+ bool InitListTopDate();\r
+ void SetContentListDate();\r
+ void SetDateButtonList(std::string viewId);\r
+ void RefreshDateMsg(std::string dateMsg);\r
std::string GetFutureDate(int days_ahead);\r
- void RefreshButtonListDate(int value);\r
+ void ReloadPage();\r
+ void ClearButtonList();\r
+ void ClearContentList();\r
+ void RefreshListData();\r
+ \r
private:\r
- UIScrollView *uiScrollView = nullptr;\r
- DateAdapter *listAdapter{nullptr};\r
- UIList *downContentList{nullptr};\r
- UIImageView *image1{nullptr};\r
- DateButtonAdapter *buttonAdapter{nullptr};\r
- UIList *buttonContentList{nullptr};\r
- UILabel *title{nullptr};\r
- std::list<DateButtonItem> listTop;\r
- std::string strDate[SET_SEVEN];\r
- std::string strDay[SET_SEVEN];\r
+ UIScrollView *uiScrollView_{nullptr};\r
+ UISimpleList *detailList_{nullptr};\r
+ UISimpleList *dateList_{nullptr};\r
+ UIImageView *bgImage_{nullptr};\r
+ UILabel *titlLabel_{nullptr};\r
+ Graphic::Vector<DateButtonItem> listTop_;\r
+ std::string strDate_[WEEK_DYAS];\r
+ std::string strDay_[WEEK_DYAS];\r
};\r
}\r
#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
#include "components/ui_label_button.h"\r
#include "components/ui_swipe_view.h"\r
#include "ui_swipe_view.h"\r
-#include "date/DatePresenter.h"\r
-#include "date/DateModel.h"\r
-#include "date/DateView.h"\r
+#include "DatePresenter.h"\r
+#include "DateModel.h"\r
+#include "DateView.h"\r
#include "SlicePage.h"\r
#include "UiConfig.h"\r
\r
namespace OHOS {\r
-#define LABEL_COUNT 8\r
class DatePresenter;\r
class DateMessagePage : public SlicePage<DatePresenter>,\r
public UIView::OnDragListener {\r
~DateMessagePage() override;\r
void OnStart(void* data) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void InitLabel();\r
\r
private:\r
- UIViewGroup *group;\r
- UIImageView *image1;\r
- UILabel *labelTitle{nullptr};\r
- UILabel *labelMessage{nullptr};\r
- UILabel *labelTime{nullptr};\r
+ UIScrollView *group_{nullptr};\r
+ UIImageView *bgImage_{nullptr};\r
+ UILabel *labelTitle_{nullptr};\r
+ UILabel *labelMessage_{nullptr};\r
+ UILabel *labelAddress_{nullptr};\r
+ UILabel *labelTime_{nullptr};\r
};\r
}\r
#endif
\ No newline at end of file
#include <random>\r
#include <sstream>\r
#include <unordered_map>\r
+#include <sys/stat.h>\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
#include "hal_tick.h"\r
#include "AppViewIDs.h"\r
#include "UiConfig.h"\r
#include "cJSON.h"\r
-\r
+#include "diag_service.h"\r
+#include "gfx_utils/vector.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#define DATE_PATH "/user/app/user/ace/data/com.vendor.Weather"\r
+#else\r
+#define DATE_PATH APP_RES_PATH\r
+#endif\r
namespace OHOS {\r
+static constexpr int16 DATE_COUNT = 24;\r
+static constexpr int16 DATE_HOUR = 12;\r
static constexpr int16 HOUR_COUNT = 24;\r
static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
-static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_THIRTY = 30;\r
static constexpr uint16_t NUM_TIME_MIN = 60;\r
static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
-static constexpr int32_t NUM_TIME_DAY = 86400;\r
-static constexpr int16_t MIN_TO_HOUR = 60;\r
-static constexpr int16_t HOURLY_SYSTEM = 24;\r
+static constexpr uint32_t NUM_TIME_DAY = 86400;\r
+static constexpr uint16_t TIME_END = 16;\r
+static constexpr uint8_t DATE_UNIT_COUNT = 3;\r
+static constexpr uint8_t PAGE_STATUS_0 = 0; // 主页面滑动/按钮退出或在子页面通过按钮退出应用,清除selectButton_记录\r
+static constexpr uint8_t PAGE_STATUS_1 = 1; // 从主页面进入子页面,设置resetPage,用于主页面恢复选择记录\r
+static constexpr uint8_t PAGE_STATUS_2 = 2; // 从子页面回退到主页面,当在主页面未点击任何按钮,不修改selectButton_记录,退出到主页面时清除记录\r
+\r
typedef struct {\r
std::string hour;\r
std::string eventTitle;\r
- std::string startTime;\r
- std::string week;\r
+ std::string address;\r
+ std::string index;\r
} DateMsg;\r
\r
typedef struct {\r
- const char *label_1;\r
- const char *label_2;\r
+ const char *title;\r
+ const char *describetion;\r
+ const char *address;\r
const char *index;\r
bool visiable;\r
} DateItem;\r
\r
typedef struct {\r
- const char *button_viewId;\r
- const char *button_day;\r
- int index;\r
+ std::string buttonViewId;\r
+ const char *buttonDay;\r
bool isFirst;\r
bool isSelect;\r
} DateButtonItem;\r
\r
+typedef struct {\r
+ std::string eventTitle;\r
+ std::string time;\r
+} DateToMessage;\r
+\r
static const uint16_t DATE_ITEM_COUNT = 10;\r
+\r
class DateModel {\r
public:\r
static DateModel &GetInstance(void);\r
virtual ~DateModel();\r
- bool InitDateVec(std::string dateStr);\r
+ void Init();\r
bool InitDate();\r
-\r
+ bool InitDateVec(std::string dateStr);\r
const char *GetViewId();\r
- std::unordered_map<std::string, std::vector<DateMsg>> keyValues;\r
- std::list<DateItem> listDate;\r
- std::string now;\r
- std::string titleName;\r
- std::string messageIndex;\r
- std::string strIndex;\r
+ void InitDateTimer();\r
+ void DisableDatePhoneTimer();\r
+ void PollFileUntilChange(const std::string& filePath);\r
+ void CalcClockTime(std::string hour, std::string eventTitle);\r
+ void ClearData();\r
+ uint8_t GetConnectStatus();\r
+ std::vector<DateToMessage> dateClockVec_;\r
+ std::vector<DateItem> listDate_;\r
+ std::string titleName_ = "";\r
+ std::string selectButton_ = "";\r
+ int resetPage_ = 0;\r
+ std::string messageIndex_;\r
\r
private:\r
DateModel();\r
DateModel(const DateModel &);\r
DateModel &operator=(const DateModel &);\r
+ GraphicTimer *startCount_ = nullptr;\r
+ std::unordered_map<std::string, std::vector<DateMsg>> keyValues_;\r
};\r
}\r
\r
-#endif // DATE_MODEL_H
\ No newline at end of file
+#endif // Date_MODEL_H
\ No newline at end of file
#ifndef DATE_PRESENTER_H\r
#define DATE_PRESENTER_H\r
\r
-#include "date/DateModel.h"\r
+#include "DateModel.h"\r
#include "Presenter.h"\r
#include "components/ui_view.h"\r
namespace OHOS {\r
-constexpr int16 BACKGROUND_IMAGE_WIDTH = 190;\r
-constexpr int16 SET_ZERO = 0;\r
-constexpr int16 SET_ONE = 1;\r
-constexpr int16 SET_TWO = 2;\r
-constexpr int16 SET_THREE = 3;\r
-constexpr int16 SET_FOUR = 4;\r
-constexpr int16 SET_FIVE = 5;\r
-constexpr int16 SET_SIX = 6;\r
-constexpr int16 SET_SEVEN = 7;\r
-constexpr int16 SET_EIGHT = 8;\r
-constexpr int16 SET_NINE = 9;\r
-constexpr int16 SET_TEN = 10;\r
-constexpr int16 SET_TWELVE = 12;\r
-constexpr int16 SET_THIRTEEN = 13;\r
-constexpr int16 SET_FOURTEEN = 14;\r
-constexpr int16 SET_HUNDRED = 100;\r
-constexpr int16 SET_TWO_HUNDRED = 200;\r
\r
class DateView;\r
class DatePresenter : public Presenter<DateView> {};\r
}\r
\r
-#endif // DATE_PRESENTER_H
\ No newline at end of file
+#endif // DATE_PRESENTER_H
\ No newline at end of file
class DatePresenter;\r
class DateView : public View<DatePresenter> {};\r
}\r
-#endif // Date_VIEW_H\r
+#endif // Date_VIEW_H\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: EmptyPage\r
* Create: 2025-04-24\r
*/\r
#ifndef EMPTY_PAGE_H\r
#define EMPTY_PAGE_H\r
#include "components/ui_view_group.h"\r
-#include "components/ui_scroll_view.h"\r
+#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "SlicePage.h"\r
-#include "emptypage/EmptyPresenter.h"\r
+#include "EmptyPresenter.h"\r
\r
namespace OHOS {\r
\r
public UIView::OnClickListener,\r
public UIView::OnDragListener {\r
public:\r
- EmptyPage(){};\r
+ EmptyPage();\r
~EmptyPage();\r
void OnStart(void* data) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
- bool OnClick(UIView& view, const ClickEvent& event) override;\r
\r
private:\r
EmptyPage(const EmptyPage &) = delete;\r
EmptyPage(EmptyPage &&) = delete;\r
EmptyPage &operator=(EmptyPage &&) = delete;\r
\r
- UIScrollView *container_ = nullptr;\r
- UILabel *memLabel_ = nullptr;\r
- uint32_t used_ = 0;\r
- uint32_t free_ = 0;\r
+ UIViewGroup *container_ = nullptr;\r
+ UIImageView *bgImg_{nullptr};\r
+ UILabel *memUsedLabel_ = nullptr;\r
+ UILabel *memFreeLabel_ = nullptr;\r
};\r
\r
#ifdef __cplusplus\r
extern "C" {\r
#endif\r
#if !defined(_WIN32)\r
-uint32_t test_get_mem_info(uint8_t memType, uint32_t *used, uint32_t *free);\r
+uint32_t test_get_mem_info(uint32_t *used, uint32_t *free);\r
#endif\r
#ifdef __cplusplus\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: EmptyPresenter\r
* Create: 2025-04-24\r
*/\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: EmptyView\r
* Create: 2025-04-24\r
*/\r
#include "SlicePage.h"\r
#include "diag_service.h"\r
#include "ohos_timer.h"\r
-#include "findphone/FindPhoneModel.h"\r
-#include "findphone/FindPhonePresenter.h"\r
+#include "FindPhoneModel.h"\r
+#include "FindPhonePresenter.h"\r
\r
-#define ALIPAY_BIND_SEARCH_IMAGE_NUM 28\r
namespace OHOS {\r
-static int timeCount = 0;\r
-static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+static constexpr uint16_t FINDPHONE_IMAGE_COUNT = 28;\r
+\r
class FindPhonePresenter;\r
class FindPhoneModel;\r
class FindPhoneMainPage : public SlicePage<FindPhonePresenter>,\r
bool OnClick(UIView &view, const ClickEvent &event) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
bool ClickButtonChange();\r
- void SetUpImageAnimator();\r
- void SetupButton();\r
+ void InitImageAnimator();\r
+ void InitButton();\r
void InitImageInfo();\r
void ShowReset();\r
void DisableFindPhoneTimer();\r
bool StopFindPhone();\r
uint8_t GetConnectStatus();\r
void ChangeToDisConnect();\r
+\r
private:\r
UIViewGroup* container_ = nullptr;\r
- UILabel* labelUnder = nullptr;\r
- UILabel* labelFindTitle = nullptr;\r
- UIButton* buttonFind = nullptr;\r
- UIButton* buttonRty = nullptr;\r
- UILabel *labelRing = nullptr;\r
- UIImageView *mainImage = nullptr;\r
- ImageInfo* imageInfo1_ = nullptr;\r
- ImageInfo* imageInfo2_ = nullptr;\r
- ImageInfo* imageInfo3_ = nullptr;\r
- ImageAnimatorInfo imageAnimatorImageInfo_[SET_THREE] = { 0 };\r
+ UILabel* labelDisconnect_ = nullptr;\r
+ UILabel* labelTitle_ = nullptr;\r
+ UIButton* buttonFind_ = nullptr;\r
+ UIButton* buttonRetry_ = nullptr;\r
+ UILabel *labelRing_ = nullptr;\r
UIImageAnimatorView* imageAnimator_ = nullptr;\r
- GraphicTimer *g_startCount = nullptr;\r
- ImageAnimatorInfo searchImageInfo[ALIPAY_BIND_SEARCH_IMAGE_NUM];\r
+ GraphicTimer *startCount_ = nullptr;\r
+ ImageAnimatorInfo searchImageInfo_[FINDPHONE_IMAGE_COUNT];\r
};\r
}\r
-#endif // FINDPHONE_VIEW_H\r
+#endif // FINDPHONE_MAIN_PAGE_H\r
#include "graphic_timer.h"\r
\r
namespace OHOS {\r
-constexpr int16_t SET_ZERO = 0;\r
-constexpr int16_t SET_ONE = 1;\r
-constexpr int16_t SET_TWO = 2;\r
-constexpr int16_t SET_THREE = 3;\r
-constexpr int16_t SET_FOUR = 4;\r
-constexpr int16_t SET_FIVE = 5;\r
-constexpr int16_t SET_SIX = 6;\r
-constexpr int16_t SET_SEVEN = 7;\r
-constexpr int16_t SET_EIGHT = 8;\r
-constexpr int16_t SET_NINE = 9;\r
-constexpr int16_t SET_TEN = 10;\r
-constexpr int16_t SET_INT_MAX = 255;\r
-\r
class FindPhoneModel {\r
public:\r
static FindPhoneModel &GetInstance(void);\r
FindPhoneModel(const FindPhoneModel &);\r
FindPhoneModel &operator=(const FindPhoneModel &);\r
virtual ~FindPhoneModel();\r
- bool buttonStatus = 0;\r
};\r
}\r
\r
class FindPhoneView;\r
class FindPhonePresenter : public Presenter<FindPhoneView> {};\r
}\r
-\r
#endif // FINDPHONE_PRESENTER_H
\ No newline at end of file
namespace OHOS {\r
enum FIND_PHONE_PAGES {\r
FIND_PHONE_MAIN_PAGE = 1, // 0 is invalid\r
- FIND_PHONE_MESSAGE_PAGE = 2,\r
};\r
\r
class FindPhonePresenter;\r
#include "components/ui_label_button_ext.h"\r
#include "components/ui_scroll_view.h"\r
#include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
+#include "FlashLightPresenter.h"\r
#include "components/ui_picker.h"\r
\r
namespace OHOS {\r
public UIView::OnClickListener,\r
public UIView::OnDragListener {\r
public:\r
- FlashLightBlinkPage(){};\r
+ FlashLightBlinkPage();\r
~FlashLightBlinkPage();\r
void OnStart(void* data) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
#include "components/ui_label_button_ext.h"\r
#include "components/ui_scroll_view.h"\r
#include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
+#include "FlashLightPresenter.h"\r
\r
namespace OHOS {\r
class FlashLightColorPage : public SlicePage<FlashLightPresenter>,\r
public UIView::OnClickListener,\r
public UIView::OnDragListener {\r
public:\r
- FlashLightColorPage(){};\r
+ FlashLightColorPage();\r
~FlashLightColorPage();\r
void OnStart(void* data) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
\r
UIScrollView *container_ = nullptr;\r
UILabel *colorLabel_ = nullptr;\r
- UILabelButtonExt *color1Button_ = nullptr;\r
- UILabelButtonExt *color2Button_ = nullptr;\r
- UILabelButtonExt *color3Button_ = nullptr;\r
- UILabelButtonExt *color4Button_ = nullptr;\r
- UILabelButtonExt *color5Button_ = nullptr;\r
- UILabelButtonExt *color6Button_ = nullptr;\r
- UILabelButtonExt *color7Button_ = nullptr;\r
- UILabelButtonExt *color8Button_ = nullptr;\r
- UILabelButtonExt *color9Button_ = nullptr;\r
+ UILabelButtonExt *colorWhiteButton_ = nullptr;\r
+ UILabelButtonExt *colorRedButton_ = nullptr;\r
+ UILabelButtonExt *colorOrangeButton_ = nullptr;\r
+ UILabelButtonExt *colorYellowButton_ = nullptr;\r
+ UILabelButtonExt *colorGreenButton_ = nullptr;\r
+ UILabelButtonExt *colorLightBlueButton_ = nullptr;\r
+ UILabelButtonExt *colorDarkBlueButton_ = nullptr;\r
+ UILabelButtonExt *colorPurpleButton_ = nullptr;\r
+ UILabelButtonExt *colorMultiButton_ = nullptr;\r
};\r
} // namespace OHOS\r
#endif /* FLASHLIGHT_COLOR_PAGE_H */\r
#include <sys/time.h>\r
#include "AppViewIDs.h"\r
#include "UiConfig.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "FlashLightPresenter.h"\r
+#include "ui_resource_flashlight.h"\r
#ifndef _WIN32\r
#include "time64.h"\r
#endif\r
public:\r
static FlashLightModel &GetInstance(void);\r
// 设置手电筒颜色;\r
- FlashLightColorAttribute GetViewColor();\r
- void SetViewColor(FlashLightColorAttribute color);\r
+ FlashLightColorAttribute GetViewColorId();\r
+ void SetViewColorId(FlashLightColorAttribute color);\r
// 设置手电筒闪烁频率;\r
FlashLightBlinkFrequency GetBlinkFrequency();\r
void SetBlinkFrequency(FlashLightBlinkFrequency blinkFrequency);\r
#include "ChangeSliceListener.h"\r
#include "UiConfig.h"\r
#include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
+#include "FlashLightPresenter.h"\r
#include "animator.h"\r
\r
namespace OHOS {\r
public UIView::OnClickListener,\r
public UIView::OnDragListener {\r
public:\r
- FlashLightPage(){};\r
+ FlashLightPage();\r
~FlashLightPage();\r
\r
void OnStart(void* data) override;\r
};\r
TimeAnimatorCallback* timeCallback_ = nullptr;\r
Animator* timeAnimator_ = nullptr;\r
- UILabelButton* flashLightOn_ = nullptr;\r
+ UILabelButton* flashLightButtonOn_ = nullptr;\r
UILabel* systemTime_ = nullptr;\r
- UILabel* OnLabel_ = nullptr;\r
+ UILabel* tipsLabel_ = nullptr;\r
UIImageView* imageArrow_ = nullptr;\r
UIScrollView *container_ = nullptr;\r
};\r
#include "components/ui_image_view.h"\r
#include "components/ui_image_animator.h"\r
#include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "flashlight/FlashLightModel.h"\r
+#include "FlashLightPresenter.h"\r
+#include "FlashLightModel.h"\r
\r
namespace OHOS {\r
+static constexpr uint8_t IMAGE_NUM = 2;\r
+\r
class FlashLightPlayPage : public SlicePage<FlashLightPresenter>,\r
public UIView::OnClickListener,\r
public UIView::OnDragListener {\r
public:\r
- FlashLightPlayPage(){};\r
+ FlashLightPlayPage();\r
~FlashLightPlayPage();\r
void OnStart(void* data) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
FlashLightPlayPage &operator=(FlashLightPlayPage &&) = delete;\r
\r
UIScrollView *container_ = nullptr;\r
- UIImageAnimatorView *playImageAnimal = nullptr;\r
- ImageAnimatorInfo playImageInfo[2];\r
+ UIImageAnimatorView *playImageAnimal_ = nullptr;\r
+ ImageAnimatorInfo playImageInfo_[IMAGE_NUM];\r
};\r
} // namespace OHOS\r
#endif /* FLASHLIGHT_PLAY_PAGE_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightRecoverPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_RECOVER_PAGE_H\r
+#define FLASHLIGHT_RECOVER_PAGE_H\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "FlashLightPresenter.h"\r
+\r
+namespace OHOS {\r
+class FlashLightRecoverPage : public SlicePage<FlashLightPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ FlashLightRecoverPage();\r
+ ~FlashLightRecoverPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ FlashLightRecoverPage(const FlashLightRecoverPage &) = delete;\r
+ FlashLightRecoverPage &operator=(const FlashLightRecoverPage &) = delete;\r
+ FlashLightRecoverPage(FlashLightRecoverPage &&) = delete;\r
+ FlashLightRecoverPage &operator=(FlashLightRecoverPage &&) = delete;\r
+\r
+ UIScrollView *container_ = nullptr;\r
+ UILabel *recoverLabel_ = nullptr;\r
+ UILabelButtonExt *cancelButton_ = nullptr;\r
+ UILabelButtonExt *confirmButton_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif /* FLASHLIGHT_RECOVER_PAGE_H */\r
\r
namespace OHOS {\r
typedef struct {\r
- uint8_t item;\r
uint32_t resId;\r
std::string label;\r
std::string itemLabel;\r
FlashLightSetItemView();\r
~FlashLightSetItemView() override;\r
virtual void SetItemInfo(const FlashLightSetItem itemInfo);\r
- const char *GetViewId() const;\r
\r
private:\r
- UIImageView sIcon;\r
- UILabel sLabel;\r
- UILabel itemLabel;\r
- UIImageView sNextImage;\r
- FlashLightSetItem sItemInfo = {0, 0, "", "", ""};\r
+ UIImageView sIcon_;\r
+ UILabel sLabel_;\r
+ UILabel itemLabel_;\r
+ UIImageView sNextImage_;\r
+ FlashLightSetItem itemInfo_ = {0, "", "", ""};\r
};\r
}\r
#endif // FLASHLIGHTSET_ITEM_VIEW_H
\ No newline at end of file
#include "components/ui_label.h"\r
#include "components/ui_label_button_ext.h"\r
#include "components/ui_scroll_view.h"\r
-#include "components/ui_list.h"\r
+#include "components/ui_simple_list.h"\r
#include "SlicePage.h"\r
-#include "flashlight/FlashLightPresenter.h"\r
-#include "flashlight/FlashLightSetItemAdapter.h"\r
-#include "flashlight/FlashLightSetItemView.h"\r
+#include "FlashLightPresenter.h"\r
+#include "FlashLightSetItemView.h"\r
#include "UiConfig.h"\r
#include "main/LoadImg.h"\r
-#include "flashlight/FlashlightUiResourceImage.h"\r
+#include "ui_resource_flashlight.h"\r
\r
namespace OHOS {\r
class FlashLightSetPage : public SlicePage<FlashLightPresenter>,\r
public UIView::OnClickListener,\r
public UIView::OnDragListener {\r
public:\r
- FlashLightSetPage(){};\r
+ FlashLightSetPage();\r
~FlashLightSetPage();\r
void OnStart(void* data) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
FlashLightSetPage &operator=(FlashLightSetPage &&) = delete;\r
\r
UIScrollView *container_ = nullptr;\r
- UILabel *setLabel_ = nullptr;\r
+ UILabel *titleLabel_ = nullptr;\r
UILabelButtonExt *recoverButton_ = nullptr;\r
-\r
- UIList* setItemList_ = nullptr;\r
- FlashLightSetItemAdapter *setItemAdapter_ = nullptr;\r
- FlashLightSetItem colorItem_ = {1, IMAGE_CONVERTER_TOOL_COLORITEM, "灯光颜色"};\r
- FlashLightSetItem blinkItem_ = {2, IMAGE_CONVERTER_TOOL_BLINKITEM, "闪烁频率"};\r
+ UISimpleList* setItemList_ = nullptr;\r
};\r
} // namespace OHOS\r
#endif /* FLASHLIGHT_SET_PAGE_H */\r
namespace OHOS {\r
\r
enum FlashLightAllView {\r
- FLASH_LIGTH_VIEW = 1, // 手电筒主界面\r
+ FLASH_LIGHT_VIEW = 1, // 手电筒主界面\r
FLASH_LIGHT_PLAY_VIEW, // 手电筒显示播放\r
FLASH_LIGHT_SET_VIEW, // 手电筒设置\r
FLASH_LIGHT_COLOR_VIEW, // 手电筒颜色\r
FLASH_LIGHT_BLINK_VIEW, // 手电筒闪烁\r
- FLASH_LIGHT_DEFAULT_VIEW, // 手电筒默认\r
+ FLASH_LIGHT_RECOVER_VIEW, // 手电筒默认\r
FLASH_LIGHT_ALL_VIEW,\r
};\r
\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateMainPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEART_RATE_MAIN_PAGE_H\r
+#define HEART_RATE_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "layout/grid_layout.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "ui_test.h"\r
+#include "View.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "video_play_wrapper.h"\r
+\r
+namespace OHOS {\r
+class HeartRatePresenter;\r
+class HeartRateMainPage : public SlicePage<HeartRatePresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ HeartRateMainPage();\r
+ ~HeartRateMainPage() override;\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ bool IsToday(const struct timeval &tv);\r
+ void SetTestTime();\r
+ void InitImageAnimator();\r
+\r
+private:\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabelButton *button_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UILabel *labelPreTest_ = nullptr;\r
+ UILiteSurfaceView *surfaceView_ = nullptr;\r
+ MediaVideoPlay *videoPlay_ = nullptr;\r
+ ColorType colorKey_;\r
+};\r
+}\r
+#endif // HEART_RATE_MAIN_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateMeasurePage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEART_RATE_MEASURE_PAGE_H\r
+#define HEART_RATE_MEASURE_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_lite_surface_view.h"\r
+#include "layout/grid_layout.h"\r
+#include "animator/animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "video_play_wrapper.h"\r
+#include "HeartRateModel.h"\r
+#include "HeartRatePresenter.h"\r
+#include "HeartRateView.h"\r
+#include "HeartRateResultGroup.h"\r
+\r
+namespace OHOS {\r
+class HeartRatePresenter;\r
+class HeartRateMeasurePage : public SlicePage<HeartRatePresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ HeartRateMeasurePage();\r
+ ~HeartRateMeasurePage() override;\r
+ void OnStart(void *data) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void InitAnimator();\r
+ void StopAnimator();\r
+ void InitVideoView();\r
+ void SetTimeAndResultText(std::string str);\r
+ void SetTestStatus(bool value);\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+private:\r
+\r
+ // 心率线型图结果展示页面,通过setvisible进行显示隐藏操作\r
+ // 作用:线型图退出之后不会重新进入心率测量状态\r
+ HeartRateResultGroup *chartLineResultGroup_ = nullptr;\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UILabel *labelTimeOrResult_ = nullptr;\r
+ UILabel *labelTips_ = nullptr;\r
+ UILiteSurfaceView *surfaceView_ = nullptr;\r
+ MediaVideoPlay *videoPlay_ = nullptr;\r
+ ColorType colorKey_;\r
+ struct timeval startTime_;\r
+ bool measureStatus_;\r
+ class HeartAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ explicit HeartAnimatorCallback(HeartRateMeasurePage *page) : page_(page) {}\r
+ ~HeartAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+ private:\r
+ HeartRateMeasurePage *page_{nullptr};\r
+ };\r
+ Animator *animator_ = nullptr;\r
+ HeartAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // HEART_RATE_MEASURE_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateModel\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HREATE_RATE_ITEM_MODEL_H\r
+#define HREATE_RATE_ITEM_MODEL_H\r
+\r
+#include <string>\r
+#include <list>\r
+#include <sys/time.h>\r
+#include "graphic_timer.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEART_ALL_POINTS = 360;\r
+\r
+typedef struct {\r
+ uint16_t heartRate;\r
+ struct timeval time;\r
+} heartRateMeasurementInfo;\r
+\r
+typedef struct {\r
+ /** X coordinate */\r
+ uint16_t x;\r
+ /** Y coordinate */\r
+ uint16_t y;\r
+} HeartPoint;\r
+\r
+typedef struct {\r
+ uint16_t perSec;\r
+ uint16_t rest;\r
+ uint16_t minX;\r
+ uint16_t minValue;\r
+ uint16_t maxX;\r
+ uint16_t maxValue;\r
+ uint16_t index;\r
+ HeartPoint value[HEART_ALL_POINTS];\r
+} HeartDatas;\r
+\r
+class HeartRateModel {\r
+public:\r
+ static HeartRateModel &GetInstance(void);\r
+ void SetHeartRate(heartRateMeasurementInfo value)\r
+ {\r
+ heartRate = value;\r
+ };\r
+ heartRateMeasurementInfo GetHeartRate()\r
+ {\r
+ return heartRate;\r
+ };\r
+\r
+private:\r
+ HeartRateModel();\r
+ HeartRateModel(const HeartRateModel &);\r
+ HeartRateModel &operator=(const HeartRateModel &);\r
+ virtual ~HeartRateModel();\r
+ heartRateMeasurementInfo heartRate = {0, 0};\r
+};\r
+}\r
+#endif // HREATE_RATE_ITEM_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRatePresenter\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEART_RATE_PRESENTER_H\r
+#define HEART_RATE_PRESENTER_H\r
+\r
+#include "components/ui_view.h"\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class HeartRateView;\r
+class HeartRatePresenter : public Presenter<HeartRateView> {\r
+ HeartRatePresenter *GetInstance();\r
+};\r
+}\r
+\r
+#endif // HEART_RATE_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateReadyPage\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEART_RATE_READY_PAGE_H\r
+#define HEART_RATE_READY_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_label_button.h"\r
+#include "layout/grid_layout.h"\r
+#include "animator/animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "HeartRateModel.h"\r
+#include "HeartRatePresenter.h"\r
+#include "HeartRateView.h"\r
+\r
+namespace OHOS {\r
+class HeartRatePresenter;\r
+class HeartRateReadyPage : public SlicePage<HeartRatePresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ HeartRateReadyPage();\r
+ ~HeartRateReadyPage() override;\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void InitAnimator();\r
+ void SetLabelProgressTime(int value);\r
+ void StopAnimator();\r
+ int InitCircleProgress();\r
+ void InitImageAnimator();\r
+\r
+private:\r
+ UILabel *labelTips_ = nullptr;\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabelButton *button_ = nullptr;\r
+ UICircleProgress *timeProgress_ = nullptr;\r
+ UILabel *labelProgressTime_ = nullptr;\r
+ struct timeval startTime_;\r
+ class HeartAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ explicit HeartAnimatorCallback(HeartRateReadyPage *page) : page_(page) {}\r
+ ~HeartAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+\r
+ private:\r
+ HeartRateReadyPage *page_{nullptr};\r
+ };\r
+ Animator *animator_ = nullptr;\r
+ HeartAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // HEART_RATE_READY_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateResultGroup\r
+ * Create: 2025-06\r
+ */\r
+\r
+#ifndef HEARTRATE_RESULT_GROUP_H\r
+#define HEARTRATE_RESULT_GROUP_H\r
+\r
+#include <sys/time.h>\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_chart.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "HeartRatePresenter.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "HeartRateView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t HEARTRATE_ANIMATOR_IMAGE_NUM = 30;\r
+static constexpr uint16_t HEARTRATE_ANIMATOR_IMAGE_UPDATE = 70;\r
+class HeartRatePresenter;\r
+class HeartRateResultGroup : public UIViewGroup {\r
+public:\r
+ HeartRateResultGroup();\r
+ ~HeartRateResultGroup() override;\r
+ void InitPage();\r
+ void InitImageAnimator();\r
+ UILabel *labelHeartRateValue_ = nullptr;\r
+private:\r
+ UIImageAnimatorView *imageAnimator_ = nullptr;\r
+ UILabel *labelTitle_ = nullptr;\r
+ UIChartPolyline *chartPolyline_ = nullptr;\r
+ UILabel *labelLastMeasureTime_ = nullptr;\r
+ UILabel *labelUnitText_ = nullptr;\r
+ UIChartDataSerial *dataSerial_{nullptr};\r
+ UIImageView *imageRedArrow_ = nullptr;\r
+ UILabel *labelMaxValue_ = nullptr;\r
+ UIImageView *imageBlackArrow_ = nullptr;\r
+ UILabel *labelMinValue_ = nullptr;\r
+ // X轴坐标三个点位\r
+ UILabel *labelXAxisPointOne_ = nullptr;\r
+ UILabel *labelXAxisPointTwo_ = nullptr;\r
+ UILabel *labelXAxisPointThree_ = nullptr;\r
+ // Y轴坐标四个点位\r
+ UILabel *labelYAxisPointOne_ = nullptr;\r
+ UILabel *labelYAxisPointTwo_ = nullptr;\r
+ UILabel *labelYAxisPointThree_ = nullptr;\r
+ UILabel *labelYAxisPointFour_ = nullptr;\r
+ UIImageView *mainImg_ = nullptr;\r
+ ImageAnimatorInfo imageAnimatorImageInfo_[HEARTRATE_ANIMATOR_IMAGE_NUM];\r
+};\r
+}\r
+#endif // HEARTRATE_RESULT_GROUP_H\r
/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: heartRate view\r
- * Author:\r
- * Create: 2021-07-26\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: HeartRateView\r
+ * Create: 2025-06\r
*/\r
\r
-#ifndef HEART_RATE_VIEW_H\r
-#define HEART_RATE_VIEW_H\r
+#ifndef HEART_RATE_ITEM_VIEW_H\r
+#define HEART_RATE_ITEM_VIEW_H\r
\r
#include "View.h"\r
-#include "components/ui_image_animator.h"\r
-#include "components/ui_chart.h"\r
-#include "wearable_log.h"\r
-#include "ohos_types.h"\r
-#include "components/ui_card_page.h"\r
-#include "heartrate/HeartModel.h"\r
\r
namespace OHOS {\r
-#define HEART_AVE_NUM 360\r
-#define HEART_RATE_LIMIT_UPPER 200\r
-#define HEART_RATE_LIMIT_LOWER 0\r
-#define INVALID_HEART_VALUE ((int16)0xFFFF)\r
-\r
-#define NUM_1 1\r
-#define NUM_2 2\r
-#define NUM_3 3\r
-#define NUM_4 4\r
-#define NUM_5 5\r
-#define NUM_7 7\r
-#define NUM_16 16\r
-#define NUM_99 99\r
-\r
-class HeartRateView : public UICardPage {\r
-public:\r
- HeartRateView();\r
- ~HeartRateView() override;\r
- static HeartRateView *GetInstance(void);\r
-\r
- bool InitView(void);\r
- void PreLoad(void) override;\r
- void UnLoad(void) override;\r
- int32_t SetHeartRateData(Point *rateData, uint32 rateDataSize); // 设置心率数据,用于画心率曲线\r
- void RefreshElectrocardiogram(void); // 刷新心率曲线\r
- void ClearElectrocardiogram(void); // 清空心率曲线\r
- void RefreshHeartRatePerSec(uint16_t value); // 刷新每秒心率\r
- void RefreshHeartRateMax(uint16_t max); // 刷新心率最大值\r
- void RefreshHeartRateMin(uint16_t min); // 刷新心率最小值\r
- void RefreshRestHeartRate(uint16_t value); // 刷新静息心率\r
- void HeartbeatImageAnimatorStart(void); // 心形动画启动\r
- void HeartbeatImageAnimatorStop(void); // 心形动画停止\r
- void InitRefreshInterface(void);\r
-\r
-private:\r
- typedef struct {\r
- uint8_t fontSize;\r
- int16 x;\r
- int16 y;\r
- int16 width;\r
- int16 height;\r
- } LabelInfo;\r
-\r
- int32_t InitHeartRateData(void);\r
- void SetLabel(UILabel *label, LabelInfo labelInfo);\r
- void HeartRateLabelDisplay(void);\r
- void HeartRateCoordinate(void);\r
- void HeartRateElectrocardiogram(void);\r
- void InsertTopAndBottomRateImage(void);\r
- void UpdataTopAndBottomRate(void);\r
- void ElectrocardiogramOnePoint(Point *rateData, uint16_t index);\r
- void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
- int32_t HeartRateDataProc(void);\r
- void HeartbeatImageAnimator(void);\r
-\r
-private:\r
- Point heartRateData[HEART_AVE_NUM];\r
- Point rateDataTmp[HEART_AVE_NUM];\r
-\r
- bool viewiInitStatus{false};\r
- bool resLoadStatus{false};\r
- UIChartPolyline *chart{nullptr};\r
- uint16_t dataNume; // 心率曲线记录数据总个数\r
- uint16_t currIndex; // 当前已显示心率曲线心率个数\r
- UIChartDataSerial *dataSerial[HEART_AVE_NUM]{nullptr};\r
- UIChartDataSerial *dataTopAndbottom{nullptr};\r
- UIImageView *imageViewTop{nullptr};\r
- UIImageView *imageViewBottom{nullptr};\r
- uint16_t serialIndex;\r
- UIImageAnimatorView *imageAnimator{nullptr};\r
- UIImageView *imageViewCoordinate{nullptr};\r
-\r
- UILabel *topRate{nullptr};\r
- UILabel *bottomRate{nullptr};\r
- UILabel *ratePerSec{nullptr};\r
- UILabel *ratePerSecText{nullptr};\r
- UILabel *restRate{nullptr};\r
- UILabel *restRateText1{nullptr};\r
- UILabel *restRateText2{nullptr};\r
-\r
- uint16_t maxRate;\r
- uint16_t minRate;\r
+enum HeartRateAllView {\r
+ HEARTRATE_MAIN_PAGE = 1, // 0 is invalid\r
+ HEARTRATE_READY_PAGE = 2,\r
+ HEARTRATE_MEASUREMENT_PAGE = 3,\r
};\r
-} // namespace OHOS\r
-#endif // HEART_RATE_VIEW_H\r
+\r
+class HeartRatePresenter;\r
+class HeartRateView : public View<HeartRatePresenter> {};\r
+}\r
+#endif // HEART_RATE_ITEM_VIEW_H\r
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: APPVEIW
- * Author:
- * Create: 2021-10-15
- */
-
-#ifndef APP_GROUP_VIEW_H
-#define APP_GROUP_VIEW_H
-
-#include <string>
-#include "View.h"
-#include "components/ui_card_page.h"
-#include "common/screen.h"
-
-namespace OHOS {
-class AppGroupView : public UICardPage {
-public:
- AppGroupView()
- {
- SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
- }
- ~AppGroupView() override {}
- virtual bool InitView(void *caller)=0;
- bool initViewStatus{false};
-};
-} // namespace OHOS
-#endif // APP_GROUP_VIEW_H
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: APPVEIW\r
+ * Author:\r
+ * Create: 2021-10-15\r
+ */\r
+\r
+#ifndef APP_GROUP_VIEW_H\r
+#define APP_GROUP_VIEW_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "components/ui_card_page.h"\r
+#include "common/screen.h"\r
+\r
+namespace OHOS {\r
+class AppGroupView : public UICardPage {\r
+public:\r
+ AppGroupView()\r
+ {\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ }\r
+ ~AppGroupView() override {}\r
+ virtual bool InitView(void *caller)=0;\r
+ bool initViewStatus{false};\r
+};\r
+} // namespace OHOS\r
+#endif // APP_GROUP_VIEW_H\r
-/*
- * Copyright (c) CompanyNameMagicTag 2024-2024. All rights reserved.
- * Description: DialBinTypesV2
- * Author:
- * Create: 2024-10-30
- */
-
-#ifndef GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H
-#define GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H
-#include "main/DialBinTypes.h"
-
-namespace OHOS {
-enum class DisplayState {
- NORMAL,
- AOD,
-};
-static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY = 0;
-static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY = 1;
-static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_AMBITIENT_NORMAL = 2;
-
-struct DialHeader_V2 {
- char dialName[DIAL_NAME_MAX_LEN];
- int16_t width;
- int16_t height;
- char version[DIAL_VERSION_MAX_LEN];
- uint16_t previewImgId;
- char description[DIAL_DESCRIPTION_MAX_LEN];
- uint32_t imageOffset;
- uint8_t freq;
- uint8_t dialViewCount;
- uint8_t displayCapabiliy;
- uint8_t ambientFreq;
-};
-
-struct DialStaticImg_V2 {
- Point pos;
- Point center;
- float rotate;
- uint16_t imgId;
- uint8_t displayMode;
-};
-
-struct DialSequenceImg_V2 {
- Point pos;
- uint16_t interval;
- bool repeat;
- uint8_t imgNum;
- uint8_t displayMode;
-};
-
-struct DialRotateImg_V2 {
- Point pos;
- Point center;
- int16_t rotateStart;
- int16_t rotateEnd;
- uint16_t imgId;
- int16_t bindData;
- bool isPeriod;
- uint8_t displayMode;
- bool isAmbientPeriodic;
-};
-
-struct DialOptionImg_V2 {
- Point pos;
- int16_t bindData;
- bool isPeriod;
- uint8_t count;
- uint8_t displayMode;
- bool isAmbientPeriodic;
-};
-
-struct DialDigitalImg_V2 {
- uint8_t alignType : 4;
- uint8_t integerLength : 4;
- uint8_t decimalPrecision;
- uint16_t imgIds[DIAL_DIGITALIMG_IMG_MAX_NUM];
- int16_t signImgId;
- int16_t decimalPointImgId;
- uint16_t space;
- Point alignPosition;
- int16_t bindData;
- bool isPeriod;
- uint8_t displayMode;
- bool isAmbientPeriodic;
-};
-
-struct DialLabel_V2 {
- uint8_t breakMode;
- uint8_t align;
- uint8_t fontSize;
- bool isPeriod;
- DialRect rect;
- uint32_t color;
- char fontName[64];
- char text[64];
- int16_t bindData;
- uint8_t displayMode;
- bool isAmbientPeriodic;
-};
-
-struct DialArcLabel_V2 {
- uint8_t align;
- uint8_t fontSize;
- Point center;
- int16_t radius;
- int16_t rotateStart;
- int16_t rotateEnd;
- uint32_t color;
- char fontName[64];
- char text[64];
- int16_t bindData;
- bool isPeriod;
- uint8_t displayMode;
- bool isAmbientPeriodic;
-};
-
-struct DialBoxProgress_V2 {
- uint8_t cap;
- uint8_t direction;
- bool isPeriod;
- int16_t bindData;
- uint32_t bgColor;
- DialProgressType typeData;
- uint8_t displayMode;
- bool isAmbientPeriodic;
-};
-
-struct DialArcProgress_V2 {
- uint8_t cap;
- bool isPeriod;
- uint16_t radius;
- uint16_t startAngle;
- uint16_t endAngle;
- uint16_t lineWidth;
- int16_t bindData;
- uint32_t bgColor;
- DialProgressType typeData;
- uint8_t displayMode;
- bool isAmbientPeriodic;
-};
-
-struct DialVideo_V2 {
- DialRect rect;
- uint32_t offset;
- Color32 colorKey;
- uint32_t imgId;
- uint8_t displayMode;
-};
-
-struct DialClick_V2 {
- uint8_t type;
- DialRect rect;
- union {
- uint32_t sliceId;
- char bundleName[64];
- };
- uint8_t displayMode;
-};
-
-struct DialKaleidoscope_V2 {
- uint16_t imgId;
- float crownRotateStep;
- float animatorRotateStep;
- uint8_t displayMode;
-};
-} // namespace OHOS
-#endif // GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2024-2024. All rights reserved.\r
+ * Description: DialBinTypesV2\r
+ * Author:\r
+ * Create: 2024-10-30\r
+ */\r
+\r
+#ifndef GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H\r
+#define GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H\r
+#include "main/DialBinTypes.h"\r
+\r
+namespace OHOS {\r
+enum class DisplayState {\r
+ NORMAL,\r
+ AOD,\r
+};\r
+static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY = 0;\r
+static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY = 1;\r
+static constexpr uint8_t DIAL_DISPLAY_CAPABILITY_AMBITIENT_NORMAL = 2;\r
+\r
+struct DialHeader_V2 {\r
+ char dialName[DIAL_NAME_MAX_LEN];\r
+ int16_t width;\r
+ int16_t height;\r
+ char version[DIAL_VERSION_MAX_LEN];\r
+ uint16_t previewImgId;\r
+ char description[DIAL_DESCRIPTION_MAX_LEN];\r
+ uint32_t imageOffset;\r
+ uint8_t freq;\r
+ uint8_t dialViewCount;\r
+ uint8_t displayCapabiliy;\r
+ uint8_t ambientFreq;\r
+};\r
+\r
+struct DialStaticImg_V2 {\r
+ Point pos;\r
+ Point center;\r
+ float rotate;\r
+ uint16_t imgId;\r
+ uint8_t displayMode;\r
+};\r
+\r
+struct DialSequenceImg_V2 {\r
+ Point pos;\r
+ uint16_t interval;\r
+ bool repeat;\r
+ uint8_t imgNum;\r
+ uint8_t displayMode;\r
+};\r
+\r
+struct DialRotateImg_V2 {\r
+ Point pos;\r
+ Point center;\r
+ int16_t rotateStart;\r
+ int16_t rotateEnd;\r
+ uint16_t imgId;\r
+ int16_t bindData;\r
+ bool isPeriod;\r
+ uint8_t displayMode;\r
+ bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialOptionImg_V2 {\r
+ Point pos;\r
+ int16_t bindData;\r
+ bool isPeriod;\r
+ uint8_t count;\r
+ uint8_t displayMode;\r
+ bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialDigitalImg_V2 {\r
+ uint8_t alignType : 4;\r
+ uint8_t integerLength : 4;\r
+ uint8_t decimalPrecision;\r
+ uint16_t imgIds[DIAL_DIGITALIMG_IMG_MAX_NUM];\r
+ int16_t signImgId;\r
+ int16_t decimalPointImgId;\r
+ uint16_t space;\r
+ Point alignPosition;\r
+ int16_t bindData;\r
+ bool isPeriod;\r
+ uint8_t displayMode;\r
+ bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialLabel_V2 {\r
+ uint8_t breakMode;\r
+ uint8_t align;\r
+ uint8_t fontSize;\r
+ bool isPeriod;\r
+ DialRect rect;\r
+ uint32_t color;\r
+ char fontName[64];\r
+ char text[64];\r
+ int16_t bindData;\r
+ uint8_t displayMode;\r
+ bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialArcLabel_V2 {\r
+ uint8_t align;\r
+ uint8_t fontSize;\r
+ Point center;\r
+ int16_t radius;\r
+ int16_t rotateStart;\r
+ int16_t rotateEnd;\r
+ uint32_t color;\r
+ char fontName[64];\r
+ char text[64];\r
+ int16_t bindData;\r
+ bool isPeriod;\r
+ uint8_t displayMode;\r
+ bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialBoxProgress_V2 {\r
+ uint8_t cap;\r
+ uint8_t direction;\r
+ bool isPeriod;\r
+ int16_t bindData;\r
+ uint32_t bgColor;\r
+ DialProgressType typeData;\r
+ uint8_t displayMode;\r
+ bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialArcProgress_V2 {\r
+ uint8_t cap;\r
+ bool isPeriod;\r
+ uint16_t radius;\r
+ uint16_t startAngle;\r
+ uint16_t endAngle;\r
+ uint16_t lineWidth;\r
+ int16_t bindData;\r
+ uint32_t bgColor;\r
+ DialProgressType typeData;\r
+ uint8_t displayMode;\r
+ bool isAmbientPeriodic;\r
+};\r
+\r
+struct DialVideo_V2 {\r
+ DialRect rect;\r
+ uint32_t offset;\r
+ Color32 colorKey;\r
+ uint32_t imgId;\r
+ uint8_t displayMode;\r
+};\r
+\r
+struct DialClick_V2 {\r
+ uint8_t type;\r
+ DialRect rect;\r
+ union {\r
+ uint32_t sliceId;\r
+ char bundleName[64];\r
+ };\r
+ uint8_t displayMode;\r
+};\r
+\r
+struct DialKaleidoscope_V2 {\r
+ uint16_t imgId;\r
+ float crownRotateStep;\r
+ float animatorRotateStep;\r
+ uint8_t displayMode;\r
+};\r
+} // namespace OHOS\r
+#endif // GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H\r
\r
#include <cstdio>\r
#include "gfx_utils/list.h"\r
-#include "main/UiServersMsg.h"\r
+#include "UiServersMsg.h"\r
\r
namespace OHOS {\r
#define NUM_1 1\r
/*\r
- * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: LoadImg\r
* Create: 2025-06-05\r
*/\r
+\r
#ifndef LOAD_IMG_H\r
#define LOAD_IMG_H\r
\r
void LoadBtnImage(UIButton *btn, std::string file, uint32_t resId1, uint32_t resId2);\r
\r
void LoadImageViewImg(UIImageView *view, std::string file, uint32_t resId);\r
+\r
+void LoadImageImg(Image *view, std::string file, uint32_t resId);\r
}\r
}\r
#endif // LOAD_IMG_H
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: MainPresenterSample
- * Author:
- * Create:
- */
-
-#ifndef MAIN_PRESENTER_SAMPLE_H
-#define MAIN_PRESENTER_SAMPLE_H
-
-#include "Presenter.h"
-#include "main/ModelListenerSample.h"
-#include "components/root_view.h"
-#include "drag_event.h"
-#include "main/MainViewSample.h"
-#include "main/MainModel.h"
-#include "components/ui_swipe_view.h"
-#include "components/ui_view.h"
-#include "compass/MainCompassView.h"
-#include "compass/MainCompassPresenter.h"
-#include "player/PlayersView.h"
-#include "heartrate/HeartRateView.h"
-#include "swipe_effect/zoom_effect.h"
-
-namespace OHOS {
-static constexpr const char *MAIN_CLICK_WEATHER = "mainclickweather";
-static constexpr const char *MAIN_CLICK_ACTIVITY = "mainclickactivity";
-static constexpr const char *MAIN_CLICK_MESSAGE = "mainclickmessage";
-static constexpr const char *MAIN_CLICK_HEARTRATE = "mainclickheartrate";
-
-static constexpr const char *DROPDOWN_CLICK_DONOTDISTURB = "dropdownclickdonotdisturb";
-static constexpr const char *DROPDOWN_CLICK_BRIGHTENSCREEN = "dropdownclickbrightscreen";
-static constexpr const char *DROPDOWN_CLICK_FINDMYPHONE = "dropdownclickfindmyphone";
-static constexpr const char *DROPDOWN_CLICK_ALARM = "dropdownclickalarm";
-static constexpr const char *DROPDOWN_CLICK_SETTING = "dropdownclicksetting";
-constexpr uint16_t VERTICAL_STATUS = 1;
-constexpr uint16_t HORIZONTAL_STATUS = 0;
-enum class MainPresenterState {
- START,
- RESUME,
- PAUSE,
- STOP,
-};
-
-class MainViewSample;
-class MainPresenterSample : public Presenter<MainViewSample>, public ModelListenerSample,
- public UIView::OnClickListener, public UISwipeView::OnSwipeListener,
- public UIView::OnLongPressListener, public UISwipeView {
-public:
- MainPresenterSample();
- ~MainPresenterSample() override;
- static MainPresenterSample *GetInstance(void);
-
- void OnStart() override;
- void OnPause() override;
- void OnResume() override;
- void OnStop() override;
- void Notify() override;
- bool OnClick(UIView& view, const ClickEvent& event) override;
- bool OnLongPress(UIView& view, const LongPressEvent& event) override;
- void OnSwipe(UISwipeView& view) override;
- void SetPage(int8_t id, bool loadAdjacent = true);
- void SetTaskPeroid(CardId cardId);
-
- void InitCardSettings(void);
- uint8_t GetCardSettingCount(void);
- CardId *GetCardSettings(void);
- void InitDialSettings(void);
- DialSetting& GetDialSetting();
- bool IsFromSetCardView(void) const;
- void SetFromSetCardView(bool isFrom);
- uint8_t GetFromCardId(void);
- MainPresenterState GetMainPresenterState();
-
-private:
- void ProcessDataNotify(void);
- void SetCircleProgress(void);
- uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;
- int64_t playerCurrentTime_{0};
- int64_t playerMusicDuration_{0};
- int64_t playerProgressValue_{0};
- bool isCompassSensorOpened_{false};
- MainPresenterState mainPresenterState_ = MainPresenterState::STOP;
-};
-}
-
-#endif // MAIN_PRESENTER_H
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainPresenterSample\r
+ * Author:\r
+ * Create:\r
+ */\r
+\r
+#ifndef MAIN_PRESENTER_SAMPLE_H\r
+#define MAIN_PRESENTER_SAMPLE_H\r
+\r
+#include "Presenter.h"\r
+#include "components/root_view.h"\r
+#include "drag_event.h"\r
+#include "main/MainViewSample.h"\r
+#include "main/MainModel.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "components/ui_view.h"\r
+#include "compass/MainCompassView.h"\r
+#include "compass/MainCompassPresenter.h"\r
+#include "player/PlayersView.h"\r
+#include "common/task.h"\r
+\r
+namespace OHOS {\r
+static constexpr const char *MAIN_CLICK_WEATHER = "mainclickweather";\r
+static constexpr const char *MAIN_CLICK_ACTIVITY = "mainclickactivity";\r
+static constexpr const char *MAIN_CLICK_MESSAGE = "mainclickmessage";\r
+\r
+static constexpr const char *DROPDOWN_CLICK_DONOTDISTURB = "dropdownclickdonotdisturb";\r
+static constexpr const char *DROPDOWN_CLICK_BRIGHTENSCREEN = "dropdownclickbrightscreen";\r
+static constexpr const char *DROPDOWN_CLICK_FINDMYPHONE = "dropdownclickfindmyphone";\r
+static constexpr const char *DROPDOWN_CLICK_ALARM = "dropdownclickalarm";\r
+static constexpr const char *DROPDOWN_CLICK_SETTING = "dropdownclicksetting";\r
+constexpr uint16_t VERTICAL_STATUS = 1;\r
+constexpr uint16_t HORIZONTAL_STATUS = 0;\r
+enum class MainPresenterState {\r
+ START,\r
+ RESUME,\r
+ PAUSE,\r
+ STOP,\r
+};\r
+\r
+class MainViewSample;\r
+class MainPresenterSample : public Presenter<MainViewSample>, public UIView::OnClickListener, public Task,\r
+ public UISwipeView::OnSwipeListener, public UIView::OnLongPressListener, public UISwipeView {\r
+public:\r
+ MainPresenterSample();\r
+ ~MainPresenterSample() override;\r
+ static MainPresenterSample *GetInstance(void);\r
+\r
+ void OnStart() override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+ bool OnLongPress(UIView& view, const LongPressEvent& event) override;\r
+ void OnSwipe(UISwipeView& view) override;\r
+ void SetPage(int8_t id, bool loadAdjacent = true);\r
+ void SetTaskPeroid(CardId cardId);\r
+ void InitCardSettings(void);\r
+ uint8_t GetCardSettingCount(void);\r
+ CardId *GetCardSettings(void);\r
+ void InitDialSettings(void);\r
+ DialSetting& GetDialSetting();\r
+ bool IsFromSetCardView(void) const;\r
+ void SetFromSetCardView(bool isFrom);\r
+ uint8_t GetFromCardId(void);\r
+ MainPresenterState GetMainPresenterState();\r
+\r
+private:\r
+ void ProcessDataNotify(void);\r
+ void Callback() override;\r
+ uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;\r
+ bool isCompassSensorOpened_{false};\r
+ MainPresenterState mainPresenterState_ = MainPresenterState::STOP;\r
+};\r
+}\r
+\r
+#endif // MAIN_PRESENTER_H\r
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: MainViewSample
- * Author:
- * Create:
- */
-
-#ifndef MAIN_VIEW_SAMPLE_H
-#define MAIN_VIEW_SAMPLE_H
-
-#include <string>
-#include "View.h"
-#include "components/root_view.h"
-#include "swipe_effect/zoom_effect.h"
-#include "ChangeSliceListener.h"
-#include "font/ui_font.h"
-#include "graphic_config.h"
-#include "main/ModelListenerSample.h"
-#include "screensetting/ScreenModels.h"
-#include "activity/ActivityWeekView.h"
-#include "compass/CompassControlView.h"
-#include "main/dial/DialViewGroup.h"
-#include "clock/MainClockView.h"
-#include "player/PlayersView.h"
-#include "main/MainPresenterSample.h"
-#include "heartrate/HeartRateView.h"
-#include "components/ui_card_page.h"
-#include "main/PullUpDownView.h"
-#include "components/ui_cross_view.h"
-#include "set_card/SetCardModel.h"
-#include "videocard/VideoCard.h"
-
-namespace OHOS {
-class MainPresenterSample;
-class MainViewSample : public View<MainPresenterSample> {
-public:
- MainViewSample();
- ~MainViewSample() override;
- static MainViewSample *GetInstance(void);
- void OnStart() override;
- void OnStop() override;
- UICardPage *InitWatchFacePage(void);
- UICardPage *InitHeartRatePage(void);
- UICardPage *InitActivityPage(void);
- UICardPage *InitCompassPage(void);
- UICardPage *InitMusicPlayerPage(void);
- UICardPage *InitVideoCardPage1(void);
- UICardPage *InitVideoCardPage2(void);
- UICardPage *InitVideoCardPage3(void);
- void AnimatorStart(int pageIndex);
- void AnimatorStop(void);
- CardId GetHorCurrentCard() const;
- UIView* GetMainViewGroup(void) const
- {
- return mainSwipeGroup;
- }
-
- UICardPage* GetViewById(int16_t id) const
- {
- if (id >= MAX_CARD) {
- return nullptr;
- }
- return recordCard[id];
- }
-
- void SwitchToClockPage(bool loadAdjacent = true)
- {
- if (mainClockView != nullptr) {
- SetPage(mainClockView->GetViewIndex(), loadAdjacent);
- }
- }
- void SwitchToCard(uint8_t cardId, bool loadAdjacent = true);
- bool IsMainClockPage(void);
- void SetPage(int16_t page, bool loadAdjacent = true);
- void ReloadWatchFace();
-
-private:
- PullUpDownView *dropDownView{nullptr};
- UICardPage *messageView{nullptr};
- UILabel *messageLable{nullptr};
- UICardPage *mainClockView{nullptr};
- ActivityWeekView *activityWeekView{nullptr};
- PlayersView *playersView{nullptr};
- CompassControlView *compassControlView{nullptr};
- HeartRateView *heartRateView{nullptr};
- UICardPage *recordCard[MAX_CARD]{nullptr};
- bool pageStatus[MAX_CARD]{false};
- UICrossView *mainSwipeGroup{nullptr};
- ZoomEffect* callback{nullptr};
- VideoCard *videoCard1{nullptr};
- VideoCard *videoCard2{nullptr};
- VideoCard *videoCard3{nullptr};
-
- bool HorizontalViewInit(void);
- void VerticalViewInit(void);
- void VertViewLoad(void);
- void HorViewLoad(void);
- UICardPage *InitWatchOffDial(DialSetting &setting);
- UICardPage *InitWatchDial(DialSetting &setting);
- UICardPage *InitVideoCardPage(const std::string &video, const std::string &preview);
-};
-} // namespace OHOS
-#endif // MAIN_VIEW_SAMPLE_H
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainViewSample\r
+ * Author:\r
+ * Create:\r
+ */\r
+\r
+#ifndef MAIN_VIEW_SAMPLE_H\r
+#define MAIN_VIEW_SAMPLE_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "swipe_effect/zoom_effect.h"\r
+#include "ChangeSliceListener.h"\r
+#include "font/ui_font.h"\r
+#include "graphic_config.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "activity/ActivityWeekView.h"\r
+#include "compass/CompassControlView.h"\r
+#include "main/dial/DialViewGroup.h"\r
+#include "clock/MainClockView.h"\r
+#include "player/PlayersView.h"\r
+#include "main/MainPresenterSample.h"\r
+#include "components/ui_card_page.h"\r
+#include "main/PullUpDownView.h"\r
+#include "components/ui_cross_view.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/common/SettingCardEffectSample.h"\r
+#include "videocard/VideoCard.h"\r
+#include "main/MessageMainPage.h"\r
+\r
+namespace OHOS {\r
+class MainPresenterSample;\r
+class MainViewSample : public View<MainPresenterSample> {\r
+public:\r
+ MainViewSample();\r
+ ~MainViewSample() override;\r
+ static MainViewSample *GetInstance(void);\r
+ void OnStart() override;\r
+ void OnStop() override;\r
+ UICardPage *InitWatchFacePage(void);\r
+ UICardPage *InitActivityPage(void);\r
+ UICardPage *InitCompassPage(void);\r
+ UICardPage *InitMusicPlayerPage(void);\r
+ UICardPage *InitVideoCardPage1(void);\r
+ UICardPage *InitVideoCardPage2(void);\r
+ UICardPage *InitVideoCardPage3(void);\r
+ void AnimatorStart(int pageIndex);\r
+ void AnimatorStop(void);\r
+ CardId GetHorCurrentCard() const;\r
+ void GetVerCurrentCard() const;\r
+ UIView* GetMainViewGroup(void) const\r
+ {\r
+ return mainSwipeGroup;\r
+ }\r
+\r
+ UICardPage* GetViewById(int16_t id) const\r
+ {\r
+ if (id >= MAX_CARD) {\r
+ return nullptr;\r
+ }\r
+ return recordCard[id];\r
+ }\r
+\r
+ void SwitchToClockPage(bool loadAdjacent = true)\r
+ {\r
+ if (mainClockView != nullptr) {\r
+ SetPage(mainClockView->GetViewIndex(), loadAdjacent);\r
+ }\r
+ }\r
+ void SwitchToCard(uint8_t cardId, bool loadAdjacent = true);\r
+ bool IsMainClockPage(void);\r
+ void SetPage(int16_t page, bool loadAdjacent = true);\r
+ void ReloadWatchFace();\r
+\r
+private:\r
+ PullUpDownView *dropDownView{nullptr};\r
+ MessageMainPage *messageView{nullptr};\r
+ UICardPage *mainClockView{nullptr};\r
+ ActivityWeekView *activityWeekView{nullptr};\r
+ PlayersView *playersView{nullptr};\r
+ CompassControlView *compassControlView{nullptr};\r
+ UICardPage *recordCard[MAX_CARD]{nullptr};\r
+ bool pageStatus[MAX_CARD]{false};\r
+ UICrossView *mainSwipeGroup{nullptr};\r
+ CardSwipe* callback{nullptr};\r
+ VideoCard *videoCard1{nullptr};\r
+ VideoCard *videoCard2{nullptr};\r
+ VideoCard *videoCard3{nullptr};\r
+\r
+ bool HorizontalViewInit(void);\r
+ void VerticalViewInit(void);\r
+ void VertViewLoad(void);\r
+ void HorViewLoad(void);\r
+ UICardPage *InitWatchOffDial(DialSetting &setting);\r
+ UICardPage *InitWatchDial(DialSetting &setting);\r
+ UICardPage *InitVideoCardPage(const std::string &video, const std::string &preview);\r
+ bool SetCardEffect(CardEffectID style);\r
+};\r
+} // namespace OHOS\r
+#endif // MAIN_VIEW_SAMPLE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageDetailsGroup\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef MESSAGE_DETAILS_GROUP_H\r
+#define MESSAGE_DETAILS_GROUP_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_message.h"\r
+#include "MessageModel.h"\r
+\r
+namespace OHOS {\r
+class DetailsGroup : public UIScrollView {\r
+public:\r
+ DetailsGroup();\r
+ ~DetailsGroup() override;\r
+ void InitDetailsPage();\r
+ void RefreshNotify();\r
+ MessageItem detailsMsg_;\r
+\r
+private:\r
+ UIImageView *detailsMsgIcon_{nullptr};\r
+ UILabel *detailsMsgTitle_{nullptr};\r
+ UILabel *detailsMsgContacts_{nullptr};\r
+ UILabel *detailsMsgContents_{nullptr};\r
+ UILabel *detailsMsgTime_{nullptr};\r
+};\r
+}\r
+#endif\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- */\r
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: weather/WeatherItemView.h\r
- * Author:\r
- * Create: 2021-11-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageItemView\r
+ * Create: 2025-06-29\r
*/\r
\r
#ifndef MESSAGE_ITEM_VIEW_H\r
#include "components/ui_view_group.h"\r
#include "components/ui_image_view.h"\r
#include "components/ui_canvas.h"\r
-\r
#include "UiConfig.h"\r
#include "main/MessageModel.h"\r
\r
namespace OHOS {\r
-class MessageItemView : public UIViewGroup {\r
+class MessageItemView : public UIViewGroup,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
public:\r
explicit MessageItemView();\r
~MessageItemView() override;\r
virtual void SetItemInfo(const MessageItem itemInfo);\r
- virtual void SetUpChild();\r
+ bool OnDragStartEvent(const DragEvent& event) override;\r
+ bool OnDragEvent(const DragEvent& event) override;\r
+ bool OnDragEndEvent(const DragEvent& event) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ void SetIndex(uint16_t index);\r
+ uint16_t GetIndex();\r
+ MessageItem GetItem();\r
+ void UpdateItemStatus();\r
+\r
+ int posX;\r
+ int x = 0;\r
private:\r
- UILabel sLabel_1;\r
- UIImageView sIcon;\r
- UILabel sLabel_2;\r
- UILabel sLabel_3;\r
- UIImageView sNextImage;\r
- UILabel sback;\r
- MessageItem sItemInfo = { nullptr, nullptr, nullptr, nullptr};\r
+ uint16_t itemIndex_;\r
+ UIViewGroup group_;\r
+ UILabel appName_;\r
+ UIImageView appIcon_;\r
+ UILabel appContact_;\r
+ UILabel appContents_;\r
+ UILabel msgTime_;\r
+ UIImageView bgImg_;\r
+ UIImageView deleteImg_;\r
+ MessageItem msgItemInfo_ = {"", "", "", "", 0, 0, false};\r
};\r
}\r
\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageMainPage\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef MESSAGE_MAIN_VIEW_H\r
+#define MESSAGE_MAIN_VIEW_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_list.h"\r
+#include "main/MessageDetailsGroup.h"\r
+#include "main/MessageModel.h"\r
+#include "MainModel.h"\r
+#include "main/MessageItemView.h"\r
+namespace OHOS {\r
+class MessageMainPage : public UICardPage,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ MessageMainPage();\r
+ ~MessageMainPage() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDragStartEvent(const DragEvent& event) override;\r
+ bool OnDragEvent(const DragEvent& event) override;\r
+ bool OnDragEndEvent(const DragEvent& event) override;\r
+ static MessageMainPage *GetInstance(void);\r
+ bool InitView();\r
+ void PreLoad(void) override;\r
+ void VerticalViewInits(void);\r
+ void ConfirmDelete(void);\r
+ void CancelDelete(void);\r
+ void InitMsgList(void);\r
+ void DeleteView(void);\r
+ void NoNotify(void);\r
+ void NewNotify(void);\r
+ void RefreshMsgList(std::vector<MessageItem> &item);\r
+ bool InitScrollData();\r
+ void LoadDetailsView(void);\r
+ void DeleteDetailsView(void);\r
+ UISimpleList *msgList_{nullptr};\r
+private:\r
+ UILabel *noMsgLable_{nullptr};\r
+ UILabel *msgLable_{nullptr};\r
+ UIImageView *noMsgImage_{nullptr};\r
+ UIImageView *deleteImage_{nullptr};\r
+ UIScrollView *deleteGroup_{nullptr};\r
+ UILabel *deleteTips_{nullptr};\r
+ UIImageView *confirm_{nullptr};\r
+ UIImageView *cancel_{nullptr};\r
+ DetailsGroup *detailsGroup_{nullptr};\r
+};\r
+}\r
+#endif\r
/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MainModel.h\r
- * Author:\r
- * Create: 2021-11-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageModel\r
+ * Create: 2025-06-29\r
*/\r
\r
#ifndef MESSAGE_MODEL_H\r
\r
#include <string>\r
#include <vector>\r
+#include <sys/time.h>\r
#include "UiConfig.h"\r
\r
namespace OHOS {\r
typedef struct {\r
- std::string label_1;\r
- std::string icon;\r
- std::string label_2;\r
- std::string label_3;\r
+ std::string appName;\r
+ std::string appContact;\r
+ std::string appContents;\r
+ std::string time;\r
+ uint16_t index;\r
+ long initialTime;\r
+ bool status;\r
} MessageItem;\r
\r
- // static const uint16_t WEATHER_ITEM_COUNT = 10;\r
class MessageModel {\r
public:\r
static MessageModel &GetInstance(void);\r
- void InitMessageItem();\r
- const std::vector<MessageItem> GetMessagelistItems() const;\r
+ void SaveMsgToModel(std::string app, std::string contact, std::string information);\r
+ void SetMsgListItems();\r
+ std::vector<MessageItem> &GetMsgListItems();\r
void ClearListItem();\r
- void GetMessageInfo(std::string app, std::string contact, std::string information);\r
void SetViewStatus(bool viewStatus);\r
bool GetViewStatus(void);\r
+ std::string UpdateTime(long time);\r
+ void SetTime(void);\r
+ void DeleteItem(MessageItem itemInfo);\r
+ void SetIndex(uint16_t itemIndex);\r
private:\r
MessageModel();\r
MessageModel(const MessageModel &);\r
MessageModel &operator=(const MessageModel &);\r
virtual ~MessageModel();\r
- std::vector<MessageItem> vecMsg;\r
- MessageItem mes;\r
- bool viewInitStatus{false};\r
+ std::vector<MessageItem> vecMsg_;\r
+ MessageItem mes_;\r
+ struct timeval currentTime_;\r
+ bool viewInitStatus_ = false;\r
+ bool indexAdd_ = true;\r
+ std::string durTime_;\r
+ uint16_t index_ = 0;\r
};\r
}\r
\r
void Callback() override;\r
};\r
}\r
-#endif\r
+#endif
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: VolumeSettingView view
- * Create: 2021-09-5
- */
-
-#ifndef VOLUME_SETTING_PRESENTER_H
-#define VOLUME_SETTING_PRESENTER_H
-
-#include "components/ui_image_view.h"
-#include "components/ui_label_button.h"
-#include "components/ui_view_group.h"
-#include "components/ui_slider.h"
-#include "main/VolumeSettingView.h"
-#include "player/PlayersView.h"
-
-namespace OHOS {
-#define INCREASE_BUTTON "increaseButton"
-#define DECREASE_BUTTON "decreaseButton"
-#define VOLUME_PROGRESS "progress"
-#define VOLUME_VIEW "volumeview"
-
-typedef enum : uint16_t {
- VOLUMEPHONE = 1,
- VOLUMEPLAYERS = 3,
- VOLUMEPHONENOTIFY = 4,
-} VolumeFactor;
-
-typedef enum : uint8_t {
- VOLUMEDOWN = 0,
- VOLUMEUP = 1,
- VOLUMEDRAG = 2,
-} VolumeChangeStatus;
-
-class VolumeSettingView;
-class VolumeSliderEventListener : public UISlider::UISliderEventListener,
- public UIView::OnClickListener,
- public UIView::OnDragListener {
-public:
- VolumeSliderEventListener(VolumeSettingView *volumeSetting);
- ~VolumeSliderEventListener();
- static VolumeSliderEventListener *GetInstance();
- void OnChange(int32_t progress) override;
- void OnRelease(int32_t progress) override;
- void ChangeVolume(VolumeChangeStatus status);
- bool OnClick(UIView& view, const ClickEvent& event) override;
- bool OnDrag(UIView& view, const DragEvent& event) override;
- void SetPlayerCoefficients(int16_t value);
- void BtAndLocalVolumeSet(int16_t sounding);
-private:
- int16_t preSound{0};
- int16_t playerCoefficients{0};
- VolumeSettingView *volumeSettingView{nullptr};
-};
-} // namespace OHOS
-#endif
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: VolumeSettingView view\r
+ * Create: 2021-09-5\r
+ */\r
+\r
+#ifndef VOLUME_SETTING_PRESENTER_H\r
+#define VOLUME_SETTING_PRESENTER_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_slider.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "player/PlayersView.h"\r
+\r
+namespace OHOS {\r
+#define INCREASE_BUTTON "increaseButton"\r
+#define DECREASE_BUTTON "decreaseButton"\r
+#define VOLUME_PROGRESS "progress"\r
+#define VOLUME_VIEW "volumeview"\r
+\r
+typedef enum : uint16_t {\r
+ VOLUMEPHONE = 1,\r
+ VOLUMEPLAYERS = 3,\r
+ VOLUMEPHONENOTIFY = 4,\r
+} VolumeFactor;\r
+\r
+typedef enum : uint8_t {\r
+ VOLUMEDOWN = 0,\r
+ VOLUMEUP = 1,\r
+ VOLUMEDRAG = 2,\r
+} VolumeChangeStatus;\r
+\r
+class VolumeSettingView;\r
+class VolumeSliderEventListener : public UISlider::UISliderEventListener,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ VolumeSliderEventListener(VolumeSettingView *volumeSetting);\r
+ ~VolumeSliderEventListener();\r
+ static VolumeSliderEventListener *GetInstance();\r
+ void OnChange(int32_t progress) override;\r
+ void OnRelease(int32_t progress) override;\r
+ void ChangeVolume(VolumeChangeStatus status);\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void SetPlayerCoefficients(int16_t value);\r
+ void BtAndLocalVolumeSet(int16_t sounding);\r
+private:\r
+ int16_t preSound{0};\r
+ int16_t playerCoefficients{0};\r
+ VolumeSettingView *volumeSettingView{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif\r
// 结束:单个浮点数据,OH标准协议部分,禁止改动,到4095结束(包括4095)
// 起始:单个浮点数据,私有可定制部分,从4096开始(包括4096,二进制格式为:0001,xxxx,xxxx,xxxx)
+ ARC_PROGRESS_TEST = 8189, // arc progree test
SWIVEL_GEAR_POSITIVE = 8190, // private data, clockwise
SWIVEL_GEAR_NEGATIVE = 8191, // counterclockwise
// 结束:单个浮点数据,私有可定制部分,到8191结束(包括8191)
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.\r
+ * Description: DialModelArcProgress\r
+ * Author: Hisi Graphic\r
+ * Create: 2025-08\r
+ */\r
+\r
+#ifndef DIAL_MODEL_ARC_PROGRESS_H\r
+#define DIAL_MODEL_ARC_PROGRESS_H\r
+\r
+#include "main/dial/DialBaseModel.h"\r
+\r
+namespace OHOS {\r
+class DialModelArcProgress : public DialBaseModel {\r
+public:\r
+ static DialModelArcProgress* GetInstance();\r
+ bool GetDialFloatData(DialDataType& type, float& out) override;\r
+private:\r
+ DialModelArcProgress() {}\r
+ ~DialModelArcProgress() override {}\r
+\r
+ DialModelArcProgress(const DialModelArcProgress &) = delete;\r
+ const DialModelArcProgress &operator=(const DialModelArcProgress &) = delete;\r
+ float data_ = 0.1; // 0.1: default heart value as reference\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyModel\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef MONKEY_MODEL_H\r
+#define MONKEY_MODEL_H\r
+\r
+#include <iostream>\r
+#include <cstdint>\r
+#include <map>\r
+#include <vector>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "animator.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint32_t sliceId;\r
+ uint32_t pageId;\r
+} SlicePageId;\r
+\r
+class MonkeyModel {\r
+public:\r
+ static MonkeyModel &GetInstance(void);\r
+ void SetStart(bool start);\r
+\r
+private:\r
+ MonkeyModel();\r
+ MonkeyModel(const MonkeyModel &);\r
+ MonkeyModel &operator=(const MonkeyModel &);\r
+ virtual ~MonkeyModel();\r
+ class TimeAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ TimeAnimatorCallback(uint32_t periol) : periol_(periol) {}\r
+ virtual ~TimeAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ uint32_t periol_;\r
+ };\r
+ TimeAnimatorCallback* timeCallback_ = nullptr;\r
+ Animator* timeAnimator_ = nullptr;\r
+};\r
+}\r
+\r
+#endif // MONKEY_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyPage\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef MONKEY_PAGE_H\r
+#define MONKEY_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "SlicePage.h"\r
+#include "MonkeyPresenter.h"\r
+\r
+namespace OHOS {\r
+enum MONKEY_PAGES {\r
+ MONKEY_MAIN_PAGE = 1, // 0 is invalid\r
+};\r
+\r
+class MonkeyPage : public SlicePage<MonkeyPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ MonkeyPage();\r
+ ~MonkeyPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ MonkeyPage(const MonkeyPage &) = delete;\r
+ MonkeyPage &operator=(const MonkeyPage &) = delete;\r
+ MonkeyPage(MonkeyPage &&) = delete;\r
+ MonkeyPage &operator=(MonkeyPage &&) = delete;\r
+\r
+ UIScrollView *container_ = nullptr;\r
+ UILabel* monkeyLabel_ = nullptr;\r
+ UILabelButtonExt* startMonkeyButton_ = nullptr;\r
+ UILabelButtonExt* endMonkeyButton_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif /* MONKEY_PAGE_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef MONKEY_PRESENTER_H\r
+#define MONKEY_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class MonkeyView;\r
+class MonkeyPresenter : public Presenter<MonkeyView> {};\r
+}\r
+\r
+#endif // MONKEY_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyView\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef MONKEY_VIEW_H\r
+#define MONKEY_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class MonkeyPresenter;\r
+class MonkeyView : public View<MonkeyPresenter> {};\r
+}\r
+#endif // MONKEY_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_CALLER_LOG_ITEM_VIEW_H\r
+#define PHONE_MENU_CALLER_LOG_ITEM_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "phoneservice/PhoneService.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuCallerLogItemView : public UIViewGroup {\r
+public:\r
+ PhoneMenuCallerLogItemView();\r
+ ~PhoneMenuCallerLogItemView() override;\r
+ void SetItemInfo(const CallLogInfo &itemInfo);\r
+ unsigned char *GetItemPhoneNumber();\r
+\r
+private:\r
+ UIViewGroup bg_;\r
+ UIImageView icon_;\r
+ UILabel phoneLabel_;\r
+ UILabel stutasLabel_;\r
+ unsigned char tel_[MAX_PHONE_NUM];\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogModel\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_CALLER_LOG_MODEL_H\r
+#define PHONE_MENU_CALLER_LOG_MODEL_H\r
+\r
+#include "string"\r
+#include "AppViewIDs.h"\r
+#include "message.h"\r
+#include "msg_center.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuSync.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+typedef enum { CHANGE_STATUS = 0, SCO_STATUS, ERROR_MESSAGE } MessageType;\r
+\r
+enum PhoneStatus { PHONE_MULTI_STATUS = 0, PHONE_SINGLE_STATUS };\r
+\r
+bool MulitplePhoneTextReplaces();\r
+bool FindCallListInfoAndSetPriorityNumber();\r
+void PhoneScoStatausCallback(hfp_sco_connect_state_t state);\r
+void PhoneChangeStatusCallback(const PhoneCallInfo *phoneCall);\r
+void PhoneErrorCallback(PhoneServiceErrorType type, int volume);\r
+void UsingPhoneScoStatausCallback(hfp_sco_connect_state_t state);\r
+void UsingPhoneChangeStatusCallback(const PhoneCallInfo *phoneCall);\r
+void UsingPhoneErrorCallback(PhoneServiceErrorType type);\r
+\r
+namespace OHOS {\r
+class VolumeSettingView;\r
+void HonrsViewChange(void);\r
+VolumeSettingView *GetvolumeSetting(void);\r
+class PhoneMenuCallerLogModel {\r
+public:\r
+ void InitPhoneService();\r
+ static PhoneMenuCallerLogModel *GetInstance(void);\r
+ std::string GetPhoneNumber(void);\r
+ void SetoperateNumber(const char *number, char number_len);\r
+ bool GetPhoneStatus();\r
+ void SetMakePhoneStatus(bool status);\r
+ bool GetVolumeScreenStatus();\r
+ void SetVolumeScreenStatus(bool status);\r
+ bool GetCallStatus();\r
+ void SetCallStatus(bool status);\r
+ bool GetWaitingStatus();\r
+ void SetWaitingStatus(bool status);\r
+ bool GetMulitplePhoneStatus();\r
+ void SetMulitplePhoneStatus(bool status);\r
+ std::string GetDialingStatus(void);\r
+ void SetDialingStatus(const char *text);\r
+ std::string InitDateHourTime();\r
+ std::string &DisplayCallDuration();\r
+ int CurrCallNum();\r
+ bool GetNotifyFlag(void);\r
+ void SetNotifyFlag(bool flag);\r
+ bool IsMulitplePhoneStatus(void);\r
+ std::list<Contacts> &GetContacts();\r
+ bool GetMicMute()\r
+ {\r
+ return isMicMute_;\r
+ }\r
+ void SetMicMute(bool isMicMute)\r
+ {\r
+ isMicMute_ = isMicMute;\r
+ }\r
+ void SaveCurPage();\r
+ void BackToPrePage();\r
+\r
+private:\r
+ PhoneMenuCallerLogModel();\r
+ PhoneMenuCallerLogModel(const PhoneMenuCallerLogModel &);\r
+ PhoneMenuCallerLogModel &operator=(const PhoneMenuCallerLogModel &);\r
+ virtual ~PhoneMenuCallerLogModel();\r
+\r
+ std::string dialingStatus_;\r
+ std::string timers_;\r
+ std::string callDuration_;\r
+ std::string phoneNumber_;\r
+ bool mulitplePhoneStatus_{false};\r
+ bool waitingStatus_{false};\r
+ bool volumeStatus_{false};\r
+ bool phoneStatus_{false};\r
+ bool callStatus_{false};\r
+ bool notifyFlag_{false};\r
+ bool isMicMute_{false};\r
+ uint16_t preSliceId_{VIEW_MAIN_SAMPLE};\r
+ uint16_t prePageId_{0};\r
+};\r
+}\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef PHONE_MENU_CALLER_LOG_PAGE_H\r
+#define PHONE_MENU_CALLER_LOG_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_simple_list.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "SlicePage.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuCallerLogPage : public SlicePage<PhoneMenuPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ PhoneMenuCallerLogPage();\r
+ ~PhoneMenuCallerLogPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ UIScrollView *group_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UILabel *noCallLabel_{nullptr};\r
+ UILabelButton *clearButton_{nullptr};\r
+ UISimpleList *callerLogList_{nullptr};\r
+ CallLogInfo *info_{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // PHONE_MENU_CALLER_LOG_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallingPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef PHONE_MENU_CALLING_PAGE_H\r
+#define PHONE_MENU_CALLING_PAGE_H\r
+\r
+#include "SlicePage.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuCallingPage : public SlicePage<PhoneMenuPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ PhoneMenuCallingPage();\r
+ ~PhoneMenuCallingPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+ static PhoneMenuCallingPage *GetInstance();\r
+ UILabel *GetCallingPhoneNumberLabel();\r
+ UILabel *GetCallingStateLabel();\r
+ enum class CallingState : uint8_t {SESSION, INCOMING, OUTGOING, WAITING};\r
+ CallingState GetCallingState();\r
+private:\r
+ CallingState state_;\r
+ void CreateUILabel(void);\r
+ void CreateUIButton(void);\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *icon_{nullptr};\r
+ UILabel *phoneNumber_{nullptr};\r
+ UILabel *stateLabel_{nullptr};\r
+ UIButton *answerButton_{nullptr};\r
+ UIButton *hangUpButton_{nullptr};\r
+ UIButton *volumeButton_{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // PHONE_MENU_CALLING_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuContactsItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_CONTACTS_ITEM_VIEW_H\r
+#define PHONE_MENU_CONTACTS_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ std::string cid;\r
+ std::string name;\r
+ std::string phoneNumber;\r
+} PhoneMenuContactsItem;\r
+\r
+class PhoneMenuContactsItemView : public UIViewGroup {\r
+public:\r
+ PhoneMenuContactsItemView();\r
+ ~PhoneMenuContactsItemView() override;\r
+ virtual void SetItemInfo(const PhoneMenuContactsItem &itemInfo);\r
+ const char *GetContactsName() const;\r
+ const char *GetContactsCid() const;\r
+ const char *GetContactsPhoneNumber() const;\r
+\r
+private:\r
+ UIViewGroup bg_;\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ PhoneMenuContactsItem itemInfo_;\r
+};\r
+}\r
+#endif // PHONE_MENU_CONTACTS_ITEM_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuContactsPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_CONTACTS_PAGE_H\r
+#define PHONE_MENU_CONTACTS_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "PhoneMenuPresenter.h"\r
+#include "PhoneMenuContactsItemView.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuContactsPage : public SlicePage<PhoneMenuPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ PhoneMenuContactsPage();\r
+ ~PhoneMenuContactsPage() override;\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ UIScrollView* container_ = nullptr;\r
+ UISimpleList* contactsList_ = nullptr;\r
+ UIImageView* image_ = nullptr;\r
+ UILabel* contactsLabel_ = nullptr;\r
+};\r
+}\r
+#endif // PHONE_MENU_CONTACTS_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuDialPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_DIAL_PAGE_H\r
+#define PHONE_MENU_DIAL_PAGE_H\r
+\r
+#include <string>\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuDialPage : public SlicePage<PhoneMenuPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ PhoneMenuDialPage();\r
+ ~PhoneMenuDialPage() override;\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ UIScrollView* container_ = nullptr;\r
+ UILabel* dialNumberLabel_ = nullptr;\r
+ UILabelButton* key0Button_ = nullptr;\r
+ UILabelButton* key1Button_ = nullptr;\r
+ UILabelButton* key2Button_ = nullptr;\r
+ UILabelButton* key3Button_ = nullptr;\r
+ UILabelButton* key4Button_ = nullptr;\r
+ UILabelButton* key5Button_ = nullptr;\r
+ UILabelButton* key6Button_ = nullptr;\r
+ UILabelButton* key7Button_ = nullptr;\r
+ UILabelButton* key8Button_ = nullptr;\r
+ UILabelButton* key9Button_ = nullptr;\r
+ UILabelButton* deleteButton_ = nullptr;\r
+ UILabelButton* keyStarButton_ = nullptr;\r
+ UILabelButton* keyPoundButton_ = nullptr;\r
+ UILabelButton* diagButton_ = nullptr;\r
+ std::string dialNumber_;\r
+};\r
+}\r
+#endif // PHONE_MENU_DIAL_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuDisconnectPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_DISCONNECT_PAGE_H\r
+#define PHONE_MENU_DISCONNECT_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuDisconnectPage : public SlicePage<PhoneMenuPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ PhoneMenuDisconnectPage();\r
+ ~PhoneMenuDisconnectPage() override;\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ UIScrollView *container_{nullptr};\r
+ UIImageView *image_{nullptr};\r
+ UILabel *text_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuMainItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_MAIN_ITEM_VIEW_H\r
+#define PHONE_MENU_MAIN_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ int iconResId;\r
+ const char *label;\r
+ const char *viewId;\r
+} PhoneMenuItem;\r
+\r
+class PhoneMenuMainItemView : public UIViewGroup {\r
+public:\r
+ PhoneMenuMainItemView();\r
+ ~PhoneMenuMainItemView() override;\r
+ virtual void SetItemInfo(const PhoneMenuItem &itemInfo);\r
+\r
+private:\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ UIViewGroup bg_;\r
+};\r
+}\r
+#endif // PHONE_MENU_MAIN_ITEM_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuMainPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_MAIN_PAGE_H\r
+#define PHONE_MENU_MAIN_PAGE_H\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "PhoneMenuPresenter.h"\r
+#include "PhoneMenuMainItemView.h"\r
+\r
+namespace OHOS {\r
+constexpr uint8_t PHOEN_MENU_ITEM_NUM = 3;\r
+const char *PHONE_MENU_ITEM_CONTACTS_BOOKS = "phoneMenuItemContactsBooks";\r
+const char *PHONE_MENU_ITEM_RECENT_CALL = "phoneMenuItemRecentCall";\r
+const char *PHONE_MENU_ITEM_DIAL = "phoneMenuItemDial";\r
+\r
+class PhoneMenuMainPage : public SlicePage<PhoneMenuPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ PhoneMenuMainPage();\r
+ ~PhoneMenuMainPage() override;\r
+ void OnStart(void *data) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+\r
+private:\r
+ UIScrollView *container_ = nullptr;\r
+ UILabel *titleLabel_ = nullptr;\r
+ UISimpleList *phoneMenuList_ = nullptr;\r
+ PhoneMenuItem phoneMenu_[PHOEN_MENU_ITEM_NUM] = {\r
+ {IMAGE_PHONEMENU_CONTACTS_BOOKS, "通讯录", PHONE_MENU_ITEM_CONTACTS_BOOKS},\r
+ {IMAGE_PHONEMENU_RECENT_CALL, "最近通话", PHONE_MENU_ITEM_RECENT_CALL},\r
+ {IMAGE_PHONEMENU_DIAL, "拨号", PHONE_MENU_ITEM_DIAL},\r
+ };\r
+};\r
+} // namespace OHOS\r
+#endif // PHONE_MENU_MAIN_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuPresenter\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_PRESENTER_H\r
+#define PHONE_MENU_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class PhoneMenuView;\r
+class PhoneMenuPresenter : public Presenter<PhoneMenuView> {};\r
+}\r
+\r
+#endif // PHONE_MENU_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuSync\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_SYNC_H\r
+#define PHONE_MENU_SYNC_H\r
+#include <string>\r
+#include <fstream>\r
+#include <sstream>\r
+#include <list>\r
+#include <iostream>\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+\r
+enum CONTACT_DATA_ERROE {\r
+ OK = 0,\r
+ JSON_CREATE_FAIL = 1,\r
+ JSON_PARSE_FAIL = 2,\r
+ JSON_TYPE_FAIL = 3,\r
+ JSON_KEY_FAIL = 4,\r
+ JSON_TO_STRING_FAIL = 5,\r
+ JSON_FILE_OPEN_FAIL = 6,\r
+};\r
+\r
+typedef struct {\r
+ std::string cid_;\r
+ std::string name_;\r
+ std::string phone_;\r
+} Contacts;\r
+\r
+const std::string CONTACTS_FILE_PATH = APP_RES_PATH "/contactsInfo.json";\r
+class PhoneMenuSync {\r
+public:\r
+ static uint32_t WriteFileContact(const std::string &filePath, std::string &content);\r
+ static uint32_t ReadFileContact(const std::string &filePath);\r
+ static uint32_t ParseContactsMsg(std::string &msgContent);\r
+ static std::list<Contacts> &GetContacts();\r
+ static uint32_t PrintContacts();\r
+ static uint32_t LookContacts(std::string &contacts);\r
+ static uint32_t CleanFileContacts(const std::string &filePath);\r
+\r
+private:\r
+ static std::list<Contacts> list_;\r
+};\r
+}\r
+#endif // PHONE_MENU_SYNC_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_MENU_VIEW_H\r
+#define PHONE_MENU_VIEW_H\r
+#include "View.h"\r
+#include "PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+enum PhoneMenuPages : uint8_t {\r
+ PHONE_MENU_MAIN_PAGE = 1,\r
+ PHONE_MENU_CONTACTS_PAGE,\r
+ PHONE_MENU_DIAL_PAGE,\r
+ PHONE_MENU_DISCONNECT_PAGE,\r
+ PHONE_MENU_CALLER_LOG_PAGE,\r
+ PHONE_MENU_CALLING_PAGE,\r
+};\r
+\r
+class PhoneMenuView : public View<PhoneMenuPresenter> {};\r
+}\r
+#endif // PHONE_MENU_VIEW_H
\ No newline at end of file
/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: Player view
- * Author:
- * Create: 2021-07-26
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlayersModel
+ * Create: 2025-03-23
*/
#ifndef PLAYERS_MODEL_H
#include "main/UiServersMsg.h"
#include "player.h"
#include "source.h"
+#include "bts_br_gap.h"
+#include "bts_avrcp_controller.h"
+#include "bts_avrcp_target.h"
+#include "bts_a2dp_source.h"
#include "audio_manager.h"
#include "audio_base_type.h"
+#include "settings/model/SettingBluetoothModel.h"
#include "player/PlayersPresenter.h"
-#include "bts_avrcp_controller.h"
namespace OHOS {
using OHOS::Media::Player;
void ConncetBtResetButton();
void ClearActivateAudioInterrupt(void);
void GetDuration(int64_t &duration);
+
+ void SetViewStatus(bool viewStatus) { viewInitStatus_ = viewStatus; };
+ bool GetViewStatus(void) { return viewInitStatus_;};
private:
int64_t duration_{0};
bool isInterruptedPause_{false};
char *currentSongName{nullptr};
bool isStopAndReset{false};
bool isActivateAudioInterrupt{false};
+ bool viewInitStatus_;
};
}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersMusicItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_BUTTON_ITEM_VIEW_H\r
+#define DATE_BUTTON_ITEM_VIEW_H\r
+\r
+#include "UiConfig.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "main/LoadImg.h"\r
+\r
+namespace OHOS {\r
+class PlayersMusicItemView : public UIViewGroup {\r
+public:\r
+ explicit PlayersMusicItemView();\r
+ ~PlayersMusicItemView() override;\r
+ virtual void SetItemInfo(const PlayerCaseInfo itemInfo);\r
+ PlayerCaseInfo GetItem();\r
+\r
+private:\r
+ UILabelButton labelButton_;\r
+ PlayerCaseInfo itemInfo_ = {"", 0};\r
+};\r
+}\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersMusicListGroup\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef PLAYER_MUSIC_LIST_GROUP_H\r
+#define PLAYER_MUSIC_LIST_GROUP_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_radio_button.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_checkbox.h"\r
+\r
+namespace OHOS {\r
+class PlayersMusicListGroup : public UIViewGroup,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ PlayersMusicListGroup();\r
+ ~PlayersMusicListGroup() override;\r
+ static PlayersMusicListGroup *GetInstance(void);\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void RefreshMusicList();\r
+ void BtnOnListData(UIView& view);\r
+\r
+private:\r
+ UISimpleList *musicList_{nullptr};\r
+ char *sliceId_{nullptr};\r
+ int16_t index_{0};\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersOptionGroup\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#ifndef PLAYER_OPTION_GROUP_H\r
+#define PLAYER_OPTION_GROUP_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_radio_button.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_checkbox.h"\r
+\r
+namespace OHOS {\r
+class PlayersOptionGroup : public UIViewGroup,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ PlayersOptionGroup();\r
+ ~PlayersOptionGroup() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void InitButton();\r
+ void InitLabel();\r
+ void InitImage();\r
+\r
+private:\r
+ UILabel *watchLabel_{nullptr};\r
+ UILabel *phoneLabel_{nullptr};\r
+ UILabel *bluetoothLabel_{nullptr};\r
+ UIImageView *watchImage_{nullptr};\r
+ UIImageView *phoneImage_{nullptr};\r
+ UIImageView *bluetoothImage_{nullptr};\r
+ UIRadioButton *watchButton_{nullptr};\r
+ UIRadioButton *phoneButton_{nullptr};\r
+ UIButton *bluetoothButton_{nullptr};\r
+ UILabelButton *deleteButton{nullptr};\r
+};\r
+}\r
+#endif\r
/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: Player view
- * Author:
- * Create: 2021-07-26
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlayersPresenter
+ * Create: 2025-06-29
*/
#ifndef PLAYERS_PRESENTER_H
#include "player.h"
#include "audio_manager.h"
#include "audio_base_type.h"
-#include "player/BluetoothView.h"
#include "main/VolumeSettingView.h"
#include "main/VolumeSettingPresenter.h"
-#include "bluetooth/BluetoothModel.h"
-#include "bluetooth/BluetoothEarPhoneView.h"
-#include "bluetooth/BluetoothEarListView.h"
-#include "bluetooth/BluetoothOptionsView.h"
-#include "bluetooth/BluetoothReconnectView.h"
-#include "bluetooth/TipsSuccMessageView.h"
-#include "bluetooth/TipsConnFailMessageView.h"
-#include "bluetooth/TipsFailMessageView.h"
-#include "bluetooth/BluetoothDeviceListView.h"
-#include "bluetooth/BluetoothItemView.h"
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "settings/model/SettingBluetoothModel.h"
namespace OHOS {
using OHOS::Media::Player;
using Audio::AudioManager;
class VolumeSettingView;
#define DEC_NUM_256 256
-// 点击按钮视图ID
-#define BLUETOOTH_RESCAN_BUTTON "rescanButton"
-#define BLUETOOTH_NEWEQUIPMENT_BUTTON "newEquipmentButton"
-#define BLUETOOTH_CANCELCONNEDREQUEST_BUTTON "cancelConnedRequestButton"
-#define BLUETOOTH_UNPAIR_BUTTON "unpairButton"
-#define BLUETOOTH_OPTIONONE_BUTTON "optionsOneButton"
-#define BLUETOOTH_SETTING_BUTTON "settingButton"
-#define BLUETOOTH_DELETE_BUTTON "deleteButton"
-#define BLUETOOTH_SUCC_BACK_BUTTON "succBackButton"
-#define BLUETOOTH_FAIL_BACK_BUTTON "failBackButton" // 重试按钮
-#define BLUETOOTH_CONN_FAIL_BACK_BUTTON "connfailBackButton"
-// 视图滑动事件ID
-#define BLUETOOTH_EARLIST_VIEW "BluetoothEarListView"
-#define BLUETOOTH_DEVICE_LIST_VIEW "BluetoothDeviceListView"
-#define BLUETOOTH_EAR_PHONE_VIEW "BluetoothEarPhoneView"
-#define BLUETOOTH_OPTIONS_VIEW "BluetoothOptionsView"
-#define BLUETOOTH_RECONNECT_VIEW "BluetoothReconnectView"
-#define BLUETOOTH_VIEW "BluetoothView"
-#define TIPS_SUCC_MESSAGE_VIEW "TipsSuccMessageView"
-#define TIPS_FAIL_MESSAGE_VIEW "TipsFailMessageView"
-#define TIPS_CONN_FAIL_MESSAGE_VIEW "TipsConnFailMessageView"
-
-static constexpr uint8_t FONT_THIRTY_SIZE = 30; // 30:字体大小
-static constexpr uint8_t FONT_FORTY_SIZE = 40; // 40:字体大小
+static constexpr uint8_t FONT_THIRTY_SIZE = 30;
+static constexpr uint8_t FONT_FORTY_SIZE = 40;
struct PlayerCaseInfo {
char sliceId[DEC_NUM_256];
int16_t index;
};
-
class PlayersListGroup {
public:
PlayersListGroup() {}
int GetAllFiles(List<PlayerCaseInfo> *playersCaseList);
};
-// Button OnClick
-class ButtonOnClickListener : public UIView::OnClickListener {
-public:
- enum VolumeSetState : uint8_t {
- MUTE,
- LOW,
- MEDIUM,
- LOUD,
- };
- ButtonOnClickListener() {}
- ButtonOnClickListener(UIView *view) : view_(view) {}
- ~ButtonOnClickListener();
- static ButtonOnClickListener *GetInstance()
- {
- static ButtonOnClickListener instance;
- return &instance;
- }
- bool OnClick(UIView& view, const ClickEvent& event) override;
-private:
- UIView *view_{nullptr};
- void PlayerButtonOnClick();
- void SoundButtonOnClick();
- void PlayerModelButtonOnClick();
- void OptionsButtonOnClick();
- VolumeSettingView *volumeSettingView{nullptr};
-};
-
// 播放器回调
class PlayerCallbackImpl : public OHOS::Media::PlayerCallback {
public:
bool isInterruptedPause_{false};
};
-// 滑动手势
-class PlayerOnDragListener : public UIView::OnDragListener {
-public:
- PlayerOnDragListener();
- ~PlayerOnDragListener();
- bool OnDragEnd(UIView& view, const DragEvent& event) override;
- bool OnDrag(UIView& view, const DragEvent& event) override;
- static PlayerOnDragListener *GetInstance();
-private:
- void OnDragChangView(const DragEvent& event, int16_t hideView, int16_t showView, bool isStopScan);
- void OnDragChangBluetoothView(const DragEvent& event);
- void DropEarPhoneView(const DragEvent& event);
- void DropEarListView(const DragEvent& event);
- void CorrespondingJump(const DragEvent& event, int16_t hideView);
-};
-
-// Bluetooth View redirection
-class BluetoothEarListView;
-class BluetoothOptionsView;
-class BluetoothDeviceListView;
-class JumpView {
-public:
- enum BluetoothJumpViewNum : uint8_t {
- BLUETOOTHEARPHONEVIEW = 0, // 扫描
- BLUETOOTHEARLISTVIEW, // 扫描列表
- BLUETOOTHDEVICELISTVIEW, // 已配对设备列表
- BLUETOOTHEOPTIONSVIEW, // 选择界面
- BLUETOOTHRECONNECTVIEW,
- TIPSSUCCMESSAGEVIEW, // 连接成功
- TIPSCONNFAILMESSAGEVIEW, // 连接失败
- TIPSFAILMESSAGEVIEW,
- BLUETOOTHEVIEW, // 设置界面
- BLUETOOTHEJUMP_MAX,
- };
- JumpView();
- ~JumpView();
- static JumpView *GetInstance();
- void ChangeView(int16_t hideView, int16_t showView);
-private:
- bool ChangeTipsFailMessageView(int16_t hideView, int16_t thisView);
- bool ChangeTipsConnFailMessageView(int16_t hideView, int16_t thisView);
- bool ChangeTipsSuccMessageView(int16_t hideView, int16_t thisView);
- bool ChangeBluetoothEarPhoneView(int16_t hideView, int16_t thisView);
- bool ChangeBluetoothEarListView(int16_t hideView, int16_t thisView);
- bool ChangeBluetoothView(int16_t hideView, int16_t thisView);
- bool ChangeBluetoothOptionsView(int16_t hideView, int16_t thisView);
- bool ChangeBluetoothDeviceListView(int16_t hideView, int16_t thisView);
- bool ChangeBluetoothReconnectView(int16_t hideView, int16_t thisView);
- bool CheckViewParam(int16_t hideView, int16_t showView);
- void ResetEarListView(int16_t hideView);
- UIViewGroup *container[BLUETOOTHEJUMP_MAX]{nullptr}; // CONTAINER_NUM :蓝牙耳机连接的9个界面容器
- BluetoothEarPhoneView *bluetoothEarPhoneView{nullptr};
- BluetoothEarListView *bluetoothEarListView{nullptr};
- BluetoothView *bluetoothView{nullptr};
- BluetoothOptionsView *bluetoothOptionsView{nullptr};
- BluetoothDeviceListView *bluetoothDeviceListView{nullptr};
- BluetoothReconnectView *bluetoothReconnectView{nullptr};
- TipsSuccMessageView *tipsSuccMessageView{nullptr};
- TipsConnFailMessageView *tipsConnFailMessageView{nullptr};
- TipsFailMessageView *tipsFailMessageView{nullptr};
- typedef bool (JumpView::*PreprosssChangeView)(int16_t hideView, int16_t thisView);
- PreprosssChangeView preProcessView[BLUETOOTHEJUMP_MAX];
-};
-
class PlayersPresenter : public UIView::OnClickListener {
public:
PlayersPresenter();
~PlayersPresenter();
static PlayersPresenter *GetInstance();
- void OnClickRescanButton(void);
- void OnClickNewEquipmentButton(void);
- void OnClickCancelConnedRequestButton(void);
- void OnClickButtonUnpair(void);
- void OnClickButtonOptionOne(void);
- void OnClickSetting(void);
- void OnClickDelete(void);
- void OnClickSuccBack(void);
- void OnClickConnFailBack(void);
- void OnClickFailBack(void);
- void SetTitleSetText(const char *text);
- void SetPlaybackProgress(int64_t value);
- void SetPlayerState(bool value);
- void PlayerbackReset(void);
- void PlayerHeadsetReset(void);
- void ShowPlayerListGroup(void);
private:
- bool OnClick(UIView& view, const ClickEvent& event) override;
};
} // namespace OHOS
#endif
/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: Player view\r
- * Author:\r
- * Create: 2021-07-26\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersView\r
+ * Create: 2025-03-23\r
*/\r
\r
#ifndef PLAYERS_VIEW_H\r
#include "components/ui_abstract_scroll.h"\r
#include "components/ui_circle_progress.h"\r
#include "components/ui_checkbox.h"\r
-#include "components/ui_list.h"\r
+#include "components/ui_simple_list.h"\r
#include "font/ui_font_bitmap.h"\r
#include "font/ui_font.h"\r
#include "graphic_config.h"\r
#include "components/ui_card_page.h"\r
+#include "main/VolumeSettingView.h"\r
#include "player/PlayersPresenter.h"\r
+#include "player/PlayersOptionGroup.h"\r
+#include "player/PlayersMusicListGroup.h"\r
+#include "common/periodicupdate_interface.h"\r
\r
namespace OHOS {\r
#define PLAY_PROGRESS_MIN 0\r
#define PLAY_PROGRESS_MAX 100\r
-class JumpView;\r
class PlayersPresenter;\r
-class PlayersCaseListAdapter;\r
-class PlayersView : public UICardPage {\r
+class VolumeSettingView;\r
+class VolumeSliderEventListener;\r
+class PlayersView : public UICardPage, public PeriodicUpdateInterface,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
public:\r
PlayersView();\r
~PlayersView() override;\r
static PlayersView *GetInstance(void);\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDragEvent(const DragEvent& event) override;\r
bool InitView(void);\r
void PreLoad(void) override;\r
void UnLoad(void) override;\r
- bool OnDragEvent(const DragEvent& event) override;\r
-\r
- void SetUpLabel(const char *title, int16_t x, int16_t y);\r
- void ShowUpListView(void);\r
+ void OnInactive(void) override;\r
+ void InitButton();\r
+ void InitLabel();\r
+ void InitImage();\r
+ void InitCircleProgress();\r
+ void InitSoundAdjust();\r
+ void InitOption();\r
+ void InitListView(void);\r
+ void SetUpPlayerMode();\r
+ void PlayOrPauseButtonOnClick();\r
void TitleSetText(const char *text);\r
void PlayerModelButtonSetSrc(uint32_t playMode);\r
- int16_t GetVolumeRank(void);\r
- void SetVolumeRank(int16_t value);\r
- void SetVolumeAddOne(void);\r
- UILabelButton *GetBackButton(void);\r
- UIButton *GetPullButton(void);\r
- UIButton *GetOptionsButton(void);\r
- UIButton *GetPreButton(void);\r
- UIButton *GetNextButton(void);\r
- UILabel *GetTitleLabel(void);\r
- UICheckBox *GetPlayerButton(void);\r
- UIImageView *GetSoundButton(void);\r
- UIImageView *GetPlayerModelButton(void);\r
- UICircleProgress *GetPlaybackProgress(void);\r
+ void SetPlaybackProgress(int8_t value);\r
UICheckBox::UICheckBoxState GetPlayerButtonState(void);\r
+ void SetPlayerState(bool value);\r
void SetPlayerButtonState(UICheckBox::UICheckBoxState state);\r
- UIList *GetPlayerList(void);\r
- void SetPlayerListGroupStatus(bool status);\r
+ void PlayerHeadsetReset();\r
+\r
void SetPlayerCtrVolume(float leftVolume, float rightVolume);\r
- void CreateJumpView(void);\r
- void CreatePlayersPresenter(void);\r
- void CreatePlayerOnDragListener(void);\r
+ int16_t GetVolumeRank(void);\r
+ void SetVolumeRank(int16_t value);\r
+ void SetVolumeAddOne(void);\r
+ void Update(void) override;\r
+ uint32_t GetPeriod(void) override;\r
private:\r
- bool InitBackGround(void);\r
- void TearDownView();\r
- void CreatePlayerMusicName();\r
- int ShowUpCheckBoxButton();\r
- int ShowUpButton();\r
- int ShowUpButtonOptions();\r
- int ShowUpButtonView();\r
- int ShowUpCircleProgress();\r
- bool ShowUpPlayerMode();\r
- void SetUpButton(UIButton *btn, const Point& point, int16_t width, int16_t height,\r
- UIView::OnClickListener *listener);\r
- bool LoadPlayerImage(UIImageView *View, uint32_t resId);\r
- bool LoadPlayerImage(UIButton *button, uint32_t resId, uint32_t hlResId);\r
-\r
- UIImageView *backGround{nullptr};\r
- UILabel *subTitleLabel{nullptr};\r
- PlayersCaseListAdapter *adapterText{nullptr};\r
- UILabel *titleLabel{nullptr};\r
- UILabelButton *backButton{nullptr};\r
- UIButton *pullButton{nullptr};\r
- UIButton *optionsButton{nullptr};\r
- UIButton *preButton{nullptr};\r
- UIButton *nextButton{nullptr};\r
- UIViewGroup *listGroup{nullptr};\r
- UIImageView *soundButton{nullptr};\r
- UIImageView *playerModelButton{nullptr};\r
- UICheckBox *playerButton{nullptr};\r
- UICircleProgress *playbackProgress{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ UILabel *musicNameLabel_{nullptr};\r
+ UILabel *musicAuthorLabel_{nullptr};\r
+ UIImageView *optionsButton_{nullptr};\r
+ UIImageView *preButton_{nullptr};\r
+ UIImageView *nextButton_{nullptr};\r
+ UIImageView *soundButton_{nullptr};\r
+ UIImageView *playModelChangeButton_{nullptr};\r
+ UIImageView *pullButton_{nullptr};\r
+ UICheckBox *playerOrPauseButton_{nullptr};\r
+ UICircleProgress *playbackProgress_{nullptr};\r
+ VolumeSettingView *volumeSettingView_{nullptr};\r
+ VolumeSliderEventListener *volumeSliderEventListener_{nullptr};\r
+ PlayersMusicListGroup *playersMusicListGroup{nullptr};\r
+ PlayersOptionGroup *playerOptionGroup_{nullptr};\r
int16_t volumeSet{0};\r
- UIList *list{nullptr};\r
- JumpView *jumpView{nullptr};\r
- PlayersPresenter *playersPresenter{nullptr};\r
- PlayerOnDragListener *playerOnDragListener{nullptr};\r
uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;\r
- UIView::OnClickListener *playerlistener{nullptr};\r
- UIView::OnClickListener *soundlistener{nullptr};\r
- UIView::OnClickListener *nextlistener{nullptr};\r
- UIView::OnClickListener *prelistener{nullptr};\r
- UIView::OnClickListener *modellistener{nullptr};\r
- UIView::OnClickListener *optionslistener{nullptr};\r
bool viewiInitStatus{false};\r
+ int64_t playerCurrentTime_{0};\r
+ int64_t playerMusicDuration_{0};\r
+ int64_t playerProgressValue_{0};\r
};\r
} // namespace OHOS\r
#endif // MAIN_VIEW_H\r
--- /dev/null
+ /*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: FloatAccessView
+ * Author: Hisi Graphic Team
+ * Created: 2025-09
+ */
+
+#ifndef FLOAT_ACCESS_VIEW_H
+#define FLOAT_ACCESS_VIEW_H
+
+#include "components/ui_view_group.h"
+#include "components/ui_float_box_view.h"
+#include "applist/AppItemView.h"
+
+namespace OHOS {
+namespace {
+ constexpr uint16_t MAX_ITEM_SIZE = 3;
+}
+class FloatAnimatorCallback;
+class FloatAccessView : public UIViewGroup,
+ public UIFloatBoxView::OnItemClickListener,
+ public UIView::OnClickListener {
+public:
+ static FloatAccessView *GetInstance(void);
+ FloatAccessView(const FloatAccessView &) = delete;
+ FloatAccessView &operator=(const FloatAccessView &) = delete;
+ void AddItem(AppItem item, uint8_t index);
+ void DeleteItem(const char* label);
+ AppItem GetItem(uint8_t index);
+
+ void OnItemClick(const std::string& name) override;
+ bool OnClick(UIView& view, const ClickEvent& event) override;
+
+ void ShowView();
+ void ExitView();
+ void CleanView();
+ bool IsShowView();
+ void LoadAppItemsData();
+private:
+ FloatAccessView() {}
+ ~FloatAccessView() {}
+ uint8_t GetItemSize();
+ void SaveAppItemsData();
+ void AddAppItemsData();
+ void InitView();
+ void EnterApp();
+ bool isInitView_{false};
+ bool isShowView_{false};
+ bool isLoadData_{false};
+ bool isClickItem_{false}; // 标记点击了快捷应用
+ UIFloatBoxView* floatBoxView_ = nullptr;
+ AppItem items_[MAX_ITEM_SIZE] = {};
+ FloatAnimatorCallback* enterCallback_ = nullptr;
+};
+
+class FloatAnimatorCallback : public AnimatorCallback {
+public:
+ explicit FloatAnimatorCallback(UIView* view)
+ : startPos_(0), endPos_(0), startTime_(0), passTime_(0), isExit_(false),
+ animator_(new Animator(this, view, 300, false)) {} // 300 ms: 动画持续时间
+
+ ~FloatAnimatorCallback() override
+ {
+ if (animator_ != nullptr) {
+ delete animator_;
+ animator_ = nullptr;
+ }
+ }
+ void Callback(UIView* view) override;
+ void OnStop(UIView& view) override;
+ void DoEnter();
+ void DoExit();
+ uint8_t GetState()
+ {
+ return animator_->GetState();
+ }
+protected:
+ int16_t startPos_;
+ int16_t endPos_;
+ uint32_t startTime_;
+ uint32_t passTime_;
+ bool isExit_;
+ Animator* animator_;
+};
+} // namespace OHOS
+#endif // LOADING_FRAGMENT_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: LoadingFragment.h
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#ifndef LOADING_FRAGMENT_H
+#define LOADING_FRAGMENT_H
+
+#include "components/ui_fragment.h"
+#include "components/ui_label.h"
+
+namespace OHOS {
+
+class LoadingFragment : public UIFragment {
+public:
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+
+private:
+ UILabel* loadingLabel_ = nullptr;
+};
+} // namespace OHOS
+#endif // LOADING_FRAGMENT_H
\ No newline at end of file
namespace OHOS {
class RecentAppView;
-class RecentAppPresenter : public Presenter<RecentAppView>, public UIView::OnClickListener {
+class RecentAppPresenter : public Presenter<RecentAppView> {
public:
- RecentAppPresenter();
- ~RecentAppPresenter() override;
+ RecentAppPresenter() {}
+ ~RecentAppPresenter() override {}
void OnResume() override;
- bool OnClick(UIView &view, const ClickEvent &event) override;
};
}
#ifndef RECENT_APP_VIEW_H
#define RECENT_APP_VIEW_H
-#include <string>
-#include "recent_app/RecentAppPresenter.h"
#include "View.h"
+#include "RecentAppPresenter.h"
+#include "LoadingFragment.h"
#include "animator/animator.h"
-#include "components/ui_label.h"
-#include "components/ui_label_button.h"
-#include "components/ui_roller_view.h"
namespace OHOS {
-static constexpr const char* RECENT_APP_DELETE_BTN_ID = "RecentAppDeleteBtn";
-static std::string RECENT_ITEM_NATIVE_PREFIX = "NA_";
-static std::string RECENT_ITEM_JS_PREFIX = "JS_";
-static constexpr const uint8_t RECENT_ITEM_PREFIX_LEN = 3;
class RecentAppView : public View<RecentAppPresenter> {
public:
- RecentAppView();
+ RecentAppView() {}
~RecentAppView() override;
+
void OnStart() override;
- void LoadContent();
- UIRollerView* GetRollerView()
- {
- return roller_;
- }
+ void OnResume();
+
private:
class LoadingAnimCb : public AnimatorCallback {
public:
RecentAppView* recentAppView_;
};
- void AddRecentAppToRoller();
- void LoadRecentAppContent();
- void InitRecentApps();
- UIRollerView* roller_ = nullptr;
- Animator* loadingAnim_ = nullptr;
- UILabel* loadingLabel_ = nullptr;
- UILabel* noRecentAppLabel_ = nullptr;
- UILabelButton* delBtn_ = nullptr;
- LoadingAnimCb loadingAnimCb_;
+ void LoadContent();
bool viewiInitStatus_ = false;
+ LoadingAnimCb loadingAnimCb_;
+ Animator* loadingAnim_ = nullptr;
+ LoadingFragment *loadingFragment_ = nullptr;
+ UIFragment *rencentAppFragment_ = nullptr;
};
} // namespace OHOS
#endif // RECENT_APP_VIEW_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: RollerRecentAppFragment.h
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#ifndef ROLLER_RECENT_APP_FRAGMENT_H
+#define ROLLER_RECENT_APP_FRAGMENT_H
+
+#include <string>
+#include "animator/animator.h"
+#include "components/ui_fragment.h"
+#include "components/ui_label.h"
+#include "components/ui_label_button.h"
+#include "components/ui_roller_view.h"
+#include "gfx_utils/vector.h"
+
+namespace OHOS {
+static constexpr const char* RECENT_APP_DELETE_BTN_ID = "RecentAppDeleteBtn";
+static std::string RECENT_ITEM_NATIVE_PREFIX = "NA_";
+static std::string RECENT_ITEM_JS_PREFIX = "JS_";
+static constexpr const uint8_t RECENT_ITEM_PREFIX_LEN = 3;
+
+class RollerRecentAppFragment : public UIFragment, public UIView::OnClickListener {
+public:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+
+private:
+ void LoadRecentAppContent();
+ void InitRecentApps();
+ void AddRecentAppToRoller();
+
+ UILabel* noRecentAppLabel_ = nullptr;
+ UIRollerView* rollerContainer_ = nullptr;
+ UILabelButton* delBtn_ = nullptr;
+};
+} // namespace OHOS
+#endif // ROLLER_RECENT_APP_FRAGMENT_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: SlipFlowRecentAppFragment.h
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#ifndef SLIPFLOW_RECENT_APP_FRAGMENT_H
+#define SLIPFLOW_RECENT_APP_FRAGMENT_H
+
+#include <string>
+#include "animator/animator.h"
+#include "components/ui_fragment.h"
+#include "components/ui_label.h"
+#include "components/ui_label_button.h"
+#include "components/ui_slipflow_view.h"
+#include "gfx_utils/vector.h"
+
+namespace OHOS {
+static std::string RECENT_ITEM_NATIVE_PREFIX = "NA_";
+static std::string RECENT_ITEM_JS_PREFIX = "JS_";
+static constexpr const uint8_t RECENT_ITEM_PREFIX_LEN = 3;
+
+class SlipFlowRecentAppFragment : public UIFragment, public UIView::OnClickListener,
+ public UISlipflowView::OnSlipflowScrollListener {
+public:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ void OnScrollUpStart() override;
+ void OnScrollUpEnd() override;
+ bool OnRemove(UIView* view) override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+
+private:
+ void LoadRecentAppContent();
+ void InitRecentApps();
+ void AddRecentAppToSlipFlow();
+ void AddImageToSlipFlow(int index);
+
+ UILabel* noRecentAppLabel_ = nullptr;
+ UISlipflowView* slipFlowContainer_ = nullptr;
+ UILabel* slipUpNoticeLabel_ = nullptr;
+ Graphic::Vector<std::string> appNames_;
+ Graphic::Vector<ImageInfo*> appImgInfos_;
+};
+} // namespace OHOS
+#endif // SLIPFLOW_RECENT_APP_FRAGMENT_H
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SETTING_PRESENTER_H
-#define SETTING_PRESENTER_H
-
-#include "Presenter.h"
-
-namespace OHOS {
-class SettingView;
-class SettingPresenter : public Presenter<SettingView> {
-};
-}
-
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_PRESENTER_H\r
+#define SETTING_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class SettingView;\r
+class SettingPresenter : public Presenter<SettingView> {\r
+public:\r
+ virtual ~SettingPresenter();\r
+};\r
+}\r
#endif // SETTING_PRESENTER_H
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
- * Description: SettingPage.h
- * Author:
- * Create: 2025-04-14
- */
-
-#ifndef SETTING_VIEW_H
-#define SETTING_VIEW_H
-
-#include "View.h"
-namespace OHOS {
-enum SETTING_PAGES {
- SETTING_MAIN_PAGE = 1, // 0 is invalid
- SETTING_DESKTOP_PAGE = 2,
-};
-
-class SettingPresenter;
-class SettingView : public View<SettingPresenter> {
-};
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingView\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_VIEW_H\r
+#define SETTING_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class SettingPresenter;\r
+class SettingView : public View<SettingPresenter> {\r
+};\r
+}\r
#endif // SETTING_VIEW_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothItemGroup
+ * Created: 2025-06-05
+ */
+#ifndef SETTING_BLUETOOTH_ITEM_GROUP_H
+#define SETTING_BLUETOOTH_ITEM_GROUP_H
+
+#include "components/ui_label.h"
+#include "components/ui_view_group.h"
+#include "components/ui_image_view.h"
+#include "components/ui_canvas.h"
+#include "UiConfig.h"
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "settings/model/SettingBluetoothModel.h"
+
+namespace OHOS {
+
+class SettingBluetoothItemGroup : public UIViewGroup {
+public:
+ explicit SettingBluetoothItemGroup();
+ ~SettingBluetoothItemGroup() override;
+ void SetItemInfo(const BtCaseInfo* itemInfo);
+ void SetUpChild();
+ BtCaseInfo& GetItem();
+private:
+ UIImageView background_;
+ UIImageView icon_;
+ UIImageView conn_;
+ UILabel deviceName_;
+ unsigned char addr_[BD_ADDR_LEN];
+ UILabel connectStatus_;
+ uint32_t index_;
+ int16_t temp_;
+ BtCaseInfo itemInfo_ = {{}, {}, "", 0};
+};
+}
+
+#endif
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardAddItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_ADD_ITEM_GROUP_H\r
+#define SETTING_CARD_ADD_ITEM_GROUP_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_button.h"\r
+#include "UiConfig.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingCardMgrItemGroup.h"\r
+\r
+namespace OHOS {\r
+class SettingCardAddItemGroup : public ItemGroupImageCache,\r
+ public UIViewGroup {\r
+public:\r
+ explicit SettingCardAddItemGroup();\r
+ virtual ~SettingCardAddItemGroup();\r
+ void UpdateItemGroup(SettingCardItemData* itemData);\r
+private:\r
+ const char* imageSrc_ = nullptr;\r
+ ImageInfo* imageData_ = nullptr;\r
+ UIImageView image_;\r
+ UIButton button_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectItemGroup\r
+ * Create: 2025-04\r
+ */\r
+#ifndef SETTING_CARD_EFFECT_ITEM_GROUP_H\r
+#define SETTING_CARD_EFFECT_ITEM_GROUP_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_image_animator.h"\r
+#include "SettingCardEffectSample.h"\r
+\r
+namespace OHOS {\r
+class SettingCardEffectItemGroup : public UIViewGroup {\r
+public:\r
+ explicit SettingCardEffectItemGroup();\r
+ ~SettingCardEffectItemGroup() override;\r
+ virtual void SetItemInfo(const SettingCardEffectSample& leftItemInfo,\r
+ const SettingCardEffectSample& rightItemInfo);\r
+ virtual void SetUpChild();\r
+ CardEffectID GetViewId(const ClickEvent& event);\r
+ void SelectedChange();\r
+ void Reset();\r
+private:\r
+ void InitializeAnimator(UIImageAnimatorView& animator, int x, int y, int size);\r
+ void InitializeIcon(UIImageView& icon, int x, int y, int size);\r
+ void InitializeLabel(UILabel& label, int x, int y, int width, int height);\r
+ bool LoadMultiImages(SettingCardEffectSample& itemInfo, bool right);\r
+\r
+ UIImageAnimatorView leftAnimator_;\r
+ UILabel leftLabel_;\r
+ UIImageView leftSelectIcon_;\r
+ UIImageView leftPreviewIcon_;\r
+\r
+ UIImageAnimatorView rightAnimator_;\r
+ UILabel rightLabel_;\r
+ UIImageView rightSelectIcon_;\r
+ UIImageView rightPreviewIcon_;\r
+\r
+ SettingCardEffectSample leftItemInfo_;\r
+ SettingCardEffectSample rightItemInfo_;\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectResourceImage\r
+ * Create: 2025-04\r
+ */\r
+#ifndef SETTING_CARD_EFFECT_RESOURCE_IMAGE_H\r
+#define SETTING_CARD_EFFECT_RESOURCE_IMAGE_H\r
+#include <cstdint>\r
+#include <vector>\r
+#include "ui_resource_settings.h"\r
+\r
+namespace OHOS {\r
+ static std::vector<int> UI_3D_FOLD_RESIDS = {\r
+ IMAGE_TRAINSTION_START,\r
+ IMAGE_3D_FOLD_01,\r
+ IMAGE_3D_FOLD_02,\r
+ IMAGE_3D_FOLD_03,\r
+ IMAGE_3D_FOLD_04,\r
+ IMAGE_3D_FOLD_05,\r
+ IMAGE_3D_FOLD_06,\r
+ IMAGE_3D_FOLD_07,\r
+ IMAGE_3D_FOLD_08,\r
+ IMAGE_3D_FOLD_09,\r
+ IMAGE_3D_FOLD_10,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_3D_FOLD_10,\r
+ IMAGE_3D_FOLD_09,\r
+ IMAGE_3D_FOLD_08,\r
+ IMAGE_3D_FOLD_07,\r
+ IMAGE_3D_FOLD_06,\r
+ IMAGE_3D_FOLD_05,\r
+ IMAGE_3D_FOLD_04,\r
+ IMAGE_3D_FOLD_03,\r
+ IMAGE_3D_FOLD_02,\r
+ IMAGE_3D_FOLD_01,\r
+ IMAGE_TRAINSTION_START,\r
+ };\r
+\r
+ static std::vector<int> UI_CARD_FLIP_RESIDS = {\r
+ IMAGE_TRAINSTION_START,\r
+ IMAGE_CARD_FLIP_01,\r
+ IMAGE_CARD_FLIP_02,\r
+ IMAGE_CARD_FLIP_03,\r
+ IMAGE_CARD_FLIP_04,\r
+ IMAGE_CARD_FLIP_05,\r
+ IMAGE_CARD_FLIP_06,\r
+ IMAGE_CARD_FLIP_07,\r
+ IMAGE_CARD_FLIP_08,\r
+ IMAGE_CARD_FLIP_09,\r
+ IMAGE_CARD_FLIP_10,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_CARD_FLIP_10,\r
+ IMAGE_CARD_FLIP_09,\r
+ IMAGE_CARD_FLIP_08,\r
+ IMAGE_CARD_FLIP_07,\r
+ IMAGE_CARD_FLIP_06,\r
+ IMAGE_CARD_FLIP_05,\r
+ IMAGE_CARD_FLIP_04,\r
+ IMAGE_CARD_FLIP_03,\r
+ IMAGE_CARD_FLIP_02,\r
+ IMAGE_CARD_FLIP_01,\r
+ IMAGE_TRAINSTION_START,\r
+ };\r
+\r
+ static std::vector<int> UI_PUSH_PRESS_RESIDS = {\r
+ IMAGE_TRAINSTION_START,\r
+ IMAGE_PUSH_PRESS_01,\r
+ IMAGE_PUSH_PRESS_02,\r
+ IMAGE_PUSH_PRESS_03,\r
+ IMAGE_PUSH_PRESS_04,\r
+ IMAGE_PUSH_PRESS_05,\r
+ IMAGE_PUSH_PRESS_06,\r
+ IMAGE_PUSH_PRESS_07,\r
+ IMAGE_PUSH_PRESS_08,\r
+ IMAGE_PUSH_PRESS_09,\r
+ IMAGE_PUSH_PRESS_10,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_PUSH_PRESS_10,\r
+ IMAGE_PUSH_PRESS_09,\r
+ IMAGE_PUSH_PRESS_08,\r
+ IMAGE_PUSH_PRESS_07,\r
+ IMAGE_PUSH_PRESS_06,\r
+ IMAGE_PUSH_PRESS_05,\r
+ IMAGE_PUSH_PRESS_04,\r
+ IMAGE_PUSH_PRESS_03,\r
+ IMAGE_PUSH_PRESS_02,\r
+ IMAGE_PUSH_PRESS_01,\r
+ IMAGE_TRAINSTION_START,\r
+ };\r
+\r
+ static std::vector<int> UI_TURN_PAGE_RESIDS = {\r
+ IMAGE_TRAINSTION_START,\r
+ IMAGE_TURN_PAGE_01,\r
+ IMAGE_TURN_PAGE_02,\r
+ IMAGE_TURN_PAGE_03,\r
+ IMAGE_TURN_PAGE_04,\r
+ IMAGE_TURN_PAGE_05,\r
+ IMAGE_TURN_PAGE_06,\r
+ IMAGE_TURN_PAGE_07,\r
+ IMAGE_TURN_PAGE_08,\r
+ IMAGE_TURN_PAGE_09,\r
+ IMAGE_TURN_PAGE_10,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TURN_PAGE_10,\r
+ IMAGE_TURN_PAGE_09,\r
+ IMAGE_TURN_PAGE_08,\r
+ IMAGE_TURN_PAGE_07,\r
+ IMAGE_TURN_PAGE_06,\r
+ IMAGE_TURN_PAGE_05,\r
+ IMAGE_TURN_PAGE_04,\r
+ IMAGE_TURN_PAGE_03,\r
+ IMAGE_TURN_PAGE_02,\r
+ IMAGE_TURN_PAGE_01,\r
+ IMAGE_TRAINSTION_START,\r
+ };\r
+\r
+ static std::vector<int> UI_WINDMILL_RESIDS = {\r
+ IMAGE_TRAINSTION_START,\r
+ IMAGE_WINDMILL_01,\r
+ IMAGE_WINDMILL_02,\r
+ IMAGE_WINDMILL_03,\r
+ IMAGE_WINDMILL_04,\r
+ IMAGE_WINDMILL_05,\r
+ IMAGE_WINDMILL_06,\r
+ IMAGE_WINDMILL_07,\r
+ IMAGE_WINDMILL_08,\r
+ IMAGE_WINDMILL_09,\r
+ IMAGE_WINDMILL_10,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_WINDMILL_10,\r
+ IMAGE_WINDMILL_09,\r
+ IMAGE_WINDMILL_08,\r
+ IMAGE_WINDMILL_07,\r
+ IMAGE_WINDMILL_06,\r
+ IMAGE_WINDMILL_05,\r
+ IMAGE_WINDMILL_04,\r
+ IMAGE_WINDMILL_03,\r
+ IMAGE_WINDMILL_02,\r
+ IMAGE_WINDMILL_01,\r
+ IMAGE_TRAINSTION_START,\r
+ };\r
+\r
+ static std::vector<int> UI_ZOOM_RESIDS = {\r
+ IMAGE_TRAINSTION_START,\r
+ IMAGE_ZOOM_01,\r
+ IMAGE_ZOOM_02,\r
+ IMAGE_ZOOM_03,\r
+ IMAGE_ZOOM_04,\r
+ IMAGE_ZOOM_05,\r
+ IMAGE_ZOOM_06,\r
+ IMAGE_ZOOM_07,\r
+ IMAGE_ZOOM_08,\r
+ IMAGE_ZOOM_09,\r
+ IMAGE_ZOOM_10,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_TRAINSTION_END,\r
+ IMAGE_ZOOM_10,\r
+ IMAGE_ZOOM_09,\r
+ IMAGE_ZOOM_08,\r
+ IMAGE_ZOOM_07,\r
+ IMAGE_ZOOM_06,\r
+ IMAGE_ZOOM_05,\r
+ IMAGE_ZOOM_04,\r
+ IMAGE_ZOOM_03,\r
+ IMAGE_ZOOM_02,\r
+ IMAGE_ZOOM_01,\r
+ IMAGE_TRAINSTION_START,\r
+ };\r
+} // OHOS\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectSample\r
+ * Create: 2025-04\r
+ */\r
+#ifndef SETTING_CARD_EFFECT_SAMPLE_H\r
+#define SETTING_CARD_EFFECT_SAMPLE_H\r
+#include <cstdint>\r
+#include <vector>\r
+\r
+namespace OHOS {\r
+enum class CardEffectID {\r
+ UI_INVALIDE = -1,\r
+ UI_ZOOM = 0,\r
+ UI_CARD_FLIP = 1,\r
+ UI_CUBE = 2,\r
+ UI_TURN_PAGE = 3,\r
+ UI_PUSH_PRESS = 4,\r
+ UI_WINDMILL = 5,\r
+};\r
+\r
+struct SettingCardEffectSample {\r
+ CardEffectID viewId;\r
+ std::vector<int> resIds;\r
+ const char* label;\r
+ int backgroundImageId;\r
+ const char* resourceImage;\r
+ bool selected;\r
+\r
+ explicit SettingCardEffectSample(CardEffectID viewId = CardEffectID::UI_INVALIDE, std::vector<int> resIds = {},\r
+ const char* label = nullptr, const int backgroundImageId = 0, const char* resourceImage = nullptr,\r
+ bool selected = false)\r
+ : viewId(viewId),\r
+ resIds(std::move(resIds)),\r
+ label(label),\r
+ backgroundImageId(backgroundImageId),\r
+ resourceImage(resourceImage),\r
+ selected(selected)\r
+ {}\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardMgrItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_MGR_ITEM_GROUP_H\r
+#define SETTING_CARD_MGR_ITEM_GROUP_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+struct SettingCardItemData {\r
+ uint8_t index;\r
+ uint8_t id;\r
+ const char* image = nullptr;\r
+ bool isSelect;\r
+ void* contextPtr = nullptr;\r
+};\r
+\r
+class SettingCardMgrItemGroup : public UIViewGroup {\r
+public:\r
+ explicit SettingCardMgrItemGroup();\r
+ virtual ~SettingCardMgrItemGroup() override;\r
+ void UpdateItemGroup(SettingCardItemData* itemData);\r
+private:\r
+ const char* imageSrc_ = nullptr;\r
+ ImageInfo* imageData_ = nullptr;\r
+ UIImageView image_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCommon\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_COMMON_H\r
+#define SETTING_COMMON_H\r
+\r
+#include <cstdint>\r
+#include <vector>\r
+#include "gfx_utils/vector.h"\r
+#include "components/ui_view.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_settings.h"\r
+\r
+namespace OHOS {\r
+enum SettingPageId : uint16_t {\r
+ INVAILPAGE = 0, // 无效页面\r
+ MAIN_PAGE = 1, // 主页面\r
+ BLUETOOTH_PAGE = 2, // 蓝牙界面\r
+ DISPLAY_PAGE = 3, // 显示与亮度界面\r
+ DESKTOP_PAGE = 4, // 表盘与桌面界面\r
+ POWER_PAGE = 5, // 电池界面\r
+ CARD_PAGE = 6, // 卡片界面\r
+ SYSTEM_PAGE = 7, // 系统与升级界面\r
+ ABOUT_PAGE = 8, // 关于界面\r
+ DISPLAY_BRIGHTNESS_PAGE = 9, // 显示与亮度 调节亮度界面\r
+ DISPLAY_SCREEN_OFF_PAGE = 10, // 显示与亮度 熄屏时间界面\r
+ DISPLAY_STEADY_ON_PAGE = 11, // 显示与亮度 长亮时刻界面\r
+ DESKTOP_HOME_PAGE = 12, // 表盘与桌面 桌面界面\r
+ DESKTOP_DIAL_PAGE = 13, // 表盘与桌面 表盘界面\r
+ DESKTOP_DIAL_STYLE_PAGE = 14, // 表盘与桌面 表盘风格界面\r
+ CARD_EFFECT_PAGE = 15, // 卡片管理 卡片动效页面\r
+ CARD_MGR_PAGE = 16, // 卡片管理 卡片管理页面\r
+ CARD_ADD_PAGE = 17, // 卡片管理 卡片添加页面\r
+ SYSTEM_OPERATION_PAGE = 18, // 系统与升级 关机、重启、恢复出厂设置界面\r
+ SYSTEM_OTA_PAGE = 19, // 系统与升级 OTA界面\r
+ CONNECT_NEW_PHONE_PAGE = 20, // 蓝牙 连接新手机界面\r
+ CONNECT_OPEN_PAGE = 21, // 蓝牙 连接新手机连接已打开界面\r
+ CONNECT_BLUE_SUCCESS_PAGE = 22, // 蓝牙 连接耳机蓝牙成功界面\r
+ CONNECT_BLUE_FAIL_PAGE = 23, // 蓝牙 连接耳机蓝牙失败界面\r
+ RECONNECTION_PAGE = 24, // 蓝牙 重连耳机和取消配对界面\r
+ RECONNECT_SECOND_CONFIRM_PAGE = 25, // 蓝牙 重连耳机二次确认界面\r
+ UNPAIR_SECOND_CONFIRM_PAGE = 26, // 蓝牙 取消配对耳机二次确认界面\r
+ QRCODE_CONN_PAGE = 27, // 蓝牙 二维码连接\r
+};\r
+\r
+#define SETTING_LIST_DEFAULT_BG_COLOR Color::GetColorFromRGB(32, 32, 32) // 0xFF202020\r
+#define SETTING_LIST_BLUETOOTH_BG_COLOR Color::GetColorFromRGB(2, 142, 247) // 0xFF028EF7\r
+#define SETTING_LIST_DISPLAY_BG_COLOR Color::GetColorFromRGB(253, 200, 42) // 0xFFFDC82A\r
+#define SETTING_LIST_DESKTOP_BG_COLOR Color::GetColorFromRGB(98, 87, 251) // 0xFF6257FB\r
+#define SETTING_LIST_POWER_BG_COLOR Color::GetColorFromRGB(102, 192, 94) // 0xFF66C05\r
+#define SETTING_LIST_CARD_BG_COLOR Color::GetColorFromRGB(255, 128, 102) // 0xFFFF8066\r
+#define SETTING_LIST_SYSTEM_BG_COLOR Color::GetColorFromRGB(0, 210, 185) // 0xFF00D2B9\r
+#define SETTING_LIST_ABOUT_BG_COLOR Color::GetColorFromRGB(255, 255, 255) // 0xFFFFFFFF\r
+\r
+#define SETTING_LIST_DEFAULT_BG_COLOR_OPA 255 // 100%\r
+#define SETTING_LIST_BLUETOOTH_BG_COLOR_OPA 63 // 24.61\r
+#define SETTING_LIST_DISPLAY_BG_COLOR_OPA 63 // 24.85%\r
+#define SETTING_LIST_DESKTOP_BG_COLOR_OPA 65 // 25.42%\r
+#define SETTING_LIST_POWER_BG_COLOR_OPA 65 // 25.33%\r
+#define SETTING_LIST_CARD_BG_COLOR_OPA 64 // 25.24%\r
+#define SETTING_LIST_SYSTEM_BG_COLOR_OPA 63 // 24.66%\r
+#define SETTING_LIST_ABOUT_BG_COLOR_OPA 38 // 14.85%\r
+\r
+// 记录ItemGroup类中所有加载过的图片, 确保所有图片资源释放\r
+class ItemGroupImageCache {\r
+public:\r
+ inline virtual ~ItemGroupImageCache()\r
+ {\r
+ for (auto imageId: imageIdList) {\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(imageId, SETTING_IMAGE);\r
+ }\r
+ }\r
+\r
+ inline ImageInfo* CacheImage(uint32_t imageId)\r
+ {\r
+ imageIdList.push_back(imageId);\r
+ return ImageCacheManager::GetInstance().LoadOneInMultiRes(imageId, SETTING_IMAGE);\r
+ }\r
+private:\r
+ std::vector<uint32_t> imageIdList;\r
+};\r
+\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopHomeItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_HOME_ITEM_GROUP_H\r
+#define SETTING_DESKTOP_HOME_ITEM_GROUP_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_radio_button.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+struct SettingDesktopHomeItemData {\r
+ uint8_t style; // 风格\r
+ uint32_t selectIcon; // 选中图标\r
+ uint32_t unSelectIcon; // 未选中图标\r
+ const char* label; // 文本内容\r
+ bool isSelect; // 是否选中\r
+ void* contextPtr; // 上下文指针,内部使用\r
+};\r
+\r
+class SettingDesktopHomeItemGroup : public ItemGroupImageCache,\r
+ public UIViewGroup {\r
+public:\r
+ explicit SettingDesktopHomeItemGroup();\r
+ ~SettingDesktopHomeItemGroup() override;\r
+ void UpdateItemGroup(SettingDesktopHomeItemData* itemData);\r
+private:\r
+ UIImageView image_;\r
+ UILabel label_;\r
+ UIRadioButton button_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingRefSingleton\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_REF_SINGLETON_H\r
+#define SETTING_REF_SINGLETON_H\r
+\r
+namespace OHOS {\r
+template<typename T>\r
+class SettingRefSingleton {\r
+public:\r
+ static T& GetInstance()\r
+ {\r
+ static T instance;\r
+ return instance;\r
+ }\r
+protected:\r
+ SettingRefSingleton() = default;\r
+ virtual ~SettingRefSingleton() = default;\r
+ SettingRefSingleton(const SettingRefSingleton&) = delete;\r
+ SettingRefSingleton& operator=(const SettingRefSingleton&) = delete;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingToggleButton\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_TOGGLE_BUTTON_H\r
+#define SETTING_TOGGLE_BUTTON_H\r
+\r
+#include "components/ui_toggle_button.h"\r
+\r
+namespace OHOS {\r
+/*\r
+ * UIToggleButton的宽高比绑定, SettingToggleButton通过重写UIToggleButton的方法提供松散的宽高比\r
+ */\r
+class SettingToggleButton : public UIToggleButton {\r
+public:\r
+ SettingToggleButton();\r
+ virtual ~SettingToggleButton() = default;\r
+ void SetTrackPadding(int16_t padding);\r
+ void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;\r
+protected:\r
+ void CalculateSize() override;\r
+#if DEFAULT_ANIMATION\r
+ void Callback(UIView* view) override;\r
+ void OnStop(UIView& view) override;\r
+#endif\r
+private:\r
+ uint16_t trackCorner_ = 0; // 轨道圆角半径\r
+ int16_t trackPadding_ = 0; // 轨道内边距\r
+ uint16_t thumbRadius_ = 0; // 滑块半径\r
+ Point leftCenter_ = {0, 0};\r
+ Point rightCenter_ = {0, 0};\r
+ Point currentCenter_ = {0, 0};\r
+ ColorType bgColor_ = Color::White();\r
+ Rect rectMid_ = {0, 0, 0, 0};\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingUnionItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_UNION_ITEM_GROUP_H\r
+#define SETTING_UNION_ITEM_GROUP_H\r
+\r
+#include <vector>\r
+#include <unordered_map>\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingToggleButton.h"\r
+\r
+namespace OHOS {\r
+enum SettingUnionItemType : uint16_t {\r
+ PLAIN_TEXT, // 纯文本类型的item\r
+ ICON_TEXT_TOGGLE, // 按钮切换类型item\r
+ ICON_TEXT_NAVIGATION, // 页面切换类型item\r
+};\r
+\r
+struct PlainTextItemData {\r
+ const char* textContent; // 文本内容\r
+};\r
+\r
+struct IconTextToggleItemData {\r
+ uint32_t icon; // 图标\r
+ const char* textContent; // 文本内容\r
+ bool selected; // 是否选择\r
+ ColorType bgColor; // item背景色\r
+ uint8_t bgOpa; // item背景透明度\r
+};\r
+\r
+struct IconTextNavigationItemData {\r
+ SettingPageId pageId; // 页面ID\r
+ uint32_t icon; // 图标\r
+ const char* textContent; // 固定文本内容\r
+ const char* dataContent; // 动态数据内容\r
+ bool hasSecondMenu; // 是否有二级页面\r
+ ColorType bgColor; // item背景色\r
+ uint8_t bgOpa; // item背景透明度\r
+};\r
+\r
+class SettingUnionItemData {\r
+public:\r
+ SettingUnionItemType GetUnionItemType();\r
+ void* GetUnionItemData();\r
+ \r
+ // 新增加到union的data类型请在这里注册\r
+ SettingUnionItemData(const PlainTextItemData& itemData);\r
+ SettingUnionItemData(const IconTextToggleItemData& itemData);\r
+ SettingUnionItemData(const IconTextNavigationItemData& itemData);\r
+\r
+ // 新增加到union的data类型请在这里注册\r
+ union {\r
+ PlainTextItemData plainTextItemData;\r
+ IconTextToggleItemData iconTextToggleItemData;\r
+ IconTextNavigationItemData iconTextNavigationItemData;\r
+ } unionItemData_;\r
+private:\r
+ SettingUnionItemType type_;\r
+ void* contextPtr_ = nullptr; // 用于SimpleList的Create和Update静态函数中使用\r
+};\r
+\r
+class PlainTextItemView : public UIViewGroup, public ItemGroupImageCache {\r
+public:\r
+ explicit PlainTextItemView();\r
+ ~PlainTextItemView() override;\r
+ void UpdateViewData(PlainTextItemData* data);\r
+private:\r
+ UILabel label_;\r
+};\r
+\r
+class IconTextToggleItemView : public UIViewGroup, public ItemGroupImageCache {\r
+public:\r
+ explicit IconTextToggleItemView();\r
+ ~IconTextToggleItemView() override;\r
+ void UpdateViewData(IconTextToggleItemData* data);\r
+private:\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ SettingToggleButton toggleButton_;\r
+};\r
+\r
+class IconTextNavigationItemView : public UIViewGroup, public ItemGroupImageCache {\r
+public:\r
+ explicit IconTextNavigationItemView();\r
+ ~IconTextNavigationItemView() override;\r
+ void UpdateViewData(IconTextNavigationItemData* data);\r
+private:\r
+ UIImageView icon_;\r
+ UILabel textLabel_;\r
+ UILabel dataLabel_;\r
+ UIImageView nextImage_;\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingAboutModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_ABOUT_MODEL_H\r
+#define SETTING_ABOUT_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <string>\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+class SettingAboutModel : public SettingRefSingleton<SettingAboutModel> {\r
+public:\r
+ std::string GetSystemName();\r
+ std::string GetSystemType();\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothHeadsetEvent.
+ */
+#ifndef SETTING_BLUETOOTH_HEADSET_EVENT_H
+#define SETTING_BLUETOOTH_HEADSET_EVENT_H
+
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "td_type.h"
+#include "bt_audio.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+ SETTING_AVRCP_SRV_PRESS_VALUE,
+ SETTING_AVRCP_SRV_RELEASED_VALUE,
+ SETTING_AVRCP_SRV_INIT_VALUE
+};
+
+typedef struct {
+ td_pvoid stream_hdl;
+ uint8_t loc_volume;
+ uint8_t play_stat;
+ uint8_t dir_forward;
+ uint8_t avrcp_button_flag;
+ bd_addr_t bd_addr;
+ uint8_t reg_cap_auto;
+ uint8_t resrv;
+ profile_connect_state_t avrcp_srv_conn_stat;
+} SettingBtAvrcpTgInf;
+
+void SettingUsingPressButtonStatusCallback(td_u32 keyOperation, td_u32 keyValue);
+void SettingMediaStatusCallback(bt_avrcp_tg_evt_status_param *eventStatusParam);
+void SettingPressButtonStatusCallback(td_u32 keyOperation, td_u32 keyValue);
+void SettingConnCtStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state);
+void SettingConnectTgStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state);
+void SettingInitBtHeadsetEvent(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // SETTING_BLUETOOTH_HEADSET_EVENT_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBuletoothModel
+ * Create: 2025-06-01
+ */
+#ifndef SETTING_BLUETOOTH_MODEL_H
+#define SETTING_BLUETOOTH_MODEL_H
+
+#include <string>
+#include <cstring>
+#include <list>
+#include <cstdio>
+#include "gfx_utils/list.h"
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "settings/common/SettingUnionItemGroup.h"
+#include "settings/common/SettingRefSingleton.h"
+
+namespace OHOS {
+typedef struct {
+ unsigned char deviceName[BD_NAME_LEN]; /* Name of the device record, must be in UTF-8 */
+ unsigned char addr[BD_ADDR_LEN];
+ std::string connect_status;
+ int16_t rssi; // 蓝牙信号强弱
+} BtCaseInfo;
+
+typedef enum {
+ BT_MAIN_PAGE = 0,
+ RECONNECT_FRAGMENT,
+ RECONNECT_SECOND_CONFIRM_FRAGMENT,
+ UNPAIR_CONFIRM_FRAGMENT,
+ CONNECT_NEW_PHONE_FRAGMENT,
+ CONNECT_OPEN_FRAGMENT,
+ CONNECT_BLUETOOTH_SUCCESS_FRAGMENT,
+ CONNECT_BLUETOOTH_FAIL_FRAGMENT,
+} BtGroupId;
+
+class SettingBluetoothModel {
+public:
+ ~SettingBluetoothModel(){};
+ static SettingBluetoothModel *GetInstance(void);
+ void Init();
+ std::list<BtCaseInfo>& GetScansDevicesList(); // 获取扫描到的设备列表
+ void ScansDevicesListAddCase(BtCaseInfo caseInfo); // 设备列表新增数据
+ void SetScansCaseRssi(const bd_addr_t *bdAddr, int rssi); // 设置设备的信号值
+ void SortScansCaseRssi(); // 根据信号值对设备列表进行排序
+ void ClearScansDevicesList();
+ bool CheckExistScanList(BtCaseInfo caseInfo); // 去重检查
+ void ResetScanDevicesCase(const BtCaseInfo& caseInfo); // 刷新名称变化的设备信息
+ // 已配对蓝牙设备
+ void SetPairedDevicesListClear();
+ void AddPairedDevicesCase(BtCaseInfo caseInfo);
+ bool CheckExistPairedList(BtCaseInfo caseInfo);
+ List<BtCaseInfo>& GetPairedDevicesCase();
+ // 被选中的设备信息
+ void SetSelectedDeviceInfo(BtCaseInfo *caseInfo);
+ BtCaseInfo *GetSelectedDeviceInfo(void);
+ // 最后连接的设备地址
+ void SetLastConnedAddr(const bd_addr_t *addr);
+ bd_addr_t *GetLastConnedAddr(void);
+ void SetAclConnected(bool tag);
+ bool GetAclConnected(void);
+ void UpdateAclConnectStatus(bool status);
+ void SettingBtGapDiscoveryResultCallbakHandle(const bd_addr_t &bdAddr);
+ void SettingBtGapAclStateChangedHandle(gap_acl_state_t state, unsigned int reason, const bd_addr_t &bdAddr);
+ bool GetAdvStartState(void);
+ void SetAdvStartState(bool state);
+ int ConnectRemoteDevice(const bd_addr_t *addr);
+ bool ConnectRemoteCheck(const bd_addr_t *addr);
+ char* GetWatchName(void);
+ void ChangeBleConnectToMax();
+ void ChangeBleConnectToDefault();
+ // 耳机蓝牙连接状态
+ void SetBlueToothConnectStatus(bool status);
+ bool GetBlueToothConnectStatus();
+ void SetDeviceName(std::string deviceName_);
+ std::string GetDeviceName();
+ void SetEarPhoneListHasData(bool status);
+ uint32_t GetEarPhoneListHasData();
+ void MoveMatchingDeviceToFront();
+ // 更新UI上设备列表的信息
+ void UpdateConnectStatusForDevice();
+ void UpdateDisconnectStatusForDevice(const bd_addr_t &bdAddr);
+ void UpdateConnectedStatusForDevice(const bd_addr_t &bdAddr);
+ // 设置是否展示成功或失败的页面
+ void SetConnectResultPage(bool redirct);
+ bool GetConnectResultPage();
+ // 取消配对
+ void HandleUnpairRequest(void);
+ void AddNodeFromPairListToScanList(const bd_addr_t &bdAddr);
+ void SetConnectFragmentStatus(bool status);
+ bool GetConnectFragmentStatus();
+private:
+ SettingBluetoothModel();
+ void SetUpPairedDevicesList();
+ void InitBluetoothInfo(void);
+ bool aclConnected_{false};
+ BtCaseInfo selectedDeviceInfo_{};
+ bd_addr_t lastConnedAddr_{0};
+ bd_addr_t remoteConnectAddr_{0};
+ std::list<BtCaseInfo> btScansDevicesList_{};
+ List<BtCaseInfo> *btPairedDevicesList_{nullptr};
+ bool advStartState_{false};
+ char watchName_[BD_NAME_LEN] = { 0 };
+ bool btConnectStatus_{false};
+ std::string deviceName_;
+ uint32_t EarPhoneListHasData_ = 0;
+ bool redirct_ = false;
+ bool connectFragmentStatus_ = false;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void SettingBtGapReadRemoteRssiEventCallback(const bd_addr_t *bdAddr, int rssi, int status);
+void SettingBtGapDiscoveryStateChangedCallback(int status);
+void SettingBtGapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason);
+void SettingBtRemoteNameChangedCallback(const bd_addr_t *bdAddr, const unsigned char *deviceName, unsigned char length);
+void SettingBtIsAcceptConnOnSafeModeCallback(const bd_addr_t *bd_addr, bool *res);
+void SettingBtInitCallBacks(void);
+void SettingBtInitCallBacksEx(void);
+void SettingBtInitGatts(void);
+void SettingBtInitSpp(void);
+void BleSettingAdvStart(void);
+#ifdef __cplusplus
+}
+#endif
+}
+
+#endif
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_MODEL_H\r
+#define SETTING_CARD_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include "settings/common/SettingCardEffectSample.h"\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingCardAddItemGroup.h"\r
+#include "settings/common/SettingCardMgrItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+class SettingCardModel : public SettingRefSingleton<SettingCardModel> {\r
+public:\r
+ SettingCardModel();\r
+ std::vector<SettingUnionItemData>& GetCardUnionData();\r
+ std::vector<SettingCardItemData>& GetCardData();\r
+ void RefreshCardData();\r
+ void AddCard(uint8_t cardId);\r
+ void DeleteCard(uint8_t cardId);\r
+ void SetSelectedCard(uint8_t cardId);\r
+ uint8_t GetSelectedCard(void);\r
+ // 卡片动效\r
+ CardEffectID GetSwipeEffectStyle(void);\r
+ void SetSwipeEffectStyle(CardEffectID style);\r
+ void InitEffectItem(void);\r
+ std::map<CardEffectID, SettingCardEffectSample>& GetEffectListItems(void);\r
+private:\r
+ std::vector<SettingUnionItemData> cardUnionData_;\r
+ std::vector<SettingCardItemData> cardData_;\r
+ uint8_t selectedCardId_ = MAX_CARD;\r
+ std::map<CardEffectID, SettingCardEffectSample> effects_;\r
+ CardEffectID selectStyle_;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_MODEL_H\r
+#define SETTING_DESKTOP_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <string>\r
+#include "gfx_utils/image_info.h"\r
+#include "main/MainModel.h"\r
+#include "settings/common/SettingDesktopHomeItemGroup.h"\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+typedef enum {\r
+ APPLIST_STYLE,\r
+ HEXAGONS_STYLE,\r
+ FOOTBALL_STYLE,\r
+ WATERFALL_STYLE,\r
+ PLANET_STYLE,\r
+ SPHERE_STYLE\r
+} DesktopStyle;\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t dialFlag; /* 1:离线表盘 0:预制表盘 */\r
+ uint8_t id; /* 仅预制表盘使用 */\r
+ uint32_t resId; /* 仅离线表盘使用 */\r
+ std::string dialFullName; /* 仅离线表盘使用 */\r
+ std::string imageFullName; /* 仅预制表盘使用 */\r
+ std::string dialName;\r
+ std::string description; /* 仅离线表盘使用 */\r
+ ImageInfo* preImageInfo;\r
+ uint8_t capability;\r
+} SetDialInfo;\r
+\r
+enum class DialStyle {\r
+ COVERFLOW = 0,\r
+ ROLLER,\r
+ STYLE_NUM\r
+};\r
+\r
+class SettingDesktopModel : public SettingRefSingleton<SettingDesktopModel> {\r
+public:\r
+ SettingDesktopModel();\r
+ std::vector<SettingUnionItemData>& GetDesktopUnionData();\r
+ std::vector<SettingDesktopHomeItemData>& GetDesktopHomeData();\r
+ std::vector<SettingUnionItemData>& GetDialStyleUnionData();\r
+ void RefreshDialStyleUnionDataForStyle();\r
+ void RefreshDialStyleUnionDataForAod();\r
+ // 桌面\r
+ DesktopStyle GetDesktopStyle(void);\r
+ void SetDesktopStyle(DesktopStyle style);\r
+ uint8_t GetDesktopHomeDataSelect();\r
+ void SetDesktopHomeDataSelect(DesktopStyle style);\r
+ // 表盘风格\r
+ DialStyle GetDialStyle();\r
+ void SetDialStyle(DialStyle style);\r
+ void SetDialStyleDataSelect(const char* DialStyleName);\r
+ // 表盘\r
+ void LoadAllDial(void);\r
+ std::vector<SetDialInfo>& GetDialInfo(void); // 表盘信息\r
+ std::vector<SetDialInfo>& GetAmbientDialInfo(void); // 息屏显示表盘信息 AOD(always-on display)\r
+ void SaveDialSetting(uint8_t pageIndex);\r
+ void SetSpecifyDialSetting(const DialSetting &setting); // 设置指定的dial\r
+ void ClearDialInfo(void);\r
+ uint8_t GetPageIndex(void);\r
+protected:\r
+ void LoadAllDialFromRam();\r
+ void LoadAllDialFromFs();\r
+ int32_t ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo);\r
+private:\r
+ std::vector<SettingUnionItemData> desktopUnionData_;\r
+ std::vector<SettingDesktopHomeItemData> desktopHomeData_;\r
+ std::vector<SettingUnionItemData> dialStyleUnionData_;\r
+ std::vector<SetDialInfo> dialInfos_;\r
+ std::vector<SetDialInfo> aodDialInfos_;\r
+ bool hasSpecificDial_ = false;\r
+ DialSetting specificDialSetting_;\r
+};\r
+}\r
+\r
+#endif // SET_DESKTOP_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_MODEL_H\r
+#define SETTING_DISPLAY_MODEL_H\r
+\r
+#include <cstdint>\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+// 息屏时间 (单位:ms)\r
+enum class ScreenOffTime : uint32_t {\r
+ SECONDS_5 = 5000u,\r
+ SECONDS_10 = 10000u,\r
+ SECONDS_15 = 15000u,\r
+ SECONDS_30 = 30000u,\r
+ MINUTE_1 = 60000u,\r
+ MINUTE_5 = 300000u,\r
+};\r
+\r
+// 常亮时间 (单位:ms)\r
+enum class SteadyOnTime : uint32_t {\r
+ MINUTE_5 = 300000u,\r
+ MINUTE_10 = 600000u,\r
+ MINUTE_20 = 1200000u,\r
+ MINUTE_30 = 1800000u,\r
+ HOUR_1 = 3600000u,\r
+ HOUR_2 = 7200000u,\r
+};\r
+\r
+class SettingDisplayModel : public SettingRefSingleton<SettingDisplayModel> {\r
+public:\r
+ SettingDisplayModel();\r
+ std::vector<SettingUnionItemData>& GetDisplayUnionData();\r
+ void RefreshDisplayUnionDataForAutoAdjustBrightness();\r
+ void RefreshDisPlayUnionDataForScreenOffDataContext();\r
+ void RefreshDisplayUnionDataForSteadyOnDataContext();\r
+ void InitDisplayModel();\r
+ void EnableSteadyOn(); // 打开常亮\r
+ void DisableSteadyOn(); // 关闭常亮\r
+ bool GetAutoAdjustBrightness();\r
+ uint8_t GetBrightness();\r
+ ScreenOffTime GetScreenOffTime();\r
+ SteadyOnTime GetSteadyOnTime();\r
+ void SetAutoAdjustBrightness(bool isAuto);\r
+ void SetBrightness(uint8_t brightness);\r
+ void SetScreenOffTime(ScreenOffTime blinkFrequency);\r
+ void SetSteadyOnTime(SteadyOnTime blinkFrequency);\r
+ const char** GetScreenOffTimeAllStr();\r
+ const char** GetSteadyOnTimeAllStr();\r
+ uint8_t GetScreenOffTimeAllStrSize();\r
+ uint8_t GetSteadyOnTimeAllStrSize();\r
+ uint8_t GetScreenOffTimeIndex();\r
+ uint8_t GetSteadyOnTimeIndex();\r
+ void SetScreenOffTimeIndex(uint8_t index);\r
+ void SetSteadyOnTimeIndex(uint8_t index);\r
+protected:\r
+ const char* GetScreenOffTimeShortStr(ScreenOffTime screenOffTime);\r
+ const char* GetSteadyOnTimeShortStr(SteadyOnTime steadyOnTime);\r
+ uint8_t TransBriValueToPercent(uint8_t value);\r
+ uint8_t TransBriPercentToValue(uint8_t percent);\r
+private:\r
+ std::vector<SettingUnionItemData> displayUnionData_;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingMainModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_MAIN_MODEL_H\r
+#define SETTING_MAIN_MODEL_H\r
+\r
+#include <cstdint>\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+class SettingMainModel : public SettingRefSingleton<SettingMainModel> {\r
+public:\r
+ SettingMainModel();\r
+ void InitSettingsData();\r
+ std::vector<SettingUnionItemData>& GetMainUnionData();\r
+ static UIView* OnSimpleListCreate(uint8_t type);\r
+private:\r
+ std::vector<SettingUnionItemData> mainUnionData_;\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPowerModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_POWER_MODEL_H\r
+#define SETTING_POWER_MODEL_H\r
+\r
+#include <cstdint>\r
+#if !defined(_WIN32)\r
+#include "adc.h"\r
+#include "tcxo.h"\r
+#include "pinctrl.h"\r
+#include "hal_adc.h"\r
+#endif\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+#if !defined(_WIN32)\r
+class SettingPowerModel : public SettingRefSingleton<SettingPowerModel> {\r
+public:\r
+ SettingPowerModel();\r
+ ~SettingPowerModel();\r
+ uint8_t GetBatteryPowerLevel();\r
+ const char* GetPowerModelNotify();\r
+protected:\r
+ bool adc_context_init();\r
+ bool adc_context_startup();\r
+ void adc_context_shutdown();\r
+ uint8_t calc_percentage(uint32_t voltage);\r
+ uint32_t calc_voltage();\r
+ uint32_t adc_trans_sytick_to_voltages(uint32_t sytick);\r
+private:\r
+ adc_channel_t channel_; // ADC信道\r
+ pin_t analog_pin_; // ADC输入引脚\r
+ pin_mode_t mode_; // ADC管脚工作模式\r
+ uint32_t samples_to_keep_; // 总采样次数\r
+ uint32_t samples_to_discard_; // 丢弃的初始样本数\r
+ uint32_t adc_max_range_mv_; // ADC原始值上限(单位:毫伏)\r
+ uint32_t adc_min_range_mv_; // ADC原始值下限(单位:毫伏)\r
+};\r
+#else\r
+class SettingPowerModel : public SettingRefSingleton<SettingPowerModel> {\r
+public:\r
+ uint8_t GetBatteryPowerLevel();\r
+ const char* GetPowerModelNotify();\r
+};\r
+#endif\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingQrcodeConnModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_QRCODE_CONN_MODEL_H\r
+#define SETTING_QRCODE_CONN_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include "AppViewIDs.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+class SettingQrcodeConnModel : public SettingRefSingleton<SettingQrcodeConnModel> {\r
+public:\r
+ static SettingQrcodeConnModel &GetInstance(void);\r
+private:\r
+ SettingQrcodeConnModel();\r
+ SettingQrcodeConnModel(const SettingQrcodeConnModel &);\r
+ SettingQrcodeConnModel &operator=(const SettingQrcodeConnModel &);\r
+ virtual ~SettingQrcodeConnModel();\r
+};\r
+}\r
+\r
+#endif // SETTING_QRCODE_CONN_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemModel\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_SYSTEM_MODEL_H\r
+#define SETTING_SYSTEM_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <mutex>\r
+#include <string>\r
+#ifndef _WIN32\r
+#include "osal_task.h"\r
+#endif\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+#include "settings/common/SettingRefSingleton.h"\r
+\r
+namespace OHOS {\r
+class SettingSystemModel : public SettingRefSingleton<SettingSystemModel> {\r
+public:\r
+ SettingSystemModel();\r
+ virtual ~SettingSystemModel();\r
+ std::vector<SettingUnionItemData>& GetSystemUnionData();\r
+ void SystemOperation(const char* operationName);\r
+ // OTA\r
+ bool GetOtaIsUpgrade();\r
+ uint32_t GetOtaPackageSize();\r
+ void StartOtaNativeUpgrade();\r
+ void StopOtaNativeUpgrade();\r
+ uint8_t GetOtaNativeUpgradePercent();\r
+ std::string GetOtaNativeUpgradeMessage();\r
+protected:\r
+ void RestoreJSApplication();\r
+ void RestoreNativeApplication();\r
+ void RestoreKvstore();\r
+ void SetOtaNativeUpgradePercent(uint8_t percent);\r
+ void SetOtaNativeUpgradeMessage(std::string message);\r
+ static int SystemOta(void *data);\r
+ static void UninstallCallback(const uint8_t resultCode, const void *resultMessage);\r
+private:\r
+ std::vector<SettingUnionItemData> systemUnionData_;\r
+ std::mutex otaOSALMtx_;\r
+#ifndef _WIN32\r
+ osal_task* systemOtaTask_ = nullptr;\r
+#endif\r
+ uint8_t otaUpgradePrecent_ = 0;\r
+ std::string otaUpgradeMessage_;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingAboutPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_ABOUT_PAGE_H\r
+#define SETTING_ABOUT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingAboutPage : public SlicePage<SettingPresenter> {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+protected:\r
+ void InitTitle();\r
+ void InitDeviceTypeView();\r
+ void InitDeviceNameView();\r
+private:\r
+ UILabel* title_ = nullptr;\r
+ UILabel* deviceNameTitle_ = nullptr;\r
+ UILabel* deviceTypeTitle_ = nullptr;\r
+ UILabel* deviceName_ = nullptr;\r
+ UILabel* deviceType_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingBuletoothPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_BLUETOOTH_PAGE_H\r
+#define SETTING_BLUETOOTH_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "graphic_timer.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/model/SettingBluetoothModel.h"\r
+#include "settings/page/SettingConnectNewPhone.h"\r
+#include "settings/page/SettingReconnection.h"\r
+#include "settings/page/SettingConnectBlueFail.h"\r
+#include "settings/page/SettingConnectBlueSuccess.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t SEARCH_IMAGE_COUNT = 31;\r
+\r
+class SettingBluetoothPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SettingBluetoothPage();\r
+ ~SettingBluetoothPage() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ static SettingBluetoothPage *GetInstance(void);\r
+ void InitSearchAni(void);\r
+ void InitImageAnimator();\r
+ void InitContentList();\r
+ void BtScan();\r
+ void StartBtScan();\r
+ void StopBtScan();\r
+ bool GetScanStatus(void);\r
+ void BtAnimatorStart();\r
+ void BtAnimatorStop();\r
+ void SetScanStatus(bool value);\r
+ void InitPageView();\r
+ void DestoryPageView();\r
+ void NotFindDevice();\r
+ void LoadFindDeviceList();\r
+ void UpdataImageAnimatorAndList();\r
+ void TimerFindDevice();\r
+ void UpdateBtListContent(int16_t viewIndex);\r
+ bool IsDeviceConnect();\r
+ bool GetImageAnimatorState();\r
+ void ChangeView(int16_t value);\r
+ void ShowResultGroup(int16_t value);\r
+\r
+protected:\r
+ static UIView* CreateForContent(uint8_t type);\r
+ static void UpdateForContent(UIView* view, void* data, uint8_t type);\r
+ static UIView* CreateForBtList(uint8_t type);\r
+ static void UpdateForBtList(UIView* view, void* data, uint8_t type);\r
+\r
+private:\r
+ bool scanStart_{0};\r
+ UIScrollViewNested *scroll_ = nullptr;\r
+ UILabel *titleLabel_ = nullptr;\r
+ UILabel *noDeviceLabel_ = nullptr;\r
+ UILabel *availableDeviceLabel_ = nullptr;\r
+ UILabel *searchBtnTextLabel_ = nullptr;\r
+ UILabelButton *resetResearchButton_ = nullptr;\r
+ UIImageAnimatorView *imageAnimator_;\r
+ ImageAnimatorInfo searchImageInfo_[SEARCH_IMAGE_COUNT];\r
+ UISimpleList *optionList_ = nullptr;\r
+ UISimpleList *btEarPhoneList_ = nullptr;\r
+ SettingConnectNewPhone *connectNewPhoneFragment_ = nullptr;\r
+ SettingConnectionOpen* connectOpenFragment_ = nullptr;\r
+ SettingReconnection *reconnectionFragment_ = nullptr;\r
+ SettingReconnectSecondConfirm* secondConfirmFragment_ = nullptr;\r
+ UnPairSecondConfirm* unPairFragment_ = nullptr;\r
+ SettingConnectBlueSuccess *successFragment_ = nullptr;\r
+ SettingConnectBlueFail *failFragment_ = nullptr;\r
+};\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+void ScanTimerCallback(int data);\r
+void SettingCancelBrScanHandle(void);\r
+void SettingEndScanHandle(void);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardAddPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_ADD_PAGE_H\r
+#define SETTING_CARD_ADD_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingCardAddPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ static UIView* OnSimpleListCreate(uint8_t type);\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UISimpleList* list_ = nullptr;\r
+ UILabel* title_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectPage\r
+ * Create: 2025-04\r
+ */\r
+#ifndef SETTING_CARD_EFFECT_PAGE_H\r
+#define SETTING_CARD_EFFECT_PAGE_H\r
+\r
+#include <list>\r
+#include "View.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCardEffectSample.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/common/SettingCardEffectItemGroup.h"\r
+\r
+namespace OHOS {\r
+using CardEffectPair = std::pair<SettingCardEffectSample, SettingCardEffectSample>;\r
+\r
+class SettingCardEffecPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener,\r
+ public ListScrollListener {\r
+public:\r
+ SettingCardEffecPage();\r
+ ~SettingCardEffecPage() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+ void OnItemSelected(int16 index, UIView* view) override;\r
+ void SetCardEffectListData(const std::map<CardEffectID, SettingCardEffectSample> &effectMap);\r
+protected:\r
+ static UIView* OnSimpleListCreate(uint8_t type);\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UILabel* titleText_{nullptr};\r
+ UISimpleList* contentList_{nullptr};\r
+ std::list<CardEffectPair> effectListDatas_;\r
+ SettingCardEffectItemGroup* itemGroupSele_{nullptr};\r
+ SettingCardEffectItemGroup* preItemGroupSele_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardMgrPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_MGR_PAGE_H\r
+#define SETTING_CARD_MGR_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingCardMgrPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ void InitListView();\r
+ void InitButtonView();\r
+ static UIView* OnSimpleListCreate(uint8_t type);\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UISimpleList* list_ = nullptr;\r
+ UIButton* addButton_ = nullptr;\r
+ UIButton* delButton_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_CARD_PAGE_H\r
+#define SETTING_CARD_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingCardPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UIScrollViewNested* scroll_ = nullptr;\r
+ UISimpleList* content_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingConnectBlueFail\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_CONNECT_BLUE_FAIL_H\r
+#define SETTING_CONNECT_BLUE_FAIL_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingConnectBlueFail : public UIFragment,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ void RefreshFragment();\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+ void OnCreateView(void* data) override;\r
+ void OnDestroyView() override;\r
+\r
+private:\r
+ void InitFailFragment();\r
+ UIImageView* img_ = nullptr;\r
+ UILabel* watchNameLabel_ = nullptr;\r
+ UILabel* connectStatusLabel_ = nullptr;\r
+ UILabelButton* confirmButton_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingConnectBlueSuccess\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_CONNECT_BLUE_SUCCESS_H\r
+#define SETTING_CONNECT_BLUE_SUCCESS_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+class SettingConnectBlueSuccess : public UIFragment,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ void RefreshFragment();\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+ void OnCreateView(void* data) override;\r
+ void OnDestroyView() override;\r
+\r
+private:\r
+ void InitSuccessFragment();\r
+ UIImageView* img_ = nullptr;\r
+ UILabel* watchNameLabel_ = nullptr;\r
+ UILabel* connectStatusLabel_ = nullptr;\r
+ UILabelButton* confirmButton_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingConnectNewPhone\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_CONNECT_NEW_PHONE_H\r
+#define SETTING_CONNECT_NEW_PHONE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/page/SettingConnectionOpen.h"\r
+\r
+namespace OHOS {\r
+class SettingConnectNewPhone : public UIFragment,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ bool OnClick(UIView &view, const ClickEvent &event);\r
+ bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+ void OnCreateView(void* data) override;\r
+ void OnDestroyView() override;\r
+\r
+private:\r
+ void InitNewPhoneFragment();\r
+ UILabel* textFirst_ = nullptr;\r
+ UILabel* textSecond_ = nullptr;\r
+ UILabel* textThird_ = nullptr;\r
+ UIImageView* cancel_ = nullptr;\r
+ UIButton* confirm_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingConnectionOpen
+ * Created: 2025-06-05
+ */
+#ifndef SETTING_CONNECTION_OPEN_H
+#define SETTING_CONNECTION_OPEN_H
+
+#include "components/ui_label.h"
+#include "components/ui_button.h"
+#include "components/ui_label_button.h"
+#include "components/ui_fragment.h"
+#include "settings/common/SettingCommon.h"
+#include "settings/SettingPresenter.h"
+
+namespace OHOS {
+class SettingConnectionOpen : public UIFragment,
+ public UIView::OnClickListener,
+ public UIView::OnDragListener {
+public:
+ void RefreshFragment();
+ bool OnClick(UIView &view, const ClickEvent &event);
+ bool OnDragStart(UIView& view, const DragEvent& event) override;
+ bool OnDrag(UIView& view, const DragEvent& event) override;
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;
+
+protected:
+ void OnCreateView(void* data) override;
+ void OnDestroyView() override;
+
+private:
+ void InitConnectionOpenFragment();
+ UIImageView* img_ = nullptr;
+ UILabel* watchNameLabel_ = nullptr;
+ UILabel* connectStatusLabel_ = nullptr;
+ UILabelButton* confirmButton_ = nullptr;
+};
+} // OHOS
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopDialPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_DIAL_PAGE_H\r
+#define SETTING_DESKTOP_DIAL_PAGE_H\r
+\r
+#include <vector>\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_coverflow_view.h"\r
+#include "components/ui_roller_view.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDesktopDialPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UICoverflowView::OnCoverflowScrollListener,\r
+ public UIRollerView::OnScrollListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+ bool OnScroll() override;\r
+ void OnScroll(UIRollerView* roller, std::string currentItemName, float currentItemAngle) override;\r
+protected:\r
+ void InitDialView();\r
+ void InitCtrlView();\r
+private:\r
+ UILabel* itemLabel_ = nullptr;\r
+ UICoverflowView* coverflow_ = nullptr;\r
+ UIRollerView* rollerView_ = nullptr;\r
+ uint8_t itemCount_ = 0;\r
+ uint8_t itemIndex_ = 0;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopDialStylePage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_DIAL_STYLE_PAGE_H\r
+#define SETTING_DESKTOP_DIAL_STYLE_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDesktopDialStylePage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ void DestoryPageView();\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UIScrollViewNested* scroll_ = nullptr;\r
+ UISimpleList* content_ = nullptr;\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopHomePage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_HOME_PAGE_H\r
+#define SETTING_DESKTOP_HOME_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDesktopHomePage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ static UIView* OnSimpleListCreate(uint8_t type);\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UISimpleList* list_ = nullptr;\r
+ UILabel* title_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DESKTOP_PAGE_H\r
+#define SETTING_DESKTOP_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDesktopPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UIScrollViewNested* scroll_ = nullptr;\r
+ UISimpleList* content_ = nullptr;\r
+};\r
+}\r
+#endif // SETTING_DESKTOP_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayBrightnessPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_BRIGHTNESS_PAGE_H\r
+#define SETTING_DISPLAY_BRIGHTNESS_PAGE_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDisplayBrightnessPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnLongPressListener,\r
+ public UIView::OnTouchListener,\r
+ public UIView::OnDragListener,\r
+ public AnimatorCallback {\r
+public:\r
+ using SlicePage<SettingPresenter>::OnStop;\r
+ using AnimatorCallback::OnStop;\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ void Callback(UIView* view) override;\r
+ bool OnLongPress(UIView& view, const LongPressEvent& event) override;\r
+ bool OnRelease(UIView& view, const ReleaseEvent& event) override;\r
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+protected:\r
+ void InitProgressView();\r
+ void InitButtonView();\r
+private:\r
+ UILabel* title_ = nullptr;\r
+ UICircleProgress* progress_ = nullptr;\r
+ UILabel* progressNum_ = nullptr;\r
+ UIButton* add_ = nullptr;\r
+ UIButton* sub_ = nullptr;\r
+ Animator* animator_ = nullptr;\r
+ UIButton* curLongPressButton_ = nullptr;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_PAGE_H\r
+#define SETTING_DISPLAY_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDisplayPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UIScrollViewNested* scroll_ = nullptr;\r
+ UISimpleList* content_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayScreenOffPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_SCREEN_OFF_PAGE_H\r
+#define SETTING_DISPLAY_SCREEN_OFF_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_picker.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDisplayScreenOffPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+private:\r
+ UILabel* title_ = nullptr;\r
+ UIPicker* picker_ = nullptr;\r
+ UIButton* button_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplaySteadyOnPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_DISPLAY_STEADY_ON_PAGE_H\r
+#define SETTING_DISPLAY_STEADY_ON_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_picker.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingDisplaySteadyOnPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+private:\r
+ UILabel* title_ = nullptr;\r
+ UIPicker* picker_ = nullptr;\r
+ UIButton* button_ = nullptr;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingMainPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_MAIN_PAGE_H\r
+#define SETTING_MAIN_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingMainPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnDragListener,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ void InitPageView();\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UIScrollViewNested* scrollView_ = nullptr;\r
+ UISimpleList* simpleList_ = nullptr;\r
+};\r
+}\r
+#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPowerPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_POWER_PAGE_H\r
+#define SETTING_POWER_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingPowerPage : public SlicePage<SettingPresenter>,\r
+ public AnimatorCallback {\r
+public:\r
+ using SlicePage<SettingPresenter>::OnStop;\r
+ using AnimatorCallback::OnStop;\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ void OnStop() override;\r
+ void Callback(UIView* view) override;\r
+protected:\r
+ void InitPowerView();\r
+ void InitBatteryStatusView();\r
+ void InitNotify();\r
+private:\r
+ UIScrollView* scrollView_ = nullptr;\r
+ UILabel* title_ = nullptr;\r
+ UILabel* powerDesc_ = nullptr;\r
+ UILabel* batteryPercentage_ = nullptr;\r
+ UILabel* timeLabel_ = nullptr;\r
+ UIViewGroup* batteryStatusGroup_ = nullptr;\r
+ UILabel* batteryLabel_ = nullptr;\r
+ UILabel* batteryLevel_ = nullptr;\r
+ UILabel* detailsDesc_ = nullptr;\r
+ Animator* timeAnimator_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingQrcodeConnPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_QRCODE_CONN_PAGE_H\r
+#define SETTING_QRCODE_CONN_PAGE_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_qrcode.h"\r
+#include "components/ui_label.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class SettingQrcodeConnPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SettingQrcodeConnPage();\r
+ ~SettingQrcodeConnPage() override;\r
+ void OnStart(void* data) override;\r
+ void InitView();\r
+private:\r
+ UIScrollViewNested *group_ = nullptr;\r
+ UIQrcode *qrcode_ = nullptr;\r
+ UILabel *content_ = nullptr;\r
+};\r
+}\r
+#endif // SETTING_QRCODE_CONN_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingReconnectSecondConfirm\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_RECONNECT_SECOND_CONFIRM_H\r
+#define SETTING_RECONNECT_SECOND_CONFIRM_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+class SettingReconnectSecondConfirm : public UIFragment,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ void RefreshFragment();\r
+ bool OnClick(UIView &view, const ClickEvent &event);\r
+ bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+ void OnCreateView(void* data) override;\r
+ void OnDestroyView() override;\r
+\r
+private:\r
+ void InitSecondConfirmFragment();\r
+ UILabel* title_ = nullptr;\r
+ UILabel* contentFirst_ = nullptr;\r
+ UILabel* contentSecond_ = nullptr;\r
+ UILabel* contentThird_ = nullptr;\r
+ UIImageView* cancel_ = nullptr;\r
+ UILabelButton* confirm_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingReconnection\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SETTING_RECONNECTION_H\r
+#define SETTING_RECONNECTION_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/page/SettingReconnectSecondConfirm.h"\r
+#include "settings/page/UnPairSecondConfirm.h"\r
+\r
+namespace OHOS {\r
+class SettingReconnection : public UIFragment,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ void RefreshFragment();\r
+ bool OnClick(UIView &view, const ClickEvent &event);\r
+ bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+ void OnCreateView(void* data) override;\r
+ void OnDestroyView() override;\r
+\r
+private:\r
+ void InitReconnectionFragment();\r
+ UILabel* watchNameLabel_ = nullptr;\r
+ UILabel* connectStatusLabel_ = nullptr;\r
+ UILabelButton* reconnectionButton_ = nullptr;\r
+ UIImageView* unpair_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemOperationPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_SYSTEM_OPERATION_PAGE_H\r
+#define SETTING_SYSTEM_OPERATION_PAGE_H\r
+\r
+#include <map>\r
+#include <string>\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_slider.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+struct OperationData {\r
+ ColorType sliderBgColor;\r
+ uint32_t sliderKnobImage;\r
+};\r
+\r
+class SettingSystemOperationPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UISlider::UISliderEventListener {\r
+public:\r
+ SettingSystemOperationPage();\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ void OnChange(int32_t value) override;\r
+ void OnRelease(int32_t value) override;\r
+protected:\r
+ void InitSliderView();\r
+ void InitButtonView();\r
+ void RefreshSlider();\r
+private:\r
+ UISlider* slider_ = nullptr;\r
+ UILabel* sliderLabel_ = nullptr;\r
+ UIButton* button_ = nullptr;\r
+ UILabel* buttonDescription_ = nullptr;\r
+ std::string operationName_;\r
+ std::map<std::string, OperationData> operationData_;\r
+ bool sliderBegin_ = false;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemOTAPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_SYSTEM_OTA_PAGE_H\r
+#define SETTING_SYSTEM_OTA_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_slider.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingSystemOtaPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener,\r
+ public AnimatorCallback {\r
+public:\r
+ using SlicePage<SettingPresenter>::OnStop;\r
+ using AnimatorCallback::OnStop;\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ void Callback(UIView* view) override;\r
+protected:\r
+ void InitPreGroupView();\r
+ void InitMidCircleView();\r
+ void InitMidMessageView();\r
+private:\r
+ Animator* upgradeAnimator_ = nullptr;\r
+ UIViewGroup* preUpgradeGroup_ = nullptr;\r
+ UIViewGroup* midUpgradeGroup_ = nullptr;\r
+ UIButton* preUpgradeButton_ = nullptr;\r
+ UILabel* preUpgradeLabel_ = nullptr;\r
+ UICircleProgress* midUpgradeProress_ = nullptr;\r
+ UILabel* midUpgradeLabel_ = nullptr;\r
+ UILabel* midUpgradePercent_ = nullptr;\r
+ UILabel* midUpgradeMessage_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemPage\r
+ * Create: 2025-06-01\r
+ */\r
+#ifndef SETTING_SYSTEM_PAGE_H\r
+#define SETTING_SYSTEM_PAGE_H\r
+\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "settings/SettingPresenter.h"\r
+#include "settings/common/SettingCommon.h"\r
+\r
+namespace OHOS {\r
+class SettingSystemPage : public SlicePage<SettingPresenter>,\r
+ public UIView::OnClickListener {\r
+public:\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+protected:\r
+ static void OnSimpleListUpdate(UIView* view, void* data, uint8_t type);\r
+private:\r
+ UIScrollViewNested* scroll_ = nullptr;\r
+ UISimpleList* content_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UnPairSecondConfirm\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef UNPAIR_SECOND_CONFIRM_H\r
+#define UNPAIR_SECOND_CONFIRM_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_fragment.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+class UnPairSecondConfirm : public UIFragment,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ void RefreshFragment();\r
+ bool OnClick(UIView &view, const ClickEvent &event);\r
+ bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+\r
+protected:\r
+ void OnCreateView(void* data) override;\r
+ void OnDestroyView() override;\r
+\r
+private:\r
+ void InitUnpairFragment();\r
+ UILabel* title_ = nullptr;\r
+ UILabel* contentFirst_ = nullptr;\r
+ UILabel* contentSecond_ = nullptr;\r
+ UILabel* watchNameLabel_ = nullptr;\r
+ UIImageView* cancel_ = nullptr;\r
+ UILabelButton* confirm_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepDetailsPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEP_DETAILS_PAGE_H\r
+#define SLEEP_DETAILS_PAGE_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sleep.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepModel.h"\r
+\r
+namespace OHOS {\r
+class SleepPresenter;\r
+class SleepDetailsPage : public SlicePage<SleepPresenter>,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SleepDetailsPage();\r
+ ~SleepDetailsPage() override;\r
+\r
+ void OnStart(void* data) override;\r
+ void InitPage();\r
+ void InitNoDeatilPage();\r
+ void InitDetailPage();\r
+ void InitSoberingTime();\r
+ void InitRapidEyeMovement();\r
+ void InitLightSleepTime();\r
+ void InitDeepSleepTime();\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ bool GetRecord();\r
+ std::string SetTimeUnit(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ void InitActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ void LoadDeatilActualSleepTime();\r
+\r
+private:\r
+ UIScrollView *group_{nullptr};\r
+ UILabel *sleepTitleLabel_{nullptr};\r
+ UILabel *actualSleepNorecordTimeLabel_{nullptr}; // norecord\r
+ UILabel *actualSleepTimeHoursLabel_{nullptr};\r
+ UILabel *actualSleepTimeHoursUnitLabel_{nullptr};\r
+ UILabel *actualSleepTimeMinutesLabel_{nullptr};\r
+ UILabel *actualSleepTimeMinutesUnitLabel_{nullptr};\r
+\r
+ UIImageView *bgImg_{nullptr};\r
+ UIImageView *grayBgImg_{nullptr};\r
+ UIImageView *redPointImg_{nullptr};\r
+ UILabel *soberingTimeLabel_{nullptr};\r
+ UILabel *soberingTimeUnitLabel_{nullptr};\r
+ UIImageView *orangePointImg_{nullptr};\r
+ UILabel *rapidEyeMovementLabel_ {nullptr};\r
+ UILabel *rapidEyeMovementUnitLabel_{nullptr};\r
+ UIImageView *greenPointImg_{nullptr};\r
+ UILabel *lightSleepTimeLabel_{nullptr};\r
+ UILabel *lightSleepTimeUnitLabel_{nullptr};\r
+ UIImageView *bluePointImg_{nullptr};\r
+ UILabel *deepSleepTimeLabel_{nullptr};\r
+ UILabel *deepSleepTimeUnitLabel_{nullptr};\r
+};\r
+}\r
+\r
+#endif // SLEEP_DETAILS_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEP_MAIN_PAGE_H\r
+#define SLEEP_MAIN_PAGE_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_sleep.h"\r
+#include "main/LoadImg.h"\r
+#include "sleep/SleepTargetTime.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepModel.h"\r
+\r
+\r
+namespace OHOS {\r
+class SleepPresenter;\r
+class SleepMainPage : public SlicePage<SleepPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SleepMainPage();\r
+ ~SleepMainPage() override;\r
+\r
+ void OnStart(void* data) override;\r
+ void InitNoRecordPage();\r
+ void InitRecordPage();\r
+ void LoadActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ void LoadTargetTimeButton(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void InitCircleProgress();\r
+ uint32_t GetSleepingScores();\r
+ void InitSleepTimeLabel();\r
+ void ScoreDisplay();\r
+ bool GetRecord();\r
+ void InitScoreDisplayPicture();\r
+private:\r
+ UIScrollView *group_{nullptr};\r
+ UIImageView *imageViewMain_{nullptr};\r
+ // noRecord页面控件\r
+ UILabel *sleepTitleLabel_{nullptr};\r
+ UIImageView *moonNoRecordImg_{nullptr};\r
+ UILabel *noRecordLabel_{nullptr};\r
+ UILabel *tipsLabel_{nullptr};\r
+ // Record页面控件\r
+ UIImageView *moonImg_{nullptr};\r
+ UILabel *sleepScoreTextLabel_{nullptr};\r
+ UILabel *sleepScoresLabel_{nullptr};\r
+ UILabel *scoreUnitLabel_{nullptr};\r
+ UIImageView *scoreStarImg1_{nullptr};\r
+ UIImageView *scoreStarImg2_{nullptr};\r
+ UIImageView *scoreStarImg3_{nullptr};\r
+ UIImageView *scoreStarImg4_{nullptr};\r
+ UIImageView *scoreStarImg5_{nullptr};\r
+ UILabel *targetSleepTimeHoursLabel_{nullptr};\r
+ UILabel *targetSleepTimeHoursUnitLabel_{nullptr};\r
+ UILabel *targetSleepTimeMinutesLabel_{nullptr};\r
+ UILabel *targetSleepTimeMinutesUnitLabel_{nullptr};\r
+ UILabel *targetTimeLabel_{nullptr};\r
+ UILabelButton *targetTimeButton_{nullptr};\r
+ UIImageView *settingImg_{nullptr};\r
+ UICircleProgress* circleProgress_{nullptr};\r
+};\r
+}\r
+\r
+#endif // SLEEP_MAIN_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepModel\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEP_MODEL_H\r
+#define SLEEP_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include <vector>\r
+#include <string>\r
+#include <sstream>\r
+#include <ctime>\r
+#include <iomanip>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "diag_service.h"\r
+#include "msg_center_device.h"\r
+#include "diag_common.h"\r
+#include "sleep/SleepPresenter.h"\r
+\r
+namespace OHOS {\r
+ enum SleepType : uint8_t {\r
+ SLEEP_TYPE_DEEP = 1, // 深睡\r
+ SLEEP_TYPE_LIGHT = 2, // 浅睡\r
+ SLEEP_TYPE_EYEMOVE = 3, // 快速动眼\r
+ SLEEP_TYPE_SOBER = 4, // 清醒\r
+ };\r
+ static const uint16_t SLEEP_DATA_DATE_RANGE = 11;\r
+ static const uint16_t SLEEP_DATA_START_DATA_RANGE = 20;\r
+\r
+ #pragma pack(1)\r
+ struct SleepData {\r
+ bool isSended;\r
+ char date[SLEEP_DATA_DATE_RANGE];\r
+ SleepType type;\r
+ char typeSleepStart[SLEEP_DATA_START_DATA_RANGE];\r
+ char typeSleepEnd[SLEEP_DATA_START_DATA_RANGE];\r
+ char sleepStart[SLEEP_DATA_START_DATA_RANGE];\r
+ char sleepEnd[SLEEP_DATA_START_DATA_RANGE];\r
+\r
+ SleepData(\r
+ bool isSended,\r
+ const char* date,\r
+ SleepType type,\r
+ const char* typeSleepStart,\r
+ const char* typeSleepEnd,\r
+ const char* sleepStart,\r
+ const char* sleepEnd)\r
+ {\r
+ this->isSended = isSended;\r
+ strncpy_s(this->date, SLEEP_DATA_DATE_RANGE, date, SLEEP_DATA_DATE_RANGE - 1);\r
+ this->type = type;\r
+ strncpy_s(this->typeSleepStart, SLEEP_DATA_START_DATA_RANGE, typeSleepStart,\r
+ SLEEP_DATA_START_DATA_RANGE - 1);\r
+ strncpy_s(this->typeSleepEnd, SLEEP_DATA_START_DATA_RANGE, typeSleepEnd, SLEEP_DATA_START_DATA_RANGE - 1);\r
+ strncpy_s(this->sleepStart, SLEEP_DATA_START_DATA_RANGE, sleepStart, SLEEP_DATA_START_DATA_RANGE - 1);\r
+ strncpy_s(this->sleepEnd, SLEEP_DATA_START_DATA_RANGE, sleepEnd, SLEEP_DATA_START_DATA_RANGE - 1);\r
+ }\r
+ };\r
+ #pragma pack()\r
+\r
+ class SleepModel {\r
+ public:\r
+ static SleepModel &GetInstance(void);\r
+ void SendData();\r
+ uint8_t* SerializeSleepData(const SleepData* sleepData, size_t* outSize);\r
+ void SetSleepDataVec(); // 存入睡眠数据接口\r
+ void SetTargetTime(uint32_t minute);\r
+ std::tuple<uint32_t, uint32_t> GetTargetTime();\r
+ void SetData();\r
+ std::tuple<uint32_t, uint32_t> GetSoberingTime();\r
+ std::tuple<uint32_t, uint32_t> GetRapidEyeMovementTime();\r
+ std::tuple<uint32_t, uint32_t> GetLightSleepTime();\r
+ std::tuple<uint32_t, uint32_t> GetDeepSleepTime();\r
+ std::tuple<uint32_t, uint32_t> GetSleepTime();\r
+ void SetSoberingTime();\r
+ void SetRapidEyeMovementTime();\r
+ void SetLightSleepTime();\r
+ void SetDeepSleepTime();\r
+ bool GetRecord();\r
+ uint32_t GetSleepTimeHours();\r
+ uint32_t GetSleepTimeMinutes();\r
+ std::tuple<uint32_t, uint32_t> MinutesToHours(uint32_t minutes);\r
+ uint32_t TimeDiffInMinutes(const std::string& timeStr1, const std::string& timeStr2);\r
+ uint32_t GetDetailData(int type);\r
+ uint32_t GetTotalSleepTime();\r
+ void LoadData();\r
+ std::string GetTodayDate();\r
+ \r
+ private:\r
+ SleepModel();\r
+ virtual ~SleepModel();\r
+ uint32_t sleepTarget_ = 0;\r
+ std::vector<SleepData> sleepDataVector_;\r
+ uint32_t soberingTime_;\r
+ uint32_t eyeMoveTime_;\r
+ uint32_t lightTime_;\r
+ uint32_t deepTime_;\r
+ };\r
+}\r
+\r
+#endif // SLEEP_MODEL_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SLEEP_PRESENTER_H\r
+#define SLEEP_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class SleepView;\r
+class SleepPresenter : public Presenter<SleepView> {\r
+};\r
+}\r
+\r
+#endif // SLEEP_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepSleepingPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEP_SLEEPING_PAGE_H\r
+#define SLEEP_SLEEPING_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_sleep.h"\r
+#include "main/LoadImg.h"\r
+#include "sleep/SleepTargetTime.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepModel.h"\r
+\r
+\r
+namespace OHOS {\r
+class SleepPresenter;\r
+class SleepSleepingPage : public SlicePage<SleepPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SleepSleepingPage();\r
+ ~SleepSleepingPage() override;\r
+\r
+ void OnStart(void* data) override;\r
+ void OnPause() override;\r
+ void InitCircleProgress();\r
+ void InitSleepTimeLabel();\r
+ void LoadTargetTimeForHourAndMin(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ void StopAnimator();\r
+private:\r
+ UIScrollView *group_{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ UIImageView *moonImg_{nullptr};\r
+ UILabel *sleepTitleLabel_{nullptr};\r
+ UILabel *sleepingLabel_{nullptr};\r
+ UILabel *targetSleepTimeHoursLabel_{nullptr};\r
+ UILabel *targetSleepTimeHoursUnitLabel_{nullptr};\r
+ UILabel *targetSleepTimeMinutesLabel_{nullptr};\r
+ UILabel *targetSleepTimeMinutesUnitLabel_{nullptr};\r
+ UIImageView *sleepTimeBgImg_{nullptr};\r
+ UICircleProgress* circleProgress_{nullptr};\r
+\r
+class SleepAnimatorCallback : public AnimatorCallback {\r
+public:\r
+ explicit SleepAnimatorCallback(SleepSleepingPage* page) : page_(page) {}\r
+ ~SleepAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+\r
+private:\r
+ SleepSleepingPage* page_{nullptr};\r
+};\r
+ Animator *animator_ = nullptr;\r
+ SleepAnimatorCallback *callBack_ = nullptr;\r
+ struct timeval startTime_ = {0};\r
+};\r
+}\r
+\r
+#endif // SLEEP_SLEEPING_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepTargetTime\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SLEEP_TARGET_TIME_H\r
+#define SLEEP_TARGET_TIME_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "main/LoadImg.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+namespace OHOS {\r
+static constexpr int16_t PICKER_COUNT = 2;\r
+\r
+class SleepTargetTime : public SlicePage<SleepPresenter>,\r
+ public UIPicker::SelectedListener,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SleepTargetTime();\r
+ ~SleepTargetTime() override;\r
+\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void OnPickerStoped(UIPicker& picker) override;\r
+ void InitStartButton();\r
+ void CreatePicker();\r
+ void CreateLabel();\r
+ void SetPickerTime();\r
+private:\r
+ UIScrollView *group_{nullptr};\r
+ UILabel* targetTitleLabel_{nullptr};\r
+ UILabel* timerUnitLabel_{nullptr};\r
+ UILabelButton *startButton_{nullptr};\r
+ UIPicker* timerPicker_[PICKER_COUNT]{nullptr};\r
+};\r
+}\r
+#endif // TARGET_SLEEP_TIME_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepView\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SLEEP_VIEW_H\r
+#define SLEEP_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum SLEEPING_PAGES {\r
+ SLEEPING_MAIN_PAGE = 1, // 0 is invalid\r
+ SLEEPING_DEATIL_PAGE = 2,\r
+ SLEEPING_TARGET_PAGE = 3,\r
+ SLEEPING_SLEEP_PAGE = 4,\r
+};\r
+class SleepPresenter;\r
+class SleepView : public View<SleepPresenter> {\r
+};\r
+}\r
+#endif // SLEEP_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportCountdownPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_COUNTDOWN_PAGE_H\r
+#define SPORT_COUNTDOWN_PAGE_H\r
+\r
+#include "animator/animator.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+class SportCountdownPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportCountdownPage() {}\r
+ ~SportCountdownPage();\r
+ void OnStart(void* data) override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void UpdateCountdownView(uint64_t time);\r
+ class SportCountdownAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ SportCountdownAnimatorCallback(SportCountdownPage* page):page_(page) {}\r
+ virtual ~SportCountdownAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ SportCountdownPage* page_{nullptr};\r
+ };\r
+ Animator* animator_{nullptr};\r
+ SportCountdownAnimatorCallback* callback_{nullptr};\r
+ UIViewGroup *group_{nullptr};\r
+ UILabel *countdownText_{nullptr};\r
+ UICircleProgress *countdownProgress_{nullptr};\r
+ struct timeval startTime_{0};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_COUNTDOWN_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportDataPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_DATA_PAGE_H\r
+#define SPORT_DATA_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_sweep_clock.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+class SportDataPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportDataPage() {}\r
+ ~SportDataPage();\r
+ void OnStart(void* data) override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void InitBatteryView();\r
+ void InitTimeLableVIew();\r
+ void ShowUpHeartRate();\r
+ void ShowUpTopView();\r
+ void ShowUpLeftView();\r
+ void ShowUpRightView();\r
+ void ShowUpBottomView();\r
+ void ShowUpSeparateLine();\r
+ void UpdateDataViewByType();\r
+ void CheckTarget();\r
+ void CheckRemind();\r
+ class SportDataAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ SportDataAnimatorCallback(SportDataPage* page):page_(page) {}\r
+ virtual ~SportDataAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ SportDataPage* page_{nullptr};\r
+ };\r
+ Animator* animator_{nullptr};\r
+ SportDataAnimatorCallback* callback_{nullptr};\r
+ Image *secondHand_{nullptr};\r
+ UISweepClock *sweepClock_{nullptr};\r
+ UIImageView *heartRateScale_{nullptr};\r
+ UIImageView *heartRatePointer_{nullptr};\r
+ UICanvas *separateLine_{nullptr};\r
+ UILabel *topValueLabel_{nullptr};\r
+ UILabel *topUnitLabel_{nullptr};\r
+ UILabel *leftValueLabel_{nullptr};\r
+ UILabel *leftUnitLabel_{nullptr};\r
+ UILabel *rightValueLabel_{nullptr};\r
+ UILabel *rightUnitLabel_{nullptr};\r
+ UILabel *bottomValueLabel_{nullptr};\r
+ UILabel *bottomUnitLabel_{nullptr};\r
+ UILabel *timeLabel_{nullptr};\r
+ UIImageView *batteryIcon_{nullptr};\r
+ UILabel *batteryLabel_{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_DATA_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportHeartRateRangeItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_HEART_RATE_RANGE_ITEM_VIEW_H\r
+#define SPORT_HEART_RATE_RANGE_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_radio_button.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t itemId;\r
+ const char *title;\r
+ const char *viewId;\r
+} SportHeartRateRangeItem;\r
+\r
+class SportHeartRateRangeItemView : public UIViewGroup {\r
+public:\r
+ SportHeartRateRangeItemView();\r
+ ~SportHeartRateRangeItemView() override;\r
+\r
+ virtual void SetItemInfo(const SportHeartRateRangeItem &itemInfo);\r
+\r
+private:\r
+ UIImageView bgImage_;\r
+ UILabel title_;\r
+ UILabel range_;\r
+ UIRadioButton button_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportHeartRateRangePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_HEART_RATE_RANGE_PAGE_H\r
+#define SPORT_HEART_RATE_RANGE_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportHeartRateRangeItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_HEARTRATE_RANGE_ITEM_1 = "sportHeartRateRangeItem1";\r
+const char* SPORT_HEARTRATE_RANGE_ITEM_2 = "sportHeartRateRangeItem2";\r
+const char* SPORT_HEARTRATE_RANGE_ITEM_3 = "sportHeartRateRangeItem3";\r
+const char* SPORT_HEARTRATE_RANGE_ITEM_4 = "sportHeartRateRangeItem4";\r
+\r
+class SportHeartRateRangePage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportHeartRateRangePage();\r
+ ~SportHeartRateRangePage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UIScrollView *group_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UISimpleList *heartRateRangeList_{nullptr};\r
+ SportHeartRateRangeItem heartRateRanges_[SPORT_HEARTRATE_RANGE_MAX] = {\r
+ {SPORT_HEARTRATE_RANGE_ITEM1, "热身燃脂", SPORT_HEARTRATE_RANGE_ITEM_1},\r
+ {SPORT_HEARTRATE_RANGE_ITEM2, "有氧耐力", SPORT_HEARTRATE_RANGE_ITEM_2},\r
+ {SPORT_HEARTRATE_RANGE_ITEM3, "无氧耐力", SPORT_HEARTRATE_RANGE_ITEM_3},\r
+ {SPORT_HEARTRATE_RANGE_ITEM4, "极限训练", SPORT_HEARTRATE_RANGE_ITEM_4}};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_HEART_RATE_RANGE_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMenuItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_MENU_ITEM_VIEW_H\r
+#define SPORT_MENU_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ int bgId;\r
+ int iconId;\r
+ const char *label;\r
+ const char *viewId;\r
+} SportMenuItem;\r
+\r
+class SportMenuItemView : public UIViewGroup {\r
+public:\r
+ SportMenuItemView();\r
+ ~SportMenuItemView() override;\r
+\r
+ virtual void SetItemInfo(const SportMenuItem &itemInfo);\r
+\r
+private:\r
+ UIImageView bgImage_;\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ UIImageView settingImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMenuPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_MENU_PAGE_H\r
+#define SPORT_MENU_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_sport.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportMenuItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_ITEM_OUTDOOR_RUNNING = "sportItemOutdoorRunning";\r
+const char* SPORT_ITEM_INDOOR_RUNNING = "sportItemIndoorRunning";\r
+const char* SPORT_ITEM_CYCLING = "sportItemCycling";\r
+const char* SPORT_ITEM_CLIMBING = "sportItemClimbing";\r
+const char* SPORT_ITEM_INDOOR_SWIMMING = "sportItemIndoorSwimming";\r
+const char* SPORT_ITEM_OUTDOOR_SWIMMING = "sportItemOutdoorSwimming";\r
+\r
+class SportMenuPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportMenuPage();\r
+ ~SportMenuPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void InitBackgroundView();\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UIScrollView *group_{nullptr};\r
+ UIImageView *background_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UISimpleList *sportList_{nullptr};\r
+ SportMenuItem sportMenu_[SPORT_TYPE_MAX] = {\r
+ {IMAGE_SPORT_ITEMBG1, IMAGE_SPORT_OUTDOOR_RUNNING1, "户外跑步", SPORT_ITEM_OUTDOOR_RUNNING},\r
+ {IMAGE_SPORT_ITEMBG2, IMAGE_SPORT_INDOOR_RUNNING1, "室内跑步", SPORT_ITEM_INDOOR_RUNNING},\r
+ {IMAGE_SPORT_ITEMBG3, IMAGE_SPORT_CYCLING1, "骑行", SPORT_ITEM_CYCLING},\r
+ {IMAGE_SPORT_ITEMBG4, IMAGE_SPORT_CLIMBING1, "登山", SPORT_ITEM_CLIMBING},\r
+ {IMAGE_SPORT_ITEMBG6, IMAGE_SPORT_INDOOR_SWIMMING1, "室内游泳", SPORT_ITEM_INDOOR_SWIMMING},\r
+ {IMAGE_SPORT_ITEMBG5, IMAGE_SPORT_OUTDOOR_SWIMMING1, "户外游泳", SPORT_ITEM_OUTDOOR_SWIMMING}};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_MENU_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMistouchPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_MISTOUCH_PAGE_H\r
+#define SPORT_MISTOUCH_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_MISTOUCH_SCREEN_BUTTON = "sportMistouchScreenButton";\r
+const char* SPORT_MISTOUCH_CROWN_BUTTON = "sportMistouchCrownButton";\r
+\r
+class SportMistouchPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportMistouchPage() {}\r
+ ~SportMistouchPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ UIScrollView* group_ = nullptr;\r
+ UILabel* title_ = nullptr;\r
+ UIImageView* bgScreen_ = nullptr;\r
+ UIToggleButton* buttonScreen_ = nullptr;\r
+ UILabel* titleScreen_ = nullptr;\r
+ UIImageView* imageScreen_ = nullptr;\r
+ UIImageView* bgCrown_ = nullptr;\r
+ UIToggleButton* buttonCrown_ = nullptr;\r
+ UILabel* titleCrown_ = nullptr;\r
+ UIImageView* imageCrown_ = nullptr;\r
+ UILabel* textScreen_ = nullptr;\r
+ UILabel* textCrown_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_MISTOUCH_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportModel\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_MODEL_H\r
+#define SPORT_MODEL_H\r
+\r
+#include <vector>\r
+#if defined(_WIN32)\r
+#include "animator/animator.h"\r
+#define SPORT_CONFIG_PATH\r
+#else\r
+#define SPORT_CONFIG_PATH "/user/data/"\r
+#include "ohos_timer.h"\r
+#include "graphic_timer.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+enum SportType : uint8_t {\r
+ SPORT_TYPE_OUTDOOR_RUNNING = 0,\r
+ SPORT_TYPE_INDOOR_RUNNING,\r
+ SPORT_TYPE_CYCLING,\r
+ SPORT_TYPE_CLIMBING,\r
+ SPORT_TYPE_INDOOR_SWIMMING,\r
+ SPORT_TYPE_OUTDOOR_SWIMMING,\r
+ SPORT_TYPE_MAX,\r
+};\r
+\r
+enum SportSetType : uint8_t {\r
+ SPORT_SET_TYPE_TARGET = 0, // 设置项(目标)和提示类型共用\r
+ SPORT_SET_TYPE_REMIND, // 设置项(提醒)和提示类型共用\r
+ SPORT_SET_TYPE_MISTOUCH, // 设置项(防误触)\r
+ SPORT_SET_TYPE_MAX = 3, // 设置项最大值\r
+ SPORT_SET_TYPE_HEARTRATE, // 只用于心率提示类型\r
+};\r
+\r
+enum SportTarget : uint8_t {\r
+ SPORT_TARGET_DISTANCE = 0,\r
+ SPORT_TARGET_TIME,\r
+ SPORT_TARGET_CALORIE,\r
+ SPORT_TARGET_MAX,\r
+};\r
+\r
+enum SportRemind : uint8_t {\r
+ SPORT_REMIND_INTERVAL = 0,\r
+ SPORT_REMIND_HEARTRATE,\r
+ SPORT_REMIND_MAX,\r
+};\r
+\r
+enum SportRemindInterval : uint8_t {\r
+ SPORT_REMIND_INTERVAL_NONE = 0,\r
+ SPORT_REMIND_INTERVAL_DISTANCE,\r
+ SPORT_REMIND_INTERVAL_TIME,\r
+ SPORT_REMIND_INTERVAL_MAX,\r
+};\r
+\r
+enum SportRemindHeartRate : uint8_t {\r
+ SPORT_REMIND_HEARTRATE_ENABLE = 0,\r
+ SPORT_REMIND_HEARTRATE_RANGE,\r
+ SPORT_REMIND_HEARTRATE_MAX,\r
+};\r
+\r
+enum SportHeartRateRange : uint8_t {\r
+ SPORT_HEARTRATE_RANGE_ITEM1 = 0,\r
+ SPORT_HEARTRATE_RANGE_ITEM2,\r
+ SPORT_HEARTRATE_RANGE_ITEM3,\r
+ SPORT_HEARTRATE_RANGE_ITEM4,\r
+ SPORT_HEARTRATE_RANGE_MAX,\r
+};\r
+\r
+enum GpsSignal : uint8_t {\r
+ SPORT_GPS_SIGNAL0 = 0,\r
+ SPORT_GPS_SIGNAL1,\r
+ SPORT_GPS_SIGNAL2,\r
+ SPORT_GPS_SIGNAL3,\r
+};\r
+\r
+enum SportAction : uint8_t {\r
+ SPORT_ACTION_START = 1,\r
+ SPORT_ACTION_PAUSE = 2,\r
+ SPORT_ACTION_RESUME = 3,\r
+ SPORT_ACTION_STOP = 4,\r
+};\r
+\r
+enum SportConfig : uint8_t {\r
+ SPORT_CONFIG_INFO = 1,\r
+ SPORT_CONFIG_RECORD = 2,\r
+};\r
+\r
+typedef struct sport_control {\r
+ uint8_t action;\r
+ uint8_t type;\r
+} sport_control_t;\r
+\r
+typedef struct sport_data {\r
+ uint8_t type; // 运动类型\r
+ uint16_t heartRate; // 心率\r
+ uint16_t calorie; // 卡路里\r
+ uint16_t altitude; // 高度\r
+ uint16_t ascent; // 海拔上升\r
+ uint16_t descent; // 海拔下降\r
+ uint32_t distance; // 运动距离\r
+ uint32_t lap; // 室内游泳趟数\r
+ uint32_t startTime; // 运动开始时间\r
+ uint32_t endTime; // 运动结束时间\r
+ uint32_t elapsedTime; // 运动总耗时\r
+} sport_data_t;\r
+\r
+typedef struct sport_info {\r
+ SportSetType setType; // 当前设置项类型(目标或提醒)\r
+ SportSetType promptType; // 当前提醒项类型\r
+ bool isTargetSetted; // 是否已设置过目标\r
+ SportTarget targetType; // 目标类型\r
+ SportTarget targetTypeTemp; // 临时目标类型,用于恢复没有成功设置目标类型时\r
+ uint16_t targetValue; // 设置的目标值,在Picker中选择的值\r
+ bool targetHalf; // 是否达到一半目标\r
+ bool targetComplete; // 是否达成半目标\r
+ bool isRemindSetted; // 是否已设置过提醒\r
+ SportRemindInterval remindType; // 提醒类型\r
+ SportRemindInterval remindTypeTemp; // 临时提醒类型,用于恢复没有成功设置提醒类型时\r
+ uint16_t remindIndex; // 提醒的索引值,在Picker中的索引值\r
+ uint16_t remindValue; // 设置的提醒值,在Picker中选择的值\r
+ uint16_t remindTimes; // 已经提醒的次数\r
+ bool enableHeartRemind; // 是否开启心率提醒\r
+ bool isHeartReminded; // 同区间的心率值是否已经提醒过\r
+ SportHeartRateRange heartRange; // 设置的心率提醒区间\r
+ bool enableScreenLock; // 是否开启屏幕锁定\r
+ bool enableCrownLock; // 是否开启表冠锁定\r
+ uint32_t startTimeTemp; // 用于暂停时再继续运动时计算运动耗时\r
+ sport_data_t data; // 各项运动数据\r
+} sport_info_t;\r
+\r
+std::string GetCurrentTimeStr();\r
+std::string ConvertDistance(uint32_t distance);\r
+std::string FormatSportTime(uint32_t uiSportTime);\r
+std::string CalculateSpeed(uint32_t distance, uint32_t time);\r
+const char *GetHeartRateRangeDescription(uint8_t range);\r
+uint16_t GetHeartRateRangeBounder(uint8_t index);\r
+\r
+class SportModel {\r
+public:\r
+ enum class SportState : uint8_t { STOPPED, RUNNING, PAUSED };\r
+ static SportModel &GetInstance(void);\r
+ void SetSportType(SportType sportType);\r
+ SportType GetSportType(void);\r
+ void SetTargetValue(uint16_t index);\r
+ void SetRemindValue(uint16_t index);\r
+ void SetGpsSignal(GpsSignal gpsSignal);\r
+ GpsSignal GetGpsSignal(void);\r
+ uint16_t GetHeartRate(void);\r
+ sport_info_t *GetSportInfo(SportType type);\r
+ sport_info_t *GetCurrSportInfo();\r
+ uint32_t GetElapsedTime();\r
+ void StartSport(bool startedByWatch);\r
+ void PauseAndReport(bool isReport);\r
+ void ResumeAndReport(bool isReport);\r
+ void StopAndReport(bool isReport);\r
+ void AddRecord();\r
+ void ClearRecord();\r
+ std::vector<sport_data_t> &GetRecord();\r
+ bool IsStartByWatch();\r
+ void LoadConfig();\r
+ void SaveConfig(uint8_t config);\r
+ void ClearData();\r
+\r
+private:\r
+ SportModel();\r
+ SportModel(const SportModel &);\r
+ SportModel &operator=(const SportModel &);\r
+ virtual ~SportModel();\r
+ SportType curSport_;\r
+ sport_info_t info_[SPORT_TYPE_MAX];\r
+ GpsSignal gpsSignal_;\r
+ bool isStartByWatch_{false};\r
+ SportState state_;\r
+ std::vector<sport_data_t> records_;\r
+#if defined(_WIN32)\r
+ class SportAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ SportAnimatorCallback() {}\r
+ virtual ~SportAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+\r
+ private:\r
+ };\r
+ SportAnimatorCallback *callback_{nullptr};\r
+ Animator *animator_{nullptr};\r
+#else\r
+ GraphicTimer *generateDataHandle_{nullptr};\r
+ void InitGenerateSportData();\r
+ void StartGenerateSportData();\r
+ void StopGenerateSportData();\r
+#endif\r
+};\r
+}\r
+\r
+#endif // SPORT_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPausePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_PAUSE_PAGE_H\r
+#define SPORT_PAUSE_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_PAUSE_CONTINUE_BUTTON = "sportPauseContinueButton";\r
+const char* SPORT_PAUSE_FINISH_BUTTON = "sportPauseFinishButton";\r
+\r
+class SportPausePage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportPausePage() {}\r
+ ~SportPausePage();\r
+ void OnStart(void* data) override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIButton(void);\r
+ class SportPauseAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ SportPauseAnimatorCallback() {}\r
+ virtual ~SportPauseAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ };\r
+ SportPauseAnimatorCallback* callback_{nullptr};\r
+ Animator* animator_{nullptr};\r
+ UIViewGroup *group_{nullptr};\r
+ UILabel *timeLabel_{nullptr};\r
+ UILabel *textLabel_{nullptr};\r
+ UILabelButton *continueButton_{nullptr};\r
+ UILabelButton *finishButton_{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_PAUSE_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPreparePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_PREPARE_PAGE_H\r
+#define SPORT_PREPARE_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_PREPARE_GO_BUTTON = "sportPrepareGoButton";\r
+\r
+class SportPreparePage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportPreparePage() {}\r
+ ~SportPreparePage();\r
+ void OnStart(void* data) override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void InitGpsSignalImage();\r
+ void InitBackgroundView();\r
+ void InitBatteryView();\r
+ void InitHeartbeatView();\r
+ void InitTimeLableVIew();\r
+ void InitCenterView();\r
+ void InitGPSView();\r
+ void InitHeartRateView();\r
+ void InitGoButtonView();\r
+ class SportPrepareAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ SportPrepareAnimatorCallback(SportPreparePage* page):page_(page) {}\r
+ virtual ~SportPrepareAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ SportPreparePage* page_{nullptr};\r
+ };\r
+ SportPrepareAnimatorCallback* callback_{nullptr};\r
+ Animator* animator_{nullptr};\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *background_{nullptr};\r
+ UILabel *timeLabel_{nullptr};\r
+ UIImageView *batteryIcon_{nullptr};\r
+ UILabel *batteryLabel_{nullptr};\r
+ UILabel *locatingLabel_{nullptr};\r
+ UIImageView *gpsImageView_{nullptr};\r
+ UIImageView *gpsSignalView_{nullptr};\r
+ UIImageView *heartRateImageView_{nullptr};\r
+ UILabel *heartRateLabel_{nullptr};\r
+ UILabelButton *goButton_{nullptr};\r
+ UIImageView *iconImageView_{nullptr};\r
+ time_t startTime_{0};\r
+ bool isOverTime_{false};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_PREPARE_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPresenter\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_PRESENTER_H\r
+#define SPORT_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class SportView;\r
+class SportPresenter : public Presenter<SportView> {};\r
+}\r
+\r
+#endif // SPORT_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPromptPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_PROMPT_PAGE_H\r
+#define SPORT_PROMPT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_PROMPT_CANCEL_BUTTON = "sportPromptCancelButton";\r
+const char* SPORT_PROMPT_CONFIRM_BUTTON = "sportPromptConfirmButton";\r
+\r
+class SportPromptPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportPromptPage() {}\r
+ ~SportPromptPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIButton(void);\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *promptIcon_{nullptr};\r
+ UILabel *promptLabel_{nullptr};\r
+ UIButton *cancelButton_{nullptr};\r
+ UIButton *confirmButton_{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_PROMPT_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindHeartRateItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_HEART_RATE_ITEM_VIEW_H\r
+#define SPORT_REMIND_HEART_RATE_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t itemId;\r
+ int iconId;\r
+ const char *label;\r
+ const char *viewId;\r
+} SportRemindHeartRateItem;\r
+\r
+class SportRemindHeartRateItemView : public UIViewGroup {\r
+public:\r
+ SportRemindHeartRateItemView();\r
+ ~SportRemindHeartRateItemView() override;\r
+\r
+ virtual void SetItemInfo(const SportRemindHeartRateItem &itemInfo);\r
+\r
+private:\r
+ UIImageView bgImage_;\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ UILabel hits_;\r
+ UIToggleButton button_;\r
+ UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindHeartRatePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_HEART_RATE_PAGE_H\r
+#define SPORT_REMIND_HEART_RATE_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_view_group.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_sport.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportRemindHeartRateItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_REMIND_HEARTRATE_ITEM_ENABLE = "sportRemindHeartRateItemEnable";\r
+const char* SPORT_REMIND_HEARTRATE_ITEM_RANGE = "sportRemindHeartRateItemRange";\r
+\r
+class SportRemindHeartRatePage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportRemindHeartRatePage();\r
+ ~SportRemindHeartRatePage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UIViewGroup *group_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UISimpleList *remindHeartRateList_{nullptr};\r
+ SportRemindHeartRateItem remindHeartRates_[SPORT_REMIND_HEARTRATE_MAX] = {\r
+ {SPORT_REMIND_HEARTRATE_ENABLE, IMAGE_SPORT_HEARTRATE, "心率提醒", SPORT_REMIND_HEARTRATE_ITEM_ENABLE},\r
+ {SPORT_REMIND_HEARTRATE_RANGE, IMAGE_SPORT_HEARTRATE, "心率范围", SPORT_REMIND_HEARTRATE_ITEM_RANGE}};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_REMIND_HEART_RATE_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindIntervalItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_INTERVAL_ITEM_VIEW_H\r
+#define SPORT_REMIND_INTERVAL_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t itemId;\r
+ int iconId;\r
+ const char *label;\r
+ const char *viewId;\r
+} SportRemindIntervalItem;\r
+\r
+class SportRemindIntervalItemView : public UIViewGroup {\r
+public:\r
+ SportRemindIntervalItemView();\r
+ ~SportRemindIntervalItemView() override;\r
+\r
+ virtual void SetItemInfo(const SportRemindIntervalItem &itemInfo);\r
+\r
+private:\r
+ UIImageView bgImage_;\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindIntervalPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_INTERVAL_PAGE_H\r
+#define SPORT_REMIND_INTERVAL_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_sport.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportRemindIntervalItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_REMIND_INTERVAL_ITEM_DISTANCE = "sportRemindIntervalItemDistance";\r
+const char* SPORT_REMIND_INTERVAL_ITEM_TIME = "sportRemindIntervalItemTime";\r
+const char* SPORT_REMIND_INTERVAL_ITEM_NONE = "sportRemindIntervalItemNone";\r
+\r
+class SportRemindIntervalPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportRemindIntervalPage();\r
+ ~SportRemindIntervalPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void InitBackgroundView();\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UIScrollView *group_{nullptr};\r
+ UIImageView *background_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UISimpleList *remindIntervalList_{nullptr};\r
+ SportRemindIntervalItem remindIntervals_[SPORT_REMIND_INTERVAL_MAX] = {\r
+ {SPORT_REMIND_INTERVAL_DISTANCE, IMAGE_SPORT_DISTANCE, "距离", SPORT_REMIND_INTERVAL_ITEM_DISTANCE},\r
+ {SPORT_REMIND_INTERVAL_TIME, IMAGE_SPORT_TIME, "时间", SPORT_REMIND_INTERVAL_ITEM_TIME},\r
+ {SPORT_REMIND_INTERVAL_NONE, IMAGE_SPORT_NONE, "无提醒", SPORT_REMIND_INTERVAL_ITEM_NONE}};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_REMIND_INTERVAL_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_ITEM_VIEW_H\r
+#define SPORT_REMIND_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t itemId;\r
+ int iconId;\r
+ const char *label;\r
+ const char *viewId;\r
+} SportRemindItem;\r
+\r
+class SportRemindItemView : public UIViewGroup {\r
+public:\r
+ SportRemindItemView();\r
+ ~SportRemindItemView() override;\r
+\r
+ virtual void SetItemInfo(const SportRemindItem &itemInfo);\r
+\r
+private:\r
+ UIImageView bgImage_;\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ UILabel hits_;\r
+ UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_REMIND_PAGE_H\r
+#define SPORT_REMIND_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_sport.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportRemindItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_REMIND_ITEM_INTERVAL = "sportRemindItemInterval";\r
+const char* SPORT_REMIND_ITEM_HEARTRATE = "sportRemindItemHeartRate";\r
+\r
+class SportRemindPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportRemindPage();\r
+ ~SportRemindPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void InitBackgroundView();\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *background_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UISimpleList *remindList_{nullptr};\r
+ SportRemindItem reminds_[SPORT_REMIND_MAX] = {\r
+ {SPORT_REMIND_INTERVAL, IMAGE_SPORT_INTERVAL, "间隔提醒", SPORT_REMIND_ITEM_INTERVAL},\r
+ {SPORT_REMIND_HEARTRATE, IMAGE_SPORT_HEARTRATE, "心率提醒", SPORT_REMIND_ITEM_HEARTRATE}};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_REMIND_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportSettingsItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_SETTINGS_ITEM_VIEW_H\r
+#define SPORT_SETTINGS_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t itemId;\r
+ int iconId;\r
+ const char *label;\r
+ const char *viewId;\r
+} SportSettingsItem;\r
+\r
+class SportSettingsItemView : public UIViewGroup {\r
+public:\r
+ SportSettingsItemView();\r
+ ~SportSettingsItemView() override;\r
+\r
+ virtual void SetItemInfo(const SportSettingsItem &itemInfo);\r
+\r
+private:\r
+ UIImageView bgImage_;\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ UILabel hits_;\r
+ UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportSettingsPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_SETTINGS_PAGE_H\r
+#define SPORT_SETTINGS_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_sport.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportSettingsItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SETTINGS_ITEM_TARGET = "settingsItemTarget";\r
+const char* SETTINGS_ITEM_REMIND = "settingsItemTargetRemind";\r
+const char* SETTINGS_ITEM_MISTOUCH = "settingsItemTargetMistouch";\r
+\r
+class SportSettingsPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportSettingsPage();\r
+ ~SportSettingsPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void InitBackgroundView();\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UIScrollView *group_{nullptr};\r
+ UIImageView *background_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UISimpleList *settingList_{nullptr};\r
+ SportSettingsItem settings_[SPORT_SET_TYPE_MAX] = {\r
+ {SPORT_SET_TYPE_TARGET, IMAGE_SPORT_TARGET, "目标", SETTINGS_ITEM_TARGET},\r
+ {SPORT_SET_TYPE_REMIND, IMAGE_SPORT_REMIND, "提醒", SETTINGS_ITEM_REMIND},\r
+ {SPORT_SET_TYPE_MISTOUCH, IMAGE_SPORT_MISTOUCH, "防误触", SETTINGS_ITEM_MISTOUCH},\r
+ };\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_SETTINGS_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_TARGET_ITEM_VIEW_H\r
+#define SPORT_TARGET_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t itemId;\r
+ int iconId;\r
+ const char *label;\r
+ const char *viewId;\r
+} SportTargetItem;\r
+\r
+class SportTargetItemView : public UIViewGroup {\r
+public:\r
+ SportTargetItemView();\r
+ ~SportTargetItemView() override;\r
+\r
+ virtual void SetItemInfo(const SportTargetItem &itemInfo);\r
+\r
+private:\r
+ UIImageView bgImage_;\r
+ UIImageView icon_;\r
+ UILabel label_;\r
+ UIImageView nextImage_;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_TARGET_PAGE_H\r
+#define SPORT_TARGET_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_sport.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+#include "SportTargetItemView.h"\r
+\r
+namespace OHOS {\r
+const char* SPORT_TARGET_ITEM_DISTANCE = "sportTargetItemDistance";\r
+const char* SPORT_TARGET_ITEM_TIME = "sportTargetItemTime";\r
+const char* SPORT_TARGET_ITEM_CALORIE = "sportTargetItemCalorie";\r
+\r
+class SportTargetPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportTargetPage();\r
+ ~SportTargetPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void InitBackgroundView();\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UIScrollView *group_{nullptr};\r
+ UIImageView *background_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UISimpleList *targetList_{nullptr};\r
+ SportTargetItem targets_[SPORT_TARGET_MAX] = {\r
+ {SPORT_TARGET_DISTANCE, IMAGE_SPORT_DISTANCE, "距离", SPORT_TARGET_ITEM_DISTANCE},\r
+ {SPORT_TARGET_TIME, IMAGE_SPORT_TIME, "时间", SPORT_TARGET_ITEM_TIME},\r
+ {SPORT_TARGET_CALORIE, IMAGE_SPORT_CALORIE, "热量", SPORT_TARGET_ITEM_CALORIE}};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_TARGET_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetPromptPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_TARGET_PROMPT_PAGE_H\r
+#define SPORT_TARGET_PROMPT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "animator/animator.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+\r
+class SportTargetPromptPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportTargetPromptPage() {}\r
+ ~SportTargetPromptPage();\r
+ void OnStart(void* data) override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void CreatePromptView(void);\r
+ class SportPromptAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ SportPromptAnimatorCallback(SportTargetPromptPage* page):page_(page) {}\r
+ virtual ~SportPromptAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ SportTargetPromptPage* page_{nullptr};\r
+ };\r
+ SportPromptAnimatorCallback* callback_{nullptr};\r
+ Animator* animator_{nullptr};\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *promptIcon_{nullptr};\r
+ UILabel *promptLabel_{nullptr};\r
+ time_t startTime_{0};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_TARGET_PROMPT_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetSettingPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_TARGET_SETTING_PAGE_H\r
+#define SPORT_TARGET_SETTING_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_picker.h"\r
+#include "SlicePage.h"\r
+#include "SportPresenter.h"\r
+#include "SportModel.h"\r
+\r
+namespace OHOS {\r
+const char* TARGET_SETTING_CONFIRM_BUTTON = "targetSettingConfirmButton";\r
+\r
+class SportTargetSettingPage : public SlicePage<SportPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ public UIPicker::SelectedListener {\r
+public:\r
+ SportTargetSettingPage() {}\r
+ ~SportTargetSettingPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void UpdateViewByTargetType();\r
+ void UpdateViewByRemindType();\r
+ void CreateUILabel(void);\r
+ void CreateUIPicker(void);\r
+ void CreateUIButton(void);\r
+ UIViewGroup *group_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UIPicker *picker_{nullptr};\r
+ UILabelButton *confirmButton_{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORT_TARGET_SETTING_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef SPORT_VIEW_H\r
+#define SPORT_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+enum SportPages : uint8_t {\r
+ SPORT_PAGE_MENU = 1,\r
+ SPORT_PAGE_PREPARE,\r
+ SPORT_PAGE_COUNTDOWN,\r
+ SPORT_PAGE_DATA,\r
+ SPORT_PAGE_PAUSE,\r
+ SPORT_PAGE_PROMPT,\r
+ SPORT_PAGE_SETTINGS,\r
+ SPORT_PAGE_TARGET,\r
+ SPORT_PAGE_TARGET_SETTING,\r
+ SPORT_PAGE_TARGET_PROMPT,\r
+ SPORT_PAGE_REMIND,\r
+ SPORT_PAGE_REMIND_INTERVAL,\r
+ SPORT_PAGE_REMIND_HEARTRATE,\r
+ SPORT_PAGE_HEARTRATE_RANGE,\r
+ SPORT_PAGE_MISTOUCH,\r
+ SPORT_PAGE_MAX,\r
+};\r
+\r
+class SportPresenter;\r
+class SportView : public View<SportPresenter> {};\r
+}\r
+#endif // SPORT_VIEW_H\r
\r
namespace OHOS {\r
typedef struct {\r
+ uint8_t index;\r
std::string record;\r
bool isLatest;\r
} StopwatchItem;\r
public:\r
explicit StopwatchItemView();\r
virtual ~StopwatchItemView() override;\r
- void SetItemInfo(int16_t index, const StopwatchItem &itemInfo);\r
+ void SetItemInfo(const StopwatchItem &itemInfo);\r
\r
private:\r
UILabel nameLabel_;\r
#ifndef STOPWATCH_MODEL_H\r
#define STOPWATCH_MODEL_H\r
\r
-#include "stopwatch/StopwatchItemView.h"\r
#include "gfx_utils/list.h"\r
#ifndef _WIN32\r
#include "time64.h"\r
#endif\r
+#include "StopwatchItemView.h"\r
\r
namespace OHOS {\r
class StopwatchModel {\r
uint64_t GetElapsedTime();\r
uint64_t UpdateElapsedTime();\r
void ResetCounter();\r
- bool GetActiveState();\r
- void SetActiveState();\r
- void SetInactiveState();\r
+ bool GetRunningState();\r
+ void SetRunningState(bool isRunning);\r
+ bool GetRecordListVisible();\r
+ void SetRecordListVisible(bool isVisible);\r
+ bool GetTimeOverRangeState();\r
+ void SetTimeOverRangeState(bool isTimeOverRange);\r
List<StopwatchItem> &GetRecordsList();\r
void AddRecordToList(const StopwatchItem &record);\r
- void ClearData();\r
- bool IsInRecordView();\r
- void SetRecordViewState(bool state);\r
- bool GetOverflowState()\r
- {\r
- return isOverflow_;\r
- }\r
- void SetOverflowState(bool state)\r
- {\r
- isOverflow_ = state;\r
- }\r
-\r
private:\r
StopwatchModel();\r
StopwatchModel(const StopwatchModel &);\r
StopwatchModel &operator=(const StopwatchModel &);\r
#ifdef _WIN32\r
- struct timeval startTime_ {0};\r
+ struct timeval startTime_{0};\r
#else\r
- struct timeval64 startTime_ {0};\r
+ struct timeval64 startTime_{0};\r
#endif\r
- bool isOverflow_{false};\r
- uint64_t uiElapsedTime_{0};\r
- uint64_t uiSavedElapsedTime_{0};\r
- bool bIsActive_{false};\r
- bool bIsRecordView_{false};\r
+ uint64_t elapsedTime_{0};\r
+ uint64_t savedElapsedTime_{0};\r
+ bool isTimeOverRange_{false};\r
+ bool isRunning_{false};\r
+ bool isRecordListVisible_{false};\r
List<StopwatchItem> records_;\r
};\r
}\r
#ifndef STOPWATCH_PAGE_H\r
#define STOPWATCH_PAGE_H\r
\r
-#include "UiConfig.h"\r
-#include "SlicePage.h"\r
-#include "stopwatch/StopwatchPresenter.h"\r
-#include "stopwatch/StopwatchAdapter.h"\r
-#include "NativeRegisterManager.h"\r
#include "components/ui_view_group.h"\r
#include "components/ui_label.h"\r
-#include "components/ui_list.h"\r
+#include "components/ui_simple_list.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_image_view.h"\r
#include "components/ui_sweep_clock.h"\r
#include "animator/animator.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "NativeRegisterManager.h"\r
+#include "StopwatchPresenter.h"\r
\r
namespace OHOS {\r
-\r
-#define STOPWATCH_APP_NAME "秒表"\r
-\r
class StopwatchPresenter;\r
class StopwatchPage : public SlicePage<StopwatchPresenter>,\r
public UIView::OnClickListener,\r
void OnResume() override;\r
bool OnClick(UIView &view, const ClickEvent &event) override;\r
bool OnDrag(UIView &view, const DragEvent &event) override;\r
- void Overflowing(void);\r
- UISweepClock* GetSweepClock(){return sweepClock_;}\r
- UILabel* GetElapsedTimeLabel(){return elapsedTime_;}\r
private:\r
- void DrawButtonStatusView(bool isActive);\r
- void DrawContainRecordListView(bool isContainRecordList);\r
+ void TimeOverRange(void);\r
+ void DrawButtonStatusView(bool isRunning);\r
+ void DrawRecordListVisibleView(bool isRecordListVisible);\r
void RefreshRecordsList(void);\r
class StopwatchAnimatorCallback : public AnimatorCallback {\r
public:\r
- StopwatchAnimatorCallback(StopwatchPage* page) : stopwatchPage(page) {}\r
+ StopwatchAnimatorCallback(StopwatchPage* page) : page_(page) {}\r
virtual ~StopwatchAnimatorCallback() override {}\r
void Callback(UIView* view) override;\r
private:\r
- StopwatchPage* stopwatchPage{nullptr};\r
+ StopwatchPage* page_{nullptr};\r
};\r
class TimeAnimatorCallback : public AnimatorCallback {\r
public:\r
virtual ~TimeAnimatorCallback() override {}\r
void Callback(UIView* view) override;\r
};\r
- Animator* animator_{nullptr};\r
- StopwatchAnimatorCallback* animatorCallback_{nullptr};\r
- TimeAnimatorCallback* timeCallback_{nullptr};\r
+ Animator* stopwatchAnimator_{nullptr};\r
+ StopwatchAnimatorCallback* stopwatchAnimatorCallback_{nullptr};\r
Animator* timeAnimator_{nullptr};\r
+ TimeAnimatorCallback* timeCallback_{nullptr};\r
UISweepClock *sweepClock_{nullptr};\r
Image *secondHand_{nullptr};\r
UILabel *currentTime_{nullptr};\r
UILabel *appName_{nullptr};\r
UILabel *elapsedTime_{nullptr};\r
- UIList *recordsList_{nullptr};\r
- StopwatchAdapter *listAdapter_{nullptr};\r
+ UISimpleList *recordsList_{nullptr};\r
UILabelButton *startButton_{nullptr};\r
UILabelButton *resetButton_{nullptr};\r
UIImageView *backGround_{nullptr};\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchRecordPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_RECORD_PAGE_H\r
+#define STOPWATCH_RECORD_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_stopwatch.h"\r
+#include "StopwatchPresenter.h"\r
+#include "StopwatchModel.h"\r
+\r
+namespace OHOS {\r
+class StopwatchRecordPage : public SlicePage<StopwatchPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ StopwatchRecordPage() {}\r
+ ~StopwatchRecordPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+private:\r
+ void InitBackgroundView();\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *background_{nullptr};\r
+ UILabel *titleLabel_{nullptr};\r
+ UISimpleList *recordList_{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // STOPWATCH_RECORD_PAGE_H
\ No newline at end of file
#include "View.h"\r
namespace OHOS {\r
enum STOPWATCH_PAGES {\r
- STOPWATCH_MAIN_PAGE = 1, // 0 is invalid\r
+ STOPWATCH_MAIN_PAGE = 1,\r
+ STOPWATCH_RECORD_PAGE,\r
};\r
\r
class StopwatchPresenter;\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerCountDown\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_COUNT_DOWN_H\r
+#define TIMER_COUNT_DOWN_H\r
+\r
+#include <sys/time.h>\r
+#include "View.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_fragment.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "UiConfig.h"\r
+#include "TimerModel.h"\r
+#include "TimerPresenter.h"\r
+#include "SlicePage.h"\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_sweep_clock.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_timer.h"\r
+\r
+namespace OHOS {\r
+class TimerCountDown : public UIFragment,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ void OnResume();\r
+ void OnPause();\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDragStart(UIView& view, const DragEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
+ void CreateButton();\r
+ void CreateTimerTime();\r
+ void CircleProgress();\r
+ void SetTimerTime(int64_t durationTime);\r
+ void InitAnimator();\r
+ void SetAnimatorStatus(bool status);\r
+ void RefreshFragment();\r
+\r
+private:\r
+ void OnCreateView(void* data) override;\r
+ void OnDestroyView() override;\r
+ class TimeAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ TimeAnimatorCallback() {}\r
+ virtual ~TimeAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+ };\r
+\r
+ class TimerCountDownCallback : public AnimatorCallback {\r
+ public:\r
+ explicit TimerCountDownCallback(TimerCountDown *page) : page_(page) {}\r
+ ~TimerCountDownCallback() override {}\r
+ void Callback(UIView *view) override;\r
+\r
+ private:\r
+ TimerCountDown *page_{nullptr};\r
+ };\r
+\r
+ UILabel *labelTitle_{nullptr};\r
+ UIDigitalClock *timerClock_{nullptr};\r
+ UIImageView *startOrPauseImg_{nullptr};\r
+ UIImageView *resetOrExitImg_{nullptr};\r
+ UICircleProgress *circleProgress_{nullptr};\r
+ UILabel *currentTime_{nullptr};\r
+ TimeAnimatorCallback *currentTimeCallback_{nullptr};\r
+ Animator *currentTimeAnimator_{nullptr};\r
+ TimerCountDownCallback *countDownTimecallBack_ = nullptr;\r
+ Animator *countDownTimeanimator_ = nullptr;\r
+ UIImageView *bgImg_{nullptr};\r
+};\r
+}\r
+#endif // TIMER_TIMING_PAGE_H
\ No newline at end of file
#include "UiConfig.h"\r
#include "ChangeSliceListener.h"\r
#include "components/ui_image_view.h"\r
-#include "timers/TimerPresenter.h"\r
-#include "timers/TimerModel.h"\r
+#include "TimerPresenter.h"\r
+#include "TimerModel.h"\r
#include "SlicePage.h"\r
#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
#include "ui_resource_timer.h"\r
+#include "timers/TimerCountDown.h"\r
\r
namespace OHOS {\r
+static constexpr uint8_t SELECT_IMAGE_COUNT = 4;\r
+\r
class TimerMainPage : public SlicePage<TimerPresenter>,\r
public UIView::OnClickListener,\r
public UIView::OnDragListener {\r
public:\r
- TimerMainPage() = default;\r
+ TimerMainPage();\r
~TimerMainPage() override;\r
-\r
+ void OnResume() override;\r
+ void OnPause() override;\r
void OnStart(void *data) override;\r
bool OnClick(UIView &view, const ClickEvent &event) override;\r
bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ static TimerMainPage *GetInstance(void);\r
+ void ShowMainPage();\r
void LabelTitle();\r
void CreateButton();\r
void InitView();\r
\r
private:\r
- UIScrollView *group{nullptr};\r
- UIImageView *selectMin[4]{nullptr}; // 分钟计时\r
- UIImageView *addButton{nullptr}; // 自定义按钮\r
- UILabel *title{nullptr}; // 计时器\r
- UIImageView *backround{nullptr};\r
+ UIScrollView *group_{nullptr};\r
+ UIImageView *selectMin_[SELECT_IMAGE_COUNT]{nullptr};\r
+ UIImageView *addButton_{nullptr};\r
+ UILabel *labelTitle_{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ TimerCountDown *countDownFragment_{nullptr};\r
};\r
}\r
#endif // TIMER_MAIN_PAGE_H
\ No newline at end of file
#include <mutex>\r
#include "AppViewIDs.h"\r
#include "UiConfig.h"\r
-#include "timers/TimerPresenter.h"\r
+#include "TimerPresenter.h"\r
#include "graphic_timer.h"\r
#include "ohos_timer.h"\r
\r
namespace OHOS {\r
- class TimerModel {\r
- public:\r
- static TimerModel &GetInstance(void);\r
+class TimerModel {\r
+public:\r
+ static TimerModel &GetInstance(void);\r
\r
- void SetDurationTime(uint32_t time); // 设置计时器的总时间\r
- uint32_t GetDurationTime(); // 获取计时器的总时间\r
- bool GetIsTiming() { return isTiming; }\r
- void SetIsTiming(bool value) { isTiming = value; }\r
- bool GetIsPause() { return isPause; }\r
- void SetIsPause(bool value) { isPause = value; }\r
- uint32_t GetStartTime() { return start_time; };\r
- void SetStartTime(uint32_t value) { start_time = value; };\r
- uint32_t GetSaveTime();\r
- void SetSaveTime(bool falg, uint32_t value);\r
-\r
- void InitTimer();\r
- void DisableTimer();\r
- bool GetExistTimer() { return haveTimer; };\r
- void SetExistTimer(bool value) { haveTimer = value; };\r
+ void SetTotalTime(uint64_t time); // 设置计时器的总时间\r
+ uint64_t GetTotalTime(); // 获取计时器的总时间\r
+ bool GetIsShowFragment()\r
+ {\r
+ return isShowFragment_;\r
+ }\r
+ void SetIsShowFragment(bool value)\r
+ {\r
+ isShowFragment_ = value;\r
+ }\r
+ bool GetIsCountDown()\r
+ {\r
+ return isCountDown_;\r
+ }\r
+ void SetIsCountDown(bool value)\r
+ {\r
+ isCountDown_ = value;\r
+ }\r
+ bool GetIsPause()\r
+ {\r
+ return isPause_;\r
+ }\r
+ void SetIsPause(bool value)\r
+ {\r
+ isPause_ = value;\r
+ }\r
+ uint64_t GetStartTime()\r
+ {\r
+ return startTime_;\r
+ };\r
+ void SetStartTime(uint64_t value)\r
+ {\r
+ startTime_ = value;\r
+ };\r
+ uint64_t GetEclipseTime();\r
+ void SetEclipseTime(bool flag, uint64_t value);\r
\r
- private:\r
- TimerModel();\r
- virtual ~TimerModel();\r
- TimerModel(const TimerModel &) = delete;\r
- TimerModel &operator=(const TimerModel &) = delete;\r
- uint32_t start_time;\r
- uint32_t save_time;\r
- uint32_t durationTime = 0;\r
- GraphicTimer *g_startCounting = nullptr; // 定时器\r
- bool haveTimer = false;\r
- bool isTiming = false;\r
- bool isPause = false;\r
+ void InitTimer();\r
+ void DisableTimer();\r
+ bool GetExistTimer()\r
+ {\r
+ return haveTimer_;\r
};\r
+ void SetExistTimer(bool value)\r
+ {\r
+ haveTimer_ = value;\r
+ };\r
+\r
+private:\r
+ TimerModel();\r
+ virtual ~TimerModel();\r
+ TimerModel(const TimerModel &) = delete;\r
+ TimerModel &operator=(const TimerModel &) = delete;\r
+ uint64_t startTime_;\r
+ uint64_t eclipseTime_;\r
+ uint64_t totalTime_ = 0;\r
+ GraphicTimer *startCounting_ = nullptr; // 定时器\r
+ bool haveTimer_ = false;\r
+ bool isCountDown_ = false;\r
+ bool isPause_ = false;\r
+ bool isShowFragment_ = false;\r
+};\r
}\r
\r
#endif // TIMER_MODEL_H
\ No newline at end of file
#include "components/ui_view.h"\r
\r
namespace OHOS {\r
-\r
-#define SETTING_TIMER "setting_timer"\r
-#define STOPWATCH_RESET "stopwatch_reset"\r
-#define ONE_MIN "onemine"\r
-#define THREE_MIN "threemine"\r
-#define FIFTY_MIN "fiftymine"\r
-#define THIRTY_MIN "thirtymine"\r
-#define BACK_TIMER "backtimer"\r
-#define RESET "reset"\r
-#define START_PAUSE "start_pause"\r
-#define START_TIMING "start_timing"\r
-\r
- class TimerView;\r
- class TimerPresenter : public Presenter<TimerView> {\r
- };\r
+class TimerView;\r
+class TimerPresenter : public Presenter<TimerView> {};\r
}\r
\r
-#endif // TIMER_PRESENTER_H
\ No newline at end of file
+#endif // TIMER_PRESENTER_H
\ No newline at end of file
#include "components/ui_label_button.h"\r
#include "components/ui_scroll_view.h"\r
#include "UiConfig.h"\r
-#include "timers/TimerPresenter.h"\r
-#include "timers/TimerModel.h"\r
+#include "TimerPresenter.h"\r
+#include "TimerModel.h"\r
#include "SlicePage.h"\r
#include "ChangeSliceListener.h"\r
+#include "main/LoadImg.h"\r
#include "ui_resource_timer.h"\r
\r
namespace OHOS {\r
+static constexpr uint8_t PICKER_COUNT = 3;\r
class TimerSettingPage : public UIPicker::SelectedListener,\r
public SlicePage<TimerPresenter>,\r
public UIView::OnClickListener,\r
public UIView::OnDragListener {\r
public:\r
- TimerSettingPage() = default;\r
+ TimerSettingPage();\r
~TimerSettingPage() override;\r
\r
void OnStart(void *data) override;\r
void OnPickerStoped(UIPicker& picker) override;\r
\r
private:\r
- UIScrollView *group{nullptr};\r
- UIButton *back{nullptr};\r
- UILabel *title{nullptr};\r
- UIImageView *start{nullptr};\r
-\r
- UILabel *timerLabel{nullptr};\r
- UIPicker *timerPicker[3]{nullptr};\r
- ImageInfo *image1 = nullptr;\r
- ImageInfo *image2 = nullptr;\r
+ UIScrollView *group_{nullptr};\r
+ UILabel *labelTitle_{nullptr};\r
+ UIImageView *startImg_{nullptr};\r
+ UILabel *labelUnit_{nullptr};\r
+ UIPicker *timerPicker_[PICKER_COUNT]{nullptr};\r
};\r
}\r
#endif // TIMER_SETTING_PAGE_H
\ No newline at end of file
#include "View.h"\r
\r
namespace OHOS {\r
- enum TIMER_PAGES {\r
- TIMER_MAIN_PAGE = 1, // 主页面\r
- TIMER_SETTING_PAGE, // 自定义页面\r
- TIMER_TIMING_PAGE, // 显示计时页面\r
- TIMER_ALL_VIEW,\r
- };\r
+enum TIMER_PAGES {\r
+ TIMER_MAIN_PAGE = 1, // 主页面\r
+ TIMER_SETTING_PAGE, // 自定义页面\r
+ TIMER_TIMING_PAGE, // 显示计时页面\r
+ TIMER_ALL_VIEW,\r
+};\r
\r
- class TimerPresenter;\r
- class TimerView : public View<TimerPresenter> {\r
- };\r
+class TimerPresenter;\r
+class TimerView : public View<TimerPresenter> {};\r
}\r
-#endif // TIMER_VIEW_H\r
+#endif // TIMER_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_MAIN_PAGE_H\r
+#define UISAMPLE_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "ChangeSliceListener.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_timer.h"\r
+#include "uisample/UISamplePresenter.h"\r
+#include "ui_test_group.h"\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class UISampleMainPage : public SlicePage<UISamplePresenter>, public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ UISampleMainPage();\r
+ ~UISampleMainPage() override;\r
+ static UISampleMainPage* GetInstance(void);\r
+\r
+ void OnStart(void *data) override;;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+private:\r
+ void CreateTitle();\r
+ void CreateMainList();\r
+\r
+ UIScrollView* container_ = nullptr;\r
+ UILabel *title_ = nullptr;\r
+ UISimpleList* mainList_ = nullptr;\r
+};\r
+} // OHOS\r
+#endif // UISAMPLE_MAIN_PAGE_H
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingModel.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef UISAMPLE_MODEL_H
-#define UISAMPLE_MODEL_H
-
-#include <cstdint>
-#include <map>
-#include "AppViewIDs.h"
-#include "UiConfig.h"
-#include "uisample/UISamplePresenter.h"
-
-namespace OHOS {
- class UISampleModel {
- public:
- static UISampleModel &GetInstance(void);
-
- private:
- UISampleModel();
- UISampleModel(const UISampleModel &);
- UISampleModel &operator=(const UISampleModel &);
- virtual ~UISampleModel();
- };
-}
-
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_MODEL_H\r
+#define UISAMPLE_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "uisample/UISamplePresenter.h"\r
+\r
+namespace OHOS {\r
+ class UISampleModel {\r
+ public:\r
+ static UISampleModel &GetInstance(void);\r
+\r
+ private:\r
+ UISampleModel();\r
+ UISampleModel(const UISampleModel &);\r
+ UISampleModel &operator=(const UISampleModel &);\r
+ virtual ~UISampleModel();\r
+ };\r
+}\r
+\r
#endif // UISAMPLE_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_OPEN_HARMONY_PAGE_H\r
+#define UISAMPLE_OPEN_HARMONY_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_timer.h"\r
+#include "uisample/UISamplePresenter.h"\r
+#include "ui_test_group.h"\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class UISampleNativeTestCasePage : public SlicePage<UISamplePresenter>, public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ UISampleNativeTestCasePage();\r
+ ~UISampleNativeTestCasePage() override;\r
+ static UISampleNativeTestCasePage *GetInstance(void);\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+\r
+private:\r
+ void CreateTitle();\r
+ void CreateMainList();\r
+ void CreateBackButton();\r
+ bool BackMenuPage(UIView& view);\r
+\r
+ UIScrollView* container_ = nullptr;\r
+ UILabel *title_{nullptr};\r
+ UISimpleList* mainList_ = nullptr;\r
+ UIButton* backBtn_{nullptr};\r
+ bool isInTestCase_ = false;\r
+};\r
+} // OHOS\r
+#endif // UISAMPLE_OPEN_HARMONY_PAGE_H
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef UISAMPLE_PRESENTER_H
-#define UISAMPLE_PRESENTER_H
-
-#include "Presenter.h"
-#include "components/ui_view.h"
-
-namespace OHOS {
-class UISampleView;
-class UISampleModel;
-class UISamplePresenter : public Presenter<UISampleView> {
-public:
- UISamplePresenter();
- ~UISamplePresenter() override;
-
- void OnResume() override;
- void OnPause() override;
-
-private:
- UISampleModel *uisampleModel;
-};
-}
-
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_PRESENTER_H\r
+#define UISAMPLE_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+class UISampleView;\r
+class UISampleModel;\r
+class UISamplePresenter : public Presenter<UISampleView> {\r
+public:\r
+ UISamplePresenter();\r
+ ~UISamplePresenter() override;\r
+\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+\r
+private:\r
+ UISampleModel *uisampleModel_;\r
+};\r
+}\r
+\r
#endif // UISAMPLE_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_HISI_PAGE_H\r
+#define UISAMPLE_HISI_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_simple_list.h"\r
+#include "SlicePage.h"\r
+#include "ui_resource_timer.h"\r
+#include "uisample/UISamplePresenter.h"\r
+#include "ui_test_group.h"\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+class UISampleProprietaryTestCasePage : public SlicePage<UISamplePresenter>, public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ UISampleProprietaryTestCasePage();\r
+ ~UISampleProprietaryTestCasePage() override;\r
+ static UISampleProprietaryTestCasePage *GetInstance(void);\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+\r
+private:\r
+ void CreateTitle();\r
+ void CreateMainList();\r
+ void CreateBackButton();\r
+ bool BackMenuPage(UIView& view);\r
+\r
+ UIViewGroup* container_ = nullptr;\r
+ UILabel *title_ = nullptr;\r
+ UISimpleList* mainList_ = nullptr;\r
+ UIButton* backBtn_ = nullptr;\r
+ bool isInTestCase_ = false;\r
+};\r
+} // OHOS\r
+#endif // UISAMPLE_HISI_PAGE_H
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingView.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef UISAMPLE_VIEW_H
-#define UISAMPLE_VIEW_H
-
-#include "View.h"
-#include "components/root_view.h"
-#include "components/ui_view_group.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_label.h"
-#include "components/ui_list.h"
-#include "ChangeSliceListener.h"
-#include "test_case_list_adapter.h"
-#include "UiConfig.h"
-
-namespace OHOS {
-
-class UISamplePresenter;
-
-class UISampleOnDragListener : public UIView::OnDragListener {
-public:
- UISampleOnDragListener() {}
- ~UISampleOnDragListener() override {}
-
- bool OnDrag(UIView& view, const DragEvent& event) override
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISampleOnDragListener::OnDrag");
- UNUSED(view);
- if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
- (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISampleOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
- }
- return false;
- }
-};
-
-class UISampleView : public View<UISamplePresenter> {
-public:
- UISampleView();
- ~UISampleView() override;
-
- static UISampleView *GetInstance();
-
- void OnStart() override;
- void OnStop() override;
- void InitView();
-
-private:
- UIView::OnDragListener *dragListener_ = nullptr;
- UIList* mainList_ = nullptr;
- TestCaseListAdapter* adapter_ = nullptr;
-};
-}
-#endif // UISAMPLE_VIEW_H
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#ifndef UISAMPLE_VIEW_H\r
+#define UISAMPLE_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+enum SAMPLE_PAGES {\r
+ SAMPLE_MAIN_PAGE = 1,\r
+ SAMPLE_PROPRIETARY_TESTCASE_PAGE = 2,\r
+ SAMPLE_NATIVE_TESTCASE_PAGE = 3,\r
+};\r
+\r
+class UISamplePresenter;\r
+class UISampleView : public View<UISamplePresenter> {\r
+};\r
+}\r
+#endif // UISAMPLE_VIEW_H\r
#include "components/ui_view_group.h"\r
#include "components/ui_image_view.h"\r
#include "components/ui_canvas.h"\r
-\r
#include "UiConfig.h"\r
-#include "weather/WeatherModel.h"\r
+#include "WeatherModel.h"\r
\r
namespace OHOS {\r
class WeatherItemView : public UIViewGroup {\r
explicit WeatherItemView();\r
~WeatherItemView() override;\r
virtual void SetItemInfo(const WeatherItem itemInfo);\r
- virtual void SetUpChild();\r
\r
private:\r
- UILabel sLabel_1;\r
- UIImageView sIcon;\r
- UILabel sLabel_2;\r
- UICanvas chartLine;\r
- UIImageView sNextImage;\r
- WeatherItem sItemInfo = {nullptr, nullptr, nullptr, false};\r
+ UILabel labelDay_;\r
+ UIImageView icon_;\r
+ UILabel labelTmp_;\r
+ UICanvas chartLine_;\r
+ UIImageView bgImg_;\r
};\r
}\r
\r
#include "components/ui_scroll_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_list.h"\r
-#include "weather/WeatherAdapter.h"\r
-#include "weather/WeatherPresenter.h"\r
+#include "WeatherPresenter.h"\r
#include "SlicePage.h"\r
#include "UiConfig.h"\r
-#include "weather/WeatherView.h"\r
+#include "WeatherView.h"\r
+\r
namespace OHOS {\r
+static constexpr int16_t LABEL_ADDRESS = 0;\r
+static constexpr int16_t LABEL_TEMP = 1;\r
+static constexpr int16_t LABEL_AIR = 2;\r
+static constexpr int16_t LABEL_HUMIDITY = 3;\r
+static constexpr int16_t LABEL_UPDATETIME = 4;\r
+static constexpr int16_t LABEL_CURRENT_TEMP = 5;\r
static constexpr int16_t LABEL_COUNT = 6;\r
+\r
class WeatherPresenter;\r
class WeatherMainPage : public SlicePage<WeatherPresenter>,\r
public UIView::OnClickListener,\r
public:\r
WeatherMainPage();\r
~WeatherMainPage() override;\r
-\r
+ static WeatherMainPage *GetInstance();\r
void OnStart(void* data) override;\r
bool OnClick(UIView &view, const ClickEvent &event) override;\r
bool OnDrag(UIView& view, const DragEvent& event) override;\r
- std::string FormatTime(bool falg, const std::string& inputStr);\r
- void InitLabel();\r
- void InitImage();\r
- void InitWeatherImage();\r
+ std::string FormatTime(const std::string& inputStr);\r
+ void InitWeatherImage1();\r
+ void InitWeatherImage2();\r
+ void InitWeatherLabel1();\r
+ void InitWeatherLabel2();\r
+ uint8_t GetConnectStatus();\r
+ void ReloadPage();\r
private:\r
- bool flag = false;\r
- int curWeather_code = 0;\r
- CurWeather cur{nullptr};\r
- UIViewGroup *group = nullptr;\r
- WeatherModel *weatherModel = nullptr;\r
- UILabel *title[LABEL_COUNT]{nullptr};\r
- UILabel *labelTitle{nullptr};\r
- UIImageView *mainImg{nullptr};\r
- UIImageView *addressImg{nullptr};\r
- UIImageView *aroundImg = nullptr;\r
- UIImageView *weatherImg{nullptr};\r
- UIImageView *ImageAir{nullptr};\r
- UIImageView *ImageHumidity{nullptr};\r
- UIImageView *ImagePageKey{nullptr};\r
+ bool flag_ = false;\r
+ int curWeatherCode_ = 0;\r
+ CurWeather cur_{nullptr};\r
+ UIViewGroup *group_ = nullptr;\r
+ UILabel *title_[LABEL_COUNT]{nullptr};\r
+ UILabel *labelTitle_{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ UIImageView *addressImg_{nullptr};\r
+ UIImageView *airQualityAndHumidityBgImg_{nullptr};\r
+ UIImageView *weatherImg_{nullptr};\r
+ UIImageView *airQulityImgIcon_{nullptr};\r
+ UIImageView *humidityImgIcon_{nullptr};\r
+ UIImageView *pageIdxImg_{nullptr};\r
};\r
}\r
#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
#include <fstream>\r
#include <sstream>\r
#include <cstdint>\r
+#include <iomanip>\r
#include <map>\r
#include <iostream>\r
#include <random>\r
#include <chrono>\r
#include <ctime>\r
-#include <hal_tick.h>\r
+#include <string>\r
+#include "hal_tick.h"\r
#include "AppViewIDs.h"\r
#include "UiConfig.h"\r
#include "cJSON.h"\r
#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
#include "common/image_cache_manager.h"\r
#include "main/LoadImg.h"\r
#include "ui_resource_weather.h"\r
#ifndef _WIN32\r
#include "time64.h"\r
+#define WEATHER_PATH "/user/app/user/ace/data/com.vendor.Weather/"\r
+#else\r
+#define WEATHER_PATH APP_RES_PATH\r
#endif\r
+\r
namespace OHOS {\r
static constexpr int16_t MIN_TO_HOUR = 60;\r
static constexpr int16_t HOURLY_SYSTEM = 24;\r
-static constexpr int16_t WEATHER_COUNT = 24;\r
+static constexpr int16_t ALL_HOURS_WEATHER_COUNT = 24;\r
static constexpr int16_t WEATHER_HOUR = 12;\r
-static constexpr int16_t SET_ZERO = 0;\r
-static constexpr int16_t SET_ONE = 1;\r
-static constexpr int16_t SET_TWO = 2;\r
-static constexpr int16_t SET_THREE = 3;\r
-static constexpr int16_t SET_FOUR = 4;\r
-static constexpr int16_t SET_FIVE = 5;\r
-static constexpr int16_t SET_SIX = 6;\r
-static constexpr int16_t SET_SEVEN = 7;\r
-static constexpr int16_t SET_EIGHT = 8;\r
-static constexpr int16_t SET_NINE = 9;\r
-static constexpr int16_t SET_TEN = 10;\r
-static constexpr int16_t SET_TWELVE = 12;\r
-static constexpr int16_t SET_FOURTEEN = 14;\r
-static constexpr int16_t SET_HUNDRED = 100;\r
static constexpr int16_t START_YEAR = 1900;\r
-static constexpr int16_t ARRAY_SIZE = 31;\r
-static const uint16_t WEATHER_ITEM_COUNT = 10;\r
+static constexpr int16_t ARRAY_SIZE = 32;\r
+static constexpr uint16_t WEATHER_ITEM_COUNT = 10;\r
+static constexpr uint16_t ONE_WEEK_DYAS = 7;\r
+static constexpr int16_t INDEX_0 = 0;\r
+static constexpr int16_t INDEX_1 = 1;\r
+static constexpr int16_t INDEX_2 = 2;\r
+static constexpr int16_t INDEX_3 = 3;\r
+static constexpr int16_t INDEX_4 = 4;\r
+static constexpr int16_t INDEX_5 = 5;\r
+static constexpr int16_t INDEX_6 = 6;\r
+static constexpr int16_t INDEX_7 = 7;\r
+static constexpr int16_t INDEX_8 = 8;\r
+static constexpr int16_t INDEX_12 = 12;\r
+static constexpr int16_t NUMBER_10 = 10;\r
\r
const int bigWeatherImage[ARRAY_SIZE] = {\r
- IMAGE_CONVERTER_TOOL_WEATHER00, // 0\r
- IMAGE_CONVERTER_TOOL_WEATHER01, // 1\r
- IMAGE_CONVERTER_TOOL_WEATHER02, // 2\r
- IMAGE_CONVERTER_TOOL_WEATHER03, // 3\r
- IMAGE_CONVERTER_TOOL_WEATHER04, // 4\r
- IMAGE_CONVERTER_TOOL_WEATHER05, // 5\r
- IMAGE_CONVERTER_TOOL_WEATHER06, // 6\r
- IMAGE_CONVERTER_TOOL_WEATHER07, // 7\r
- IMAGE_CONVERTER_TOOL_WEATHER08, // 8\r
- IMAGE_CONVERTER_TOOL_WEATHER09, // 9\r
- IMAGE_CONVERTER_TOOL_WEATHER10, // 10\r
- IMAGE_CONVERTER_TOOL_WEATHER11, // 11\r
- IMAGE_CONVERTER_TOOL_WEATHER12, // 12\r
- IMAGE_CONVERTER_TOOL_WEATHER13, // 13\r
- IMAGE_CONVERTER_TOOL_WEATHER14, // 14\r
- IMAGE_CONVERTER_TOOL_WEATHER15, // 15\r
- IMAGE_CONVERTER_TOOL_WEATHER16, // 16\r
- IMAGE_CONVERTER_TOOL_WEATHER17, // 17\r
- IMAGE_CONVERTER_TOOL_WEATHER18, // 18\r
- IMAGE_CONVERTER_TOOL_WEATHER19, // 19\r
- IMAGE_CONVERTER_TOOL_WEATHER20, // 20\r
- IMAGE_CONVERTER_TOOL_WEATHER21, // 21\r
- IMAGE_CONVERTER_TOOL_WEATHER22, // 22\r
- IMAGE_CONVERTER_TOOL_WEATHER23, // 23\r
- IMAGE_CONVERTER_TOOL_WEATHER24, // 24\r
- IMAGE_CONVERTER_TOOL_WEATHER25, // 25\r
- IMAGE_CONVERTER_TOOL_WEATHER26, // 26\r
- IMAGE_CONVERTER_TOOL_WEATHER27, // 27\r
- IMAGE_CONVERTER_TOOL_WEATHER28, // 28\r
- IMAGE_CONVERTER_TOOL_WEATHER29, // 29\r
- IMAGE_CONVERTER_TOOL_WEATHER31 // 30\r
-};\r
+ IMAGE_WEATHER_WEATHER00, IMAGE_WEATHER_WEATHER01, IMAGE_WEATHER_WEATHER02, IMAGE_WEATHER_WEATHER03,\r
+ IMAGE_WEATHER_WEATHER04, IMAGE_WEATHER_WEATHER05, IMAGE_WEATHER_WEATHER06, IMAGE_WEATHER_WEATHER07,\r
+ IMAGE_WEATHER_WEATHER08, IMAGE_WEATHER_WEATHER09, IMAGE_WEATHER_WEATHER10, IMAGE_WEATHER_WEATHER11,\r
+ IMAGE_WEATHER_WEATHER12, IMAGE_WEATHER_WEATHER13, IMAGE_WEATHER_WEATHER14, IMAGE_WEATHER_WEATHER15,\r
+ IMAGE_WEATHER_WEATHER16, IMAGE_WEATHER_WEATHER17, IMAGE_WEATHER_WEATHER18, IMAGE_WEATHER_WEATHER19,\r
+ IMAGE_WEATHER_WEATHER20, IMAGE_WEATHER_WEATHER21, IMAGE_WEATHER_WEATHER22, IMAGE_WEATHER_WEATHER23,\r
+ IMAGE_WEATHER_WEATHER24, IMAGE_WEATHER_WEATHER25, IMAGE_WEATHER_WEATHER26, IMAGE_WEATHER_WEATHER27,\r
+ IMAGE_WEATHER_WEATHER28, IMAGE_WEATHER_WEATHER29, IMAGE_WEATHER_WEATHER30, IMAGE_WEATHER_WEATHER31};\r
\r
const int smallWeatherImage[ARRAY_SIZE] = {\r
- IMAGE_CONVERTER_TOOL_WEATHER32, // 32\r
- IMAGE_CONVERTER_TOOL_WEATHER33, // 33\r
- IMAGE_CONVERTER_TOOL_WEATHER34, // 34\r
- IMAGE_CONVERTER_TOOL_WEATHER35, // 35\r
- IMAGE_CONVERTER_TOOL_WEATHER36, // 36\r
- IMAGE_CONVERTER_TOOL_WEATHER37, // 37\r
- IMAGE_CONVERTER_TOOL_WEATHER38, // 38\r
- IMAGE_CONVERTER_TOOL_WEATHER39, // 39\r
- IMAGE_CONVERTER_TOOL_WEATHER40, // 40\r
- IMAGE_CONVERTER_TOOL_WEATHER41, // 41\r
- IMAGE_CONVERTER_TOOL_WEATHER42, // 42\r
- IMAGE_CONVERTER_TOOL_WEATHER43, // 43\r
- IMAGE_CONVERTER_TOOL_WEATHER44, // 44\r
- IMAGE_CONVERTER_TOOL_WEATHER45, // 45\r
- IMAGE_CONVERTER_TOOL_WEATHER46, // 46\r
- IMAGE_CONVERTER_TOOL_WEATHER47, // 47\r
- IMAGE_CONVERTER_TOOL_WEATHER48, // 48\r
- IMAGE_CONVERTER_TOOL_WEATHER49, // 49\r
- IMAGE_CONVERTER_TOOL_WEATHER50, // 50\r
- IMAGE_CONVERTER_TOOL_WEATHER51, // 51\r
- IMAGE_CONVERTER_TOOL_WEATHER52, // 52\r
- IMAGE_CONVERTER_TOOL_WEATHER53, // 53\r
- IMAGE_CONVERTER_TOOL_WEATHER54, // 54\r
- IMAGE_CONVERTER_TOOL_WEATHER55, // 55\r
- IMAGE_CONVERTER_TOOL_WEATHER56, // 56\r
- IMAGE_CONVERTER_TOOL_WEATHER57, // 57\r
- IMAGE_CONVERTER_TOOL_WEATHER58, // 58\r
- IMAGE_CONVERTER_TOOL_WEATHER59, // 59\r
- IMAGE_CONVERTER_TOOL_WEATHER60, // 60\r
- IMAGE_CONVERTER_TOOL_WEATHER61, // 61\r
- IMAGE_CONVERTER_TOOL_WEATHER62 // 62\r
-};\r
+ IMAGE_WEATHER_WEATHER32, IMAGE_WEATHER_WEATHER33, IMAGE_WEATHER_WEATHER34, IMAGE_WEATHER_WEATHER35,\r
+ IMAGE_WEATHER_WEATHER36, IMAGE_WEATHER_WEATHER37, IMAGE_WEATHER_WEATHER38, IMAGE_WEATHER_WEATHER39,\r
+ IMAGE_WEATHER_WEATHER40, IMAGE_WEATHER_WEATHER41, IMAGE_WEATHER_WEATHER42, IMAGE_WEATHER_WEATHER43,\r
+ IMAGE_WEATHER_WEATHER44, IMAGE_WEATHER_WEATHER45, IMAGE_WEATHER_WEATHER46, IMAGE_WEATHER_WEATHER47,\r
+ IMAGE_WEATHER_WEATHER48, IMAGE_WEATHER_WEATHER49, IMAGE_WEATHER_WEATHER50, IMAGE_WEATHER_WEATHER51,\r
+ IMAGE_WEATHER_WEATHER52, IMAGE_WEATHER_WEATHER53, IMAGE_WEATHER_WEATHER54, IMAGE_WEATHER_WEATHER55,\r
+ IMAGE_WEATHER_WEATHER56, IMAGE_WEATHER_WEATHER57, IMAGE_WEATHER_WEATHER58, IMAGE_WEATHER_WEATHER59,\r
+ IMAGE_WEATHER_WEATHER60, IMAGE_WEATHER_WEATHER61, IMAGE_WEATHER_WEATHER62, IMAGE_WEATHER_WEATHER63};\r
\r
typedef struct {\r
- const char *label_1;\r
- const ImageInfo *icon;\r
- const char *label_2;\r
+ const char *weatherWeek;\r
+ int image;\r
+ const char *weatherTemp;\r
bool hasSecondMenu;\r
} WeatherItem;\r
\r
typedef struct {\r
- const char *min_degree;\r
- const char *max_degree;\r
+ const char *min_temp;\r
+ const char *max_temp;\r
const char *address;\r
const char *weather_code;\r
- const char *degree;\r
+ const char *temp;\r
const char *updateTime;\r
const char *humidity;\r
std::string sunSet;\r
\r
typedef struct {\r
const char *hour;\r
- const char *degree;\r
+ const char *temp;\r
const char *weather;\r
} HourWeather;\r
+\r
+typedef struct {\r
+ const char *sunRise;\r
+ const char *sunSet;\r
+ const char *weekTime;\r
+} SunStruct;\r
+\r
+typedef struct {\r
+ const char *monthRise;\r
+ const char *monthSet;\r
+ const char *weekTime;\r
+} MonthStruct;\r
+\r
+typedef struct {\r
+ const char *phase;\r
+ int image;\r
+ const char *lightTime;\r
+ const char *monthDay;\r
+ const char *weekTime;\r
+} LunarPhaseStruct;\r
+\r
class WeatherModel {\r
public:\r
static WeatherModel &GetInstance(void);\r
+ virtual ~WeatherModel();\r
bool InitWeatherItem();\r
- WeatherItem *GetWeatherlistItems();\r
- uint8_t GetWeatherListNum();\r
- CurWeather GetCurWeather();\r
- std::vector<HourWeather> GetHourWeather();\r
- void InitFirstPageData();\r
- void InitSecondPageData();\r
- void InitThirdPageData();\r
+ void InitMainPageData();\r
+ void InitHoursPageData();\r
+ void InitDaysPageData();\r
void UpdateTemp();\r
+ void InitStringData();\r
bool InitVecForecast(cJSON *root);\r
bool InitVecObserve(cJSON *root);\r
bool InitVecRise(cJSON *root);\r
bool InitVecWeek(cJSON *root);\r
bool InitVecAddress(cJSON *root);\r
- virtual ~WeatherModel();\r
+ WeatherItem *GetWeatherlistItems();\r
+ uint8_t GetWeatherListNum();\r
+ CurWeather GetCurWeather();\r
+ SunStruct *GetSunData();\r
+ MonthStruct *GetMonthData();\r
+ LunarPhaseStruct *GetLunarPhaseData();\r
+ std::vector<HourWeather> GetHourWeather();\r
void SetDayStatus(const std::string &timeRise, const std::string &timeSet);\r
- bool GetDayStatus();\r
+ void ClearData();\r
+ int index_ = 0;\r
+ void LoadImageOfDayNight(UIImageView *view, uint32_t resDayId, uint32_t resNightId);\r
+ void LoadTextColorOfDayNight(UILabel *view, uint32_t colorDay, uint32_t colorNight);\r
\r
private:\r
WeatherModel();\r
WeatherModel(const WeatherModel &);\r
WeatherModel &operator=(const WeatherModel &);\r
- int usedLen{0};\r
- int tempMinArray[WEATHER_ITEM_COUNT] = {0};\r
- int tempMaxArray[WEATHER_ITEM_COUNT] = {0};\r
- bool isDay;\r
- CurWeather curWeather{nullptr};\r
- std::vector<HourWeather> houWeather;\r
- WeatherItem weather[WEATHER_ITEM_COUNT] = {nullptr, nullptr, nullptr, false};\r
- std::vector<std::tuple<std::string, std::string, int>> vec_forecast_1h;\r
- std::vector<std::tuple<std::string, std::string, int>> vec_forecast_24h;\r
- std::vector<std::tuple<std::string, std::string, int>> vec_rise;\r
- std::map<std::string, std::string> map_observe;\r
- std::map<std::string, std::string> map_address;\r
+ CurWeather curWeather_{nullptr};\r
+ std::vector<HourWeather> houWeather_;\r
+ WeatherItem weather_[ONE_WEEK_DYAS] = {nullptr, 0, nullptr, false};\r
+ std::string strTmp_[ONE_WEEK_DYAS];\r
+ std::string minTemp_[ONE_WEEK_DYAS];\r
+ std::string maxTemp_[ONE_WEEK_DYAS];\r
+ std::string currentWeek_[ONE_WEEK_DYAS];\r
+ std::string strRise_[ONE_WEEK_DYAS];\r
+ std::string strSet_[ONE_WEEK_DYAS];\r
+ int weatherValue_[ONE_WEEK_DYAS];\r
+ SunStruct sunData_[ONE_WEEK_DYAS] = {nullptr, nullptr, nullptr};\r
+ MonthStruct monthData_[ONE_WEEK_DYAS] = {nullptr, nullptr, nullptr};\r
+ LunarPhaseStruct parseData_[ONE_WEEK_DYAS] = {nullptr, 0, nullptr, nullptr, nullptr};\r
+ std::vector<std::tuple<std::string, std::string, int>> vec_forecast_1h_;\r
+ std::vector<std::tuple<std::string, std::string, int>> vec_forecast_24h_;\r
+ std::map<std::string, std::string> map_observe_;\r
+ std::map<std::string, std::string> map_address_;\r
+ int usedLen_{0};\r
+ bool isDay_{0};\r
};\r
}\r
\r
-#endif // Weather_MODEL_H
\ No newline at end of file
+#endif // Weather_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageDays\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_DAYS_H\r
+#define WEATHER_PAGE_DAYS_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_simple_list.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherItemView.h"\r
+#include "WeatherPresenter.h"\r
+\r
+namespace OHOS {\r
+class WeatherPageDays : public SlicePage<WeatherPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ public UISwipeView::OnSwipeListener {\r
+public:\r
+ WeatherPageDays();\r
+ ~WeatherPageDays() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void OnSwipe(UISwipeView &view) override;\r
+ void InitScrollView();\r
+ bool InitScrollData();\r
+ void RefreshWeathersList(WeatherItem *item, uint8_t count);\r
+private:\r
+ UIViewGroup *group_{nullptr};\r
+ UISimpleList *contentList_{nullptr};\r
+ UILabel *title_{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ UIImageView *pageIdxImg_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageHours\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_HOURS_H\r
+#define WEATHER_PAGE_HOURS_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+#include "WeatherPageHoursGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t GROUP_24H_COUNT = 3;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageHours : public SlicePage<WeatherPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ public UISwipeView::OnSwipeListener {\r
+public:\r
+ WeatherPageHours();\r
+ ~WeatherPageHours() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void OnSwipe(UISwipeView &view) override;\r
+private:\r
+ UISwipeView *weatherSwipeGroup_{nullptr};\r
+ WeatherPageHoursGroup *hoursGroup_[GROUP_24H_COUNT]{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageHoursGroup\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_HOURS_GROUP_H\r
+#define WEATHER_PAGE_HOURS_GROUP_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t WEATHER_24H_PER_8H = 8;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageHoursGroup : public UIViewGroup {\r
+public:\r
+ WeatherPageHoursGroup();\r
+ ~WeatherPageHoursGroup() override;\r
+ void WeatherInit(int index);\r
+ void InitLabel(int index);\r
+ void InitImage(int index);\r
+private:\r
+ std::vector<HourWeather> houWeather_;\r
+ UILabel *labelTime_[WEATHER_24H_PER_8H]{nullptr};\r
+ UILabel *labelTemp_[WEATHER_24H_PER_8H]{nullptr};\r
+ UIImageView *imgBack_[WEATHER_24H_PER_8H]{nullptr};\r
+ UIImageView *imgWeather_[WEATHER_24H_PER_8H]{nullptr};\r
+ UILabel *topLabel_{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ UIImageView *pageIdxImg_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageLunarPhase\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_LUNARPHASE_H\r
+#define WEATHER_PAGE_LUNARPHASE_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t BUTTON_CHANGE_END = 6;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageLunarPhase : public SlicePage<WeatherPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ WeatherPageLunarPhase();\r
+ ~WeatherPageLunarPhase() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void InitLabel();\r
+ void InitImage();\r
+ void InitButton();\r
+ void InitMonthLabel();\r
+private:\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ UIImageView *drawImg_{nullptr};\r
+ UILabel *labelTitle_{nullptr};\r
+ UILabel *labelDay_{nullptr};\r
+ UILabel *labelLunarPhase_{nullptr};\r
+ UILabel *labelMonthLight_{nullptr};\r
+ UILabel *labelMonthDay_{nullptr};\r
+ UIButton *buttonChangeLeft_{nullptr};\r
+ UIButton *buttonChangeRight_{nullptr};\r
+ LunarPhaseStruct *phase_ = nullptr;\r
+ int index_ = 0;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageMonthRise\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_MONTHRISE_H\r
+#define WEATHER_PAGE_MONTHRISE_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t MONTHRISE_TIME_LABEL_COUNT = 2;\r
+static constexpr int16_t BUTTON_CHANGE_END = 6;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageMonthRise : public SlicePage<WeatherPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ WeatherPageMonthRise();\r
+ ~WeatherPageMonthRise() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void InitLabel();\r
+ void InitLabelMonth();\r
+ void InitImage();\r
+ void InitButton();\r
+private:\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ UIImageView *drawImg_{nullptr};\r
+ UIImageView *monthImg_{nullptr};\r
+ UILabel *labelTitle_{nullptr};\r
+ UILabel *labelDay_{nullptr};\r
+ UILabel *labelMonth_[MONTHRISE_TIME_LABEL_COUNT]{nullptr};\r
+ UIButton *buttonChangeLeft_{nullptr};\r
+ UIButton *buttonChangeRight_{nullptr};\r
+ MonthStruct *month_ = nullptr;\r
+ int index_ = 0;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageSunRise\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGE_SUNRISE_H\r
+#define WEATHER_PAGE_SUNRISE_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "WeatherPresenter.h"\r
+#include "WeatherView.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SUNRISE_TIME_LABEL_COUNT = 2;\r
+static constexpr int16_t BUTTON_CHANGE_END = 6;\r
+\r
+class WeatherPresenter;\r
+class WeatherPageSunRise : public SlicePage<WeatherPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ WeatherPageSunRise();\r
+ ~WeatherPageSunRise() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void InitLabel();\r
+ void InitLabelSun();\r
+ void InitImage();\r
+ void InitButton();\r
+private:\r
+ UIViewGroup *group_{nullptr};\r
+ UIImageView *bgImg_{nullptr};\r
+ UIImageView *drawImg_{nullptr};\r
+ UIImageView *sunImg_{nullptr};\r
+ UILabel *labelTitle_{nullptr};\r
+ UILabel *labelDay_{nullptr};\r
+ UILabel *labelSun_[SUNRISE_TIME_LABEL_COUNT]{nullptr};\r
+ UIButton *buttonChangeLeft_{nullptr};\r
+ UIButton *buttonChangeRight_{nullptr};\r
+ SunStruct *sun_ = nullptr;\r
+ int index_ = 0;\r
+};\r
+}\r
+#endif
\ No newline at end of file
\r
#include "Presenter.h"\r
#include "components/ui_view.h"\r
-#include "weather/WeatherModel.h"\r
+#include "WeatherModel.h"\r
+\r
namespace OHOS {\r
class WeatherView;\r
class WeatherPresenter : public Presenter<WeatherView> {};\r
}\r
\r
-#endif // Weather_PRESENTER_H
\ No newline at end of file
+#endif // WEATHER_PRESENTER_H
\ No newline at end of file
#define WEATHER_VIEW_H\r
\r
#include "View.h"\r
+\r
namespace OHOS {\r
enum WEATHER_PAGES {\r
WEATHER_MAIN_PAGE = 1, // 0 is invalid\r
- WEATHER_SECOND_PAGE = 2,\r
- WEATHER_THIRD_PAGE = 3,\r
+ WEATHER_HOURS_PAGE = 2,\r
+ WEATHER_DAYS_PAGE = 3,\r
+ WEATHER_SUNRISE_PAGE = 4,\r
+ WEATHER_MONTHRISE_PAGE = 5,\r
+ WEATHER_LUNARPHASE_PAGE = 6,\r
};\r
\r
class WeatherPresenter;\r
class WeatherView : public View<WeatherPresenter> {};\r
}\r
-#endif // Weather_VIEW_H\r
+#endif // WEATHER_VIEW_H\r
#include "dock/input_device.h"
#include "notification_manager.h"
#include "alarm/AlarmPopUpPresenter.h"
-#include "callerlog/CallerLogModel.h"
-#include "makephone/MainCallingPresenter.h"
-#include "applist/ApplistModel.h"
+#include "phonemenu/PhoneMenuView.h"
+#include "phonemenu/PhoneMenuCallerLogModel.h"
+#include "settings/model/SettingDesktopModel.h"
+#include "quickaccess/FloatAccessView.h"
namespace OHOS {
+// 可以弹窗快捷应用的应用页
+static uint16_t g_viewIds[] = {
+ VIEW_MAIN_SAMPLE, // 主表盘
+ VIEW_APPLIST, // 菜单页
+};
+
+static void PressQuickApp(uint16_t viewId)
+{
+ if (FloatAccessView::GetInstance()->IsShowView()) {
+ FloatAccessView::GetInstance()->ExitView();
+ } else {
+ int len = sizeof(g_viewIds) / sizeof(uint16_t);
+ for (int i = 0 ; i < len; i++) {
+ if (viewId == g_viewIds[i]) {
+ FloatAccessView::GetInstance()->ShowView();
+ return;
+ }
+ }
+ }
+}
+
static bool IsNotifyCallStatus()
{
uint16_t notifyId = NotificationManager::GetInstance()->GetShowingNotifyId();
// 切换到关机/重启卡片
NativeAbility::GetInstance().ChangeSlice(VIEW_REBOOT);
} else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) { // 功能按键
- // 切换到查看系统版本卡片
+ PressQuickApp(NativeAbility::GetInstance().GetCurSliceId());
}
return;
}
void KeyInputListener::CallVolumeDipSwitchControl(uint8_t status)
{
VolumeSliderEventListener *volumeSliderEventListener = nullptr;
- if (MainCallingPresenter::GetInstance() != nullptr && CallerLogModel::GetInstance()->GetCallStatus()) {
- if (CallerLogModel::GetInstance()->GetVolumeScreenStatus()) {
- VolumeSettingView *settingView = MainCallingPresenter::GetInstance()->GetvolumeSetting();
+ if (PhoneMenuCallerLogModel::GetInstance()->GetCallStatus()) {
+ if (PhoneMenuCallerLogModel::GetInstance()->GetVolumeScreenStatus()) {
+ VolumeSettingView *settingView = GetvolumeSetting();
if (settingView == nullptr) {
return;
}
}
volumeSliderEventListener->ChangeVolume(static_cast<VolumeChangeStatus>(status));
} else {
- MainCallingPresenter::GetInstance()->HonrsViewChange();
- CallerLogModel::GetInstance()->SetVolumeScreenStatus(true);
+ HonrsViewChange();
+ PhoneMenuCallerLogModel::GetInstance()->SetVolumeScreenStatus(true);
}
}
if (IsNotifyCallStatus()) {
void KeyInputListener::OnKeyRelease(const KeyEvent& event)
{
- uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();
+ uint32_t targetId = NativeAbility::GetInstance().GetCurTargetId();
+ uint16_t curSlice = static_cast<uint16_t>(targetId & SLICE_MASK);
+ uint16_t curPage = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
uint16 keyID = event.GetKeyId();
if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER)) { // 电源按键
if (longPressFlag == 0 && pressFlag == 1) { // 短按电源键
- if (currentViewId == VIEW_MAEKPHONE_SAMPLE ||
+ // 先关闭快捷应用悬浮框再处理事件
+ if (FloatAccessView::GetInstance()->IsShowView()) {
+ FloatAccessView::GetInstance()->CleanView();
+ }
+ if ((curSlice == VIEW_PHONE_MENU && curPage == PhoneMenuPages::PHONE_MENU_CALLING_PAGE) ||
NotificationManager::GetInstance()->GetWatchCallStatus()) { // 音量卡片
// 音量+
CallVolumeDipSwitchControl(VOLUMEUP);
- } else if (currentViewId != VIEW_MAIN_SAMPLE) { // 主表盘
+ } else if (curSlice != VIEW_MAIN_SAMPLE) { // 主表盘
PressAlarmNotify(); // 当前为闹钟通知页面时,先处理闹钟再切换页面
- NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM);
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE, TransitionType::TRANSITION_ZOOM_OUT);
} else {
PressAlarmNotify(); // 当前为闹钟通知页面时,先处理闹钟再切换页面
if (!MainViewSample::GetInstance()->IsMainClockPage()) { // 当前页面为主表盘的其他页面时,切换回主表盘页面
MainViewSample::GetInstance()->SwitchToClockPage();
} else {
- if (ApplistModel::GetInstance().GetCurrentStyle() == AppListStyle::WATERFALL_STYLE) {
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ENTER_WATERFALL);
+ if (SettingDesktopModel::GetInstance().GetDesktopStyle() == DesktopStyle::WATERFALL_STYLE) {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST,
+ TransitionType::TRANSITION_ENTER_WATERFALL);
} else {
NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM);
}
}
} else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) { // 功能按键
if (longPressFlag == 0 && pressFlag == 1) { // 短按功能键
- if (currentViewId == VIEW_MAEKPHONE_SAMPLE ||
+ if ((curSlice == VIEW_PHONE_MENU && curPage == PhoneMenuPages::PHONE_MENU_CALLING_PAGE) ||
NotificationManager::GetInstance()->GetWatchCallStatus()) { // 音量卡片
// 音量-
CallVolumeDipSwitchControl(VOLUMEDOWN);
- } else if (currentViewId != VIEW_RECENT_APP) {
+ } else if (curSlice != VIEW_RECENT_APP) {
NativeAbility::GetInstance().ChangeSlice(VIEW_RECENT_APP);
}
}
-/*
- * Copyright (c) 2020-2021 CompanyNameMagicTag.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "main/HealthModel.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include "securec.h"
-#include "message.h"
-#include "wearable_log.h"
-#include "iostream"
-#include <fstream>
-#include "graphic_mutex.h"
-
-namespace OHOS {
-HealthAllData g_healthData;
-
-static GraphicMutex g_healthDataMutex;
-static constexpr const char *HEALTH_DATA_PATH = "/user/res/health.bin";
-static constexpr uint16_t LIST_HEALTH_LENGTH = 30;
-
-HealthModel::HealthModel()
-{
-}
-
-HealthModel::~HealthModel()
-{
- listHealth.Clear();
- listHealthNum = 0;
-}
-
-HealthModel *HealthModel::GetInstance(void)
-{
- static HealthModel healthModel;
- return &healthModel;
-}
-
-int HealthModel::SaveGlobalHealthToFile(void)
-{
- std::ofstream outHealthFile;
- outHealthFile.open(HEALTH_DATA_PATH, std::ios::out);
- if (outHealthFile.is_open() == 0) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open HEALTH_DATA_PATH failure!");
- outHealthFile.close();
- return -1;
- } else {
- outHealthFile.write((const char*)&g_healthData, sizeof(HealthAllData));
- if (outHealthFile.fail()) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGlobalHealthToFile fail");
- return -1;
- }
- outHealthFile.close();
- return 0;
- }
-}
-
-int HealthModel::GetHealthGlobalData(DataDistribute type, uint32_t *value)
-{
- switch (type) {
- case HEALTH_SLEEP:
- *value = g_healthData.healthSleep;
- break;
- case BATTERY_LIFE:
- break;
- default:
- return -1;
- break;
- }
- return 0;
-}
-
-void HealthModel::PushHealthData(HealthMsg healthMsg)
-{
- uint16_t tmp;
- if (listHealthNum >= LIST_HEALTH_MAX) {
- return;
- }
- g_healthDataMutex.Lock();
- listHealthNum++;
- listHealth.PushBack(healthMsg);
- g_healthDataMutex.Unlock();
- switch (healthMsg.type) {
- case HEALTH_SLEEP:
- g_healthData.healthSleep = healthMsg.value;
- break;
- case BATTERY_LIFE:
- break;
- default:
- break;
- }
-}
-
-bool HealthModel::FetchedHealthData(HealthMsg *healthMsg)
-{
- if (listHealth.IsEmpty()) {
- return false;
- } else {
- g_healthDataMutex.Lock();
- listHealthNum--;
- *healthMsg = listHealth.Front();
- listHealth.PopFront();
- g_healthDataMutex.Unlock();
- }
- return true;
-}
-
-bool HealthModel::InitHealthData(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HealthModel::InitHealthData start");
- (void)memset_s(&g_healthData, sizeof(HealthAllData), 0, sizeof(HealthAllData));
- std::ifstream inHealthFile;
- inHealthFile.open(HEALTH_DATA_PATH, std::ios::in);
- if (!inHealthFile.is_open()) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open HEALTH_DATA_PATH failure!");
- inHealthFile.close();
- return false;
- } else {
- inHealthFile.read((char*)&g_healthData, sizeof(HealthAllData));
- if (inHealthFile.fail()) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitHealthData fail");
- inHealthFile.close();
- return false;
- }
- inHealthFile.close();
- }
- return true;
-}
-
-int HealthModel::GetBriScrStatus(void)
-{
- return briScreenStatus;
-}
-
-int HealthModel::GetDntDistStatus(void)
-{
- return dntDisturbStatus;
-}
-
-void HealthModel::UpdateBriScrStatus(uint16_t status)
-{
- briScreenStatus = status;
-}
-
-void HealthModel::UpdateDntDistStatus(uint16_t status)
-{
- dntDisturbStatus = status;
-}
-}
+/*\r
+ * Copyright (c) 2020-2021 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+#include "main/HealthModel.h"\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <fcntl.h>\r
+#include <unistd.h>\r
+#include "securec.h"\r
+#include "message.h"\r
+#include "wearable_log.h"\r
+#include "iostream"\r
+#include <fstream>\r
+#include "graphic_mutex.h"\r
+\r
+namespace OHOS {\r
+HealthAllData g_healthData;\r
+\r
+static GraphicMutex g_healthDataMutex;\r
+static constexpr const char *HEALTH_DATA_PATH = "/user/res/health.bin";\r
+static constexpr uint16_t LIST_HEALTH_LENGTH = 30;\r
+\r
+HealthModel::HealthModel()\r
+{\r
+}\r
+\r
+HealthModel::~HealthModel()\r
+{\r
+ listHealth.Clear();\r
+ listHealthNum = 0;\r
+}\r
+\r
+HealthModel *HealthModel::GetInstance(void)\r
+{\r
+ static HealthModel healthModel;\r
+ return &healthModel;\r
+}\r
+\r
+int HealthModel::SaveGlobalHealthToFile(void)\r
+{\r
+ std::ofstream outHealthFile;\r
+ outHealthFile.open(HEALTH_DATA_PATH, std::ios::out);\r
+ if (outHealthFile.is_open() == 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open HEALTH_DATA_PATH failure!");\r
+ outHealthFile.close();\r
+ return -1;\r
+ } else {\r
+ outHealthFile.write((const char*)&g_healthData, sizeof(HealthAllData));\r
+ if (outHealthFile.fail()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGlobalHealthToFile fail");\r
+ return -1;\r
+ }\r
+ outHealthFile.close();\r
+ return 0;\r
+ }\r
+}\r
+\r
+int HealthModel::GetHealthGlobalData(DataDistribute type, uint32_t *value)\r
+{\r
+ switch (type) {\r
+ case HEALTH_SLEEP:\r
+ *value = g_healthData.healthSleep;\r
+ break;\r
+ case BATTERY_LIFE:\r
+ break;\r
+ default:\r
+ return -1;\r
+ break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void HealthModel::PushHealthData(HealthMsg healthMsg)\r
+{\r
+ uint16_t tmp;\r
+ if (listHealthNum >= LIST_HEALTH_MAX) {\r
+ return;\r
+ }\r
+ g_healthDataMutex.Lock();\r
+ listHealthNum++;\r
+ listHealth.PushBack(healthMsg);\r
+ g_healthDataMutex.Unlock();\r
+ switch (healthMsg.type) {\r
+ case HEALTH_SLEEP:\r
+ g_healthData.healthSleep = healthMsg.value;\r
+ break;\r
+ case BATTERY_LIFE:\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+}\r
+\r
+bool HealthModel::FetchedHealthData(HealthMsg *healthMsg)\r
+{\r
+ if (listHealth.IsEmpty()) {\r
+ return false;\r
+ } else {\r
+ g_healthDataMutex.Lock();\r
+ listHealthNum--;\r
+ *healthMsg = listHealth.Front();\r
+ listHealth.PopFront();\r
+ g_healthDataMutex.Unlock();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool HealthModel::InitHealthData(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HealthModel::InitHealthData start");\r
+ (void)memset_s(&g_healthData, sizeof(HealthAllData), 0, sizeof(HealthAllData));\r
+ std::ifstream inHealthFile;\r
+ inHealthFile.open(HEALTH_DATA_PATH, std::ios::in);\r
+ if (!inHealthFile.is_open()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open HEALTH_DATA_PATH failure!");\r
+ inHealthFile.close();\r
+ return false;\r
+ } else {\r
+ inHealthFile.read((char*)&g_healthData, sizeof(HealthAllData));\r
+ if (inHealthFile.fail()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitHealthData fail");\r
+ inHealthFile.close();\r
+ return false;\r
+ }\r
+ inHealthFile.close();\r
+ }\r
+ return true;\r
+}\r
+\r
+int HealthModel::GetBriScrStatus(void)\r
+{\r
+ return briScreenStatus;\r
+}\r
+\r
+int HealthModel::GetDntDistStatus(void)\r
+{\r
+ return dntDisturbStatus;\r
+}\r
+\r
+void HealthModel::UpdateBriScrStatus(uint16_t status)\r
+{\r
+ briScreenStatus = status;\r
+}\r
+\r
+void HealthModel::UpdateDntDistStatus(uint16_t status)\r
+{\r
+ dntDisturbStatus = status;\r
+}\r
+}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: LoadImg\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: LoadImg.cpp\r
* Author:\r
* Create: 2025-06-05\r
*/\r
\r
namespace OHOS {\r
namespace LOADIMG {\r
-\r
// 加载图片资源\r
void LoadBtnImage(UIButton *btn, std::string file, uint32_t resId1, uint32_t resId2)\r
{\r
ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId1, file);\r
if (image1 == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
return;\r
}\r
ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId2, file);\r
if (image2 == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
return;\r
}\r
btn->SetImageSrc(image1, image2);\r
{\r
ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
if (image == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadImageViewImg %x fail", resId);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadImageViewImg %x fail", resId);\r
+ return;\r
+ }\r
+ view->SetSrc(image);\r
+ return;\r
+}\r
+\r
+void LoadImageImg(Image *view, std::string file, uint32_t resId)\r
+{\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
+ if (image == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadImageImg %x fail", resId);\r
return;\r
}\r
view->SetSrc(image);\r
#include "wearable_log.h"\r
#include "main/DialBinTypesV2.h"\r
#include "power_display_service.h"\r
+#include "UIWatchDialFactory.h"\r
\r
namespace OHOS {\r
static const int CARD_SETTING_VALUE_LEN = 32;\r
static const int DIAL_SETTING_VALUE_LEN = 64;\r
const CardInfo cardInfoMap[] = {\r
- { HEART_RATE, PNG_SET_CARD_HEART },\r
{ COMPASS, PNG_SET_CARD_COMPASS },\r
{ ACTIVITY, PNG_SET_CARD_ACTIVITY },\r
{ MUSIC_PLAYER, PNG_SET_CARD_PLAYER },\r
{ VIDEO_CARD3, PNG_SET_CARD_VIDEO },\r
};\r
\r
- const DialInfo dialInfoMap[] = {\r
- { 0, "扫秒表盘", PNG_SET_DIAL_CLOCK, DEFAULT_TASK_PERIOD, DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY},\r
- { 1, "aod扫秒表盘", PNG_SET_DIAL_CLOCK, DEFAULT_TASK_PERIOD, DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY},\r
- };\r
-\r
MainModel::MainModel()\r
{\r
power_display_gui_enable_aod(IsAodEnabled());\r
\r
const DialInfo *MainModel::GetDialInfo(uint8_t dialId) const\r
{\r
- for (uint8_t i = 0; i < (sizeof(dialInfoMap) / sizeof(dialInfoMap[0])); i++) {\r
- if (dialId == dialInfoMap[i].id) {\r
- return &dialInfoMap[i];\r
- }\r
- }\r
- return nullptr;\r
+ return UIWatchDialFactory::GetInstance().GetNormalDialInfo(dialId);\r
}\r
\r
uint8_t MainModel::GetDialInfoNum() const\r
{\r
- return sizeof(dialInfoMap) / sizeof(dialInfoMap[0]);\r
+ return UIWatchDialFactory::GetInstance().GetNormalDialInfoNum();\r
}\r
\r
void MainModel::InitCardSettings(void)\r
} else {\r
/* 使用默认card配置 */\r
cardSettings[index++] = WATCH_FACE;\r
- cardSettings[index++] = HEART_RATE;\r
cardSettings[index++] = COMPASS;\r
cardSettings[index++] = ACTIVITY;\r
cardSettings[index++] = MUSIC_PLAYER;\r
{\r
char temp[DIAL_SETTING_VALUE_LEN] = { 0 };\r
int32_t len = UtilsGetValue("dial_setting", temp, DIAL_SETTING_VALUE_LEN);\r
- if (len >= 0) {\r
- char *setBuffer = nullptr;\r
- char *setValue = strtok_s(temp, ",", &setBuffer);\r
- if (setValue != nullptr) {\r
- dialSetting.dialFlag = atoi(setValue);\r
- } else {\r
- InitDialSettingDefault();\r
- return;\r
- }\r
+ if (len < 0) {\r
+ InitDialSettingDefault();\r
+ return;\r
+ }\r
+ char* setBuffer = nullptr;\r
+ char* setValue = strtok_s(temp, ",", &setBuffer);\r
+ if (!setValue) {\r
+ InitDialSettingDefault();\r
+ return;\r
+ }\r
+ dialSetting.dialFlag = atoi(setValue);\r
\r
- setValue = strtok_s(nullptr, ",", &setBuffer);\r
- if (setValue != nullptr) {\r
- dialSetting.dialId = atoi(setValue);\r
- } else {\r
- InitDialSettingDefault();\r
- return;\r
- }\r
+ setValue = strtok_s(nullptr, ",", &setBuffer);\r
+ if (!setValue) {\r
+ InitDialSettingDefault();\r
+ return;\r
+ }\r
+ dialSetting.dialId = atoi(setValue);\r
\r
- if (dialSetting.dialFlag == 0) {\r
- return;\r
- }\r
- setValue = strtok_s(nullptr, ",", &setBuffer);\r
- if (setValue != nullptr) {\r
- dialSetting.dialFullName = setValue;\r
- if (!((dialSetting.dialFullName.length() > 0) &&\r
- (access(dialSetting.dialFullName.c_str(), F_OK) == 0))) {\r
- InitDialSettingDefault();\r
- return;\r
- }\r
- } else {\r
- InitDialSettingDefault();\r
- return;\r
- }\r
- } else {\r
+ if (dialSetting.dialFlag == 0) {\r
+ dialSetting.dialFullName = "";\r
+ return;\r
+ }\r
+\r
+ setValue = strtok_s(nullptr, ",", &setBuffer);\r
+ if (!setValue) {\r
+ InitDialSettingDefault();\r
+ return;\r
+ }\r
+ dialSetting.dialFullName = setValue;\r
+\r
+ if (access(dialSetting.dialFullName.c_str(), F_OK) != 0) {\r
InitDialSettingDefault();\r
}\r
}\r
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: MainPresenterSample
- * Author:
- * Create: 2021-10-18
- */
-
-#include "main/MainPresenterSample.h"
-#include "common/task_manager.h"
-#include "heartrate/HeartRateView.h"
-#include "player/PlayersModel.h"
-#include "player/PlayersPresenter.h"
-#include "NativeRegisterManager.h"
-#include "compass/CompassModel.h"
-#include "drag_event.h"
-#include "graphic_service.h"
-#include "wearable_log.h"
-#include "UiConfig.h"
-#include "ui_resource_image.h"
-#include <iostream>
-#include <map>
-#include "main/dial/ModelDialDataFactory.h"
-#include "main/dial/DialModelTime.h"
-#include "main/dial/DialViewGroup.h"
-#include "uiservice/ui_service.h"
-#include "PageTransitionMgr.h"
-
-namespace OHOS {
-
-REGIST_SLICE(VIEW_MAIN_SAMPLE, MainViewSample, MainPresenterSample);
-
-std::map<std::string, AppViewId> g_jumpView = { { MAIN_CLICK_WEATHER, VIEW_MAIN_SAMPLE }, // 天气界面
- { MAIN_CLICK_ACTIVITY, VIEW_MAIN_ACTIVITY }, // 活动记录界面
- { MAIN_CLICK_MESSAGE, VIEW_MAIN_SAMPLE }, // 消息app
- { MAIN_CLICK_HEARTRATE, VIEW_MAIN_SAMPLE }, // 心率界面
- { DROPDOWN_CLICK_ALARM, VIEW_MAIN_ALARM }, // 闹钟app
- { DROPDOWN_CLICK_SETTING, VIEW_SETTING } }; // 设置界面
-
-std::map<std::string, int> g_chanColor = { { DROPDOWN_CLICK_FINDMYPHONE, DROPDOWN_DROPDOWN_FIND_PHONE_B },
- { DROPDOWN_CLICK_ALARM, DROPDOWN_DROPDOWN_ALARM_B },
- { DROPDOWN_CLICK_SETTING, DROPDOWN_DROPDOWN_SETTING_B } };
-
-static MainPresenterSample *g_pMainPresenterSample = nullptr;
-
-static constexpr uint16_t DROP_X_MAX = 360;
-static constexpr uint16_t PROGRESS_PERCENTAGE = 100;
-static constexpr uint16_t HORIZONTAL_SWIPE = 1;
-static constexpr uint16_t PLAYER_PERIOD = 500;
-static constexpr uint16_t MAX_PERIOD = 1000;
-
-MainPresenterSample::MainPresenterSample()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample :%p", this);
- g_pMainPresenterSample = this;
-}
-
-MainPresenterSample::~MainPresenterSample()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~MainPresenterSample");
-}
-
-MainPresenterSample *MainPresenterSample::GetInstance(void)
-{
- return g_pMainPresenterSample;
-}
-
-void MainPresenterSample::OnStart()
-{
- mainPresenterState_ = MainPresenterState::START;
-}
-
-void MainPresenterSample::OnPause()
-{
- // Save watchface content for slide back
- UIView* watchFace = view_->GetViewById(WATCH_FACE)->GetParent();
- uint8_t opaScale = watchFace->GetOpaScale();
- watchFace->SetOpaScale(OPA_OPAQUE);
- PageTransitionMgr::GetInstance().SaveSlideBackSnapShotIfNecessary(watchFace);
- watchFace->SetOpaScale(opaScale);
-
- uint8_t curCardId = view_->GetHorCurrentCard();
- UICardPage *card = view_->GetViewById(curCardId);
- if (card != nullptr) {
- card->OnPause();
- }
- mainPresenterState_ = MainPresenterState::PAUSE;
-}
-
-void MainPresenterSample::OnResume(void)
-{
- mainPresenterState_ = MainPresenterState::RESUME;
- // Set current page again to invoke OnActive method.
- uint8_t curCardId = view_->GetHorCurrentCard();
- view_->SwitchToCard(curCardId);
-}
-
-void MainPresenterSample::OnStop(void)
-{
- mainPresenterState_ = MainPresenterState::STOP;
- if (isCompassSensorOpened_) {
- CompassModel::GetInstance()->CloseCompassSensor();
- }
-}
-
-MainPresenterState MainPresenterSample::GetMainPresenterState(void)
-{
- return mainPresenterState_;
-}
-
-bool MainPresenterSample::OnClick(UIView &view, const ClickEvent &event)
-{
- UNUSED(event);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StatusButtonClickListener: %s", view.GetViewId());
- std::string curViewId = view.GetViewId();
-
- UIImageView *imgView = static_cast<UIImageView *>(&view);
- if (HealthModel::GetInstance() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "health model nullptr");
- return false;
- }
- if (curViewId == DROPDOWN_CLICK_DONOTDISTURB) {
- if (HealthModel::GetInstance()->GetDntDistStatus() == 0) {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB_B);
- HealthModel::GetInstance()->UpdateDntDistStatus(1);
- } else {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB);
- HealthModel::GetInstance()->UpdateDntDistStatus(0);
- }
- }
- if (curViewId == DROPDOWN_CLICK_BRIGHTENSCREEN) {
- if (HealthModel::GetInstance()->GetBriScrStatus() == 0) {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN_B);
- HealthModel::GetInstance()->UpdateBriScrStatus(1);
- ScreenOffEnable(0);
- } else {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN);
- HealthModel::GetInstance()->UpdateBriScrStatus(0);
- ScreenOffEnable(1);
- }
- }
-
- if (g_jumpView.count(curViewId) != 0) {
- if (g_jumpView[curViewId] == VIEW_SETTING) {
- NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId], TransitionType::TRANSITION_INVALID,
- gSliceDefaultPriority, true);
- } else {
- NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId]);
- }
- }
- return true;
-}
-
-bool MainPresenterSample::OnLongPress(UIView& view, const LongPressEvent& event)
-{
- UNUSED(event);
- UNUSED(view);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample OnLongPress");
- uint8_t cardId = view_->GetHorCurrentCard();
- if (cardId != WATCH_FACE) {
- SetCardModel::GetInstance().SetSelectedCard(cardId);
- NativeAbility::GetInstance().ChangeSlice(VIEW_SET_CARD);
- } else {
- NativeAbility::GetInstance().ChangeSlice(VIEW_SET_DIAL);
- }
- return true;
-}
-
-void MainPresenterSample::SetPage(int8_t id, bool loadAdjacent)
-{
- if (view_ != nullptr) {
- view_->SetPage(id, loadAdjacent);
- }
-}
-
-void MainPresenterSample::SetTaskPeroid(CardId cardId)
-{
- SetLastRun(0); // refresh entering card in time
- if (cardId == COMPASS) {
- SetPeriod(DEFAULT_TASK_PERIOD);
- } else if (cardId == WATCH_FACE) {
- uint32_t time;
- DialSetting &setting = GetDialSetting();
- if (setting.dialFlag) {
- time = dynamic_cast<DialViewGroup*>(view_->GetViewById(WATCH_FACE))->GetPeriod();
- } else {
- time = DEFAULT_TASK_PERIOD;
- }
- SetPeriod(time);
- } else if (cardId == MUSIC_PLAYER) {
- SetPeriod(PLAYER_PERIOD);
- } else {
- SetPeriod(MAX_PERIOD);
- }
-}
-
-void MainPresenterSample::OnSwipe(UISwipeView &view)
-{
- UNUSED(view);
- CardId cardId = view_->GetHorCurrentCard();
- SetTaskPeroid(cardId);
- if (cardId == COMPASS) {
- if (!isCompassSensorOpened_) {
- CompassModel::GetInstance()->OpenCompassSensor();
- isCompassSensorOpened_ = true;
- }
- } else if (isCompassSensorOpened_) {
- CompassModel::GetInstance()->CloseCompassSensor();
- isCompassSensorOpened_ = false;
- }
-
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnSwipe OnSwipe");
- return;
-}
-
-void MainPresenterSample::ProcessDataNotify(void)
-{
- HealthMsg healthMsg;
- uint16_t len;
-
- while ((HealthModel::GetInstance()->FetchedHealthData(&healthMsg))) {
- switch (healthMsg.type) {
- case BATTERY_LIFE:
- break;
- default:
- break;
- }
- }
-}
-
-void MainPresenterSample::SetCircleProgress()
-{
- PlayersView *playersView = dynamic_cast<PlayersView*>(view_->GetViewById(MUSIC_PLAYER));
- if (playersView == nullptr) {
- return;
- }
- UICircleProgress *playbackProgress = playersView->GetPlaybackProgress();
- if (playbackProgress == nullptr) {
- return;
- }
- int32_t playerState;
- PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
- state_ = playersView->GetPlayerButtonState();
- if ((playerState != PLAYER_STARTED) && (state_ == UICheckBox::UICheckBoxState::SELECTED)) {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
- } else if ((playerState == PLAYER_STARTED) && (state_ == UICheckBox::UICheckBoxState::UNSELECTED)) {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
- }
- if (state_ == UICheckBox::UICheckBoxState::SELECTED) {
- PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime_);
- PlayersModel::GetInstance()->GetDuration(playerMusicDuration_);
- if (playerMusicDuration_ != 0) {
- playerProgressValue_ = (playerCurrentTime_ * PROGRESS_PERCENTAGE) / playerMusicDuration_;
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerProgressValue_ %lld", playerProgressValue_);
- } else {
- playerProgressValue_ = 100; // 100: max progress value
- }
- PlayersModel::GetInstance()->SetCircleProgress(playerProgressValue_);
- PlayersPresenter::GetInstance()->SetPlaybackProgress(playerProgressValue_);
- }
-}
-
-void MainPresenterSample::Notify(void)
-{
- CardId cardId = view_->GetHorCurrentCard();
- if (cardId == MUSIC_PLAYER) {
- SetCircleProgress();
- } else if (cardId == WATCH_FACE) {
- DialSetting &setting = GetDialSetting();
- if (setting.dialFlag) {
- DialModelTime::GetInstance()->UpdateTime();
- DialViewGroup* group = dynamic_cast<DialViewGroup*>(view_->GetViewById(WATCH_FACE));
- if (group != nullptr) {
- group->UpdateViewsByPeriodicUpdateData();
- }
- } else {
- MainClockView* clock = dynamic_cast<MainClockView*>(view_->GetViewById(WATCH_FACE));
- if (clock != nullptr) {
- clock->UpdateTime();
- }
- }
- }
-}
-
-void MainPresenterSample::InitCardSettings(void)
-{
- MainModel::GetInstance().InitCardSettings();
-}
-
-uint8_t MainPresenterSample::GetCardSettingCount(void)
-{
- return MainModel::GetInstance().GetCardSettingCount();
-}
-
-CardId *MainPresenterSample::GetCardSettings(void)
-{
- return MainModel::GetInstance().GetCardSettings();
-}
-
-void MainPresenterSample::InitDialSettings(void)
-{
- return MainModel::GetInstance().InitDialSettings();
-}
-DialSetting& MainPresenterSample::GetDialSetting()
-{
- return MainModel::GetInstance().GetDialSetting();
-}
-
-bool MainPresenterSample::IsFromSetCardView(void) const
-{
- return MainModel::GetInstance().IsFromSetCardView();
-}
-
-void MainPresenterSample::SetFromSetCardView(bool isFrom)
-{
- MainModel::GetInstance().SetFromSetCardView(isFrom);
-}
-
-uint8_t MainPresenterSample::GetFromCardId(void)
-{
- return MainModel::GetInstance().GetFromCardId();
-}
-
-}
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainPresenterSample\r
+ * Author:\r
+ * Create: 2021-10-18\r
+ */\r
+\r
+#include "main/MainPresenterSample.h"\r
+#include "common/task_manager.h"\r
+#include "player/PlayersModel.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+#include "compass/CompassModel.h"\r
+#include "drag_event.h"\r
+#include "graphic_service.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_image.h"\r
+#include <iostream>\r
+#include <map>\r
+#include "main/dial/ModelDialDataFactory.h"\r
+#include "main/dial/DialModelTime.h"\r
+#include "main/dial/DialViewGroup.h"\r
+#include "uiservice/ui_service.h"\r
+#include "PageTransitionMgr.h"\r
+#include "findphone/FindPhoneView.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "clock/GradientClockView.h"\r
+#include "common/periodicupdate_interface.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE(VIEW_MAIN_SAMPLE, MainViewSample, MainPresenterSample);\r
+\r
+std::map<std::string, AppViewId> g_jumpView = { { MAIN_CLICK_WEATHER, VIEW_MAIN_SAMPLE }, // 天气界面\r
+ { MAIN_CLICK_ACTIVITY, VIEW_MAIN_ACTIVITY }, // 活动记录界面\r
+ { MAIN_CLICK_MESSAGE, VIEW_MAIN_SAMPLE }, // 消息app\r
+ { DROPDOWN_CLICK_ALARM, VIEW_MAIN_ALARM }, // 闹钟app\r
+ { DROPDOWN_CLICK_SETTING, VIEW_SETTING } }; // 设置界面\r
+\r
+std::map<std::string, int> g_chanColor = { { DROPDOWN_CLICK_FINDMYPHONE, DROPDOWN_DROPDOWN_FIND_PHONE_B },\r
+ { DROPDOWN_CLICK_ALARM, DROPDOWN_DROPDOWN_ALARM_B },\r
+ { DROPDOWN_CLICK_SETTING, DROPDOWN_DROPDOWN_SETTING_B } };\r
+\r
+static MainPresenterSample *g_pMainPresenterSample = nullptr;\r
+\r
+static constexpr uint16_t DROP_X_MAX = 360;\r
+static constexpr uint16_t HORIZONTAL_SWIPE = 1;\r
+static constexpr uint16_t MAX_PERIOD = 1000;\r
+\r
+MainPresenterSample::MainPresenterSample()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample :%p", this);\r
+ g_pMainPresenterSample = this;\r
+}\r
+\r
+MainPresenterSample::~MainPresenterSample()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~MainPresenterSample");\r
+}\r
+\r
+MainPresenterSample *MainPresenterSample::GetInstance(void)\r
+{\r
+ return g_pMainPresenterSample;\r
+}\r
+\r
+void MainPresenterSample::OnStart()\r
+{\r
+ mainPresenterState_ = MainPresenterState::START;\r
+}\r
+\r
+void MainPresenterSample::OnPause()\r
+{\r
+ // Save watchface content for slide back\r
+ UIView* watchFace = view_->GetViewById(WATCH_FACE)->GetParent();\r
+ uint8_t opaScale = watchFace->GetOpaScale();\r
+ watchFace->SetOpaScale(OPA_OPAQUE);\r
+ PageTransitionMgr::GetInstance().SaveSlideBackSnapShotIfNecessary(watchFace);\r
+ watchFace->SetOpaScale(opaScale);\r
+\r
+ uint8_t curCardId = view_->GetHorCurrentCard();\r
+ UICardPage *card = view_->GetViewById(curCardId);\r
+ if (card != nullptr) {\r
+ card->OnPause();\r
+ }\r
+ mainPresenterState_ = MainPresenterState::PAUSE;\r
+ Deinit();\r
+}\r
+\r
+void MainPresenterSample::OnResume(void)\r
+{\r
+ mainPresenterState_ = MainPresenterState::RESUME;\r
+ // Set current page again to invoke OnActive method.\r
+ uint8_t curCardId = view_->GetHorCurrentCard();\r
+ view_->SwitchToCard(curCardId);\r
+ Init();\r
+}\r
+\r
+void MainPresenterSample::OnStop(void)\r
+{\r
+ mainPresenterState_ = MainPresenterState::STOP;\r
+ if (isCompassSensorOpened_) {\r
+ CompassModel::GetInstance()->CloseCompassSensor();\r
+ }\r
+}\r
+\r
+MainPresenterState MainPresenterSample::GetMainPresenterState(void)\r
+{\r
+ return mainPresenterState_;\r
+}\r
+\r
+bool MainPresenterSample::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StatusButtonClickListener: %s", view.GetViewId());\r
+ std::string curViewId = view.GetViewId();\r
+\r
+ UIImageView *imgView = static_cast<UIImageView *>(&view);\r
+ if (HealthModel::GetInstance() == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "health model nullptr");\r
+ return false;\r
+ }\r
+ if (curViewId == DROPDOWN_CLICK_DONOTDISTURB) {\r
+ if (HealthModel::GetInstance()->GetDntDistStatus() == 0) {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB_B);\r
+ HealthModel::GetInstance()->UpdateDntDistStatus(1);\r
+ } else {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_DN_DISTURB);\r
+ HealthModel::GetInstance()->UpdateDntDistStatus(0);\r
+ }\r
+ }\r
+ if (curViewId == DROPDOWN_CLICK_BRIGHTENSCREEN) {\r
+ if (HealthModel::GetInstance()->GetBriScrStatus() == 0) {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN_B);\r
+ HealthModel::GetInstance()->UpdateBriScrStatus(1);\r
+ ScreenOffEnable(0);\r
+ } else {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, imgView, DROPDOWN_DROPDOWN_BRI_SCREEN);\r
+ HealthModel::GetInstance()->UpdateBriScrStatus(0);\r
+ ScreenOffEnable(1);\r
+ }\r
+ }\r
+ if (curViewId == DROPDOWN_CLICK_FINDMYPHONE) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FIND_PHONE, FIND_PHONE_PAGES::FIND_PHONE_MAIN_PAGE);\r
+ }\r
+\r
+ if (g_jumpView.count(curViewId) != 0) {\r
+ if (g_jumpView[curViewId] == VIEW_SETTING) {\r
+ NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId], TransitionType::TRANSITION_INVALID,\r
+ gSliceDefaultPriority, true);\r
+ } else {\r
+ NativeAbility::GetInstance().ChangeSlice(g_jumpView[curViewId]);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool MainPresenterSample::OnLongPress(UIView& view, const LongPressEvent& event)\r
+{\r
+ UNUSED(event);\r
+ UNUSED(view);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainPresenterSample OnLongPress");\r
+ uint8_t cardId = view_->GetHorCurrentCard();\r
+ if (cardId != WATCH_FACE) {\r
+ SettingCardModel::GetInstance().SetSelectedCard(cardId);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_SETTING, SettingPageId::CARD_MGR_PAGE,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_SETTING, SettingPageId::DESKTOP_DIAL_PAGE,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ return true;\r
+}\r
+\r
+void MainPresenterSample::SetPage(int8_t id, bool loadAdjacent)\r
+{\r
+ if (view_ != nullptr) {\r
+ view_->SetPage(id, loadAdjacent);\r
+ }\r
+}\r
+\r
+void MainPresenterSample::SetTaskPeroid(CardId cardId)\r
+{\r
+ SetLastRun(0); // refresh entering card in time\r
+ PeriodicUpdateInterface* page = dynamic_cast<PeriodicUpdateInterface*>(view_->GetViewById(cardId));\r
+ if (page != nullptr) {\r
+ page->Update();\r
+ SetPeriod(page->GetPeriod());\r
+ } else if (cardId == WATCH_FACE) {\r
+ DialSetting &setting = GetDialSetting();\r
+ if (setting.dialFlag) {\r
+ SetPeriod(dynamic_cast<DialViewGroup*>(view_->GetViewById(WATCH_FACE))->GetPeriod());\r
+ }\r
+ } else {\r
+ SetPeriod(MAX_PERIOD);\r
+ }\r
+}\r
+\r
+void MainPresenterSample::OnSwipe(UISwipeView &view)\r
+{\r
+ if (view.GetDirection()) {\r
+ view_->GetVerCurrentCard();\r
+ } else {\r
+ CardId cardId = view_->GetHorCurrentCard();\r
+ SetTaskPeroid(cardId);\r
+ if (cardId == COMPASS) {\r
+ if (!isCompassSensorOpened_) {\r
+ CompassModel::GetInstance()->OpenCompassSensor();\r
+ isCompassSensorOpened_ = true;\r
+ }\r
+ } else if (isCompassSensorOpened_) {\r
+ CompassModel::GetInstance()->CloseCompassSensor();\r
+ isCompassSensorOpened_ = false;\r
+ }\r
+ }\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnSwipe OnSwipe");\r
+ return;\r
+}\r
+\r
+void MainPresenterSample::ProcessDataNotify(void)\r
+{\r
+ HealthMsg healthMsg;\r
+ uint16_t len;\r
+\r
+ while ((HealthModel::GetInstance()->FetchedHealthData(&healthMsg))) {\r
+ switch (healthMsg.type) {\r
+ case BATTERY_LIFE:\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void MainPresenterSample::Callback(void)\r
+{\r
+ CardId cardId = view_->GetHorCurrentCard();\r
+ PeriodicUpdateInterface* page = dynamic_cast<PeriodicUpdateInterface*>(view_->GetViewById(cardId));\r
+ if (page != nullptr) {\r
+ page->Update();\r
+ } else if (cardId == WATCH_FACE) {\r
+ DialSetting &setting = GetDialSetting();\r
+ if (setting.dialFlag) {\r
+ DialModelTime::GetInstance()->UpdateTime();\r
+ DialViewGroup* group = dynamic_cast<DialViewGroup*>(view_->GetViewById(WATCH_FACE));\r
+ if (group != nullptr) {\r
+ group->UpdateViewsByPeriodicUpdateData();\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+void MainPresenterSample::InitCardSettings(void)\r
+{\r
+ MainModel::GetInstance().InitCardSettings();\r
+}\r
+\r
+uint8_t MainPresenterSample::GetCardSettingCount(void)\r
+{\r
+ return MainModel::GetInstance().GetCardSettingCount();\r
+}\r
+\r
+CardId *MainPresenterSample::GetCardSettings(void)\r
+{\r
+ return MainModel::GetInstance().GetCardSettings();\r
+}\r
+\r
+void MainPresenterSample::InitDialSettings(void)\r
+{\r
+ return MainModel::GetInstance().InitDialSettings();\r
+}\r
+DialSetting& MainPresenterSample::GetDialSetting()\r
+{\r
+ return MainModel::GetInstance().GetDialSetting();\r
+}\r
+\r
+bool MainPresenterSample::IsFromSetCardView(void) const\r
+{\r
+ return MainModel::GetInstance().IsFromSetCardView();\r
+}\r
+\r
+void MainPresenterSample::SetFromSetCardView(bool isFrom)\r
+{\r
+ MainModel::GetInstance().SetFromSetCardView(isFrom);\r
+}\r
+\r
+uint8_t MainPresenterSample::GetFromCardId(void)\r
+{\r
+ return MainModel::GetInstance().GetFromCardId();\r
+}\r
+\r
+}\r
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: MainViewSample
- * Author:
- * Create: 2021-10-18
- */
-#include "wearable_log.h"
-#include "main/MainViewSample.h"
-#include "graphic_service.h"
-#include "common/image_cache_manager.h"
-#include "UICardPageFactory.h"
-
-namespace OHOS {
-static MainViewSample *g_pMainView = nullptr;
-static constexpr uint16_t MESLABLE_X_TMP = 177;
-static constexpr uint16_t MESLABLE_Y_TMP = 212;
-static constexpr uint16_t MESLABLE_WIDTH_TMP = 100;
-static constexpr uint16_t MESLABLE_HEIGHT_TMP = 30;
-static constexpr uint8_t FONT_SIZE_TMP = 24;
-static constexpr uint8_t PULL_MIDDLE_VIEW_OPA = 0;
-
-struct MainViewMapper {
- CardId id;
- UICardPage *(MainViewSample::*func)(void);
-};
-
-static const MainViewMapper CardMapper[] = {
- {WATCH_FACE, &MainViewSample::InitWatchFacePage},
- {HEART_RATE, &MainViewSample::InitHeartRatePage},
- {COMPASS, &MainViewSample::InitCompassPage},
- {ACTIVITY, &MainViewSample::InitActivityPage},
- {MUSIC_PLAYER, &MainViewSample::InitMusicPlayerPage},
- {VIDEO_CARD1, &MainViewSample::InitVideoCardPage1},
- {VIDEO_CARD2, &MainViewSample::InitVideoCardPage2},
- {VIDEO_CARD3, &MainViewSample::InitVideoCardPage3},
-};
-
-MainViewSample::MainViewSample()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::MainViewSample");
- g_pMainView = this;
-}
-
-MainViewSample::~MainViewSample()
-{
- dropDownView->ClearBackgroundBlur();
- messageView->ClearBackgroundBlur();
-
- for (int32_t i = 0; i < MAX_CARD; i++) {
- recordCard[i] = nullptr;
- pageStatus[i] = false;
- }
-
- if (mainSwipeGroup != nullptr) {
- delete mainSwipeGroup;
- mainSwipeGroup = nullptr;
- }
-
- if (mainClockView != nullptr) {
- delete mainClockView;
- mainClockView = nullptr;
- }
-
- if (activityWeekView != nullptr) {
- delete activityWeekView;
- activityWeekView = nullptr;
- }
-
- if (playersView != nullptr) {
- delete playersView;
- playersView = nullptr;
- }
-
- bool hasVideo = false;
- if (videoCard1 != nullptr) {
- hasVideo = true;
- delete videoCard1;
- videoCard1 = nullptr;
- }
-
- if (videoCard2 != nullptr) {
- hasVideo = true;
- delete videoCard2;
- videoCard2 = nullptr;
- }
-
- if (videoCard3 != nullptr) {
- hasVideo = true;
- delete videoCard3;
- videoCard3 = nullptr;
- }
-
- if (hasVideo) {
- ImageCacheManager::GetInstance().UnloadSingleRes(PNG_PREVIEW_CARD_VIDEO);
- }
-
- if (heartRateView != nullptr) {
- delete heartRateView;
- heartRateView = nullptr;
- }
-
- if (dropDownView != nullptr) {
- delete dropDownView;
- dropDownView = nullptr;
- }
-
- if (messageView != nullptr) {
- messageView->RemoveAll();
- delete messageView;
- messageView = nullptr;
- }
-
- if (messageLable != nullptr) {
- delete messageLable;
- messageLable = nullptr;
- }
-
- if (compassControlView != nullptr) {
- delete compassControlView;
- compassControlView = nullptr;
- }
-
- if (callback != nullptr) {
- delete callback;
- callback = nullptr;
- }
-
- g_pMainView = nullptr;
-}
-
-MainViewSample *MainViewSample::GetInstance(void)
-{
- return g_pMainView;
-}
-
-void MainViewSample::OnStart()
-{
- mainSwipeGroup = new UICrossView();
- if (mainSwipeGroup == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSwipeGroup new fail");
- return;
- }
-
- if (callback == nullptr) {
- callback = new ZoomEffect();
- if (callback == nullptr) {
- delete mainSwipeGroup;
- mainSwipeGroup = nullptr;
- GRAPHIC_LOGE("SwipeCallback new fail\n");
- return;
- }
- }
- callback->SetContainer(mainSwipeGroup);
-
- HorizontalViewInit();
- HorViewLoad();
- VerticalViewInit();
- VertViewLoad();
- mainSwipeGroup->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
- mainSwipeGroup->SetAnimatorTime(50); // 50: animator drag time(ms);
- mainSwipeGroup->SetLoopState(true);
- mainSwipeGroup->EnableScreenCap(true);
- mainSwipeGroup->RegisterSwipeCallback(callback);
- if (presenter_->IsFromSetCardView()) {
- presenter_->SetFromSetCardView(false);
- SwitchToCard(presenter_->GetFromCardId(), false);
- } else {
- SwitchToClockPage(false);
- }
- AddViewToRootContainer(mainSwipeGroup);
-}
-
-bool MainViewSample::HorizontalViewInit(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::HorizontalViewInit");
- presenter_->InitDialSettings();
- presenter_->InitCardSettings();
- uint8_t cardSettingNum = presenter_->GetCardSettingCount();
- CardId *cardSettings = presenter_->GetCardSettings();
- uint8_t cardMapNumber = sizeof(CardMapper) / sizeof(CardMapper[0]);
- for (int16_t i = 0; i < cardSettingNum; i++) {
- for (uint8_t j = 0; j < cardMapNumber; j++) {
- if (cardSettings[i] == CardMapper[j].id) {
- recordCard[j] = (this->*(CardMapper[j].func))();
- if (recordCard[j] == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
- "MainViewSample:: recordCard %d error", j);
- return false;
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
- "MainViewSample:: recordCard[%d]:%p", j, recordCard[j]);
- break;
- }
- }
- }
- mainSwipeGroup->SetOnSwipeListener(presenter_);
- mainSwipeGroup->SetOnLongPressListener(presenter_);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::InitPage over");
- return true;
-}
-
-void MainViewSample::HorViewLoad(void)
-{
- uint8_t cardSettingNum = presenter_->GetCardSettingCount();
- CardId *cardSettings = presenter_->GetCardSettings();
- for (int16_t i = 0; i < cardSettingNum; i++) {
- CardId cardId = cardSettings[i];
- if (recordCard[cardId] != nullptr) {
- mainSwipeGroup->HorAdd(recordCard[cardId]);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample:: HorViewLoad cardid = %d ViewIndex = %d",
- cardId, recordCard[cardId]->GetViewIndex());
- }
- }
-}
-
-void MainViewSample::VerticalViewInit(void)
-{
- dropDownView = new PullUpDownView();
- if (dropDownView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dropDownView new fail");
- return;
- }
- dropDownView->PreLoad();
- dropDownView->SetViewId("dropDownView");
- dropDownView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
- dropDownView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-
- messageView = new UICardPage();
- if (messageView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail");
- return;
- }
- messageView->SetPosition(0, 0);
- messageView->SetWidth(Screen::GetInstance().GetWidth());
- messageView->SetHeight(Screen::GetInstance().GetHeight());
- messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
- messageView->SetViewId("messageView");
- messageView->SetTouchable(true);
- messageView->SetIntercept(true);
- messageLable = new UILabel();
- if (messageLable == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLable new fail");
- return;
- }
- messageLable->SetPosition(MESLABLE_X_TMP, MESLABLE_Y_TMP, MESLABLE_WIDTH_TMP, MESLABLE_HEIGHT_TMP);
- messageLable->SetText("无消息");
- messageLable->SetAlign(TEXT_ALIGNMENT_CENTER);
- messageLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_SIZE_TMP);
- messageLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
- messageView->Add(messageLable);
-}
-
-void MainViewSample::VertViewLoad(void)
-{
- mainSwipeGroup->VerAdd(dropDownView, UICrossView::VPage::UP_PAGE);
- mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::PullViewLoad::Pull View Load complete");
-}
-
-void MainViewSample::OnStop()
-{
- messageView->RemoveAll();
- return;
-}
-
-UICardPage *MainViewSample::InitWatchOffDial(DialSetting &setting)
-{
- DialViewGroup *dial = new DialViewGroup();
- dial->SetDial(setting.dialFullName);
- return dial;
-}
-
-UICardPage *MainViewSample::InitWatchDial(DialSetting &setting)
-{
- return UICardPageFactory::GetInstance().CreateWatchDial(DIAL_DISPLAY_MODE_MAIN, setting.dialId);
-}
-
-UICardPage *MainViewSample::InitWatchFacePage(void)
-{
- DialSetting &setting = presenter_->GetDialSetting();
- if (setting.dialFlag) {
- mainClockView = InitWatchOffDial(setting);
- } else {
- mainClockView = InitWatchDial(setting);
- }
-
- if (mainClockView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView new fail");
- return nullptr;
- }
- return mainClockView;
-}
-
-UICardPage *MainViewSample::InitHeartRatePage(void)
-{
- heartRateView = new HeartRateView();
- if (heartRateView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateView new fail");
- return nullptr;
- }
- return heartRateView;
-}
-
-UICardPage *MainViewSample::InitActivityPage(void)
-{
- activityWeekView = new ActivityWeekView();
- if (activityWeekView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "activityWeekView new fail");
- return nullptr;
- }
- return activityWeekView;
-}
-
-UICardPage *MainViewSample::InitCompassPage(void)
-{
- compassControlView = new CompassControlView();
- if (compassControlView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "compassControlView new fail");
- return nullptr;
- }
- return compassControlView;
-}
-
-UICardPage *MainViewSample::InitMusicPlayerPage(void)
-{
- playersView = new PlayersView();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView new fail");
- return nullptr;
- }
- return playersView;
-}
-
-UICardPage *MainViewSample::InitVideoCardPage1(void)
-{
- videoCard1 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));
- return videoCard1;
-}
-
-UICardPage *MainViewSample::InitVideoCardPage2(void)
-{
- videoCard2 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));
- return videoCard2;
-}
-
-UICardPage *MainViewSample::InitVideoCardPage3(void)
-{
- videoCard3 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));
- return videoCard3;
-}
-
-UICardPage *MainViewSample::InitVideoCardPage(const std::string &video, const std::string &preview)
-{
- VideoCard *page = new VideoCard;
- if (page == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "videocard new fail");
- return nullptr;
- }
- page->SetFilePath(video);
- page->SetPreviewFile(preview);
- return page;
-}
-
-void MainViewSample::SetPage(int16_t page, bool loadAdjacent)
-{
- if (mainSwipeGroup != nullptr) {
- mainSwipeGroup->SetHorCurrentPage(page, loadAdjacent);
- }
-
- if (presenter_ != nullptr) {
- CardId *cardSettings = presenter_->GetCardSettings();
- /* page 与CardId 没有对应关系,需要一次转换 */
- CardId id = MAX_CARD;
- for (uint8_t i = 0; i < presenter_->GetCardSettingCount(); ++i) {
- if (cardSettings[i] < MAX_CARD && recordCard[cardSettings[i]] != nullptr &&
- recordCard[cardSettings[i]]->GetViewIndex() == page) {
- id = cardSettings[i];
- }
- }
- presenter_->SetTaskPeroid(id);
- }
-}
-
-void MainViewSample::ReloadWatchFace()
-{
- if (mainSwipeGroup == nullptr) {
- return;
- }
- mainSwipeGroup->Remove(mainClockView, UISwipeView::HORIZONTAL);
-
- delete mainClockView;
- mainClockView = nullptr;
- recordCard[WATCH_FACE] = InitWatchFacePage();
- if (recordCard[WATCH_FACE] == nullptr) {
- GRAPHIC_LOGE("failed to reload main clock");
- return;
- }
- mainSwipeGroup->HorInsert(nullptr, mainClockView);
-
- SwitchToCard(WATCH_FACE);
- Draw();
-}
-
-bool MainViewSample::IsMainClockPage(void)
-{
- if (mainSwipeGroup->GetCurrentPageId(0) == mainClockView->GetViewIndex() &&
- mainSwipeGroup->GetCurrentPageId(1) == 1) { // 0: horizontal; 1: vertical
- return true;
- } else {
- return false;
- }
-}
-
-CardId MainViewSample::GetHorCurrentCard() const
-{
- CardId *cardSettings = presenter_->GetCardSettings();
- int pageId = mainSwipeGroup->GetCurrentPageId(UISwipeView::HORIZONTAL); // 0: horizontal; 1: vertical
- /* pageId 与CardId 没有对应关系,需要一次转换 */
- for (uint8_t i = 0; i < presenter_->GetCardSettingCount(); ++i) {
- if (cardSettings[i] < MAX_CARD && recordCard[cardSettings[i]] != nullptr &&
- recordCard[cardSettings[i]]->GetViewIndex() == pageId) {
- return cardSettings[i];
- }
- }
- return MAX_CARD;
-}
-
-void MainViewSample::SwitchToCard(uint8_t cardId, bool loadAdjacent)
-{
- if ((cardId < MAX_CARD) && (recordCard[cardId] != nullptr)) {
- SetPage(recordCard[cardId]->GetViewIndex(), loadAdjacent);
- } else {
- SwitchToClockPage(loadAdjacent);
- }
-}
-} // OHOS
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainViewSample\r
+ * Author:\r
+ * Create: 2021-10-18\r
+ */\r
+#include "wearable_log.h"\r
+#include "main/MainViewSample.h"\r
+#include "graphic_service.h"\r
+#include "common/image_cache_manager.h"\r
+#include "swipe_effect/turn_page_effect.h"\r
+#include "swipe_effect/push_press_effect.h"\r
+#include "swipe_effect/cube_effect.h"\r
+#include "swipe_effect/windmill_effect.h"\r
+#include "swipe_effect/card_flip_effect.h"\r
+#include "swipe_effect/zoom_effect.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "clock/GradientClockView.h"\r
+#include "UIWatchDialFactory.h"\r
+\r
+namespace OHOS {\r
+static MainViewSample *g_pMainView = nullptr;\r
+static constexpr uint16_t MESLABLE_X_TMP = 177;\r
+static constexpr uint16_t MESLABLE_Y_TMP = 212;\r
+static constexpr uint16_t MESLABLE_WIDTH_TMP = 100;\r
+static constexpr uint16_t MESLABLE_HEIGHT_TMP = 30;\r
+static constexpr uint8_t FONT_SIZE_TMP = 24;\r
+static constexpr uint8_t PULL_MIDDLE_VIEW_OPA = 0;\r
+static constexpr uint8_t PAGE_ID = 2;\r
+\r
+struct MainViewMapper {\r
+ CardId id;\r
+ UICardPage *(MainViewSample::*func)(void);\r
+};\r
+\r
+static const MainViewMapper CardMapper[] = {\r
+ {WATCH_FACE, &MainViewSample::InitWatchFacePage},\r
+ {COMPASS, &MainViewSample::InitCompassPage},\r
+ {ACTIVITY, &MainViewSample::InitActivityPage},\r
+ {MUSIC_PLAYER, &MainViewSample::InitMusicPlayerPage},\r
+ {VIDEO_CARD1, &MainViewSample::InitVideoCardPage1},\r
+ {VIDEO_CARD2, &MainViewSample::InitVideoCardPage2},\r
+ {VIDEO_CARD3, &MainViewSample::InitVideoCardPage3},\r
+};\r
+\r
+MainViewSample::MainViewSample()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::MainViewSample");\r
+ g_pMainView = this;\r
+}\r
+\r
+MainViewSample::~MainViewSample()\r
+{\r
+ dropDownView->ClearBackgroundBlur();\r
+ messageView->ClearBackgroundBlur();\r
+\r
+ for (int32_t i = 0; i < MAX_CARD; i++) {\r
+ recordCard[i] = nullptr;\r
+ pageStatus[i] = false;\r
+ }\r
+\r
+ if (mainSwipeGroup != nullptr) {\r
+ delete mainSwipeGroup;\r
+ mainSwipeGroup = nullptr;\r
+ }\r
+\r
+ if (mainClockView != nullptr) {\r
+ delete mainClockView;\r
+ mainClockView = nullptr;\r
+ }\r
+\r
+ if (activityWeekView != nullptr) {\r
+ delete activityWeekView;\r
+ activityWeekView = nullptr;\r
+ }\r
+\r
+ if (playersView != nullptr) {\r
+ delete playersView;\r
+ playersView = nullptr;\r
+ }\r
+\r
+ bool hasVideo = false;\r
+ if (videoCard1 != nullptr) {\r
+ hasVideo = true;\r
+ delete videoCard1;\r
+ videoCard1 = nullptr;\r
+ }\r
+\r
+ if (videoCard2 != nullptr) {\r
+ hasVideo = true;\r
+ delete videoCard2;\r
+ videoCard2 = nullptr;\r
+ }\r
+\r
+ if (videoCard3 != nullptr) {\r
+ hasVideo = true;\r
+ delete videoCard3;\r
+ videoCard3 = nullptr;\r
+ }\r
+\r
+ if (hasVideo) {\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(PNG_PREVIEW_CARD_VIDEO);\r
+ }\r
+\r
+ if (dropDownView != nullptr) {\r
+ delete dropDownView;\r
+ dropDownView = nullptr;\r
+ }\r
+\r
+ if (messageView != nullptr) {\r
+ messageView->RemoveAll();\r
+ delete messageView;\r
+ messageView = nullptr;\r
+ }\r
+\r
+ if (compassControlView != nullptr) {\r
+ delete compassControlView;\r
+ compassControlView = nullptr;\r
+ }\r
+\r
+ if (callback != nullptr) {\r
+ delete callback;\r
+ callback = nullptr;\r
+ }\r
+\r
+ g_pMainView = nullptr;\r
+}\r
+\r
+MainViewSample *MainViewSample::GetInstance(void)\r
+{\r
+ return g_pMainView;\r
+}\r
+\r
+bool MainViewSample::SetCardEffect(CardEffectID style)\r
+{\r
+ if (mainSwipeGroup == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSwipeGroup is nullptr");\r
+ return false;\r
+ }\r
+ if (callback != nullptr) {\r
+ delete callback;\r
+ callback = nullptr;\r
+ }\r
+\r
+ std::map<CardEffectID, std::function<OHOS::CardSwipe*()>> effectMap = {\r
+ {CardEffectID::UI_CARD_FLIP, []{ return new CardFlipEffect(); }},\r
+ {CardEffectID::UI_ZOOM, []{ return new ZoomEffect(); }},\r
+ {CardEffectID::UI_CUBE, []{ return new CubeEffect(); }},\r
+ {CardEffectID::UI_TURN_PAGE, []{ return new TurnPageEffect(); }},\r
+ {CardEffectID::UI_PUSH_PRESS, []{ return new PushPressEffect(); }},\r
+ {CardEffectID::UI_WINDMILL, []{ return new WindmillEffect(); }},\r
+ };\r
+ auto it = effectMap.find(style);\r
+ if (it != effectMap.end()) {\r
+ callback = it->second();\r
+ } else {\r
+ callback = new ZoomEffect(); // ZoomEffect is used by default\r
+ }\r
+\r
+ if (callback == nullptr) {\r
+ delete mainSwipeGroup;\r
+ mainSwipeGroup = nullptr;\r
+ GRAPHIC_LOGE("Effect new fail\n");\r
+ return false;\r
+ }\r
+\r
+ callback->SetContainer(mainSwipeGroup);\r
+ mainSwipeGroup->RegisterSwipeCallback(callback);\r
+ return true;\r
+}\r
+\r
+void MainViewSample::OnStart()\r
+{\r
+ mainSwipeGroup = new UICrossView();\r
+ if (mainSwipeGroup == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainSwipeGroup new fail");\r
+ return;\r
+ }\r
+\r
+ SettingCardModel& swipeEffectModel = SettingCardModel::GetInstance();\r
+ if (!SetCardEffect(swipeEffectModel.GetSwipeEffectStyle())) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetCardEffect fail");\r
+ return;\r
+ }\r
+\r
+ HorizontalViewInit();\r
+ HorViewLoad();\r
+ VerticalViewInit();\r
+ VertViewLoad();\r
+ mainSwipeGroup->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ mainSwipeGroup->SetAnimatorTime(50); // 50: animator drag time(ms);\r
+ mainSwipeGroup->SetLoopState(true);\r
+ mainSwipeGroup->EnableScreenCap(true);\r
+ if (presenter_->IsFromSetCardView()) {\r
+ presenter_->SetFromSetCardView(false);\r
+ SwitchToCard(presenter_->GetFromCardId(), false);\r
+ } else {\r
+ SwitchToClockPage(false);\r
+ }\r
+ AddViewToRootContainer(mainSwipeGroup);\r
+}\r
+\r
+bool MainViewSample::HorizontalViewInit(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::HorizontalViewInit");\r
+ presenter_->InitDialSettings();\r
+ presenter_->InitCardSettings();\r
+ uint8_t cardSettingNum = presenter_->GetCardSettingCount();\r
+ CardId *cardSettings = presenter_->GetCardSettings();\r
+ uint8_t cardMapNumber = sizeof(CardMapper) / sizeof(CardMapper[0]);\r
+ for (int16_t i = 0; i < cardSettingNum; i++) {\r
+ for (uint8_t j = 0; j < cardMapNumber; j++) {\r
+ if (cardSettings[i] == CardMapper[j].id) {\r
+ recordCard[j] = (this->*(CardMapper[j].func))();\r
+ if (recordCard[j] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "MainViewSample:: recordCard %d error", j);\r
+ return false;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+ "MainViewSample:: recordCard[%d]:%p", j, recordCard[j]);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ mainSwipeGroup->SetOnSwipeListener(presenter_);\r
+ mainSwipeGroup->SetOnLongPressListener(presenter_);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::InitPage over");\r
+ return true;\r
+}\r
+\r
+void MainViewSample::HorViewLoad(void)\r
+{\r
+ uint8_t cardSettingNum = presenter_->GetCardSettingCount();\r
+ CardId *cardSettings = presenter_->GetCardSettings();\r
+ for (int16_t i = 0; i < cardSettingNum; i++) {\r
+ CardId cardId = cardSettings[i];\r
+ if (recordCard[cardId] != nullptr) {\r
+ mainSwipeGroup->HorAdd(recordCard[cardId]);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample:: HorViewLoad cardid = %d ViewIndex = %d",\r
+ cardId, recordCard[cardId]->GetViewIndex());\r
+ }\r
+ }\r
+}\r
+\r
+void MainViewSample::VerticalViewInit(void)\r
+{\r
+ dropDownView = new PullUpDownView();\r
+ if (dropDownView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dropDownView new fail");\r
+ return;\r
+ }\r
+ dropDownView->PreLoad();\r
+ dropDownView->SetViewId("dropDownView");\r
+ dropDownView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ dropDownView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ messageView = new MessageMainPage();\r
+ if (messageView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail");\r
+ return;\r
+ }\r
+ messageView->PreLoad();\r
+ messageView->SetPosition(0, 0);\r
+ messageView->SetWidth(Screen::GetInstance().GetWidth());\r
+ messageView->SetHeight(Screen::GetInstance().GetHeight());\r
+ messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ messageView->SetViewId("messageView");\r
+ messageView->SetTouchable(true);\r
+ messageView->SetIntercept(true);\r
+}\r
+\r
+void MainViewSample::VertViewLoad(void)\r
+{\r
+ mainSwipeGroup->VerAdd(dropDownView, UICrossView::VPage::UP_PAGE);\r
+ mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::PullViewLoad::Pull View Load complete");\r
+}\r
+\r
+void MainViewSample::OnStop()\r
+{\r
+ messageView->RemoveAll();\r
+ return;\r
+}\r
+\r
+UICardPage *MainViewSample::InitWatchOffDial(DialSetting &setting)\r
+{\r
+ DialViewGroup *dial = new DialViewGroup();\r
+ dial->SetDial(setting.dialFullName);\r
+ return dial;\r
+}\r
+\r
+UICardPage *MainViewSample::InitWatchDial(DialSetting &setting)\r
+{\r
+ return dynamic_cast<UICardPage*>(UIWatchDialFactory::GetInstance().CreateNormalDial(setting.dialId));\r
+}\r
+\r
+UICardPage *MainViewSample::InitWatchFacePage(void)\r
+{\r
+ DialSetting &setting = presenter_->GetDialSetting();\r
+ if (setting.dialFlag) {\r
+ mainClockView = InitWatchOffDial(setting);\r
+ } else {\r
+ mainClockView = InitWatchDial(setting);\r
+ }\r
+\r
+ if (mainClockView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainClockView new fail");\r
+ return nullptr;\r
+ }\r
+ return mainClockView;\r
+}\r
+\r
+UICardPage *MainViewSample::InitActivityPage(void)\r
+{\r
+ activityWeekView = new ActivityWeekView();\r
+ if (activityWeekView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "activityWeekView new fail");\r
+ return nullptr;\r
+ }\r
+ return activityWeekView;\r
+}\r
+\r
+UICardPage *MainViewSample::InitCompassPage(void)\r
+{\r
+ compassControlView = new CompassControlView();\r
+ if (compassControlView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "compassControlView new fail");\r
+ return nullptr;\r
+ }\r
+ return compassControlView;\r
+}\r
+\r
+UICardPage *MainViewSample::InitMusicPlayerPage(void)\r
+{\r
+ playersView = new PlayersView();\r
+ if (playersView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView new fail");\r
+ return nullptr;\r
+ }\r
+ return playersView;\r
+}\r
+\r
+UICardPage *MainViewSample::InitVideoCardPage1(void)\r
+{\r
+ videoCard1 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));\r
+ return videoCard1;\r
+}\r
+\r
+UICardPage *MainViewSample::InitVideoCardPage2(void)\r
+{\r
+ videoCard2 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));\r
+ return videoCard2;\r
+}\r
+\r
+UICardPage *MainViewSample::InitVideoCardPage3(void)\r
+{\r
+ videoCard3 = dynamic_cast<VideoCard*>(InitVideoCardPage(APP_VIDEO_PATH"/noaudio_05.mp4", PNG_PREVIEW_CARD_VIDEO));\r
+ return videoCard3;\r
+}\r
+\r
+UICardPage *MainViewSample::InitVideoCardPage(const std::string &video, const std::string &preview)\r
+{\r
+ VideoCard *page = new VideoCard;\r
+ if (page == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "videocard new fail");\r
+ return nullptr;\r
+ }\r
+ page->SetFilePath(video);\r
+ page->SetPreviewFile(preview);\r
+ return page;\r
+}\r
+\r
+void MainViewSample::SetPage(int16_t page, bool loadAdjacent)\r
+{\r
+ if (mainSwipeGroup != nullptr) {\r
+ mainSwipeGroup->SetHorCurrentPage(page, loadAdjacent);\r
+ }\r
+\r
+ if (presenter_ != nullptr) {\r
+ CardId *cardSettings = presenter_->GetCardSettings();\r
+ /* page 与CardId 没有对应关系,需要一次转换 */\r
+ CardId id = MAX_CARD;\r
+ for (uint8_t i = 0; i < presenter_->GetCardSettingCount(); ++i) {\r
+ if (cardSettings[i] < MAX_CARD && recordCard[cardSettings[i]] != nullptr &&\r
+ recordCard[cardSettings[i]]->GetViewIndex() == page) {\r
+ id = cardSettings[i];\r
+ }\r
+ }\r
+ presenter_->SetTaskPeroid(id);\r
+ }\r
+}\r
+\r
+void MainViewSample::ReloadWatchFace()\r
+{\r
+ if (mainSwipeGroup == nullptr) {\r
+ return;\r
+ }\r
+ mainSwipeGroup->Remove(mainClockView, UISwipeView::HORIZONTAL);\r
+\r
+ delete mainClockView;\r
+ mainClockView = nullptr;\r
+ recordCard[WATCH_FACE] = InitWatchFacePage();\r
+ if (recordCard[WATCH_FACE] == nullptr) {\r
+ GRAPHIC_LOGE("failed to reload main clock");\r
+ return;\r
+ }\r
+ mainSwipeGroup->HorInsert(nullptr, mainClockView);\r
+\r
+ SwitchToCard(WATCH_FACE);\r
+ Draw();\r
+}\r
+\r
+bool MainViewSample::IsMainClockPage(void)\r
+{\r
+ if (mainSwipeGroup->GetCurrentPageId(0) == mainClockView->GetViewIndex() &&\r
+ mainSwipeGroup->GetCurrentPageId(1) == 1) { // 0: horizontal; 1: vertical\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+}\r
+\r
+CardId MainViewSample::GetHorCurrentCard() const\r
+{\r
+ CardId *cardSettings = presenter_->GetCardSettings();\r
+ int pageId = mainSwipeGroup->GetCurrentPageId(UISwipeView::HORIZONTAL); // 0: horizontal; 1: vertical\r
+ /* pageId 与CardId 没有对应关系,需要一次转换 */\r
+ for (uint8_t i = 0; i < presenter_->GetCardSettingCount(); ++i) {\r
+ if (cardSettings[i] < MAX_CARD && recordCard[cardSettings[i]] != nullptr &&\r
+ recordCard[cardSettings[i]]->GetViewIndex() == pageId) {\r
+ return cardSettings[i];\r
+ }\r
+ }\r
+ return MAX_CARD;\r
+}\r
+\r
+void MainViewSample::GetVerCurrentCard() const\r
+{\r
+ int pageId = mainSwipeGroup->GetCurrentPageId(UISwipeView::VERTICAL);\r
+ if (pageId == PAGE_ID) {\r
+ MessageModel::GetInstance().SetTime();\r
+ std::vector<MessageItem> &itemInfo = MessageModel::GetInstance().GetMsgListItems();\r
+ MessageMainPage::GetInstance()->RefreshMsgList(itemInfo);\r
+ }\r
+}\r
+\r
+void MainViewSample::SwitchToCard(uint8_t cardId, bool loadAdjacent)\r
+{\r
+ if ((cardId < MAX_CARD) && (recordCard[cardId] != nullptr)) {\r
+ SetPage(recordCard[cardId]->GetViewIndex(), loadAdjacent);\r
+ } else {\r
+ SwitchToClockPage(loadAdjacent);\r
+ }\r
+}\r
+} // OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageDetailsGroup\r
+ * Created: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include "common/image_cache_manager.h"\r
+#include "NativeAbility.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "main/MessageDetailsGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t MESSAGE_ICON_X = 130;\r
+static constexpr int16_t MESSAGE_ICON_Y = 50;\r
+static constexpr int16_t MESSAGE_ICON_SIZE = 40;\r
+static constexpr int16_t MESSAGE_TITLES_X = 170;\r
+static constexpr int16_t MESSAGE_TITLES_Y = 40;\r
+static constexpr int16_t MESSAGE_TITLES_WIDTH = 160;\r
+static constexpr int16_t MESSAGE_TITLES_HEIGHT = 53;\r
+static constexpr int16_t MESSAGE_TITLES_FONT_SIZE = 38;\r
+static constexpr int16_t MESSAGE_CONTACTS_X = 15;\r
+static constexpr int16_t MESSAGE_CONTACTS_Y = 138;\r
+static constexpr int16_t MESSAGE_CONTACTS_WIDTH = 370;\r
+static constexpr int16_t MESSAGE_CONTACTS_HEIGHT = 50;\r
+static constexpr int16_t MESSAGE_CONTACTA_FONT_SIZE = 36;\r
+static constexpr int16_t MESSAGE_CONTENTS_X = 15;\r
+static constexpr int16_t MESSAGE_CONTENTS_Y = 201;\r
+static constexpr int16_t MESSAGE_CONTENTS_WIDTH = 370;\r
+static constexpr int16_t MESSAGE_CONTENTS_HEIGHT = 200;\r
+static constexpr int16_t MESSAGE_CONTENTA_FONT_SIZE = 36;\r
+static constexpr int16_t MESSAGE_TIME_X = 77;\r
+static constexpr int16_t MESSAGE_TIME_Y = 385;\r
+static constexpr int16_t MESSAGE_TIME_WIDTH = 300;\r
+static constexpr int16_t MESSAGE_TIME_HEIGHT = 40;\r
+static constexpr int16_t MESSAGE_TIME_FONT_SIZE = 36;\r
+constexpr int16_t PAGE_WIDTH = 454;\r
+\r
+DetailsGroup::DetailsGroup()\r
+{\r
+ InitDetailsPage();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DetailsGroup::DetailsGroup");\r
+}\r
+\r
+DetailsGroup::~DetailsGroup()\r
+{\r
+ RemoveAll();\r
+ if (detailsMsgIcon_ != nullptr) {\r
+ delete detailsMsgIcon_;\r
+ detailsMsgIcon_ = nullptr;\r
+ }\r
+ if (detailsMsgTitle_ != nullptr) {\r
+ delete detailsMsgTitle_;\r
+ detailsMsgTitle_ = nullptr;\r
+ }\r
+ if (detailsMsgContacts_ != nullptr) {\r
+ delete detailsMsgContacts_;\r
+ detailsMsgContacts_ = nullptr;\r
+ }\r
+ if (detailsMsgContents_ != nullptr) {\r
+ delete detailsMsgContents_;\r
+ detailsMsgContents_ = nullptr;\r
+ }\r
+ if (detailsMsgTime_ != nullptr) {\r
+ delete detailsMsgTime_;\r
+ detailsMsgTime_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DetailsGroup::~DetailsGroup");\r
+}\r
+\r
+void DetailsGroup::InitDetailsPage()\r
+{\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+ SetViewId("detail");\r
+ SetThrowDrag(true);\r
+ SetScrollBlankSize(31);\r
+\r
+ detailsMsgIcon_ = new UIImageView;\r
+ if (detailsMsgIcon_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgIcon_ fail");\r
+ return;\r
+ }\r
+ detailsMsgIcon_->SetPosition(MESSAGE_ICON_X, MESSAGE_ICON_Y);\r
+\r
+ detailsMsgTitle_ = new UILabel;\r
+ if (detailsMsgTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgTitle_ fail");\r
+ return;\r
+ }\r
+ detailsMsgTitle_->SetPosition(MESSAGE_TITLES_X, MESSAGE_TITLES_Y, MESSAGE_TITLES_WIDTH, MESSAGE_TITLES_HEIGHT);\r
+ detailsMsgTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, MESSAGE_TITLES_FONT_SIZE);\r
+ detailsMsgTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ detailsMsgTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ detailsMsgTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ detailsMsgTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ detailsMsgTitle_->SetVisible(true);\r
+\r
+ detailsMsgContacts_ = new UILabel;\r
+ if (detailsMsgContacts_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgContacts_ fail");\r
+ return;\r
+ }\r
+ detailsMsgContacts_->SetPosition(MESSAGE_CONTACTS_X, MESSAGE_CONTACTS_Y,\r
+ MESSAGE_CONTACTS_WIDTH, MESSAGE_CONTACTS_HEIGHT);\r
+ detailsMsgContacts_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MESSAGE_CONTACTA_FONT_SIZE);\r
+ detailsMsgContacts_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ detailsMsgContacts_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ detailsMsgContacts_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ detailsMsgContacts_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ detailsMsgContacts_->SetVisible(true);\r
+\r
+ detailsMsgContents_ = new UILabel;\r
+ if (detailsMsgContents_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgContents_ fail");\r
+ return;\r
+ }\r
+ detailsMsgContents_->SetPosition(MESSAGE_CONTENTS_X, MESSAGE_CONTENTS_Y,\r
+ MESSAGE_CONTENTS_WIDTH, MESSAGE_CONTENTS_HEIGHT);\r
+ detailsMsgContents_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MESSAGE_CONTENTA_FONT_SIZE);\r
+ detailsMsgContents_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_TOP);\r
+ detailsMsgContents_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ detailsMsgContents_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ detailsMsgContents_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ detailsMsgContents_->SetVisible(true);\r
+\r
+ detailsMsgTime_ = new UILabel;\r
+ if (detailsMsgTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsMsgTime_ fail");\r
+ return;\r
+ }\r
+ detailsMsgTime_->SetPosition(MESSAGE_TIME_X, MESSAGE_TIME_Y, MESSAGE_TIME_WIDTH, MESSAGE_TIME_HEIGHT);\r
+ detailsMsgTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MESSAGE_TIME_FONT_SIZE);\r
+ detailsMsgTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ detailsMsgTime_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ detailsMsgTime_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ detailsMsgTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ detailsMsgTime_->SetVisible(true);\r
+\r
+ Add(detailsMsgIcon_);\r
+ Add(detailsMsgTitle_);\r
+ Add(detailsMsgContacts_);\r
+ Add(detailsMsgContents_);\r
+ Add(detailsMsgTime_);\r
+}\r
+\r
+void DetailsGroup::RefreshNotify()\r
+{\r
+ detailsMsgTitle_->SetText(detailsMsg_.appName.c_str());\r
+ if (strcmp(detailsMsg_.appName.c_str(), "微信") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WX);\r
+ } else if (strcmp(detailsMsg_.appName.c_str(), "QQ") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_QQ);\r
+ } else if (strcmp(detailsMsg_.appName.c_str(), "抖音") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DY);\r
+ } else if (strcmp(detailsMsg_.appName.c_str(), "日历") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_CALENDAR);\r
+ } else if (strcmp(detailsMsg_.appName.c_str(), "信息") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+ } else if (strcmp(detailsMsg_.appName.c_str(), "短信") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+ } else if (strcmp(detailsMsg_.appName.c_str(), "今日头条") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_TOUTIAO);\r
+ } else if (strcmp(detailsMsg_.appName.c_str(), "微博") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WB);\r
+ } else if (strcmp(detailsMsg_.appName.c_str(), "小红书") == 0) {\r
+ LOADIMG::LoadImageViewImg(detailsMsgIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_XHS);\r
+ }\r
+ int controlOffset = 10;\r
+ int cut = 2;\r
+ int posX = (PAGE_WIDTH - detailsMsgTitle_->GetTextWidth() - detailsMsgIcon_->GetWidth() - controlOffset) / cut;\r
+ detailsMsgIcon_->SetX(posX);\r
+ detailsMsgTitle_->SetWidth(detailsMsgTitle_->GetTextWidth());\r
+ detailsMsgTitle_->SetX(posX + detailsMsgIcon_->GetWidth() + controlOffset);\r
+\r
+ std::string str = detailsMsg_.appContact + ":";\r
+ detailsMsgContacts_->SetText(str.c_str());\r
+ if (detailsMsgContacts_->GetTextWidth() > MESSAGE_CONTACTS_WIDTH) {\r
+ detailsMsgContacts_->SetWidth(MESSAGE_CONTACTS_WIDTH);\r
+ } else {\r
+ detailsMsgContacts_->SetWidth(detailsMsgContacts_->GetTextWidth());\r
+ }\r
+ posX = (PAGE_WIDTH - detailsMsgContacts_->GetWidth()) / cut;\r
+ detailsMsgContacts_->SetX(posX);\r
+\r
+ detailsMsgContents_->SetText(detailsMsg_.appContents.c_str());\r
+ int height = detailsMsgContents_->GetTextHeight();\r
+ detailsMsgContents_->SetHeight(height);\r
+ posX = (PAGE_WIDTH - detailsMsgContents_->GetWidth()) / cut;\r
+ detailsMsgContents_->SetX(posX);\r
+\r
+ detailsMsgTime_->SetText(detailsMsg_.time.c_str());\r
+ int posY = detailsMsgContents_->GetY() + height + (cut * controlOffset);\r
+ detailsMsgTime_->SetY(posY);\r
+ posX = (PAGE_WIDTH - detailsMsgTime_->GetWidth()) / cut;\r
+}\r
+\r
+}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- */\r
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MessageItemView.cpp\r
- * Author:\r
- * Create: 2021-11-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageItemView\r
+ * Create: 2025-06-29\r
*/\r
\r
#include "wearable_log.h"\r
+#include "ui_resource_message.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "main/MessageMainPage.h"\r
#include "main/MessageItemView.h"\r
\r
namespace OHOS {\r
- static constexpr int16 SETTING_ICON_X = 20;\r
- static constexpr int16 NUM_22 = 22;\r
- static constexpr int16_t SETTING_ITEM_BUTTON_HEIGHT = 80;\r
- static constexpr int16_t SETTING_ITEM_LABEL_WIDTH = 155;\r
- static constexpr int16_t SETTING_ITEM_LABEL_HEIGHT = 100;\r
- static constexpr int16 SETTING_ITEM_FONT_SIZE = 35;\r
- static constexpr int16_t SETTINGS_RESIZE_SIZE = 100;\r
- static constexpr int16_t SETTING_SICON_Y = 15;\r
- static constexpr int16 NUMS_2 = 2;\r
- static constexpr int16 NUMS_50 = 50;\r
-\r
- MessageItemView::MessageItemView()\r
- {\r
- SetPosition(0, 0, HORIZONTAL_RESOLUTION, 200);\r
- SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
- SetTouchable(true);\r
- SetUpChild();\r
-\r
- Add(&sback);\r
- Add(&sLabel_1);\r
- Add(&sIcon);\r
- Add(&sLabel_2);\r
- Add(&sLabel_3);\r
- }\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_X = 30;\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_EX = -100;\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_MOVEX = 100;\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_WIDTH = 454;\r
+static constexpr int16_t MESSAGE_ITEM_GROUP_HEIGHT = 130;\r
+static constexpr int16_t MESSAGE_ITEM_DELETE_X = 283;\r
+static constexpr int16_t MESSAGE_ITEM_DELETE_SIZE = 36;\r
+static constexpr int16_t MESSAGE_ITEM_APPNAME_X = 60;\r
+static constexpr int16_t MESSAGE_ITEM_APPNAME_Y = 15;\r
+static constexpr int16_t MESSAGE_ITEM_APPNAME_WIDTH = 131;\r
+static constexpr int16_t MESSAGE_ITEM_APPNAME_HEIGHT = 45;\r
+static constexpr int16_t ITEM_APPNAME_FONT_SIZE = 32;\r
+static constexpr int16_t MESSAGE_ITEM_APPICON_X = 10;\r
+static constexpr int16_t MESSAGE_ITEM_APPICON_Y = 15;\r
+static constexpr int16_t MESSAGE_ITEM_APPICON_SIZE = 30;\r
+static constexpr int16_t MESSAGE_ITEM_CONTACT_X = 10;\r
+static constexpr int16_t MESSAGE_ITEM_CONTACT_Y = 73;\r
+static constexpr int16_t MESSAGE_ITEM_CONTACT_WIDTH = 95;\r
+static constexpr int16_t MESSAGE_ITEM_CONTACT_HEIGHT = 42;\r
+static constexpr int16_t ITEM_CONTACT_FONT_SIZE = 30;\r
+static constexpr int16_t MESSAGE_ITEM_INFOR_X = 110;\r
+static constexpr int16_t MESSAGE_ITEM_INFOR_Y = 73;\r
+static constexpr int16_t MESSAGE_ITEM_INFOR_WIDTH = 156;\r
+static constexpr int16_t MESSAGE_ITEM_INFOR_HEIGHT = 42;\r
+static constexpr int16_t ITEM_INFOR_FONT_SIZE = 30;\r
+static constexpr int16_t MESSAGE_ITEM_TIME_X = 270;\r
+static constexpr int16_t MESSAGE_ITEM_TIME_Y = 75;\r
+static constexpr int16_t MESSAGE_ITEM_TIME_WIDTH = 100;\r
+static constexpr int16_t MESSAGE_ITEM_TIME_HEIGHT = 36;\r
+static constexpr int16_t ITEM_TIME_FONT_SIZE = 26;\r
+static constexpr char *DELETE_BUTTON = "deleteButton";\r
+\r
+MessageItemView::MessageItemView()\r
+{\r
+ appName_.SetPosition(MESSAGE_ITEM_APPNAME_X, MESSAGE_ITEM_APPNAME_Y,\r
+ MESSAGE_ITEM_APPNAME_WIDTH, MESSAGE_ITEM_APPNAME_HEIGHT);\r
+ appName_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_APPNAME_FONT_SIZE);\r
+ appName_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ appName_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ appName_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ appName_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ appIcon_.SetPosition(MESSAGE_ITEM_APPICON_X, MESSAGE_ITEM_APPICON_Y,\r
+ MESSAGE_ITEM_APPICON_SIZE, MESSAGE_ITEM_APPICON_SIZE);\r
+ appIcon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+ appContact_.SetPosition(MESSAGE_ITEM_CONTACT_X, MESSAGE_ITEM_CONTACT_Y,\r
+ MESSAGE_ITEM_CONTACT_WIDTH, MESSAGE_ITEM_CONTACT_HEIGHT);\r
+ appContact_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_CONTACT_FONT_SIZE);\r
+ appContact_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ appContact_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ appContact_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ appContact_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ appContents_.SetPosition(MESSAGE_ITEM_INFOR_X, MESSAGE_ITEM_INFOR_Y,\r
+ MESSAGE_ITEM_INFOR_WIDTH, MESSAGE_ITEM_INFOR_HEIGHT);\r
+ appContents_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_INFOR_FONT_SIZE);\r
+ appContents_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ appContents_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ appContents_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ appContents_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ msgTime_.SetPosition(MESSAGE_ITEM_TIME_X, MESSAGE_ITEM_TIME_Y,\r
+ MESSAGE_ITEM_TIME_WIDTH, MESSAGE_ITEM_TIME_HEIGHT);\r
+ msgTime_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_TIME_FONT_SIZE);\r
+ msgTime_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ msgTime_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ msgTime_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ msgTime_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ LOADIMG::LoadImageViewImg(&bgImg_, MESSAGE_IMAGE, IMAGE_MESSAGE_BG);\r
+\r
+ group_.SetPosition(MESSAGE_ITEM_GROUP_X, 0, MESSAGE_ITEM_GROUP_WIDTH, MESSAGE_ITEM_GROUP_HEIGHT);\r
+ group_.SetViewId("message");\r
+ group_.SetDraggable(true);\r
+ group_.SetTouchable(true);\r
+\r
+ deleteImg_.SetPosition(MESSAGE_ITEM_DELETE_X, 0, MESSAGE_ITEM_DELETE_SIZE, MESSAGE_ITEM_DELETE_SIZE);\r
+ LOADIMG::LoadImageViewImg(&deleteImg_, MESSAGE_IMAGE, IMAGE_MESSAGE_SINGLE_DELETE);\r
+ deleteImg_.SetViewId(DELETE_BUTTON);\r
+ deleteImg_.SetTouchable(true);\r
+ deleteImg_.SetOnClickListener(this);\r
\r
- MessageItemView::~MessageItemView()\r
- {\r
- Remove(&sIcon);\r
- Remove(&sLabel_1);\r
- Remove(&sLabel_2);\r
- Remove(&sLabel_3);\r
- Remove(&sback);\r
+ group_.Add(&bgImg_);\r
+ group_.Add(&appName_);\r
+ group_.Add(&appIcon_);\r
+ group_.Add(&appContact_);\r
+ group_.Add(&appContents_);\r
+ group_.Add(&msgTime_);\r
+ Add(&group_);\r
+ Add(&deleteImg_);\r
+\r
+}\r
+\r
+MessageItemView::~MessageItemView()\r
+{\r
+ group_.RemoveAll();\r
+ Remove(&appIcon_);\r
+ Remove(&appName_);\r
+ Remove(&appContact_);\r
+ Remove(&appContents_);\r
+ Remove(&bgImg_);\r
+ Remove(&msgTime_);\r
+ Remove(&group_);\r
+ Remove(&deleteImg_);\r
+}\r
+\r
+void MessageItemView::SetItemInfo(const MessageItem itemInfo)\r
+{\r
+ msgItemInfo_ = itemInfo;\r
+ appName_.SetText(itemInfo.appName.c_str());\r
+ appContact_.SetText(itemInfo.appContact.c_str());\r
+ appContents_.SetText(itemInfo.appContents.c_str());\r
+ msgTime_.SetText(itemInfo.time.c_str());\r
+ // 获取label1的内容更改图标\r
+ if (strcmp(msgItemInfo_.appName.c_str(), "微信") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WX);\r
+ } else if (strcmp(msgItemInfo_.appName.c_str(), "QQ") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_QQ);\r
+ } else if (strcmp(msgItemInfo_.appName.c_str(), "抖音") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DY);\r
+ } else if (strcmp(msgItemInfo_.appName.c_str(), "日历") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_CALENDAR);\r
+ } else if (strcmp(msgItemInfo_.appName.c_str(), "信息") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+ } else if (strcmp(msgItemInfo_.appName.c_str(), "短信") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+ } else if (strcmp(msgItemInfo_.appName.c_str(), "今日头条") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_TOUTIAO);\r
+ } else if (strcmp(msgItemInfo_.appName.c_str(), "微博") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WB);\r
+ } else if (strcmp(msgItemInfo_.appName.c_str(), "小红书") == 0) {\r
+ LOADIMG::LoadImageViewImg(&appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_XHS);\r
}\r
+ if (msgItemInfo_.status == false) {\r
+ group_.SetPosition(MESSAGE_ITEM_GROUP_X, 0, MESSAGE_ITEM_GROUP_WIDTH, MESSAGE_ITEM_GROUP_HEIGHT);\r
+ } else {\r
+ group_.SetPosition(MESSAGE_ITEM_GROUP_EX, 0, MESSAGE_ITEM_GROUP_WIDTH, MESSAGE_ITEM_GROUP_HEIGHT);\r
+ }\r
+ deleteImg_.SetVisible(msgItemInfo_.status);\r
+}\r
+\r
+MessageItem MessageItemView::GetItem()\r
+{\r
+ return msgItemInfo_;\r
+}\r
\r
- void MessageItemView::SetItemInfo(const MessageItem itemInfo)\r
- {\r
- sItemInfo = itemInfo;\r
- sLabel_1.SetText(itemInfo.label_1.c_str());\r
- sIcon.SetSrc(itemInfo.icon.c_str());\r
- sLabel_2.SetText(itemInfo.label_2.c_str());\r
- sLabel_3.SetText(itemInfo.label_3.c_str());\r
+void MessageItemView::SetIndex(uint16_t index)\r
+{\r
+ itemIndex_ = index;\r
+}\r
+\r
+uint16_t MessageItemView ::GetIndex()\r
+{\r
+ return itemIndex_;\r
+}\r
+\r
+bool MessageItemView::OnDragStartEvent(const DragEvent& event)\r
+{\r
+ return false;\r
+}\r
+\r
+bool MessageItemView::OnDragEvent(const DragEvent& event)\r
+{\r
+ // 检查拖拽方向是否为左到右,并且X坐标在允许范围内(0到100之间)\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT &&\r
+ (((0 - group_.GetX()) <= MESSAGE_ITEM_GROUP_MOVEX)))) {\r
+ int pox = group_.GetX() + event.GetDeltaX();\r
+ group_.SetX(pox);\r
+ group_.Invalidate();\r
+ Invalidate();\r
+ return true;\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+ group_.SetX(MESSAGE_ITEM_GROUP_X);\r
+ group_.Invalidate();\r
+ deleteImg_.SetVisible(false);\r
+ return true;\r
}\r
+ return false;\r
+}\r
\r
- void MessageItemView::SetUpChild()\r
- {\r
- sLabel_1.SetPosition(50, 10);\r
- sLabel_1.Resize(SETTING_ITEM_LABEL_WIDTH, 50);\r
- sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
- sLabel_1.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- sLabel_1.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- sLabel_1.SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
- sLabel_1.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-\r
- sIcon.SetPosition(15, SETTING_SICON_Y);\r
- sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
-\r
- sLabel_2.SetPosition(15, 78);\r
- sLabel_2.Resize(100, 50);\r
- sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
- sLabel_2.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- sLabel_2.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- sLabel_2.SetStyle(STYLE_BACKGROUND_COLOR, Color::Orange().full);\r
- sLabel_2.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-\r
- sLabel_3.SetPosition(150, 78, 100, 50);\r
- sLabel_3.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
- sLabel_3.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- sLabel_3.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- sLabel_3.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- sLabel_3.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
- sLabel_3.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-\r
- sback.SetPosition(0, 0, 450, 180);\r
- sback.SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);\r
- sback.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+bool MessageItemView::OnDragEndEvent(const DragEvent& event)\r
+{\r
+ // 超出一定距离 显示X按钮\r
+ if ((0 - group_.GetX()) >= MESSAGE_ITEM_GROUP_MOVEX) {\r
+ group_.SetX(MESSAGE_ITEM_GROUP_EX);\r
+ group_.Invalidate();\r
+ deleteImg_.SetVisible(true);\r
+ msgItemInfo_.status = true;\r
+ SetIndex(msgItemInfo_.index);\r
+ // 恢复其它item位置\r
+ UpdateItemStatus();\r
+ Invalidate();\r
+ return true;\r
+ } else {\r
+ group_.SetPosition(MESSAGE_ITEM_GROUP_X, 0,\r
+ MESSAGE_ITEM_GROUP_WIDTH, MESSAGE_ITEM_GROUP_HEIGHT);\r
+ group_.Invalidate();\r
+ }\r
+ return false;\r
+}\r
\r
+bool MessageItemView::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), DELETE_BUTTON) == 0) {\r
+ deleteImg_.SetVisible(false);\r
+ // 单项删除\r
+ MessageModel::GetInstance().DeleteItem(msgItemInfo_);\r
+ return true;\r
}\r
+ return false;\r
+}\r
\r
-}
\ No newline at end of file
+// 恢复item的位置\r
+void MessageItemView::UpdateItemStatus()\r
+{\r
+ std::vector<MessageItem> &vecMsg = MessageModel::GetInstance().GetMsgListItems();\r
+ for (int i = 0; i < vecMsg.size(); ++i) {\r
+ if (vecMsg[i].index == itemIndex_) {\r
+ vecMsg[i].status = true;\r
+ } else {\r
+ vecMsg[i].status = false;\r
+ }\r
+ }\r
+ MessageMainPage::GetInstance()->RefreshMsgList(vecMsg);\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MessageMainPage\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "common/screen.h"\r
+#include "ui_resource_image.h"\r
+#include "ui_resource_message.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "UiConfig.h"\r
+#include "main/MainPresenterSample.h"\r
+#include "main/MessageMainPage.h"\r
+\r
+namespace OHOS {\r
+\r
+static constexpr int16_t MESSAGE_TITLE_X = 97;\r
+static constexpr int16_t MESSAGE_TITLE_Y = 31;\r
+static constexpr int16_t MESSAGE_TITLE_WIDTH = 260;\r
+static constexpr int16_t MESSAGE_TITLE_HEIGHT = 53;\r
+static constexpr int16_t MESSAGE_TITLE_FONT_SIZE = 38;\r
+static constexpr int16_t NOTICE_IMAGE_X = 191;\r
+static constexpr int16_t NOTICE_IMAGE_Y = 361;\r
+static constexpr int16_t NOTICE_IMAGE_SIZE = 85;\r
+static constexpr int16_t MESAGE_LIST_X = 5;\r
+static constexpr int16_t MESAGE_LIST_Y = 100;\r
+static constexpr int16_t MESSAGE_LIST_WIDTH = 454;\r
+static constexpr int16_t MESSAGE_LIST_HEIGHT = 354;\r
+static constexpr int16_t MESSAGE_SCORLL_BAR_X = 222;\r
+static constexpr int16_t MESSAGE_SCORLL_BAR_Y = 129;\r
+static constexpr int16_t MESSAGE_SCORLL_BLANK_SIZE = 70;\r
+static constexpr int16_t MESSAGE_DELETE_REMINDER_X = 21;\r
+static constexpr int16_t MESSAGE_DELETE_REMINDER_Y = 158;\r
+static constexpr int16_t MESSAGE_DELETE_REMINDER_WIDTH = 424;\r
+static constexpr int16_t MESSAGE_DELETE_REMINDER_HEIGHT = 50;\r
+static constexpr int16_t DELETE_REMINDER_FONT_SIZE = 36;\r
+static constexpr int16_t MESSAGE_DELETE_CONFIRM_X = 260;\r
+static constexpr int16_t MESSAGE_DELETE_CONFIRM_Y = 300;\r
+static constexpr int16_t MESSAGE_DELETE_CONFIRM_SIZE = 85;\r
+static constexpr int16_t MESSAGE_DELETE_CANCEL_X = 110;\r
+static constexpr int16_t MESSAGE_DELETE_CANCEL_Y = 300;\r
+static constexpr int16_t MESSAGE_DELETE_CANCEL_SIZE = 85;\r
+static constexpr int16_t NOMESSAGE_TITLE_X = 45;\r
+static constexpr int16_t NOMESSAGE_TITLE_Y = 341;\r
+static constexpr int16_t NOMESSAGE_TITLE_WIDTH = 364;\r
+static constexpr int16_t NOMESSAGE_TITLE_HEIGHT = 50;\r
+static constexpr int16_t NOMESSAGE_TITLE_FONT_SIZE = 36;\r
+static constexpr int16_t NOMESSAGE_ICON_X = 154;\r
+static constexpr int16_t NOMESSAGE_ICON_Y = 154;\r
+static constexpr int16_t NOMESSAGE_ICON_SIZE = 146;\r
+static constexpr int16_t MOVE_DISTANCE = 30;\r
+static constexpr int16_t MESSAGE_ITEM_HEIGHT = 130;\r
+static constexpr char *DELETE_BUTTON = "deleteButton";\r
+static constexpr char *CONFIRM_BUTTON = "confirmButton";\r
+static constexpr char *CANCEL_BUTTON = "cancelButton";\r
+\r
+static MessageMainPage *g_pMessageMainView = nullptr;\r
+\r
+MessageMainPage::MessageMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainPage::MessageMainPage");\r
+ g_pMessageMainView = this;\r
+}\r
+\r
+MessageMainPage::~MessageMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainPage::~MessageMainPage");\r
+ RemoveAll();\r
+ if (detailsGroup_ != nullptr) {\r
+ delete detailsGroup_;\r
+ detailsGroup_ = nullptr;\r
+ }\r
+ if (deleteGroup_ != nullptr) {\r
+ deleteGroup_->RemoveAll();\r
+ delete deleteGroup_;\r
+ deleteGroup_ = nullptr;\r
+ }\r
+ if (noMsgLable_ != nullptr) {\r
+ delete noMsgLable_;\r
+ noMsgLable_ = nullptr;\r
+ }\r
+ if (msgLable_ != nullptr) {\r
+ delete msgLable_;\r
+ msgLable_ = nullptr;\r
+ }\r
+ if (noMsgImage_ != nullptr) {\r
+ delete noMsgImage_;\r
+ noMsgImage_ = nullptr;\r
+ }\r
+ if (deleteTips_ != nullptr) {\r
+ delete deleteTips_;\r
+ deleteTips_ = nullptr;\r
+ }\r
+ if (confirm_ != nullptr) {\r
+ delete confirm_;\r
+ confirm_ = nullptr;\r
+ }\r
+ if (cancel_ != nullptr) {\r
+ delete cancel_;\r
+ cancel_ = nullptr;\r
+ }\r
+ if (deleteImage_ != nullptr) {\r
+ delete deleteImage_;\r
+ deleteImage_ = nullptr;\r
+ }\r
+ if (msgList_ != nullptr) {\r
+ delete msgList_;\r
+ msgList_ = nullptr;\r
+ }\r
+\r
+ g_pMessageMainView = nullptr;\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(MESSAGE_IMAGE);\r
+ MessageModel::GetInstance().SetViewStatus(false);\r
+}\r
+\r
+MessageMainPage *MessageMainPage::GetInstance(void)\r
+{\r
+ return g_pMessageMainView;\r
+}\r
+\r
+bool MessageMainPage::InitView()\r
+{\r
+ msgLable_ = new UILabel();\r
+ if (msgLable_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "msgLable_ new fail");\r
+ return false;\r
+ }\r
+ msgLable_->SetPosition(MESSAGE_TITLE_X, MESSAGE_TITLE_Y, MESSAGE_TITLE_WIDTH, MESSAGE_TITLE_HEIGHT);\r
+ msgLable_->SetText("通知");\r
+ msgLable_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ msgLable_->SetFont(BOLD_VECTOR_FONT_FILENAME, MESSAGE_TITLE_FONT_SIZE);\r
+ msgLable_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+ msgLable_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+\r
+ // 删除图标\r
+ deleteImage_ = new UIImageView();\r
+ if (deleteImage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new deleteImage_ fail");\r
+ return false;\r
+ }\r
+ deleteImage_->SetPosition(NOTICE_IMAGE_X, NOTICE_IMAGE_Y, NOTICE_IMAGE_SIZE, NOTICE_IMAGE_SIZE);\r
+ LOADIMG::LoadImageViewImg(deleteImage_, MESSAGE_IMAGE, IMAGE_MESSAGE_DELETE);\r
+ deleteImage_->SetViewId(DELETE_BUTTON);\r
+ deleteImage_->SetTouchable(true);\r
+ deleteImage_->SetOnClickListener(this);\r
+ InitMsgList();\r
+ InitScrollData();\r
+ Add(msgLable_);\r
+ Add(deleteImage_);\r
+ return true;\r
+}\r
+\r
+void MessageMainPage::PreLoad(void)\r
+{\r
+ if (! MessageModel::GetInstance().GetViewStatus()) {\r
+ DeleteView();\r
+ NoNotify();\r
+ InitView();\r
+ const std::vector<MessageItem> &itemInfo = MessageModel::GetInstance().GetMsgListItems();\r
+ if (itemInfo.size() == 0) {\r
+ msgLable_->SetVisible(true);\r
+ deleteImage_->SetVisible(false);\r
+ msgList_->SetVisible(false);\r
+ deleteGroup_->SetVisible(false);\r
+ noMsgLable_->SetVisible(true);\r
+ noMsgImage_->SetVisible(true);\r
+ } else {\r
+ msgLable_->SetVisible(true);\r
+ deleteImage_->SetVisible(true);\r
+ msgList_->SetVisible(true);\r
+ deleteGroup_->SetVisible(false);\r
+ noMsgLable_->SetVisible(false);\r
+ noMsgImage_->SetVisible(false);\r
+ }\r
+ MessageModel::GetInstance().SetViewStatus(true);\r
+ }\r
+}\r
+\r
+void MessageMainPage::InitMsgList(void)\r
+{\r
+ msgList_ = new UISimpleList();\r
+ if (msgList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new msgList_ is nullptr");\r
+ return;\r
+ }\r
+ msgList_->SetPosition(MESAGE_LIST_X, MESAGE_LIST_Y, MESSAGE_LIST_WIDTH, MESSAGE_LIST_HEIGHT);\r
+ msgList_->SetScrollBlankSize(MESSAGE_SCORLL_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ msgList_->SetDraggable(true);\r
+ msgList_->SetThrowDrag(true);\r
+ msgList_->EnableAutoAlign(true);\r
+ msgList_->SetYScrollBarVisible(true);\r
+ Point scorllBarPoint = {MESSAGE_SCORLL_BAR_X, MESSAGE_SCORLL_BAR_Y};\r
+ msgList_->SetScrollBarCenter(scorllBarPoint);\r
+ msgList_->SetOnDragListener(this);\r
+ Add(msgList_);\r
+}\r
+\r
+void MessageMainPage::ConfirmDelete(void)\r
+{\r
+ if (deleteImage_->IsVisible()) {\r
+ deleteImage_->SetVisible(false);\r
+ }\r
+ if (msgLable_->IsVisible()) {\r
+ msgLable_->SetVisible(false);\r
+ }\r
+ if (msgList_->IsVisible()) {\r
+ msgList_->SetVisible(false);\r
+ }\r
+ if (noMsgLable_->IsVisible()) {\r
+ noMsgLable_->SetVisible(false);\r
+ }\r
+ if (noMsgImage_->IsVisible()) {\r
+ noMsgImage_->SetVisible(false);\r
+ }\r
+ deleteGroup_->SetVisible(true);\r
+}\r
+\r
+void MessageMainPage::NewNotify(void)\r
+{\r
+ if (noMsgLable_->IsVisible()) {\r
+ noMsgLable_->SetVisible(false);\r
+ }\r
+ if (noMsgImage_->IsVisible()) {\r
+ noMsgImage_->SetVisible(false);\r
+ }\r
+ if (! deleteImage_->IsVisible()) {\r
+ deleteImage_->SetVisible(true);\r
+ }\r
+ if (! msgLable_->IsVisible()) {\r
+ msgLable_->SetVisible(true);\r
+ }\r
+ if (! msgList_->IsVisible()) {\r
+ msgList_->SetVisible(true);\r
+ }\r
+}\r
+\r
+void MessageMainPage::DeleteView(void)\r
+{\r
+ // deleteGroup_这个页面会多次创建,防止new多次 加入判空处理\r
+ if (deleteGroup_ == nullptr) {\r
+ deleteGroup_ = new UIScrollView;\r
+ if (deleteGroup_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new deleteGroup_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+ deleteGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+ // 标题\r
+ deleteTips_ = new UILabel();\r
+ if (deleteTips_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new deleteTips_ is nullptr");\r
+ return;\r
+ }\r
+ deleteTips_->SetPosition(MESSAGE_DELETE_REMINDER_X, MESSAGE_DELETE_REMINDER_Y,\r
+ MESSAGE_DELETE_REMINDER_WIDTH, MESSAGE_DELETE_REMINDER_HEIGHT);\r
+ deleteTips_->SetText("是否清空消息通知?");\r
+ deleteTips_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DELETE_REMINDER_FONT_SIZE);\r
+ deleteTips_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ deleteTips_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+\r
+ // 确认按钮\r
+ confirm_ = new UIImageView();\r
+ if (confirm_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new confirm_ is nullptr");\r
+ return;\r
+ }\r
+ confirm_->SetPosition(MESSAGE_DELETE_CONFIRM_X, MESSAGE_DELETE_CONFIRM_Y,\r
+ MESSAGE_DELETE_CONFIRM_SIZE, MESSAGE_DELETE_CONFIRM_SIZE);\r
+ LOADIMG::LoadImageViewImg(confirm_, MESSAGE_IMAGE, IMAGE_MESSAGE_CONFIRM);\r
+ confirm_->SetViewId(CONFIRM_BUTTON);\r
+ confirm_->SetTouchable(true);\r
+ confirm_->SetOnClickListener(this);\r
+\r
+ // 取消按钮\r
+ cancel_ = new UIImageView();\r
+ if (cancel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new cancel_ is nullptr");\r
+ return;\r
+ }\r
+ cancel_->SetPosition(MESSAGE_DELETE_CANCEL_X, MESSAGE_DELETE_CANCEL_Y,\r
+ MESSAGE_DELETE_CANCEL_SIZE, MESSAGE_DELETE_CANCEL_SIZE);\r
+ LOADIMG::LoadImageViewImg(cancel_, MESSAGE_IMAGE, IMAGE_MESSAGE_CANCEL);\r
+ cancel_->SetViewId(CANCEL_BUTTON);\r
+ cancel_->SetTouchable(true);\r
+ cancel_->SetOnClickListener(this);\r
+\r
+ deleteGroup_->Add(deleteTips_);\r
+ deleteGroup_->Add(confirm_);\r
+ deleteGroup_->Add(cancel_);\r
+ Add(deleteGroup_);\r
+}\r
+\r
+void MessageMainPage::VerticalViewInits(void)\r
+{\r
+ deleteGroup_->SetVisible(false);\r
+ if (! noMsgLable_->IsVisible()) {\r
+ noMsgLable_->SetVisible(true);\r
+ }\r
+ if (! noMsgImage_->IsVisible()) {\r
+ noMsgImage_->SetVisible(true);\r
+ }\r
+ if (! msgLable_->IsVisible()) {\r
+ msgLable_->SetVisible(true);\r
+ }\r
+}\r
+\r
+void MessageMainPage::NoNotify(void)\r
+{\r
+ noMsgLable_ = new UILabel();\r
+ if (noMsgLable_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new noMsgLable_ fail");\r
+ return;\r
+ }\r
+ noMsgLable_->SetPosition(NOMESSAGE_TITLE_X, NOMESSAGE_TITLE_Y,\r
+ NOMESSAGE_TITLE_WIDTH, NOMESSAGE_TITLE_HEIGHT);\r
+ noMsgLable_->SetText("没有通知");\r
+ noMsgLable_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ noMsgLable_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, NOMESSAGE_TITLE_FONT_SIZE);\r
+ noMsgLable_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+\r
+ noMsgImage_ = new UIImageView();\r
+ if (noMsgImage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new noMsgImage_ is nullptr");\r
+ return;\r
+ }\r
+ noMsgImage_->SetPosition(NOMESSAGE_ICON_X, NOMESSAGE_ICON_Y, NOMESSAGE_ICON_SIZE, NOMESSAGE_ICON_SIZE);\r
+ LOADIMG::LoadImageViewImg(noMsgImage_, MESSAGE_IMAGE, IMAGE_MESSAGE_RING);\r
+ Add(noMsgLable_);\r
+ Add(noMsgImage_);\r
+}\r
+\r
+void MessageMainPage::CancelDelete(void)\r
+{\r
+ deleteGroup_->SetVisible(false);\r
+ if (! msgLable_->IsVisible()) {\r
+ msgLable_->SetVisible(true);\r
+ }\r
+ if (! deleteImage_->IsVisible()) {\r
+ deleteImage_->SetVisible(true);\r
+ }\r
+ if (! msgList_->IsVisible()) {\r
+ msgList_->SetVisible(true);\r
+ }\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+ MessageItemView* item = new MessageItemView();\r
+ if (item == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new item is nullptr");\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, HORIZONTAL_RESOLUTION, MESSAGE_ITEM_HEIGHT);\r
+ item->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_pMessageMainView);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ MessageItemView* item = dynamic_cast<MessageItemView*>(view);\r
+ if (data == nullptr || item == nullptr) {\r
+ return;\r
+ }\r
+ MessageItem* content = static_cast<MessageItem *>(data);\r
+ item->SetItemInfo(*content);\r
+}\r
+\r
+void MessageMainPage::RefreshMsgList(std::vector<MessageItem> &item)\r
+{\r
+ if (item.size() == 0) {\r
+ msgLable_->SetVisible(true);\r
+ deleteImage_->SetVisible(false);\r
+ msgList_->SetVisible(false);\r
+ deleteGroup_->SetVisible(false);\r
+ noMsgLable_->SetVisible(true);\r
+ noMsgImage_->SetVisible(true);\r
+ return;\r
+ } \r
+ // 设置msgList_数据\r
+ msgList_->ClearAll();\r
+ for (size_t i = 0; i < item.size(); ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 1;\r
+ content.data = reinterpret_cast<void *>(&item[i]);\r
+ msgList_->AddContent(content);\r
+ }\r
+ msgList_->RefreshList();\r
+}\r
+\r
+bool MessageMainPage::InitScrollData()\r
+{\r
+ std::vector<MessageItem> &itemInfo = MessageModel::GetInstance().GetMsgListItems();\r
+ RefreshMsgList(itemInfo);\r
+ return true;\r
+}\r
+\r
+bool MessageMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), DELETE_BUTTON) == 0) {\r
+ ConfirmDelete();\r
+ } else if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {\r
+ VerticalViewInits();\r
+ MessageModel::GetInstance().ClearListItem();\r
+ MessageModel::GetInstance().SetIndex(0);\r
+ } else if (strcmp(view.GetViewId(), CANCEL_BUTTON) == 0) {\r
+ CancelDelete();\r
+ } else {\r
+ // 点击的是消息item条目\r
+ MessageItemView *MessageItemViewID = static_cast<MessageItemView *>(&view);\r
+ noMsgLable_->SetVisible(false);\r
+ msgLable_->SetVisible(false);\r
+ noMsgImage_->SetVisible(false);\r
+ deleteImage_->SetVisible(false);\r
+ msgList_->SetVisible(false);\r
+ LoadDetailsView();\r
+ detailsGroup_->detailsMsg_ = MessageItemViewID->GetItem();\r
+ detailsGroup_->RefreshNotify();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool MessageMainPage::OnDragStartEvent(const DragEvent &event)\r
+{\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+\r
+bool MessageMainPage::OnDragEvent(const DragEvent &event)\r
+{\r
+ int16_t deltaX = event.GetDeltaX();\r
+ int16_t deltaY = event.GetDeltaY();\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT &&\r
+ (MATH_ABS(deltaX) >= MATH_ABS(deltaY) && MATH_ABS(deltaX) > MOVE_DISTANCE)) {\r
+ // 返回主页面\r
+ DeleteDetailsView();\r
+ noMsgLable_->SetVisible(true);\r
+ msgLable_->SetVisible(true);\r
+ noMsgImage_->SetVisible(true);\r
+ deleteImage_->SetVisible(true);\r
+ msgList_->SetVisible(true);\r
+ return true;\r
+ }\r
+ return true;\r
+}\r
+\r
+void MessageMainPage::LoadDetailsView(void)\r
+{\r
+ detailsGroup_ = new DetailsGroup();\r
+ if (detailsGroup_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new detailsGroup_ is nullptr");\r
+ return;\r
+ }\r
+ Add(detailsGroup_);\r
+}\r
+\r
+void MessageMainPage::DeleteDetailsView(void)\r
+{\r
+ if (detailsGroup_ != nullptr) {\r
+ Remove(detailsGroup_);\r
+ delete detailsGroup_;\r
+ detailsGroup_ = nullptr;\r
+ }\r
+}\r
+\r
+bool MessageMainPage::OnDragEndEvent(const DragEvent &event)\r
+{\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM ||\r
+ event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+ std::vector<MessageItem> &itemInfo = MessageModel::GetInstance().GetMsgListItems();\r
+ for (size_t i = 0; i < itemInfo.size(); ++i) {\r
+ itemInfo[i].status = false;\r
+ }\r
+ RefreshMsgList(itemInfo);\r
+ }\r
+ return true;\r
+}\r
+}\r
/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MainModel.cpp\r
- * Author:\r
- * Create: 2021-11-23\r
- */\r
+* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+* Description: MessageModel\r
+* Create: 2025-06-29\r
+*/\r
\r
#include "unistd.h"\r
-#include "main/MessageModel.h"\r
-#include "main/MessageMainView.h"\r
+#include <sys/time.h>\r
#include "kv_store.h"\r
+#include <hal_tick.h>\r
+#include <cstdint>\r
+#include <random>\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
#include "securec.h"\r
#include "wearable_log.h"\r
#include "main/DialBinTypesV2.h"\r
#include "power_display_service.h"\r
-#include <hal_tick.h>\r
-#include <cstdint>\r
-#include <random>\r
+#include "main/MessageMainPage.h"\r
+#include "main/MessageModel.h"\r
+\r
namespace OHOS {\r
- MessageModel::MessageModel() {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::MessageModel");\r
- }\r
\r
- MessageModel::~MessageModel() {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::~MessageModel");\r
- }\r
+static constexpr int16_t MESSAGE_MAX = 20;\r
+static constexpr int32_t SECONDS = 60;\r
+static constexpr int32_t HOURS = 3600;\r
+static constexpr int32_t ONE_DAY = 86400;\r
+static constexpr int16_t BUFFER_MAX = 6;\r
\r
- MessageModel &MessageModel::GetInstance()\r
- {\r
- static MessageModel instance;\r
- return instance;\r
- }\r
+MessageModel::MessageModel() {}\r
+\r
+MessageModel::~MessageModel() {}\r
+\r
+MessageModel &MessageModel::GetInstance()\r
+{\r
+ static MessageModel instance;\r
+ return instance;\r
+}\r
\r
- void MessageModel::GetMessageInfo(std::string app, std::string contact, std::string information)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::GetMessageInfo");\r
- //保存数据\r
- mes.label_1 = app; // 应用\r
- mes.label_2 = contact; // 联系人\r
- mes.label_3 = information; // 内容\r
- mes.icon = "默认";\r
- // if (app == 微信) {\r
- // mes1.icon = 微信图标;\r
- // }\r
- // if (app == 信息) {\r
- // mes1.icon = 信息图标;\r
- // }\r
- InitMessageItem();\r
- if (GetViewStatus()) {\r
- if (! MessageMainView::GetInstance()->contentList->IsVisible()) {\r
- MessageMainView::GetInstance()->NewNotify();\r
- }\r
- MessageMainView::GetInstance()->InitScrollData();\r
+// 将数据转换,保存到model模块\r
+void MessageModel::SaveMsgToModel(std::string app, std::string contact, std::string information)\r
+{\r
+ mes_.appName = app; // 应用\r
+ mes_.appContact = contact; // 联系人\r
+ mes_.appContents = information; // 内容\r
+ mes_.time = "现在";\r
+ for (int i = 0; i < vecMsg_.size(); ++i) {\r
+ if (vecMsg_[i].appName == mes_.appName && vecMsg_[i].appContact == mes_.appContact) {\r
+ mes_.index = index_;\r
+ indexAdd_ = false;\r
+ break;\r
}\r
+ indexAdd_ = true;\r
+ continue;\r
}\r
+ if (indexAdd_) {\r
+ mes_.index = index_++;\r
+ }\r
+ gettimeofday(¤tTime_, nullptr);\r
+ mes_.initialTime = currentTime_.tv_sec;\r
+}\r
\r
- void MessageModel::InitMessageItem()\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem");\r
- if (vecMsg.size() != 0) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg.size() != 0");\r
- size_t i = 0;\r
- for (i; i < vecMsg.size(); ++i) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,for()");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_1 = %s", vecMsg[i].label_1.c_str());\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_2 = %s", vecMsg[i].label_2.c_str());\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_3 = %s", vecMsg[i].label_3.c_str());\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_1 = %s", mes.label_1.c_str());\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_2 = %s", mes.label_2.c_str());\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_3 = %s", mes.label_3.c_str());\r
- if (vecMsg[i].label_1 == mes.label_1 && vecMsg[i].label_2 == mes.label_2) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,if()");\r
- vecMsg[i].label_3 = mes.label_3;\r
- break;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,else(break)");\r
- continue;\r
- }\r
- if (i == vecMsg.size()) {\r
- vecMsg.push_back(mes);\r
- }\r
- } else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,else()");\r
- vecMsg.push_back(mes);\r
+// 将转换好的数据存到vecMsg_\r
+void MessageModel::SetMsgListItems()\r
+{\r
+ for (size_t i = 0; i < vecMsg_.size(); ++i) {\r
+ if (vecMsg_[i].appName == mes_.appName && vecMsg_[i].appContact == mes_.appContact) {\r
+ vecMsg_[i].appContents = mes_.appContents;\r
+ vecMsg_[i].time = "现在";\r
+ return;\r
}\r
}\r
+ if (vecMsg_.size() < MESSAGE_MAX) {\r
+ vecMsg_.push_back(mes_);\r
+ } else {\r
+ vecMsg_.erase(vecMsg_.begin());\r
+ vecMsg_.push_back(mes_);\r
+ int j = 0;\r
+ for (j; j < vecMsg_.size(); ++j) {\r
+ vecMsg_[j].index = j;\r
+ }\r
+ SetIndex(j);\r
+ }\r
+ // 收到新的消息后,需要同步将消息进行展示\r
+ if (MessageModel::GetInstance().GetViewStatus()) {\r
+ if (! MessageMainPage::GetInstance()->msgList_->IsVisible()) {\r
+ MessageMainPage::GetInstance()->NewNotify();\r
+ }\r
+ MessageMainPage::GetInstance()->InitScrollData();\r
+ }\r
+}\r
+\r
+std::vector<MessageItem> &MessageModel::GetMsgListItems()\r
+{\r
+ return vecMsg_;\r
+}\r
+\r
+void MessageModel::ClearListItem()\r
+{\r
+ vecMsg_.clear();\r
+}\r
+\r
+void MessageModel::SetViewStatus(bool viewStatus)\r
+{\r
+ viewInitStatus_ = viewStatus;\r
+}\r
+\r
+bool MessageModel::GetViewStatus(void)\r
+{\r
+ return viewInitStatus_;\r
+}\r
\r
- const std::vector<MessageItem> MessageModel::GetMessagelistItems() const\r
- { \r
- return vecMsg;\r
+void MessageModel::SetTime(void)\r
+{\r
+ if (vecMsg_.size() != 0) {\r
+ for (size_t i = 0; i < vecMsg_.size(); ++i) {\r
+ durTime_ = UpdateTime(vecMsg_[i].initialTime);\r
+ vecMsg_[i].time = durTime_;\r
+ }\r
}\r
+ return;\r
+}\r
+\r
+std::string MessageModel::UpdateTime(long time)\r
+{\r
+ struct timeval tv;\r
+ gettimeofday(&tv, nullptr);\r
+ auto now = tv.tv_sec;\r
+ auto seconds = now - time;\r
\r
- void MessageModel::ClearListItem()\r
- {\r
- vecMsg.clear();\r
+ if (seconds < 0) {\r
+ return "未来时间";\r
}\r
\r
- void MessageModel::SetViewStatus(bool viewStatus)\r
- {\r
- viewInitStatus = viewStatus;\r
+ if (seconds < SECONDS) {\r
+ return "现在";\r
+ } else if (seconds < HOURS) {\r
+ long minutes = seconds / SECONDS;\r
+ return std::to_string(minutes) + "分钟前";\r
+ } else if (seconds < ONE_DAY) {\r
+ long hours = seconds / HOURS;\r
+ return std::to_string(hours) + "小时前";\r
+ } else {\r
+ struct tm timeinfo;\r
+ time_t t = static_cast<time_t>(time);\r
+ localtime_r(&t, &timeinfo);\r
+ char buffer[BUFFER_MAX];\r
+ snprintf_s(buffer, sizeof(buffer), sizeof(buffer) - 1, "%02d/%02d", timeinfo.tm_mon + 1, timeinfo.tm_mday);\r
+ return std::string(buffer);\r
}\r
+}\r
\r
- bool MessageModel::GetViewStatus(void)\r
- {\r
- return viewInitStatus;\r
+void MessageModel::DeleteItem(MessageItem itemInfo)\r
+{\r
+ for (int i = 0; i < vecMsg_.size(); ++i) {\r
+ if (vecMsg_[i].appName == itemInfo.appName && vecMsg_[i].appContact == itemInfo.appContact) {\r
+ vecMsg_.erase(vecMsg_.begin() + i);\r
+ break;\r
+ }\r
+ continue;\r
}\r
+ int j = 0;\r
+ for (j; j < vecMsg_.size(); ++j) {\r
+ vecMsg_[j].index = j;\r
+ }\r
+ MessageMainPage::GetInstance()->RefreshMsgList(vecMsg_);\r
+ SetIndex(j);\r
+}\r
+\r
+void MessageModel::SetIndex(uint16_t itemIndex)\r
+{\r
+ index_ = itemIndex;\r
+}\r
}\r
-/*
- * Copyright (c) 2020-2021 CompanyNameMagicTag.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "main/ModelListenerSample.h"
-
-#include "wearable_log.h"
-namespace OHOS {
-ModelListenerSample::ModelListenerSample()
-{
- Init();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ModelListenerSample::ModelListenerSample");
-}
-ModelListenerSample::~ModelListenerSample()
-{
- Deinit();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ModelListenerSample::~ModelListenerSample");
-}
-
-void ModelListenerSample::Callback()
-{
- Notify();
- OnTickEvent();
-}
-}
+/*\r
+ * Copyright (c) 2020-2021 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "main/ModelListenerSample.h"\r
+\r
+#include "wearable_log.h"\r
+namespace OHOS {\r
+ModelListenerSample::ModelListenerSample()\r
+{\r
+ Init();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ModelListenerSample::ModelListenerSample");\r
+}\r
+ModelListenerSample::~ModelListenerSample()\r
+{\r
+ Deinit();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ModelListenerSample::~ModelListenerSample");\r
+}\r
+\r
+void ModelListenerSample::Callback()\r
+{\r
+ Notify();\r
+ OnTickEvent();\r
+}\r
+}
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: WeekStep
- * Author:
- * Create: 2021-09-11
- */
-
-#include "main/PullUpDownView.h"
-#include "wearable_log.h"
-#include "UiConfig.h"
-#include "common/screen.h"
-#include "main/MainPresenterSample.h"
-#include "screensetting/ScreenModels.h"
-#include "settings/SettingModel.h"
-#include "ui_resource_image.h"
-
-namespace OHOS {
-
-static PullUpDownView *g_pPullUpDownView = nullptr;
-
-constexpr int16_t DISTURB_IMG_X = 117;
-constexpr int16_t DISTURB_IMG_Y = 50;
-constexpr int16_t SCREEN_IMG_X = 251;
-constexpr int16_t SCREEN_IMG_Y = 50;
-constexpr int16_t PHONE_IMG_X = 49;
-constexpr int16_t PHONE_IMG_Y = 184;
-constexpr int16_t ALARM_IMG_X = 184;
-constexpr int16_t ALARM_IMG_Y = 184;
-constexpr int16_t SETTING_IMG_X = 319;
-constexpr int16_t SETTING_IMG_Y = 184;
-
-constexpr int16_t BLUETOOTH_IMG_X = 145;
-constexpr int16_t BLUETOOTH_IMG_Y = 335;
-constexpr int16_t BATTERY_IMG_X = 195;
-constexpr int16_t BATTERY_IMG_Y = 340;
-
-constexpr int16_t DISTURB_LABEL_X = 136;
-constexpr int16_t DISTURB_LABEL_Y = 145;
-constexpr int16_t SCREEN_LABEL_X = 270;
-constexpr int16_t SCREEN_LABEL_Y = 145;
-constexpr int16_t PHONE_LABEL_X = 68;
-constexpr int16_t PHONE_LABEL_Y = 279;
-constexpr int16_t ALARM_LABEL_X = 203;
-constexpr int16_t ALARM_LABEL_Y = 279;
-constexpr int16_t SETTING_LABEL_X = 338;
-constexpr int16_t SETTING_LABEL_Y = 279;
-
-constexpr int16_t BATTERY_LABEL_X = 247;
-constexpr int16_t BATTERY_LABEL_Y = 335;
-constexpr int16_t DATE_LABEL_X = 173;
-constexpr int16_t DATE_LABEL_Y = 374;
-
-constexpr int16_t FONT_DEFAULT_SIZE = 24;
-constexpr int16_t TEXT_WIDTH = 86;
-constexpr int16_t TEXT_HEIGHT = 30;
-
-constexpr int16_t NONOTICE_LABLE_X = 141;
-constexpr int16_t NONOTICE_LABLE_Y = 212;
-
-PullUpDownView::PullUpDownView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::PullUpDownView");
- g_pPullUpDownView = this;
-}
-
-PullUpDownView::~PullUpDownView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::~PullUpDownView");
- RemoveAll();
- delete dnotDisturb;
- dnotDisturb = nullptr;
- delete briScreen;
- briScreen = nullptr;
- delete finPhone;
- finPhone = nullptr;
- delete droAlarm;
- droAlarm = nullptr;
- delete droSetting;
- droSetting = nullptr;
- delete dnotDisturbLable;
- dnotDisturbLable = nullptr;
- delete briScreenLable;
- briScreenLable = nullptr;
- delete finPhoneLable;
- finPhoneLable = nullptr;
- delete droAlarmLable;
- droAlarmLable = nullptr;
- delete droSettingLable;
- droSettingLable = nullptr;
- delete bluetooth;
- bluetooth = nullptr;
- delete battery;
- battery = nullptr;
- delete batteryLable;
- batteryLable = nullptr;
- delete dateLable;
- dateLable = nullptr;
- g_pPullUpDownView = nullptr;
-}
-
-PullUpDownView *PullUpDownView::GetInstance(void)
-{
- return g_pPullUpDownView;
-}
-
-void PullUpDownView::InitSubViewImg(void)
-{
- if (HealthModel::GetInstance() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "health model nullptr");
- return;
- }
-
- dnotDisturb = new UIImageView();
- if (dnotDisturb == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dnotDisturb new fail");
- return;
- }
- dnotDisturb->SetPosition(DISTURB_IMG_X, DISTURB_IMG_Y);
- if (HealthModel::GetInstance()->GetDntDistStatus() == 0) {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, dnotDisturb, DROPDOWN_DROPDOWN_DN_DISTURB);
- } else {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, dnotDisturb, DROPDOWN_DROPDOWN_DN_DISTURB_B);
- }
- dnotDisturb->SetViewId(DROPDOWN_CLICK_DONOTDISTURB);
- dnotDisturb->SetTouchable(true);
- dnotDisturb->SetOnClickListener(clickListener); // 进入勿扰模式
-
- briScreen = new UIImageView();
- if (briScreen == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "briScreen new fail");
- return;
- }
- briScreen->SetPosition(SCREEN_IMG_X, SCREEN_IMG_Y);
- if (HealthModel::GetInstance()->GetBriScrStatus() == 0) {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, briScreen, DROPDOWN_DROPDOWN_BRI_SCREEN);
- } else {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, briScreen, DROPDOWN_DROPDOWN_BRI_SCREEN_B);
- }
- briScreen->SetViewId(DROPDOWN_CLICK_BRIGHTENSCREEN);
- briScreen->SetTouchable(true);
- briScreen->SetOnClickListener(clickListener); // 进入亮屏模式
-}
-
-void PullUpDownView::InitViewImg(void)
-{
- InitSubViewImg();
-
- finPhone = new UIImageView();
- if (finPhone == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhone new fail");
- return;
- }
- finPhone->SetPosition(PHONE_IMG_X, PHONE_IMG_Y);
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, finPhone, DROPDOWN_DROPDOWN_FIND_PHONE);
- finPhone->SetViewId(DROPDOWN_CLICK_FINDMYPHONE); // 找手机界面 DROP_DOWN_FIND_PHONE
- finPhone->SetTouchable(true);
- finPhone->SetOnClickListener(clickListener);
-
- droAlarm = new UIImageView();
- if (droAlarm == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droAlarm new fail");
- return;
- }
- droAlarm->SetPosition(ALARM_IMG_X, ALARM_IMG_Y);
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, droAlarm, DROPDOWN_DROPDOWN_ALARM);
- droAlarm->SetViewId(DROPDOWN_CLICK_ALARM); // 进入闹钟App DROP_DOWN_ALARM
- droAlarm->SetTouchable(true);
- droAlarm->SetOnClickListener(clickListener);
-
- droSetting = new UIImageView();
- if (droSetting == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droSetting new fail");
- return;
- }
- droSetting->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, droSetting, DROPDOWN_DROPDOWN_SETTING);
- droSetting->SetViewId(DROPDOWN_CLICK_SETTING); // 进入设置界面 DROP_DOWN_SETTING
- droSetting->SetTouchable(true);
- droSetting->SetOnClickListener(clickListener);
-}
-
-void PullUpDownView::InitViewLable(void)
-{
- dnotDisturbLable = new UILabel();
- if (dnotDisturbLable == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dnotDisturbLable new fail");
- return;
- }
- dnotDisturbLable->SetPosition(DISTURB_LABEL_X, DISTURB_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
- dnotDisturbLable->SetText("勿扰");
- dnotDisturbLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- dnotDisturbLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
- briScreenLable = new UILabel();
- if (briScreenLable == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "briScreenLable new fail");
- return;
- }
- briScreenLable->SetPosition(SCREEN_LABEL_X, SCREEN_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
- briScreenLable->SetText("亮屏");
- briScreenLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- briScreenLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
- finPhoneLable = new UILabel();
- if (finPhoneLable == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhoneLable new fail");
- return;
- }
- finPhoneLable->SetPosition(PHONE_LABEL_X, PHONE_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
- finPhoneLable->SetText("找手机");
- finPhoneLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- finPhoneLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
- droAlarmLable = new UILabel();
- if (finPhoneLable == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhoneLable new fail");
- return;
- }
- droAlarmLable->SetPosition(ALARM_LABEL_X, ALARM_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
- droAlarmLable->SetText("闹钟");
- droAlarmLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- droAlarmLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
- droSettingLable = new UILabel();
- if (droSettingLable == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droSettingLable new fail");
- return;
- }
- droSettingLable->SetPosition(SETTING_LABEL_X, SETTING_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
- droSettingLable->SetText("设置");
- droSettingLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- droSettingLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-}
-
-void PullUpDownView::InitViewInfo(void)
-{
- bluetooth = new UIImageView(); // 蓝牙状态显示
- if (bluetooth == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth new fail");
- return;
- }
- bluetooth->SetPosition(BLUETOOTH_IMG_X, BLUETOOTH_IMG_Y);
- if (BluetoothModel::GetInstance() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth model nullptr");
- return;
- }
-
- if (SettingModel::GetInstance().GetBlueToothConnectStatus()) {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH_B);
- } else {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH);
- }
-
- battery = new UIImageView(); // 电量状态显示
- if (battery == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery new fail");
- return;
- }
- battery->SetPosition(BATTERY_IMG_X, BATTERY_IMG_Y);
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, battery, DROPDOWN_DROPDOWN_BATTERY);
- batteryLable = new UILabel();
- if (batteryLable == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLable new fail");
- return;
- }
- batteryLable->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);
- batteryLable->SetText("90%");
- batteryLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- batteryLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
- dateLable = new UILabel();
- if (dateLable == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dateLable new fail");
- return;
- }
- dateLable->SetPosition(DATE_LABEL_X, DATE_LABEL_Y, 192, TEXT_HEIGHT); // TEXT_WIDTH = 192
- dateLable->SetText("10/23 星期五");
- dateLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- dateLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-}
-
-bool PullUpDownView::InitView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::InitDropDownView");
- clickListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();
-
- InitViewImg();
- InitViewLable();
- InitViewInfo();
-
- Add(dnotDisturb);
- Add(dnotDisturbLable);
- Add(briScreen);
- Add(briScreenLable);
- Add(finPhone);
- Add(finPhoneLable);
- Add(droAlarm);
- Add(droAlarmLable);
- Add(droSetting);
- Add(droSettingLable);
- Add(bluetooth);
- Add(battery);
- Add(batteryLable);
- Add(dateLable);
-
- SetTouchable(true);
- SetIntercept(true);
-
- return true;
-}
-
-void PullUpDownView::PreLoad(void)
-{
- if (!viewiInitStatus) {
- InitView();
- viewiInitStatus = true;
- }
-}
-
-void PullUpDownView::UpdateBlueToothStatus(int status)
-{
- if (bluetooth == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth nullptr");
- return;
- }
- if (status == 1) {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH_B);
- } else {
- ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH);
- }
- bluetooth->Invalidate();
- return;
-}
-
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PullUpDownView\r
+ * Create: 2025-06-29\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "common/screen.h"\r
+#include "main/MainPresenterSample.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "settings/model/SettingBluetoothModel.h"\r
+#include "ui_resource_image.h"\r
+#include "main/PullUpDownView.h"\r
+\r
+namespace OHOS {\r
+\r
+static PullUpDownView *g_pPullUpDownView = nullptr;\r
+\r
+constexpr int16_t DISTURB_IMG_X = 117;\r
+constexpr int16_t DISTURB_IMG_Y = 50;\r
+constexpr int16_t SCREEN_IMG_X = 251;\r
+constexpr int16_t SCREEN_IMG_Y = 50;\r
+constexpr int16_t PHONE_IMG_X = 49;\r
+constexpr int16_t PHONE_IMG_Y = 184;\r
+constexpr int16_t ALARM_IMG_X = 184;\r
+constexpr int16_t ALARM_IMG_Y = 184;\r
+constexpr int16_t SETTING_IMG_X = 319;\r
+constexpr int16_t SETTING_IMG_Y = 184;\r
+\r
+constexpr int16_t BLUETOOTH_IMG_X = 145;\r
+constexpr int16_t BLUETOOTH_IMG_Y = 335;\r
+constexpr int16_t BATTERY_IMG_X = 195;\r
+constexpr int16_t BATTERY_IMG_Y = 340;\r
+\r
+constexpr int16_t DISTURB_LABEL_X = 136;\r
+constexpr int16_t DISTURB_LABEL_Y = 145;\r
+constexpr int16_t SCREEN_LABEL_X = 270;\r
+constexpr int16_t SCREEN_LABEL_Y = 145;\r
+constexpr int16_t PHONE_LABEL_X = 68;\r
+constexpr int16_t PHONE_LABEL_Y = 279;\r
+constexpr int16_t ALARM_LABEL_X = 203;\r
+constexpr int16_t ALARM_LABEL_Y = 279;\r
+constexpr int16_t SETTING_LABEL_X = 338;\r
+constexpr int16_t SETTING_LABEL_Y = 279;\r
+\r
+constexpr int16_t BATTERY_LABEL_X = 247;\r
+constexpr int16_t BATTERY_LABEL_Y = 335;\r
+constexpr int16_t DATE_LABEL_X = 173;\r
+constexpr int16_t DATE_LABEL_Y = 374;\r
+\r
+constexpr int16_t FONT_DEFAULT_SIZE = 24;\r
+constexpr int16_t TEXT_WIDTH = 86;\r
+constexpr int16_t TEXT_HEIGHT = 30;\r
+\r
+constexpr int16_t NONOTICE_LABLE_X = 141;\r
+constexpr int16_t NONOTICE_LABLE_Y = 212;\r
+\r
+PullUpDownView::PullUpDownView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::PullUpDownView");\r
+ g_pPullUpDownView = this;\r
+}\r
+\r
+PullUpDownView::~PullUpDownView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::~PullUpDownView");\r
+ RemoveAll();\r
+ delete dnotDisturb;\r
+ dnotDisturb = nullptr;\r
+ delete briScreen;\r
+ briScreen = nullptr;\r
+ delete finPhone;\r
+ finPhone = nullptr;\r
+ delete droAlarm;\r
+ droAlarm = nullptr;\r
+ delete droSetting;\r
+ droSetting = nullptr;\r
+ delete dnotDisturbLable;\r
+ dnotDisturbLable = nullptr;\r
+ delete briScreenLable;\r
+ briScreenLable = nullptr;\r
+ delete finPhoneLable;\r
+ finPhoneLable = nullptr;\r
+ delete droAlarmLable;\r
+ droAlarmLable = nullptr;\r
+ delete droSettingLable;\r
+ droSettingLable = nullptr;\r
+ delete bluetooth;\r
+ bluetooth = nullptr;\r
+ delete battery;\r
+ battery = nullptr;\r
+ delete batteryLable;\r
+ batteryLable = nullptr;\r
+ delete dateLable;\r
+ dateLable = nullptr;\r
+ g_pPullUpDownView = nullptr;\r
+}\r
+\r
+PullUpDownView *PullUpDownView::GetInstance(void)\r
+{\r
+ return g_pPullUpDownView;\r
+}\r
+\r
+void PullUpDownView::InitSubViewImg(void)\r
+{\r
+ if (HealthModel::GetInstance() == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "health model nullptr");\r
+ return;\r
+ }\r
+\r
+ dnotDisturb = new UIImageView();\r
+ if (dnotDisturb == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dnotDisturb new fail");\r
+ return;\r
+ }\r
+ dnotDisturb->SetPosition(DISTURB_IMG_X, DISTURB_IMG_Y);\r
+ if (HealthModel::GetInstance()->GetDntDistStatus() == 0) {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, dnotDisturb, DROPDOWN_DROPDOWN_DN_DISTURB);\r
+ } else {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, dnotDisturb, DROPDOWN_DROPDOWN_DN_DISTURB_B);\r
+ }\r
+ dnotDisturb->SetViewId(DROPDOWN_CLICK_DONOTDISTURB);\r
+ dnotDisturb->SetTouchable(true);\r
+ dnotDisturb->SetOnClickListener(clickListener); // 进入勿扰模式\r
+\r
+ briScreen = new UIImageView();\r
+ if (briScreen == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "briScreen new fail");\r
+ return;\r
+ }\r
+ briScreen->SetPosition(SCREEN_IMG_X, SCREEN_IMG_Y);\r
+ if (HealthModel::GetInstance()->GetBriScrStatus() == 0) {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, briScreen, DROPDOWN_DROPDOWN_BRI_SCREEN);\r
+ } else {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, briScreen, DROPDOWN_DROPDOWN_BRI_SCREEN_B);\r
+ }\r
+ briScreen->SetViewId(DROPDOWN_CLICK_BRIGHTENSCREEN);\r
+ briScreen->SetTouchable(true);\r
+ briScreen->SetOnClickListener(clickListener); // 进入亮屏模式\r
+}\r
+\r
+void PullUpDownView::InitViewImg(void)\r
+{\r
+ InitSubViewImg();\r
+\r
+ finPhone = new UIImageView();\r
+ if (finPhone == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhone new fail");\r
+ return;\r
+ }\r
+ finPhone->SetPosition(PHONE_IMG_X, PHONE_IMG_Y);\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, finPhone, DROPDOWN_DROPDOWN_FIND_PHONE);\r
+ finPhone->SetViewId(DROPDOWN_CLICK_FINDMYPHONE); // 找手机界面 DROP_DOWN_FIND_PHONE\r
+ finPhone->SetTouchable(true);\r
+ finPhone->SetOnClickListener(clickListener);\r
+\r
+ droAlarm = new UIImageView();\r
+ if (droAlarm == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droAlarm new fail");\r
+ return;\r
+ }\r
+ droAlarm->SetPosition(ALARM_IMG_X, ALARM_IMG_Y);\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, droAlarm, DROPDOWN_DROPDOWN_ALARM);\r
+ droAlarm->SetViewId(DROPDOWN_CLICK_ALARM); // 进入闹钟App DROP_DOWN_ALARM\r
+ droAlarm->SetTouchable(true);\r
+ droAlarm->SetOnClickListener(clickListener);\r
+\r
+ droSetting = new UIImageView();\r
+ if (droSetting == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droSetting new fail");\r
+ return;\r
+ }\r
+ droSetting->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, droSetting, DROPDOWN_DROPDOWN_SETTING);\r
+ droSetting->SetViewId(DROPDOWN_CLICK_SETTING); // 进入设置界面 DROP_DOWN_SETTING\r
+ droSetting->SetTouchable(true);\r
+ droSetting->SetOnClickListener(clickListener);\r
+}\r
+\r
+void PullUpDownView::InitViewLable(void)\r
+{\r
+ dnotDisturbLable = new UILabel();\r
+ if (dnotDisturbLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dnotDisturbLable new fail");\r
+ return;\r
+ }\r
+ dnotDisturbLable->SetPosition(DISTURB_LABEL_X, DISTURB_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+ dnotDisturbLable->SetText("勿扰");\r
+ dnotDisturbLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+ dnotDisturbLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ briScreenLable = new UILabel();\r
+ if (briScreenLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "briScreenLable new fail");\r
+ return;\r
+ }\r
+ briScreenLable->SetPosition(SCREEN_LABEL_X, SCREEN_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+ briScreenLable->SetText("亮屏");\r
+ briScreenLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+ briScreenLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ finPhoneLable = new UILabel();\r
+ if (finPhoneLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhoneLable new fail");\r
+ return;\r
+ }\r
+ finPhoneLable->SetPosition(PHONE_LABEL_X, PHONE_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+ finPhoneLable->SetText("找手机");\r
+ finPhoneLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+ finPhoneLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ droAlarmLable = new UILabel();\r
+ if (finPhoneLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finPhoneLable new fail");\r
+ return;\r
+ }\r
+ droAlarmLable->SetPosition(ALARM_LABEL_X, ALARM_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+ droAlarmLable->SetText("闹钟");\r
+ droAlarmLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+ droAlarmLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ droSettingLable = new UILabel();\r
+ if (droSettingLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "droSettingLable new fail");\r
+ return;\r
+ }\r
+ droSettingLable->SetPosition(SETTING_LABEL_X, SETTING_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+ droSettingLable->SetText("设置");\r
+ droSettingLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+ droSettingLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+}\r
+\r
+void PullUpDownView::InitViewInfo(void)\r
+{\r
+ bluetooth = new UIImageView(); // 蓝牙状态显示\r
+ if (bluetooth == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth new fail");\r
+ return;\r
+ }\r
+ bluetooth->SetPosition(BLUETOOTH_IMG_X, BLUETOOTH_IMG_Y);\r
+ if (SettingBluetoothModel::GetInstance() == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth model nullptr");\r
+ return;\r
+ }\r
+\r
+ if (SettingBluetoothModel::GetInstance()->GetAclConnected()) {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH_B);\r
+ } else {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH);\r
+ }\r
+\r
+ battery = new UIImageView(); // 电量状态显示\r
+ if (battery == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery new fail");\r
+ return;\r
+ }\r
+ battery->SetPosition(BATTERY_IMG_X, BATTERY_IMG_Y);\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, battery, DROPDOWN_DROPDOWN_BATTERY);\r
+ batteryLable = new UILabel();\r
+ if (batteryLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLable new fail");\r
+ return;\r
+ }\r
+ batteryLable->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, TEXT_WIDTH, TEXT_HEIGHT);\r
+ batteryLable->SetText("90%");\r
+ batteryLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+ batteryLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ dateLable = new UILabel();\r
+ if (dateLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dateLable new fail");\r
+ return;\r
+ }\r
+ dateLable->SetPosition(DATE_LABEL_X, DATE_LABEL_Y, 192, TEXT_HEIGHT); // TEXT_WIDTH = 192\r
+ dateLable->SetText("10/23 星期五");\r
+ dateLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
+ dateLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+}\r
+\r
+bool PullUpDownView::InitView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PullUpDownView::InitDropDownView");\r
+ clickListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+\r
+ InitViewImg();\r
+ InitViewLable();\r
+ InitViewInfo();\r
+\r
+ Add(dnotDisturb);\r
+ Add(dnotDisturbLable);\r
+ Add(briScreen);\r
+ Add(briScreenLable);\r
+ Add(finPhone);\r
+ Add(finPhoneLable);\r
+ Add(droAlarm);\r
+ Add(droAlarmLable);\r
+ Add(droSetting);\r
+ Add(droSettingLable);\r
+ Add(bluetooth);\r
+ Add(battery);\r
+ Add(batteryLable);\r
+ Add(dateLable);\r
+\r
+ SetTouchable(true);\r
+ SetIntercept(true);\r
+\r
+ return true;\r
+}\r
+\r
+void PullUpDownView::PreLoad(void)\r
+{\r
+ if (!viewiInitStatus) {\r
+ InitView();\r
+ viewiInitStatus = true;\r
+ }\r
+}\r
+\r
+void PullUpDownView::UpdateBlueToothStatus(int status)\r
+{\r
+ if (bluetooth == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetooth nullptr");\r
+ return;\r
+ }\r
+ if (status == 1) {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH_B);\r
+ } else {\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, bluetooth, DROPDOWN_DROPDOWN_BLUETOOTH);\r
+ }\r
+ bluetooth->Invalidate();\r
+ return;\r
+}\r
+\r
+}\r
#include "UiConfig.h"\r
#include "ui_resource_image.h"\r
#include "drag_event.h"\r
-#include "makephone/MainCallingView.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
#include "phoneservice/PhoneService.h"\r
-#include "callerlog/CallerLogModel.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
#include "bts_avrcp_controller.h"\r
#include "bts_avrcp_target.h"\r
#include "notification_manager.h"\r
-#include "bluetooth/BluetoothHeadsetEvent.h"\r
+#include "settings/model/SettingBluetoothHeadsetEvent.h"\r
#include "bts_avrcp_controller.h"\r
\r
namespace OHOS {\r
}\r
}\r
\r
-extern BtAvrcpTgInf g_avrcp_srv_inf;\r
+extern SettingBtAvrcpTgInf g_avrcp_srv_inf;\r
void VolumeSliderEventListener::BtAndLocalVolumeSet(int16_t sounding)\r
{\r
if (g_avrcp_srv_inf.avrcp_srv_conn_stat == PROFILE_STATE_CONNECTED) {\r
playersView->SetVisible(true);\r
}\r
if (playerCoefficients == VOLUMEPHONE) {\r
- MainCallingView *mainCallView = MainCallingView::GetInstance();\r
- if (mainCallView == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnDrag:MainCallingView new fail");\r
- return false;\r
- }\r
volumeSettingView->SetVisible(false);\r
- mainCallView->GetScreenGroup()->SetVisible(false);\r
- mainCallView->GetDisplayGroup()->SetVisible(false);\r
- mainCallView->GetCallingGroup()->SetVisible(true);\r
- CallerLogModel::GetInstance()->SetVolumeScreenStatus(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetVolumeScreenStatus(false);\r
}\r
if (playerCoefficients == VOLUMEPHONENOTIFY) {\r
volumeSettingView->SetVisible(false);\r
--- /dev/null
+/*
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: DialModelArcProgress
+ * Author: Hisi Graphic
+ * Create: 2025-08
+ */
+
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelArcProgress.h"
+#include "gfx_utils/graphic_math.h"
+
+REGIST_DIAL_MODULE(OHOS::DialDataType::ARC_PROGRESS_TEST, OHOS::DialModelArcProgress::GetInstance());
+
+namespace OHOS {
+DialModelArcProgress* DialModelArcProgress::GetInstance()
+{
+ static DialModelArcProgress instance;
+ return &instance;
+}
+
+bool DialModelArcProgress::GetDialFloatData(DialDataType& type, float& out)
+{
+ (void)type;
+ out = data_;
+ data_ = FloatMore(data_, 1.0) ? 0.1 : data_ + 0.01;
+ return true;
+}
+}
#include "screennotify/ui_screennotify.h"
#endif
#include "main/MainPresenterSample.h"
+#include "aod_view/AodPresenter.h"
#include "main/dial/DialDigitalImgView.h"
#include "common/input_device_manager.h"
#include "main/dial/DialSequenceImgView.h"
if (name == nullptr) {
return;
}
- if (memcpy_s(name, len, bundleName, len) != EOK) {
+ if (strcpy_s(name, len, bundleName) != EOK) {
UIFree(name);
name = nullptr;
return;
}
- name[len] = '\0';
DialClick click = {rect, false, {.bundleName = name}};
dialClicks_.PushBack(click);
}
void DialViewGroup::OnActive(void)
{
- MainPresenterSample* mainPresenter = MainPresenterSample::GetInstance();
- if ((mainPresenter == nullptr) || (mainPresenter->GetMainPresenterState() != MainPresenterState::RESUME)) {
- return;
+ if (state_ == DisplayState::NORMAL) {
+ MainPresenterSample* mainPresenter = MainPresenterSample::GetInstance();
+ if ((mainPresenter == nullptr) || (mainPresenter->GetMainPresenterState() != MainPresenterState::RESUME)) {
+ return;
+ }
}
+
if (!isSeqImgLoaded_) {
std::weak_ptr<bool> wk = isExists_;
GraphicService::GetInstance()->ForceRefreshImmediately();
#include "common/screen.h"
#include "main/MainModel.h"
#include "main/MainViewSample.h"
-#include "set_dial/SetDialModel.h"
#include "graphic_service.h"
#include "NativeAbility.h"
#include "graphic_mutex.h"
-#include "set_dial/SetDialModel.h"
-#include "set_dial/SetDialPresenter.h"
+#include "settings/model/SettingDesktopModel.h"
#include "power_display_service.h"
using namespace OHOS;
DialSetting setting = MainModel::GetInstance().GetDialSetting();
setting.dialFlag = 1;
setting.dialFullName = g_info[index].fileName;
- if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_SET_DIAL) {
+ if (NativeAbility::GetInstance().GetCurTargetId() ==
+ (VIEW_SETTING | static_cast<uint32_t>(SettingPageId::DESKTOP_DIAL_PAGE) << PAGE_OFFSET)) {
GraphicService::GetInstance()->PostGraphicEvent([setting]() {
- if (SetDialPresenter::GetCurrentInstance() != nullptr) {
- SetDialPresenter::GetCurrentInstance()->SpecifyDialSetting(setting);
- }
+ SettingDesktopModel::GetInstance().SetSpecifyDialSetting(setting);
});
NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
return true;
setting.dialFlag = 0;
setting.dialId = 0;
}
- if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_SET_DIAL) {
+ if (NativeAbility::GetInstance().GetCurTargetId() ==
+ (VIEW_SETTING | static_cast<uint32_t>(SettingPageId::DESKTOP_DIAL_PAGE) << PAGE_OFFSET)) {
if (g_info[index].watchInfo.is_current_watch) {
// If it is the current watch face, set it as the default watch face. Otherwise, the configuration remains
// unchanged.
GraphicService::GetInstance()->PostGraphicEvent([setting]() {
- if (SetDialPresenter::GetCurrentInstance() != nullptr) {
- SetDialPresenter::GetCurrentInstance()->SpecifyDialSetting(setting);
- }
+ SettingDesktopModel::GetInstance().SetSpecifyDialSetting(setting);
});
}
NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyModel\r
+ * Create: 2025-04-24\r
+ */\r
+#include <algorithm>\r
+#include <random>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "NativeAbility.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "stopwatch/StopwatchView.h"\r
+#include "sport/SportView.h"\r
+#include "timers/TimerView.h"\r
+#include "weather/WeatherView.h"\r
+#include "blood/BloodView.h"\r
+#include "heartrate/HeartRateView.h"\r
+#include "camera/CameraView.h"\r
+#include "findphone/FindPhoneView.h"\r
+#include "sleep/SleepView.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "date/DateView.h"\r
+#include "monkey/MonkeyModel.h"\r
+#include "cmsis_os.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t TIME_PERIOL = 20;\r
+static std::vector<SlicePageId> g_page;\r
+static uint8_t g_curTime = 0;\r
+MonkeyModel::MonkeyModel()\r
+{\r
+ g_page.clear();\r
+ // 手电筒\r
+ g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_VIEW});\r
+ g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_PLAY_VIEW});\r
+ g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_SET_VIEW});\r
+ g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_COLOR_VIEW});\r
+ g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_BLINK_VIEW});\r
+ g_page.push_back({VIEW_FLASHLIGHT, FLASH_LIGHT_RECOVER_VIEW});\r
+ // 通话菜单\r
+ g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_MAIN_PAGE});\r
+ g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_CONTACTS_PAGE});\r
+ g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_DIAL_PAGE});\r
+ g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_DISCONNECT_PAGE});\r
+ g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_CALLER_LOG_PAGE});\r
+ g_page.push_back({VIEW_PHONE_MENU, PHONE_MENU_CALLING_PAGE});\r
+ // 秒表\r
+ g_page.push_back({VIEW_STOPWATCH, STOPWATCH_MAIN_PAGE});\r
+ g_page.push_back({VIEW_STOPWATCH, STOPWATCH_RECORD_PAGE});\r
+ // 运动\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_MENU});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_PREPARE});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_COUNTDOWN});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_DATA});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_PAUSE});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_PROMPT});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_SETTINGS});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_TARGET});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_TARGET_SETTING});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_TARGET_PROMPT});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_REMIND});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_REMIND_INTERVAL});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_REMIND_HEARTRATE});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_HEARTRATE_RANGE});\r
+ g_page.push_back({VIEW_SPORT, SPORT_PAGE_MISTOUCH});\r
+ // 设置\r
+ g_page.push_back({VIEW_SETTING, MAIN_PAGE});\r
+ g_page.push_back({VIEW_SETTING, BLUETOOTH_PAGE});\r
+ g_page.push_back({VIEW_SETTING, DISPLAY_PAGE});\r
+ g_page.push_back({VIEW_EMPTY, 1});\r
+ g_page.push_back({VIEW_SETTING, DESKTOP_PAGE});\r
+ g_page.push_back({VIEW_SETTING, POWER_PAGE});\r
+ g_page.push_back({VIEW_SETTING, CARD_PAGE});\r
+ g_page.push_back({VIEW_SETTING, SYSTEM_PAGE});\r
+ g_page.push_back({VIEW_SETTING, ABOUT_PAGE});\r
+ g_page.push_back({VIEW_SETTING, DISPLAY_BRIGHTNESS_PAGE});\r
+ g_page.push_back({VIEW_SETTING, DISPLAY_SCREEN_OFF_PAGE});\r
+ g_page.push_back({VIEW_SETTING, DISPLAY_STEADY_ON_PAGE});\r
+ g_page.push_back({VIEW_SETTING, DESKTOP_DIAL_PAGE});\r
+ g_page.push_back({VIEW_EMPTY, 1});\r
+ g_page.push_back({VIEW_SETTING, DESKTOP_DIAL_STYLE_PAGE});\r
+ g_page.push_back({VIEW_SETTING, CARD_EFFECT_PAGE});\r
+ g_page.push_back({VIEW_SETTING, CARD_MGR_PAGE});\r
+ g_page.push_back({VIEW_SETTING, CARD_ADD_PAGE});\r
+ g_page.push_back({VIEW_SETTING, SYSTEM_OPERATION_PAGE});\r
+ g_page.push_back({VIEW_SETTING, SYSTEM_OTA_PAGE});\r
+ g_page.push_back({VIEW_SETTING, CONNECT_NEW_PHONE_PAGE});\r
+ g_page.push_back({VIEW_SETTING, CONNECT_OPEN_PAGE});\r
+ g_page.push_back({VIEW_EMPTY, 1});\r
+ g_page.push_back({VIEW_SETTING, CONNECT_BLUE_SUCCESS_PAGE});\r
+ g_page.push_back({VIEW_SETTING, CONNECT_BLUE_FAIL_PAGE});\r
+ g_page.push_back({VIEW_SETTING, RECONNECTION_PAGE});\r
+ g_page.push_back({VIEW_SETTING, RECONNECT_SECOND_CONFIRM_PAGE});\r
+ g_page.push_back({VIEW_SETTING, UNPAIR_SECOND_CONFIRM_PAGE});\r
+ g_page.push_back({VIEW_SETTING, QRCODE_CONN_PAGE});\r
+ g_page.push_back({VIEW_EMPTY, 1});\r
+ // 计时器\r
+ g_page.push_back({VIEW_TIMER, TIMER_MAIN_PAGE});\r
+ g_page.push_back({VIEW_TIMER, TIMER_TIMING_PAGE});\r
+ g_page.push_back({VIEW_TIMER, TIMER_SETTING_PAGE});\r
+ // 天气\r
+ g_page.push_back({VIEW_WEATHER, WEATHER_MAIN_PAGE});\r
+ g_page.push_back({VIEW_WEATHER, WEATHER_HOURS_PAGE});\r
+ g_page.push_back({VIEW_WEATHER, WEATHER_DAYS_PAGE});\r
+ g_page.push_back({VIEW_WEATHER, WEATHER_SUNRISE_PAGE});\r
+ g_page.push_back({VIEW_WEATHER, WEATHER_MONTHRISE_PAGE});\r
+ g_page.push_back({VIEW_WEATHER, WEATHER_LUNARPHASE_PAGE});\r
+ // 血氧\r
+ g_page.push_back({VIEW_BLOOD, BLOOD_MAIN_PAGE});\r
+ g_page.push_back({VIEW_BLOOD, BLOOD_READY_PAGE});\r
+ g_page.push_back({VIEW_BLOOD, BLOOD_MEASUREMENT_PAGE});\r
+ g_page.push_back({VIEW_BLOOD, BLOOD_RESULT_PAGE});\r
+ g_page.push_back({VIEW_BLOOD, BLOOD_CHART_PAGE});\r
+ g_page.push_back({VIEW_BLOOD, BLOOD_EXPLAIN_PAGE});\r
+ // 心率\r
+ g_page.push_back({VIEW_HEARTRATE, HEARTRATE_MAIN_PAGE});\r
+ g_page.push_back({VIEW_HEARTRATE, HEARTRATE_READY_PAGE});\r
+ g_page.push_back({VIEW_HEARTRATE, HEARTRATE_MEASUREMENT_PAGE});\r
+ // 相机\r
+ g_page.push_back({VIEW_CAMERA, CAMERA_MAIN_PAGE});\r
+ // 寻找手机\r
+ g_page.push_back({VIEW_FIND_PHONE, FIND_PHONE_MAIN_PAGE});\r
+ // 睡眠\r
+ g_page.push_back({VIEW_SLEEPING, SLEEPING_MAIN_PAGE});\r
+ g_page.push_back({VIEW_SLEEPING, SLEEPING_DEATIL_PAGE});\r
+ g_page.push_back({VIEW_SLEEPING, SLEEPING_TARGET_PAGE});\r
+ // 日历\r
+ g_page.push_back({VIEW_DATE, DATE_MAIN_PAGE});\r
+ g_page.push_back({VIEW_DATE, DATE_MESSAGE_PAGE});\r
+ g_page.push_back({VIEW_EMPTY, 1});\r
+ timeCallback_ = new TimeAnimatorCallback(TIME_PERIOL);\r
+ if (timeCallback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timeCallback_ fail");\r
+ return;\r
+ }\r
+ timeAnimator_ = new Animator(timeCallback_, nullptr, 0, true);\r
+ if (timeAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timeAnimator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+MonkeyModel::~MonkeyModel()\r
+{\r
+ if (timeAnimator_ != nullptr) {\r
+ delete timeAnimator_;\r
+ timeAnimator_ = nullptr;\r
+ }\r
+ if (timeCallback_ != nullptr) {\r
+ delete timeCallback_;\r
+ timeCallback_ = nullptr;\r
+ }\r
+}\r
+\r
+MonkeyModel &MonkeyModel::GetInstance()\r
+{\r
+ static MonkeyModel instance;\r
+ return instance;\r
+}\r
+\r
+void MonkeyModel::SetStart(bool start)\r
+{\r
+ if (start) {\r
+ timeAnimator_->Start();\r
+ } else {\r
+ timeAnimator_->Stop();\r
+ }\r
+}\r
+\r
+void MonkeyModel::TimeAnimatorCallback::Callback(UIView *view)\r
+{\r
+ int pageSize = g_page.size();\r
+ static int monkeyId = 0;\r
+ static int g_curTime = 0;\r
+ g_curTime++;\r
+ if (g_curTime > periol_) {\r
+ monkeyId = (monkeyId + 1) % pageSize;\r
+ std::cout << "sliceId = " << g_page[monkeyId].sliceId << " pageId = " << g_page[monkeyId].pageId << std::endl;\r
+ NativeAbility::GetInstance().SwitchSlice(g_page[monkeyId].sliceId, g_page[monkeyId].pageId);\r
+ g_curTime = 0;\r
+ }\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyPage\r
+ * Create: 2025-04-24\r
+ */\r
+#include <iostream>\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "monkey/MonkeyPresenter.h"\r
+#include "monkey/MonkeyModel.h"\r
+#include "monkey/MonkeyPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t MONKEY_LABEL_POS_X = 137;\r
+static constexpr uint16_t MONKEY_LABEL_POS_Y = 66;\r
+static constexpr uint16_t MONKEY_LABEL_WIDTH = 200;\r
+static constexpr uint16_t MONKEY_LABEL_HEIGHT = 90;\r
+static constexpr uint16_t START_MONKEY_BUTTON_POS_X = 142;\r
+static constexpr uint16_t START_MONKEY_BUTTON_POS_Y = 165;\r
+static constexpr uint16_t START_MONKEY_BUTTON_WIDTH = 182;\r
+static constexpr uint16_t START_MONKEY_BUTTON_HEIGHT = 47;\r
+static constexpr uint16_t END_MONKEY_BUTTON_POS_X = 142;\r
+static constexpr uint16_t END_MONKEY_BUTTON_POS_Y = 247;\r
+static constexpr uint16_t END_MONKEY_BUTTON_WIDTH = 182;\r
+static constexpr uint16_t END_MONKEY_BUTTON_HEIGHT = 47;\r
+static constexpr uint16_t MONKEY_FONT_SIZE = 34;\r
+static constexpr char *START_MONKEY = "startMonkey";\r
+static constexpr char *END_MONKEY = "endMonkey";\r
+\r
+REGIST_SLICE_PAGE(VIEW_MONKEY, MONKEY_PAGES::MONKEY_MAIN_PAGE, MonkeyPage, true);\r
+\r
+void MonkeyPage::OnStart(void *data)\r
+{\r
+ container_ = new UIScrollView();\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new container_ fail");\r
+ return;\r
+ }\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+\r
+ monkeyLabel_ = new UILabel();\r
+ if (monkeyLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new monkeyLabel_ fail");\r
+ return;\r
+ }\r
+ monkeyLabel_->SetPosition(MONKEY_LABEL_POS_X, MONKEY_LABEL_POS_Y, MONKEY_LABEL_WIDTH, MONKEY_LABEL_HEIGHT);\r
+ monkeyLabel_->SetViewId("label1");\r
+ monkeyLabel_->SetStyle(STYLE_TEXT_FONT, MONKEY_FONT_SIZE);\r
+ monkeyLabel_->SetText("Monkey测试");\r
+ monkeyLabel_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ monkeyLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ monkeyLabel_->SetRollSpeed(0);\r
+ monkeyLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MONKEY_FONT_SIZE);\r
+ container_->Add(monkeyLabel_);\r
+ monkeyLabel_->SetVisible(true);\r
+\r
+ endMonkeyButton_ = new UILabelButtonExt();\r
+ if (endMonkeyButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new endMonkeyButton_ fail");\r
+ return;\r
+ }\r
+ endMonkeyButton_->SetPosition(END_MONKEY_BUTTON_POS_X, END_MONKEY_BUTTON_POS_Y, END_MONKEY_BUTTON_WIDTH,\r
+ END_MONKEY_BUTTON_HEIGHT);\r
+ endMonkeyButton_->SetText("结束测试");\r
+ endMonkeyButton_->SetViewId(END_MONKEY);\r
+ endMonkeyButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MONKEY_FONT_SIZE);\r
+ endMonkeyButton_->SetStyleForState(STYLE_BORDER_COLOR, Color::Blue().full, UIButton::PRESSED);\r
+ container_->Add(endMonkeyButton_);\r
+ endMonkeyButton_->SetVisible(true);\r
+\r
+ startMonkeyButton_ = new UILabelButtonExt();\r
+ if (startMonkeyButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new startMonkeyButton_ fail");\r
+ return;\r
+ }\r
+ startMonkeyButton_->SetPosition(START_MONKEY_BUTTON_POS_X, START_MONKEY_BUTTON_POS_Y, START_MONKEY_BUTTON_WIDTH,\r
+ START_MONKEY_BUTTON_HEIGHT);\r
+ startMonkeyButton_->SetText("开始测试");\r
+ startMonkeyButton_->SetViewId(START_MONKEY);\r
+ startMonkeyButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MONKEY_FONT_SIZE);\r
+ startMonkeyButton_->SetStyleForState(STYLE_BORDER_COLOR, Color::Blue().full, UIButton::PRESSED);\r
+ container_->Add(startMonkeyButton_);\r
+ startMonkeyButton_->SetVisible(true);\r
+\r
+ endMonkeyButton_->SetOnClickListener(this);\r
+ startMonkeyButton_->SetOnClickListener(this);\r
+ container_->SetOnDragListener(this);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+MonkeyPage::MonkeyPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MonkeyPage::MonkeyPage");\r
+}\r
+\r
+MonkeyPage::~MonkeyPage()\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (monkeyLabel_ != nullptr) {\r
+ delete monkeyLabel_;\r
+ monkeyLabel_ = nullptr;\r
+ }\r
+ if (endMonkeyButton_ != nullptr) {\r
+ delete endMonkeyButton_;\r
+ endMonkeyButton_ = nullptr;\r
+ }\r
+ if (startMonkeyButton_ != nullptr) {\r
+ delete startMonkeyButton_;\r
+ startMonkeyButton_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MonkeyPage::~MonkeyPage");\r
+}\r
+\r
+bool MonkeyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ MonkeyModel::GetInstance().SetStart(false);\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ return false;\r
+}\r
+\r
+bool MonkeyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), START_MONKEY) == 0) {\r
+ MonkeyModel::GetInstance().SetStart(true);\r
+ } else if (strcmp(view.GetViewId(), END_MONKEY) == 0) {\r
+ MonkeyModel::GetInstance().SetStart(false);\r
+ }\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MonkeyPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+#include "NativeRegisterManager.h"\r
+#include "monkey/MonkeyView.h"\r
+#include "monkey/MonkeyPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_MONKEY, MonkeyView, MonkeyPresenter, MONKEY_ICON, MONKEY_ICON, "Monkey");\r
+}\r
#include "player/PlayersModel.h"
#include "uiservice/ui_service.h"
#include "NativeRegisterManager.h"
+#include "phonemenu/PhoneMenuView.h"
namespace OHOS {
VocassistModel::GetInstance()->SetToggleFlag(ALREADY_CLOSE_VOCASSIST_IMAGE);
}
}
-
+
VocassistModel::GetInstance()->SetExitStatus(CONTINUTE_EXIT_MODE1);
VoiceAssistance::GetInstance()->DelayDisplayTime(DELAY_SIX_SECONDS); // 开启定时器,太长时间未操作退出语音助手
}
strcmp(view.GetViewId(), VOC_ID) == 0) { // 语音助手右滑退出
int phoneStatus = VocassistModel::GetInstance()->GetPhoneDetailStatus(); // 扫描设置此时通话的状态和个数
if (phoneStatus == ONE_ROAD_AND_INCOMING) {
- NativeAbility::GetInstance().ChangeSlice(VIEW_MAEKPHONE_SAMPLE);
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);
} else {
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+ NativeAbility::GetInstance().ChangeSliceToApplist();
}
}
return true;
#include "graphic_timer.h"\r
#include "AppViewIDs.h"\r
#include "player/PlayersModel.h"\r
-#include "callerlog/CallerLogModel.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
#include "offlinevoice/VocassistModel.h"\r
#include "offlinevoice/VocassistView.h"\r
#include "offlinevoice/VocassistPresenter.h"\r
if (quitStatus == CONTINUTE_EXIT_MODE1) {\r
int phoneStatus = VocassistModel::GetInstance()->GetPhoneDetailStatus(); // 扫描设置此时通话的状态和个数\r
if (phoneStatus == ONE_ROAD_AND_INCOMING) {\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_MAEKPHONE_SAMPLE); // 返回来电界面\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
return;\r
}\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Too long no operate, now exit vocassist");\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include <string>\r
+#include <sys/time.h>\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phonemenu/PhoneMenuCallerLogItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_GROUP_W = 418;\r
+static constexpr uint16_t BG_GROUP_H = 128;\r
+static constexpr uint16_t BG_BACKGROUND_OPA = 48;\r
+static constexpr uint16_t BG_BORDER_RADIUS = 65;\r
+static constexpr uint16_t ICON_X = 40;\r
+static constexpr uint16_t ICON_Y = 40;\r
+static constexpr uint16_t PHONE_LABEL_X = 107;\r
+static constexpr uint16_t PHONE_LABEL_Y = 20;\r
+static constexpr uint16_t PHONE_LABEL_W = 230;\r
+static constexpr uint16_t PHONE_LABEL_H = 46;\r
+static constexpr uint16_t PHONE_LABEL_FONT = 36;\r
+static constexpr uint16_t STATUS_LABEL_X = 107;\r
+static constexpr uint16_t STATUS_LABEL_Y = 66;\r
+static constexpr uint16_t STATUS_LABEL_W = 268;\r
+static constexpr uint16_t STATUS_LABEL_H = 42;\r
+static constexpr uint16_t STATUS_LABEL_FONT = 30;\r
+static constexpr uint16_t NUM_10 = 10;\r
+\r
+PhoneMenuCallerLogItemView::PhoneMenuCallerLogItemView()\r
+{\r
+ bg_.SetPosition(0, 0, BG_GROUP_W, BG_GROUP_H);\r
+ bg_.SetStyle(STYLE_BACKGROUND_OPA, BG_BACKGROUND_OPA);\r
+ bg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ bg_.SetStyle(STYLE_BORDER_RADIUS, BG_BORDER_RADIUS);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+ phoneLabel_.SetPosition(PHONE_LABEL_X, PHONE_LABEL_Y, PHONE_LABEL_W, PHONE_LABEL_H);\r
+ phoneLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, PHONE_LABEL_FONT);\r
+ phoneLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+\r
+ stutasLabel_.SetPosition(STATUS_LABEL_X, STATUS_LABEL_Y, STATUS_LABEL_W, STATUS_LABEL_H);\r
+ stutasLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, STATUS_LABEL_FONT);\r
+ stutasLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ stutasLabel_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+\r
+ Add(&bg_);\r
+ Add(&icon_);\r
+ Add(&stutasLabel_);\r
+ Add(&phoneLabel_);\r
+}\r
+\r
+PhoneMenuCallerLogItemView::~PhoneMenuCallerLogItemView()\r
+{\r
+ Remove(&bg_);\r
+ Remove(&icon_);\r
+ Remove(&stutasLabel_);\r
+ Remove(&phoneLabel_);\r
+}\r
+\r
+void PhoneMenuCallerLogItemView::SetItemInfo(const CallLogInfo &itemInfo)\r
+{\r
+ memset_s(tel_, MAX_PHONE_NUM, 0, MAX_PHONE_NUM);\r
+ memcpy_s(tel_, MAX_PHONE_NUM, itemInfo.tel, itemInfo.telLen);\r
+ phoneLabel_.SetText(itemInfo.name);\r
+ if (strlen(itemInfo.name) == 0 || itemInfo.nameLen == 0) {\r
+ phoneLabel_.SetText((const char *)itemInfo.tel);\r
+ }\r
+ std::string timeStr;\r
+ struct tm pTM;\r
+ localtime_r((time_t *)&itemInfo.creationTime, &pTM);\r
+ if (pTM.tm_mon < NUM_10) {\r
+ timeStr += "0";\r
+ }\r
+ timeStr += std::to_string(pTM.tm_mon) + "/";\r
+ if (pTM.tm_mday < NUM_10) {\r
+ timeStr += "0";\r
+ }\r
+ timeStr += std::to_string(pTM.tm_mday);\r
+ if (itemInfo.status == CALL_MISSED) {\r
+ stutasLabel_.SetText(("未接来电 " + timeStr).c_str());\r
+ phoneLabel_.SetStyle(STYLE_TEXT_COLOR, Color::Red().full);\r
+ LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLIN);\r
+ } else if (itemInfo.status == CALL_INCOMING) {\r
+ stutasLabel_.SetText(("接听 " + timeStr).c_str());\r
+ LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLIN);\r
+ } else if (itemInfo.status == CALL_OUTGOING) {\r
+ stutasLabel_.SetText(("拨号 " + timeStr).c_str());\r
+ LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLOUT);\r
+ }\r
+ SetViewId("CallerLogItem");\r
+}\r
+\r
+unsigned char *PhoneMenuCallerLogItemView::GetItemPhoneNumber()\r
+{\r
+ return tel_;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogModel\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "ohos_timer.h"\r
+#include "graphic_timer.h"\r
+#include "samgr_lite.h"\r
+#include "graphic_service.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "NativeAbility.h"\r
+#include "notification_manager.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/VolumeSettingPresenter.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallingPage.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+using namespace OHOS;\r
+\r
+static int g_callTimes{0};\r
+static constexpr int NO_NUMBER_STATUS = -1;\r
+static int g_phoneStatus = PHONE_SINGLE_STATUS;\r
+static int g_isCall{NO_NUMBER_STATUS};\r
+static PhoneCallInfo callInfo{};\r
+static int g_retNum{0};\r
+static int g_volumeLocal{0};\r
+GraphicTimer *g_startCounting = nullptr;\r
+static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+static PhoneCallInfo callList[MULTI_CALL_MAX_NUME]{};\r
+static int g_firstPriority = NO_NUMBER_STATUS;\r
+static int g_secondPriority = NO_NUMBER_STATUS;\r
+static int g_thirdPriority = NO_NUMBER_STATUS;\r
+static int g_fourthPriority = NO_NUMBER_STATUS;\r
+static bool g_isWatchCallView = false;\r
+static constexpr int16 USLEEP_NUM = 5000;\r
+static constexpr int16 ONE_NUM = 1;\r
+\r
+static void SetPriorityNumber()\r
+{\r
+ time_t seconds;\r
+ time(&seconds);\r
+\r
+ if (g_firstPriority != NO_NUMBER_STATUS) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callList[g_firstPriority].unitCalls.number,\r
+ callList[g_firstPriority].unitCalls.number_len);\r
+ g_callTimes = seconds - callList[g_firstPriority].activeTime;\r
+ } else if (g_secondPriority != NO_NUMBER_STATUS) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callList[g_secondPriority].unitCalls.number,\r
+ callList[g_secondPriority].unitCalls.number_len);\r
+ g_callTimes = seconds - callList[g_secondPriority].activeTime;\r
+ } else if (g_thirdPriority != NO_NUMBER_STATUS) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callList[g_thirdPriority].unitCalls.number,\r
+ callList[g_thirdPriority].unitCalls.number_len);\r
+ } else if (g_fourthPriority != NO_NUMBER_STATUS) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callList[g_fourthPriority].unitCalls.number,\r
+ callList[g_fourthPriority].unitCalls.number_len);\r
+ }\r
+ return;\r
+}\r
+\r
+static void DisableCallingTimer()\r
+{\r
+ if (g_startCounting != nullptr) {\r
+ delete g_startCounting;\r
+ g_startCounting = nullptr;\r
+ g_callTimes = 0;\r
+ }\r
+}\r
+\r
+static void StatusReset()\r
+{\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(false);\r
+ DisableCallingTimer();\r
+ if (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ PhoneMenuCallerLogModel::GetInstance()->BackToPrePage();\r
+ } else {\r
+ g_isWatchCallView = false;\r
+ }\r
+ return;\r
+}\r
+\r
+static void CallTimerCallbackProc(void *data)\r
+{\r
+ g_callTimes++;\r
+\r
+ if (PhoneMenuCallingPage::GetInstance() == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallTimerCallbackProc] GetInstance is nullptr");\r
+ return;\r
+ }\r
+\r
+ if (PhoneMenuCallingPage::GetInstance()->GetCallingStateLabel() == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+ "[CallTimerCallbackProc] GetInstance()->GetCallingStateLabel is nullptr");\r
+ return;\r
+ }\r
+\r
+ if (PhoneMenuCallingPage::GetInstance()->GetCallingState() == PhoneMenuCallingPage::CallingState::SESSION) {\r
+ PhoneMenuCallingPage::GetInstance()->GetCallingStateLabel()->SetText(\r
+ PhoneMenuCallerLogModel::GetInstance()->DisplayCallDuration().c_str());\r
+ }\r
+}\r
+\r
+static void CallTimerCallback(void *data)\r
+{\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(CallTimerCallbackProc, data));\r
+}\r
+\r
+static void InitCallingTimer()\r
+{\r
+ if (g_startCounting != nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogModel::CallerTimer already exists!!");\r
+ return;\r
+ }\r
+ uint32 tick = GetOSTick(MS_ONE_SECONDS);\r
+ g_startCounting = new GraphicTimer(tick, CallTimerCallback, nullptr, true);\r
+ if (g_startCounting == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogModel::CallerTimer new GraphicTimer failed!!");\r
+ return;\r
+ }\r
+ bool retTimer = g_startCounting->Start();\r
+ if (!retTimer) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogModel::CallerTimer Start failed!!");\r
+ if (g_startCounting != nullptr) {\r
+ delete g_startCounting;\r
+ g_startCounting = nullptr;\r
+ }\r
+ return;\r
+ }\r
+}\r
+\r
+bool FindCallListInfoAndSetPriorityNumber()\r
+{\r
+ g_isCall = NO_NUMBER_STATUS;\r
+ g_firstPriority = NO_NUMBER_STATUS;\r
+ g_secondPriority = NO_NUMBER_STATUS;\r
+ g_thirdPriority = NO_NUMBER_STATUS;\r
+ g_fourthPriority = NO_NUMBER_STATUS;\r
+ (void)memset_s(callList, MULTI_CALL_MAX_NUME * sizeof(PhoneCallInfo), 0,\r
+ MULTI_CALL_MAX_NUME * sizeof(PhoneCallInfo));\r
+ int ret = GetCallInfoInCallList(callList, MULTI_CALL_MAX_NUME, &g_retNum);\r
+ if (ret != 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindCallListInfoAndSetPriorityNumber Error ret = %d", ret);\r
+ return false;\r
+ }\r
+ if (g_retNum == 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindCallListInfoAndSetPriorityNumber no call num");\r
+ return false;\r
+ }\r
+\r
+ if (g_retNum > 0 && g_retNum <= MULTI_CALL_MAX_NUME) {\r
+ for (int i = 0; i < g_retNum; i++) {\r
+ if (callList[i].lastStatus == HFP_HF_CALL_STATE_ACTIVE) {\r
+ g_firstPriority = i;\r
+ g_isCall = callList[i].lastStatus;\r
+ break;\r
+ } else if (callList[i].lastStatus == HFP_HF_CALL_STATE_HELD) {\r
+ g_secondPriority = i;\r
+ g_isCall = callList[i].lastStatus;\r
+ } else if (callList[i].lastStatus == HFP_HF_CALL_STATE_ALERTING ||\r
+ callList[i].lastStatus == HFP_HF_CALL_STATE_DIALING) {\r
+ if (g_secondPriority == NO_NUMBER_STATUS) {\r
+ g_isCall = callList[i].lastStatus;\r
+ }\r
+ g_thirdPriority = i;\r
+ } else if (callList[i].lastStatus == HFP_HF_CALL_STATE_INCOMING ||\r
+ callList[i].lastStatus == HFP_HF_CALL_STATE_WAITING) {\r
+ if (g_isCall == NO_NUMBER_STATUS && callList[i].lastStatus == HFP_HF_CALL_STATE_INCOMING) {\r
+ g_isCall = callList[i].lastStatus;\r
+ }\r
+ g_fourthPriority = i;\r
+ }\r
+ }\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindCallListInfoAndSetPriorityNumber] [%d] [%d] [%d] [%d], g_isCall = %d",\r
+ g_firstPriority, g_secondPriority, g_thirdPriority, g_fourthPriority, g_isCall);\r
+ SetPriorityNumber();\r
+ return true;\r
+}\r
+\r
+static void CallModelResumePlayer(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CallModelResumePlayer] [ResumePlayer] start");\r
+ usleep(USLEEP_NUM);\r
+}\r
+\r
+static void CallModelPostGraphicEvent(void (*fun)(void))\r
+{\r
+ GraphicService::GetInstance()->PostGraphicEvent(*fun);\r
+}\r
+\r
+static int g_callOperate = OPERATE_NO_OPE;\r
+\r
+static void ExitMakePhoneSlice(void)\r
+{\r
+ if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+ (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET)) {\r
+ WEARABLE_LOGD(HILOG_MODULE_AAFWK, "ExitMakePhoneSlice");\r
+\r
+ if (GetCurrCallNum() == 0) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+ CallModelPostGraphicEvent(CallModelResumePlayer);\r
+ } else {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+ DisableCallingTimer();\r
+ if (PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ g_isWatchCallView = false;\r
+ }\r
+}\r
+\r
+static void DialingHandle(void)\r
+{\r
+ PhoneMenuCallerLogModel::GetInstance()->SetDialingStatus("正在拨号");\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(true);\r
+}\r
+\r
+static void AlertingHandle(void)\r
+{\r
+ PhoneMenuCallerLogModel::GetInstance()->SetDialingStatus("正在响铃");\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(true);\r
+}\r
+\r
+static void IncomingHandle(void)\r
+{\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(false);\r
+}\r
+\r
+static void WaitingOpreate()\r
+{\r
+ if (!IsCompleteCallFlow()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[UsingPhoneChangeStatusCallback] is not complete call flow");\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[WaitingOpreate] WaitingOpreate");\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(true);\r
+ if (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();\r
+ if (targetId == VIEW_PHONE_MENU) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+ }\r
+ } else {\r
+ g_isWatchCallView = true;\r
+ }\r
+}\r
+\r
+static void WatchActiveHandle(const PhoneCallInfo *phoneCall)\r
+{\r
+ if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+ (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+ NativeAbility::GetInstance().GetCurSliceId() == VIEW_OFFLINEVOICE ||\r
+ PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ time_t seconds;\r
+ time(&seconds);\r
+ g_callTimes = seconds - phoneCall->activeTime;\r
+\r
+ InitCallingTimer();\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+ }\r
+ if (PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ g_isWatchCallView = true;\r
+ }\r
+}\r
+\r
+static void PhoneActiveHandle(void)\r
+{\r
+ if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+ (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+ g_isWatchCallView) {\r
+ if (GetCurrCallNum() > ONE_NUM) {\r
+ g_phoneStatus = PHONE_MULTI_STATUS;\r
+ if (GetScoConnectState() == HFP_SCO_STATE_DISCONNECTED) {\r
+ DisableCallingTimer();\r
+ }\r
+ }\r
+ TransCallToMobilePhone();\r
+ PhoneMenuCallerLogModel::GetInstance()->BackToPrePage();\r
+ CallModelPostGraphicEvent(CallModelResumePlayer);\r
+ }\r
+ usleep(USLEEP_NUM);\r
+ g_callOperate = OPERATE_WATCH_ACTIVE;\r
+}\r
+\r
+static void OppoActiveHandle(const PhoneCallInfo *phoneCall)\r
+{\r
+ if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+ (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+ g_isWatchCallView) {\r
+ if (GetCurrCallNum() > ONE_NUM) {\r
+ g_phoneStatus = PHONE_MULTI_STATUS;\r
+ return;\r
+ }\r
+ time_t seconds;\r
+ time(&seconds);\r
+ g_callTimes = seconds - phoneCall->activeTime;\r
+ InitCallingTimer();\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+ }\r
+}\r
+\r
+bool MulitplePhoneTextReplaces()\r
+{\r
+ DisableCallingTimer();\r
+ PhoneMenuCallingPage::GetInstance()->GetCallingPhoneNumberLabel()->SetText("正在通话");\r
+ PhoneMenuCallingPage::GetInstance()->GetCallingStateLabel()->SetText("");\r
+ return true;\r
+}\r
+\r
+static bool MultiplePhonesViewDisplay()\r
+{\r
+ if (g_phoneStatus == PHONE_MULTI_STATUS) {\r
+ if (NativeAbility::GetInstance().GetCurTargetId() !=\r
+ (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[MultiplePhonesViewDisplay]GetCurSliceId no PHONE_MENU_CALLING_PAGE");\r
+ DisableCallingTimer();\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMulitplePhoneStatus(true);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+ if (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+ } else {\r
+ g_isWatchCallView = true;\r
+ }\r
+ return true;\r
+ }\r
+ if (!MulitplePhoneTextReplaces()) {\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+static void NonWatchFinishHandle(int laststatus)\r
+{\r
+ if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+ (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+ PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ if (GetCurrCallNum() == 0) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetNotifyFlag(false);\r
+ StatusReset();\r
+ CallModelPostGraphicEvent(CallModelResumePlayer);\r
+ g_phoneStatus = PHONE_SINGLE_STATUS;\r
+ } else if (g_phoneStatus == PHONE_MULTI_STATUS) {\r
+ MultiplePhonesViewDisplay();\r
+ } else if (FindCallListInfoAndSetPriorityNumber()) {\r
+ if (laststatus == HFP_HF_CALL_STATE_ACTIVE || laststatus == HFP_HF_CALL_STATE_HELD) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+ } else if (laststatus == HFP_HF_CALL_STATE_WAITING) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+ }\r
+ uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();\r
+ if (targetId == VIEW_PHONE_MENU) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+ }\r
+ }\r
+ if (GetCurrCallNum() == 0) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetNotifyFlag(false);\r
+ }\r
+ }\r
+ if (GetCurrCallNum() == 0) {\r
+ g_phoneStatus = PHONE_SINGLE_STATUS;\r
+ }\r
+}\r
+\r
+static void WatchFinishHandle(void)\r
+{\r
+ if (NativeAbility::GetInstance().GetCurTargetId() ==\r
+ (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||\r
+ PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ if (GetCurrCallNum() == 0) {\r
+ PhoneMenuCallerLogModel::GetInstance()->SetNotifyFlag(false);\r
+ StatusReset();\r
+ } else {\r
+ StatusReset();\r
+ for (int i = GetCurrCallNum(); i > 0; i--) {\r
+ FinishCall();\r
+ }\r
+ }\r
+ }\r
+ g_phoneStatus = PHONE_SINGLE_STATUS;\r
+}\r
+\r
+static void ChangeStatusScreendisplay(int lastStatus)\r
+{\r
+ if (GetScoConnectState() != HFP_SCO_STATE_CONNECTED) {\r
+ if (lastStatus == HFP_HF_CALL_STATE_ACTIVE) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] STATE_ACTIVE");\r
+ StatusReset();\r
+ return;\r
+ } else if (lastStatus == HFP_HF_CALL_STATE_INCOMING) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] STATE_INCOMING");\r
+ } else if (GetCurrCallNum() == ONE_NUM &&\r
+ (lastStatus == HFP_HF_CALL_STATE_DIALING || lastStatus == HFP_HF_CALL_STATE_ALERTING)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] STATE_ALERTING");\r
+ } else if (GetCurrCallNum() > ONE_NUM) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] GetCurrCallNum MULITE");\r
+ DisableCallingTimer();\r
+ return;\r
+ }\r
+ }\r
+ if (!IsCompleteCallFlow()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] is not complete call flow");\r
+ return;\r
+ }\r
+ if (MultiplePhonesViewDisplay()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ChangeStatusScreendisplay] MultiplePhonesViewDisplay");\r
+ return;\r
+ }\r
+ if (g_callOperate != OPERATE_PHONE_ACTIVE && (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag())) {\r
+ uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();\r
+ if (targetId == VIEW_PHONE_MENU) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+ }\r
+ }\r
+}\r
+\r
+void UsingPhoneChangeStatusCallback(const PhoneCallInfo *phoneCall)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[UsingPhoneChangeStatusCallback] operate:%d, callNUm:%d, call flow:%d",\r
+ phoneCall->operate, GetCurrCallNum(), IsCompleteCallFlow());\r
+\r
+ if (phoneCall->operate == OPERATE_WATCH_FINISH && GetCurrCallNum() == 0) {\r
+ g_callOperate = OPERATE_WATCH_FINISH;\r
+ WatchFinishHandle();\r
+ return;\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(phoneCall->unitCalls.number,\r
+ phoneCall->unitCalls.number_len);\r
+ g_callOperate = phoneCall->operate;\r
+\r
+ switch (g_callOperate) {\r
+ case OPERATE_DIALING:\r
+ DialingHandle();\r
+ break;\r
+ case OPERATE_ALERTING:\r
+ AlertingHandle();\r
+ break;\r
+ case OPERATE_INCOMING:\r
+ IncomingHandle();\r
+ break;\r
+ case OPERATE_WAITING:\r
+ WaitingOpreate();\r
+ return;\r
+ case OPERATE_WATCH_ACTIVE:\r
+ WatchActiveHandle(phoneCall);\r
+ break;\r
+ case OPERATE_PHONE_ACTIVE:\r
+ PhoneActiveHandle();\r
+ return;\r
+ case OPERATE_PEER_ACTIVE:\r
+ OppoActiveHandle(phoneCall);\r
+ break;\r
+ case OPERATE_PHONE_HOLD:\r
+ return;\r
+ case OPERATE_WATCH_FINISH:\r
+ WatchFinishHandle();\r
+ return;\r
+ case OPERATE_WATCH_REJECT:\r
+ case OPERATE_NON_WATCH_FINISH:\r
+ NonWatchFinishHandle(phoneCall->lastStatus);\r
+ return;\r
+ default:\r
+ break;\r
+ }\r
+ ChangeStatusScreendisplay(phoneCall->lastStatus);\r
+}\r
+\r
+void UsingPhoneErrorCallback(PhoneServiceErrorType type)\r
+{\r
+ if (type == ERROR_DIAL) {\r
+ } else if (type == ERROR_BT) {\r
+ WEARABLE_LOGD(HILOG_MODULE_AAFWK, "UsingPhoneErrorCallback BT");\r
+ ExitMakePhoneSlice();\r
+ }\r
+}\r
+\r
+static void ScoConnectHandle(void)\r
+{\r
+ if (GetCurrCallNum() == 0) {\r
+ return;\r
+ }\r
+\r
+ if (!FindCallListInfoAndSetPriorityNumber()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScoConnectHandle FindCallListInfoAndSetPriorityNumber false");\r
+ return;\r
+ }\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectHandle] g_isCall = %d", g_isCall);\r
+ switch (g_isCall) {\r
+ case HFP_HF_CALL_STATE_ACTIVE:\r
+ if (g_callOperate == OPERATE_PHONE_ACTIVE) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectHandle] OPERATE_PHONE_ACTIVE");\r
+ return;\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+ InitCallingTimer();\r
+ break;\r
+ case HFP_HF_CALL_STATE_ALERTING:\r
+ PhoneMenuCallerLogModel::GetInstance()->SetDialingStatus("正在响铃");\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(true);\r
+ break;\r
+ case HFP_HF_CALL_STATE_DIALING:\r
+ PhoneMenuCallerLogModel::GetInstance()->SetDialingStatus("正在拨号");\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(true);\r
+ break;\r
+ case HFP_HF_CALL_STATE_INCOMING:\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(false);\r
+ break;\r
+ case HFP_HF_CALL_STATE_HELD:\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+ InitCallingTimer();\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ g_isCall = NO_NUMBER_STATUS;\r
+ if (!IsCompleteCallFlow()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectHandle] is not complete call flow");\r
+ return;\r
+ }\r
+ if (MultiplePhonesViewDisplay()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoConnectHandle] MultiplePhonesViewDisplay");\r
+ return;\r
+ }\r
+ if (!PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {\r
+ uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();\r
+ if (targetId == VIEW_PHONE_MENU) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);\r
+ }\r
+ } else {\r
+ g_isWatchCallView = true;\r
+ }\r
+}\r
+\r
+static void ScoDisconnectHandle(void)\r
+{\r
+ ExitMakePhoneSlice();\r
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+}\r
+\r
+void UsingPhoneScoStatausCallback(hfp_sco_connect_state_t state)\r
+{\r
+ WEARABLE_LOGD(HILOG_MODULE_AAFWK, "UsingPhoneScoStatausCallback SOC state: %d", state);\r
+\r
+ if (!IsCompleteCallFlow()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[UsingPhoneScoStatausCallback] is not complete call flow");\r
+ return;\r
+ }\r
+\r
+ if (state == HFP_SCO_STATE_CONNECTED) {\r
+ ScoConnectHandle();\r
+ } else if (state == HFP_SCO_STATE_DISCONNECTED) {\r
+ ScoDisconnectHandle();\r
+ }\r
+}\r
+\r
+void PhoneChangeStatusCallback(const PhoneCallInfo *phoneCall)\r
+{\r
+ (void)memset_s(&callInfo, sizeof(PhoneCallInfo), 0, sizeof(PhoneCallInfo));\r
+ (void)memcpy_s(&callInfo, sizeof(PhoneCallInfo), phoneCall, sizeof(PhoneCallInfo));\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(UsingPhoneChangeStatusCallback, &callInfo));\r
+}\r
+\r
+void PhoneErrorCallback(PhoneServiceErrorType type, int volume)\r
+{\r
+ g_volumeLocal = volume;\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(UsingPhoneErrorCallback, type));\r
+}\r
+\r
+void PhoneScoStatausCallback(hfp_sco_connect_state_t state)\r
+{\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(UsingPhoneScoStatausCallback, state));\r
+}\r
+\r
+namespace OHOS {\r
+static constexpr int32 NUM_TEN = 10;\r
+static constexpr int16 NUM_TIME_MIN = 60;\r
+static constexpr int16 NUM_TIME_HOUR = 3600;\r
+static constexpr int32 NUM_TIME_DAY = 86400;\r
+VolumeSettingView *g_volumeSetting = nullptr;\r
+\r
+void HonrsViewChange(void)\r
+{\r
+ if (g_volumeSetting == nullptr) {\r
+ g_volumeSetting = new VolumeSettingView();\r
+ if (g_volumeSetting == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallViewEventListener::g_volumeSetting nullptr err");\r
+ return;\r
+ }\r
+ if (!g_volumeSetting->SetUpVolume()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallViewEventListener::g_volumeSetting SetUpVolume fail");\r
+ return;\r
+ }\r
+ g_volumeSetting->GetProgress()->SetValue(\r
+ AudioManager::GetInstance().GetVolume(AUDIO_STREAM_VOICE_CALL_BT_SCO));\r
+ if (NotificationManager::GetInstance()->screenContainer_ != nullptr) {\r
+ NotificationManager::GetInstance()->screenContainer_->Add(g_volumeSetting);\r
+ }\r
+ }\r
+ VolumeSliderEventListener *volumeSliderEventListener = g_volumeSetting->GetVolumeEventListener();\r
+ if (volumeSliderEventListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallViewEventListener::volumeSliderEventListener nullptr err");\r
+ return;\r
+ }\r
+\r
+ volumeSliderEventListener->SetPlayerCoefficients(VOLUMEPHONENOTIFY);\r
+ g_volumeSetting->SetVisible(true);\r
+ RootView::GetInstance()->Invalidate();\r
+}\r
+\r
+VolumeSettingView *GetvolumeSetting(void)\r
+{\r
+ return g_volumeSetting;\r
+}\r
+\r
+PhoneMenuCallerLogModel::PhoneMenuCallerLogModel()\r
+{\r
+ PhoneMenuSync::ReadFileContact(CONTACTS_FILE_PATH);\r
+}\r
+\r
+PhoneMenuCallerLogModel::~PhoneMenuCallerLogModel() {}\r
+\r
+std::list<Contacts> &PhoneMenuCallerLogModel::GetContacts()\r
+{\r
+ return PhoneMenuSync::GetContacts();\r
+}\r
+\r
+void PhoneMenuCallerLogModel::InitPhoneService()\r
+{\r
+ WEARABLE_LOGD(HILOG_MODULE_AAFWK, "PhoneMenuCallerLogModel::[InitPhoneService]::Init start");\r
+ PhoneServiceInit();\r
+ PhoneServiceCb serviceFoution;\r
+\r
+ serviceFoution.callChanged = PhoneChangeStatusCallback;\r
+ serviceFoution.phoneServiceErrorCb = PhoneErrorCallback;\r
+ serviceFoution.scoStatusCb = PhoneScoStatausCallback;\r
+ int ret = RegisterCallChangedCb(&serviceFoution);\r
+ WEARABLE_LOGD(HILOG_MODULE_AAFWK, "PhoneMenuCallerLogModel::[InitPhoneService]::Init ret = %d", ret);\r
+}\r
+\r
+std::string PhoneMenuCallerLogModel::InitDateHourTime(void)\r
+{\r
+ struct tm pTM;\r
+ time_t seconds;\r
+ time(&seconds);\r
+ localtime_r(&seconds, &pTM);\r
+ timers_.erase();\r
+ if (pTM.tm_min < NUM_TEN) {\r
+ std::string min = "0" + std::to_string(pTM.tm_min);\r
+ timers_ = std::to_string(pTM.tm_hour) + ":" + min;\r
+ return timers_;\r
+ }\r
+ timers_ = std::to_string(pTM.tm_hour) + ":" + std::to_string(pTM.tm_min);\r
+ return timers_;\r
+}\r
+\r
+std::string &PhoneMenuCallerLogModel::DisplayCallDuration()\r
+{\r
+ callDuration_.erase();\r
+ std::string hours;\r
+ std::string minute;\r
+ std::string seconds;\r
+ if (g_callTimes >= NUM_TIME_DAY) {\r
+ g_callTimes = 0;\r
+ }\r
+ int hour = g_callTimes / NUM_TIME_HOUR;\r
+ int min = (g_callTimes % NUM_TIME_HOUR) / NUM_TIME_MIN;\r
+ int sec = (g_callTimes % NUM_TIME_HOUR) % NUM_TIME_MIN;\r
+ if (hour >= 0 && hour < NUM_TEN) {\r
+ hours = "0" + std::to_string(hour);\r
+ } else {\r
+ hours = std::to_string(hour);\r
+ }\r
+ if (min >= 0 && min < NUM_TEN) {\r
+ minute = "0" + std::to_string(min);\r
+ } else {\r
+ minute = std::to_string(min);\r
+ }\r
+ if (sec >= 0 && sec < NUM_TEN) {\r
+ seconds = "0" + std::to_string(sec);\r
+ } else {\r
+ seconds = std::to_string(sec);\r
+ }\r
+\r
+ if (hour == 0) {\r
+ callDuration_ = "通话中 " + minute + ":" + seconds;\r
+ } else {\r
+ callDuration_ = "通话中 " + hours + ":" + minute + ":" + seconds;\r
+ }\r
+ return callDuration_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetDialingStatus(const char *text)\r
+{\r
+ dialingStatus_.clear();\r
+ dialingStatus_.append(reinterpret_cast<const char *>(text));\r
+}\r
+\r
+std::string PhoneMenuCallerLogModel::GetDialingStatus(void)\r
+{\r
+ return dialingStatus_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetNotifyFlag(bool flag)\r
+{\r
+ notifyFlag_ = flag;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetNotifyFlag(void)\r
+{\r
+ return notifyFlag_;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::IsMulitplePhoneStatus(void)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "IsMulitplePhoneStatus phoneStatus_:%d", g_phoneStatus);\r
+ return g_phoneStatus == PHONE_MULTI_STATUS;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetMulitplePhoneStatus(bool status)\r
+{\r
+ mulitplePhoneStatus_ = status;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetMulitplePhoneStatus()\r
+{\r
+ return mulitplePhoneStatus_;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetWaitingStatus()\r
+{\r
+ return waitingStatus_;\r
+}\r
+void PhoneMenuCallerLogModel::SetWaitingStatus(bool status)\r
+{\r
+ waitingStatus_ = status;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetCallStatus(bool status)\r
+{\r
+ callStatus_ = status;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetCallStatus()\r
+{\r
+ return callStatus_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetVolumeScreenStatus(bool status)\r
+{\r
+ volumeStatus_ = status;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetVolumeScreenStatus()\r
+{\r
+ return volumeStatus_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetoperateNumber(const char *number, char number_len)\r
+{\r
+ phoneNumber_.clear();\r
+ phoneNumber_.append(number, number_len);\r
+}\r
+\r
+std::string PhoneMenuCallerLogModel::GetPhoneNumber(void)\r
+{\r
+ return phoneNumber_;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SetMakePhoneStatus(bool status)\r
+{\r
+ phoneStatus_ = status;\r
+}\r
+\r
+bool PhoneMenuCallerLogModel::GetPhoneStatus()\r
+{\r
+ return phoneStatus_;\r
+}\r
+\r
+int PhoneMenuCallerLogModel::CurrCallNum(void)\r
+{\r
+ return GetCurrCallNum();\r
+}\r
+\r
+PhoneMenuCallerLogModel *PhoneMenuCallerLogModel::GetInstance(void)\r
+{\r
+ static PhoneMenuCallerLogModel callLogModel;\r
+ return &callLogModel;\r
+}\r
+\r
+void PhoneMenuCallerLogModel::SaveCurPage()\r
+{\r
+ uint32_t targetId = NativeAbility::GetInstance().GetCurTargetId();\r
+ if (targetId == VIEW_AOD) {\r
+ preSliceId_ = VIEW_MAIN_SAMPLE;\r
+ prePageId_ = 0;\r
+ } else {\r
+ preSliceId_ = static_cast<uint16_t>(targetId & SLICE_MASK);\r
+ prePageId_ = static_cast<uint16_t>(targetId >> PAGE_OFFSET);\r
+ }\r
+ WEARABLE_LOGD(\r
+ WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogModel SaveCurPage:%d %d %d", targetId, preSliceId_, prePageId_);\r
+}\r
+\r
+void PhoneMenuCallerLogModel::BackToPrePage()\r
+{\r
+ if (prePageId_ != 0) {\r
+ NativeAbility::GetInstance().SwitchSlice(preSliceId_, prePageId_);\r
+ } else {\r
+ NativeAbility::GetInstance().ChangeSlice(preSliceId_);\r
+ }\r
+}\r
+}\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallerLogPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <string.h>\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogItemView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+#include "phonemenu/PhoneMenuCallerLogPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TITLI_LABEL_X = 97;\r
+static constexpr uint16_t TITLI_LABEL_Y = 31;\r
+static constexpr uint16_t TITLI_LABEL_W = 260;\r
+static constexpr uint16_t TITLI_LABEL_H = 53;\r
+static constexpr uint16_t TITLI_LABEL_FONT = 38;\r
+static constexpr uint16_t NOCALL_LABEL_X = 156;\r
+static constexpr uint16_t NOCALL_LABEL_Y = 202;\r
+static constexpr uint16_t NOCALL_LABEL_W = 148;\r
+static constexpr uint16_t NOCALL_LABEL_H = 50;\r
+static constexpr uint16_t NOCALL_LABEL_FONT = 36;\r
+static constexpr uint16_t CLEAR_LABEL_X = 156;\r
+static constexpr uint16_t CLEAR_LABEL_W = 148;\r
+static constexpr uint16_t CLEAR_LABEL_H = 50;\r
+static constexpr uint16_t CLEAR_LABEL_FONT = 36;\r
+static constexpr uint16_t LIST_X = 17;\r
+static constexpr uint16_t LIST_Y = 110;\r
+static constexpr uint16_t LIST_W = 418;\r
+static constexpr uint16_t LIST_H = 344;\r
+static constexpr uint16_t LIST_ITEM_W = 418;\r
+static constexpr uint16_t LIST_ITEM_H = 143;\r
+static constexpr uint16_t TOP_BLANK_SIZE = 31;\r
+static constexpr uint16_t BOTTOM_BLANK_SIZE = 80;\r
+const char *PHONE_MENU_CLEAR_BUTTON = "phoneMenuClearButton";\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLER_LOG_PAGE, PhoneMenuCallerLogPage, false);\r
+\r
+static PhoneMenuCallerLogPage *g_PhoneMenuCallerLogPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ PhoneMenuCallerLogItemView *item = new PhoneMenuCallerLogItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_PhoneMenuCallerLogPageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ PhoneMenuCallerLogItemView *item = dynamic_cast<PhoneMenuCallerLogItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ CallLogInfo *itemInfo = static_cast<CallLogInfo *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+PhoneMenuCallerLogPage::PhoneMenuCallerLogPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage::PhoneMenuCallerLogPage");\r
+ g_PhoneMenuCallerLogPageInstance = this;\r
+}\r
+\r
+PhoneMenuCallerLogPage::~PhoneMenuCallerLogPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (noCallLabel_ != nullptr) {\r
+ delete noCallLabel_;\r
+ noCallLabel_ = nullptr;\r
+ }\r
+ if (clearButton_ != nullptr) {\r
+ delete clearButton_;\r
+ clearButton_ = nullptr;\r
+ }\r
+ if (callerLogList_ != nullptr) {\r
+ delete callerLogList_;\r
+ callerLogList_ = nullptr;\r
+ }\r
+ if (info_ != nullptr) {\r
+ delete[] info_;\r
+ info_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage::~PhoneMenuCallerLogPage");\r
+}\r
+\r
+void PhoneMenuCallerLogPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(TITLI_LABEL_X, TITLI_LABEL_Y, TITLI_LABEL_W, TITLI_LABEL_H);\r
+ titleLabel_->SetText("最近通话");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, TITLI_LABEL_FONT);\r
+ group_->Add(titleLabel_);\r
+\r
+ noCallLabel_ = new UILabel();\r
+ if (noCallLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage noCallLabel_ new fail");\r
+ return;\r
+ }\r
+ noCallLabel_->SetPosition(NOCALL_LABEL_X, NOCALL_LABEL_Y, NOCALL_LABEL_W, NOCALL_LABEL_H);\r
+ noCallLabel_->SetText("暂无通话");\r
+ noCallLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ noCallLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, NOCALL_LABEL_FONT);\r
+ group_->Add(noCallLabel_);\r
+\r
+ clearButton_ = new UILabelButton();\r
+ if (clearButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage clearButton_ new fail");\r
+ return;\r
+ }\r
+ clearButton_->SetText("全部清除");\r
+ clearButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CLEAR_LABEL_FONT);\r
+ clearButton_->SetViewId(PHONE_MENU_CLEAR_BUTTON);\r
+ clearButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ clearButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ clearButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ clearButton_->SetOnClickListener(this);\r
+ group_->Add(clearButton_);\r
+\r
+ callerLogList_ = new UISimpleList();\r
+ if (callerLogList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage callerLogList_ new fail");\r
+ return;\r
+ }\r
+ callerLogList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ callerLogList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ callerLogList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ callerLogList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+ int num = 0;\r
+ if (GetCallLog(&info_, &num) == -1) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage GetCallLog fail");\r
+ }\r
+\r
+ for (int i = num - 1; i >= 0; i--) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&info_[i]);\r
+ callerLogList_->AddContent(content);\r
+ }\r
+ callerLogList_->RefreshList();\r
+ group_->Add(callerLogList_);\r
+\r
+ if (num == 0) {\r
+ noCallLabel_->SetVisible(true);\r
+ callerLogList_->SetVisible(false);\r
+ clearButton_->SetVisible(false);\r
+ } else {\r
+ group_->SetYScrollBarVisible(true);\r
+ group_->SetScrollBlankSize(TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+ group_->SetScrollBlankSize(BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ noCallLabel_->SetVisible(false);\r
+ callerLogList_->SetVisible(true);\r
+ callerLogList_->Resize(LIST_W, LIST_ITEM_H * num);\r
+ clearButton_->SetVisible(true);\r
+ clearButton_->SetPosition(CLEAR_LABEL_X, LIST_Y + LIST_ITEM_H * num, CLEAR_LABEL_W, CLEAR_LABEL_H);\r
+ }\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool PhoneMenuCallerLogPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool PhoneMenuCallerLogPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), PHONE_MENU_CLEAR_BUTTON) == 0) {\r
+ if (ClearCallLogFile() == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage ClearCallLogFile success");\r
+ }\r
+ callerLogList_->ClearAll();\r
+ callerLogList_->RefreshList();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLER_LOG_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_DISCONNECT_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ return true;\r
+ }\r
+\r
+ PhoneMenuCallerLogItemView *itemView = dynamic_cast<PhoneMenuCallerLogItemView *>(&view);\r
+ if (itemView == nullptr) {\r
+ return false;\r
+ }\r
+ unsigned char *phoneNumber = itemView->GetItemPhoneNumber();\r
+ SetMicMute(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMicMute(false);\r
+ if (DialCall(phoneNumber, strlen((const char *)phoneNumber)) != OHOS_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallerLogPage DialCall fail");\r
+ return false;\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SaveCurPage();\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuCallingPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "AppViewIDs.h"\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+#include "phonemenu/PhoneMenuCallingPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t PHONE_LABEL_X = 74;\r
+static constexpr uint16_t PHONE_LABEL_Y = 143;\r
+static constexpr uint16_t PHONE_LABEL_W = 320;\r
+static constexpr uint16_t PHONE_LABEL_H = 46;\r
+static constexpr uint16_t PHONE_LABEL_FONT = 46;\r
+static constexpr uint16_t STATE_LABEL_X1 = 185;\r
+static constexpr uint16_t STATE_LABEL_X2 = 125;\r
+static constexpr uint16_t STATE_LABEL_Y = 204;\r
+static constexpr uint16_t STATE_LABEL_W = 238;\r
+static constexpr uint16_t STATE_LABEL_H = 46;\r
+static constexpr uint16_t STATE_LABEL_FONT = 34;\r
+static constexpr uint16_t ICON_X = 142;\r
+static constexpr uint16_t ICON_Y = 214;\r
+static constexpr uint16_t BUTTON_X1 = 109;\r
+static constexpr uint16_t BUTTON_X2 = 249;\r
+static constexpr uint16_t BUTTON_X3 = 186;\r
+static constexpr uint16_t BUTTON_Y = 300;\r
+static constexpr uint16_t BUTTON_W = 85;\r
+static constexpr uint16_t BUTTON_H = 85;\r
+static const char *HANG_UP_BUTTON_ID = "callingHangUp";\r
+static const char *ANSWER_BUTTON_ID = "callingAnswer";\r
+static const char *VOLUME_BUTTON_ID = "microphoneChange";\r
+static PhoneMenuCallingPage *g_phoneMenuCallingPage = nullptr;\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE, PhoneMenuCallingPage, false);\r
+\r
+PhoneMenuCallingPage::PhoneMenuCallingPage()\r
+{\r
+ g_phoneMenuCallingPage = this;\r
+}\r
+\r
+PhoneMenuCallingPage::~PhoneMenuCallingPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (icon_ != nullptr) {\r
+ delete icon_;\r
+ icon_ = nullptr;\r
+ }\r
+ if (phoneNumber_ != nullptr) {\r
+ delete phoneNumber_;\r
+ phoneNumber_ = nullptr;\r
+ }\r
+ if (stateLabel_ != nullptr) {\r
+ delete stateLabel_;\r
+ stateLabel_ = nullptr;\r
+ }\r
+ if (answerButton_ != nullptr) {\r
+ delete answerButton_;\r
+ answerButton_ = nullptr;\r
+ }\r
+ if (hangUpButton_ != nullptr) {\r
+ delete hangUpButton_;\r
+ hangUpButton_ = nullptr;\r
+ }\r
+ if (volumeButton_ != nullptr) {\r
+ delete volumeButton_;\r
+ volumeButton_ = nullptr;\r
+ }\r
+ g_phoneMenuCallingPage = nullptr;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage::~PhoneMenuCallingPage");\r
+}\r
+\r
+PhoneMenuCallingPage *PhoneMenuCallingPage::GetInstance()\r
+{\r
+ return g_phoneMenuCallingPage;\r
+}\r
+\r
+UILabel *PhoneMenuCallingPage::GetCallingPhoneNumberLabel()\r
+{\r
+ return phoneNumber_;\r
+}\r
+\r
+UILabel *PhoneMenuCallingPage::GetCallingStateLabel()\r
+{\r
+ return stateLabel_;\r
+}\r
+\r
+PhoneMenuCallingPage::CallingState PhoneMenuCallingPage::GetCallingState()\r
+{\r
+ return state_;\r
+}\r
+\r
+void PhoneMenuCallingPage::CreateUILabel()\r
+{\r
+ phoneNumber_ = new UILabel();\r
+ if (phoneNumber_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage phoneNumber_ new fail");\r
+ return;\r
+ }\r
+ phoneNumber_->SetPosition(PHONE_LABEL_X, PHONE_LABEL_Y, PHONE_LABEL_W, PHONE_LABEL_H);\r
+ phoneNumber_->SetText(PhoneMenuCallerLogModel::GetInstance()->GetPhoneNumber().c_str());\r
+ phoneNumber_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PHONE_LABEL_FONT);\r
+ phoneNumber_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(phoneNumber_);\r
+\r
+ stateLabel_ = new UILabel();\r
+ if (stateLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage stateLabel_ new fail");\r
+ return;\r
+ }\r
+ stateLabel_->SetPosition(STATE_LABEL_X1, STATE_LABEL_Y, STATE_LABEL_W, STATE_LABEL_H);\r
+ stateLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STATE_LABEL_FONT);\r
+ stateLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ stateLabel_->SetTextColor(Color::Green());\r
+ group_->Add(stateLabel_);\r
+\r
+ icon_ = new UIImageView();\r
+ if (icon_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage icon_ new fail");\r
+ return;\r
+ }\r
+ icon_->SetPosition(ICON_X, ICON_Y);\r
+ group_->Add(icon_);\r
+}\r
+\r
+void PhoneMenuCallingPage::CreateUIButton()\r
+{\r
+ answerButton_ = new UIButton();\r
+ if (answerButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage answerButton_ new fail");\r
+ return;\r
+ }\r
+ answerButton_->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ answerButton_->SetViewId(ANSWER_BUTTON_ID);\r
+ answerButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ answerButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ answerButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ LOADIMG::LoadBtnImage(answerButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_ANSWER, IMAGE_PHONEMENU_ANSWER);\r
+ answerButton_->SetOnClickListener(this);\r
+ group_->Add(answerButton_);\r
+\r
+ hangUpButton_ = new UIButton();\r
+ if (hangUpButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage hangUpButton_ new fail");\r
+ return;\r
+ }\r
+ hangUpButton_->SetViewId(HANG_UP_BUTTON_ID);\r
+ hangUpButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ hangUpButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ hangUpButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ LOADIMG::LoadBtnImage(hangUpButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_HANGUP, IMAGE_PHONEMENU_HANGUP);\r
+ hangUpButton_->SetOnClickListener(this);\r
+ group_->Add(hangUpButton_);\r
+\r
+ volumeButton_ = new UIButton();\r
+ if (volumeButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage volumeButton_ new fail");\r
+ return;\r
+ }\r
+ volumeButton_->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ volumeButton_->SetViewId(VOLUME_BUTTON_ID);\r
+ volumeButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ volumeButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ volumeButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ bool isMicMute = PhoneMenuCallerLogModel::GetInstance()->GetMicMute();\r
+ if (isMicMute) {\r
+ LOADIMG::LoadBtnImage(volumeButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_MIC_MUTE, IMAGE_PHONEMENU_MIC_MUTE);\r
+ } else {\r
+ LOADIMG::LoadBtnImage(volumeButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_MIC, IMAGE_PHONEMENU_MIC);\r
+ }\r
+ volumeButton_->SetOnClickListener(this);\r
+ group_->Add(volumeButton_);\r
+}\r
+\r
+void PhoneMenuCallingPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ CreateUILabel();\r
+ CreateUIButton();\r
+ AddViewToPageContainer(group_);\r
+\r
+ if (PhoneMenuCallerLogModel::GetInstance()->GetCallStatus()) {\r
+ state_ = CallingState::SESSION;\r
+ stateLabel_->SetPosition(STATE_LABEL_X2, STATE_LABEL_Y, STATE_LABEL_W, STATE_LABEL_H);\r
+ stateLabel_->SetText(PhoneMenuCallerLogModel::GetInstance()->DisplayCallDuration().c_str());\r
+ icon_->SetVisible(false);\r
+ hangUpButton_->SetVisible(true);\r
+ hangUpButton_->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ answerButton_->SetVisible(false);\r
+ volumeButton_->SetVisible(true);\r
+ } else if (PhoneMenuCallerLogModel::GetInstance()->GetWaitingStatus()) {\r
+ state_ = CallingState::WAITING;\r
+ stateLabel_->SetText("新来电...");\r
+ icon_->SetVisible(true);\r
+ LOADIMG::LoadImageViewImg(icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLIN_ICON);\r
+ hangUpButton_->SetVisible(true);\r
+ hangUpButton_->SetPosition(BUTTON_X3, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ answerButton_->SetVisible(false);\r
+ volumeButton_->SetVisible(false);\r
+ } else if (PhoneMenuCallerLogModel::GetInstance()->GetPhoneStatus()) {\r
+ state_ = CallingState::OUTGOING;\r
+ stateLabel_->SetText("正在呼叫...");\r
+ icon_->SetVisible(true);\r
+ LOADIMG::LoadImageViewImg(icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLOUT_ICON);\r
+ hangUpButton_->SetVisible(true);\r
+ hangUpButton_->SetPosition(BUTTON_X3, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ answerButton_->SetVisible(false);\r
+ volumeButton_->SetVisible(false);\r
+ } else {\r
+ state_ = CallingState::INCOMING;\r
+ stateLabel_->SetText("手机来电");\r
+ icon_->SetVisible(true);\r
+ LOADIMG::LoadImageViewImg(icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALLIN_ICON);\r
+ hangUpButton_->SetVisible(true);\r
+ hangUpButton_->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ answerButton_->SetVisible(true);\r
+ volumeButton_->SetVisible(false);\r
+ }\r
+\r
+ PhoneMenuCallerLogModel::GetInstance()->SetVolumeScreenStatus(false);\r
+ if (PhoneMenuCallerLogModel::GetInstance()->GetMulitplePhoneStatus()) {\r
+ MulitplePhoneTextReplaces();\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMulitplePhoneStatus(false);\r
+ }\r
+}\r
+\r
+bool PhoneMenuCallingPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ return false;\r
+}\r
+\r
+bool PhoneMenuCallingPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), VOLUME_BUTTON_ID) == 0) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage VOLUME_BUTTON_ID");\r
+ bool isMicMute = PhoneMenuCallerLogModel::GetInstance()->GetMicMute();\r
+ if (!isMicMute) {\r
+ LOADIMG::LoadBtnImage(volumeButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_MIC_MUTE, IMAGE_PHONEMENU_MIC_MUTE);\r
+ } else {\r
+ LOADIMG::LoadBtnImage(volumeButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_MIC, IMAGE_PHONEMENU_MIC);\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMicMute(!isMicMute);\r
+ SetMicMute(!isMicMute);\r
+ return true;\r
+ } else if (strcmp(view.GetViewId(), ANSWER_BUTTON_ID) == 0) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage ANSWER_BUTTON_ID");\r
+ if (AcceptIncomingCall() != 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage AcceptIncomingCall() fail");\r
+ return false;\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+ } else if (strcmp(view.GetViewId(), HANG_UP_BUTTON_ID) == 0) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage HANG_UP_BUTTON_ID");\r
+ if (state_ == CallingState::WAITING) {\r
+ if (RejectIncomingCall() != 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage RejectIncomingCall error");\r
+ return false;\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(true);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (state_ == CallingState::INCOMING) {\r
+ if (RejectIncomingCall() != 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage RejectIncomingCall fail");\r
+ return false;\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->BackToPrePage();\r
+ } else {\r
+ if (FinishCall() != 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuCallingPage FinishCall fail");\r
+ return false;\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMakePhoneStatus(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->BackToPrePage();\r
+ }\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuContactsItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phonemenu/PhoneMenuContactsItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_GROUP_X = 0;\r
+static constexpr uint16_t BG_GROUP_Y = 7;\r
+static constexpr uint16_t BG_GROUP_W = 383;\r
+static constexpr uint16_t BG_GROUP_H = 88;\r
+static constexpr uint16_t BG_BACKGROUND_OPA = 48;\r
+static constexpr uint16_t BG_BORDER_RADIUS = 45;\r
+static constexpr uint16_t ICON_X = 33;\r
+static constexpr uint16_t ICON_Y = 26;\r
+static constexpr uint16_t LABEL_X = 89;\r
+static constexpr uint16_t LABEL_Y = 30;\r
+static constexpr uint16_t LABEL_W = 294;\r
+static constexpr uint16_t LABEL_H = 35;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+\r
+PhoneMenuContactsItemView::PhoneMenuContactsItemView()\r
+{\r
+ bg_.SetPosition(BG_GROUP_X, BG_GROUP_Y, BG_GROUP_W, BG_GROUP_H);\r
+ bg_.SetStyle(STYLE_BACKGROUND_OPA, BG_BACKGROUND_OPA);\r
+ bg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ bg_.SetStyle(STYLE_BORDER_RADIUS, BG_BORDER_RADIUS);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+ LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CONTACTS);\r
+\r
+ label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ Add(&bg_);\r
+ Add(&icon_);\r
+ Add(&label_);\r
+}\r
+\r
+PhoneMenuContactsItemView::~PhoneMenuContactsItemView()\r
+{\r
+ Remove(&bg_);\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+}\r
+\r
+void PhoneMenuContactsItemView::SetItemInfo(const PhoneMenuContactsItem &itemInfo)\r
+{\r
+ itemInfo_ = itemInfo;\r
+ label_.SetText(itemInfo.name.c_str());\r
+}\r
+\r
+const char *PhoneMenuContactsItemView::GetContactsName() const\r
+{\r
+ return itemInfo_.name.c_str();\r
+}\r
+\r
+const char *PhoneMenuContactsItemView::GetContactsCid() const\r
+{\r
+ return itemInfo_.cid.c_str();\r
+}\r
+\r
+const char *PhoneMenuContactsItemView::GetContactsPhoneNumber() const\r
+{\r
+ return itemInfo_.phoneNumber.c_str();\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuContactsPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+#include "phonemenu/PhoneMenuContactsItemView.h"\r
+#include "phonemenu/PhoneMenuContactsPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_POS_X = 97;\r
+static constexpr uint16_t LABEL_POS_Y = 31;\r
+static constexpr uint16_t LABEL_WIDTH = 260;\r
+static constexpr uint16_t LABEL_HEIGHT = 53;\r
+static constexpr uint16_t LABEL_FONT_SIZE = 38;\r
+static constexpr uint16_t IMAGE_POS_X = 174;\r
+static constexpr uint16_t IMAGE_POS_Y = 111;\r
+static constexpr uint16_t LABEL_POS_X_NO_CONTACTS = 104;\r
+static constexpr uint16_t LABEL_POS_Y_NO_CONTACTS = 257;\r
+static constexpr uint16_t LABEL_WIDTH_NO_CONTACTS = 246;\r
+static constexpr uint16_t LABEL_HEIGHT_NO_CONTACTS = 100;\r
+static constexpr uint16_t LABEL_FONT_NO_CONTACTS = 34;\r
+static constexpr uint16_t LIST_POS_X = 35;\r
+static constexpr uint16_t LIST_POS_Y = 104;\r
+static constexpr uint16_t LIST_WIDTH = 383;\r
+static constexpr uint16_t LIST_HEIGHT = 350;\r
+static constexpr uint16_t LIST_ITEM_W = 383;\r
+static constexpr uint16_t LIST_ITEM_H = 102;\r
+static constexpr uint16_t CONTAINER_TOP_BLANK_SIZE = 31;\r
+static constexpr uint16_t CONTAINER_BOTTOM_BLANK_SIZE = 100;\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CONTACTS_PAGE, PhoneMenuContactsPage, false);\r
+\r
+static PhoneMenuContactsPage *g_PhoneMenuContactsPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ PhoneMenuContactsItemView *item = new PhoneMenuContactsItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_PhoneMenuContactsPageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ PhoneMenuContactsItemView *item = dynamic_cast<PhoneMenuContactsItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ PhoneMenuContactsItem *itemInfo = static_cast<PhoneMenuContactsItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+void PhoneMenuContactsPage::OnStart(void *data)\r
+{\r
+ container_ = new UIScrollView();\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage container_ new fail");\r
+ return;\r
+ }\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetOnDragListener(this);\r
+ container_->SetScrollBlankSize(CONTAINER_TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+ container_->SetScrollBlankSize(CONTAINER_BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+ contactsLabel_ = new UILabel();\r
+ if (contactsLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage contactsLabel_ new fail");\r
+ return;\r
+ }\r
+ contactsLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ container_->Add(contactsLabel_);\r
+\r
+ auto list = PhoneMenuCallerLogModel::GetInstance()->GetContacts();\r
+ if (list.empty()) {\r
+ image_ = new UIImageView();\r
+ if (image_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage image_ new fail");\r
+ return;\r
+ }\r
+ image_->SetPosition(IMAGE_POS_X, IMAGE_POS_Y);\r
+ LOADIMG::LoadImageViewImg(image_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_PHONE);\r
+ container_->Add(image_);\r
+\r
+ contactsLabel_->SetPosition(LABEL_POS_X_NO_CONTACTS, LABEL_POS_Y_NO_CONTACTS,\r
+ LABEL_WIDTH_NO_CONTACTS, LABEL_HEIGHT_NO_CONTACTS);\r
+ contactsLabel_->SetText("请前往手机APP\n同步常用联系人");\r
+ contactsLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT_NO_CONTACTS);\r
+ } else {\r
+ contactsLabel_->SetPosition(LABEL_POS_X, LABEL_POS_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+ contactsLabel_->SetText("通讯录");\r
+ contactsLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE);\r
+\r
+ contactsList_ = new UISimpleList();\r
+ if (contactsList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage contactsList_ new fail");\r
+ return;\r
+ }\r
+ contactsList_->SetPosition(LIST_POS_X, LIST_POS_Y, LIST_WIDTH, LIST_HEIGHT);\r
+ contactsList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ contactsList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+ contactsList_->Resize(LIST_WIDTH, LIST_ITEM_H * list.size());\r
+ for (auto &contacts : list) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&contacts);\r
+ contactsList_->AddContent(content);\r
+ }\r
+ contactsList_->RefreshList();\r
+ container_->Add(contactsList_);\r
+ }\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+PhoneMenuContactsPage::PhoneMenuContactsPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage::PhoneMenuContactsPage");\r
+ g_PhoneMenuContactsPageInstance = this;\r
+}\r
+\r
+PhoneMenuContactsPage::~PhoneMenuContactsPage()\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (image_ != nullptr) {\r
+ delete image_;\r
+ image_ = nullptr;\r
+ }\r
+ if (contactsLabel_ != nullptr) {\r
+ delete contactsLabel_;\r
+ contactsLabel_ = nullptr;\r
+ }\r
+ if (contactsList_ != nullptr) {\r
+ delete contactsList_;\r
+ contactsList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage::~PhoneMenuContactsPage");\r
+}\r
+\r
+bool PhoneMenuContactsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool PhoneMenuContactsPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ PhoneMenuContactsItemView *itemView = dynamic_cast<PhoneMenuContactsItemView *>(&view);\r
+ if (itemView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage::OnClick dynamic_cast view fail");\r
+ return false;\r
+ }\r
+ std::string phoneNumber = itemView->GetContactsPhoneNumber();\r
+ if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_DISCONNECT_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ return true;\r
+ }\r
+ SetMicMute(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMicMute(false);\r
+ if (DialCall((unsigned char *)phoneNumber.c_str(), phoneNumber.size()) != OHOS_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuContactsPage::OnClick DialCall[fail]");\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SaveCurPage();\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuDialPage\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_phonemenu.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuCallerLogModel.h"\r
+#include "phonemenu/PhoneMenuDialPage.h"\r
+\r
+static constexpr uint16_t DIAL_NORMAL_BUTTON_WIDTH = 88;\r
+static constexpr uint16_t DIAL_NORMAL_BUTTON_HEIGHT = 64;\r
+static constexpr uint16_t DIAL_WIDE_BUTTON_WIDTH = 180;\r
+static constexpr uint16_t DIAL_WIDE_BUTTON_HEIGHT = 64;\r
+static constexpr uint16_t FIRST_ROW_COLOR_BUTTON_POS_Y = 115;\r
+static constexpr uint16_t SECOND_ROW_COLOR_BUTTON_POS_Y = 183;\r
+static constexpr uint16_t THIRD_ROW_COLOR_BUTTON_POS_Y = 251;\r
+static constexpr uint16_t FOUR_ROW_COLOR_BUTTON_POS_Y = 319;\r
+static constexpr uint16_t FIRST_COLUMN_COLOR_BUTTON_POS_X = 45;\r
+static constexpr uint16_t SECOND_COLUMN_COLOR_BUTTON_POS_X = 137;\r
+static constexpr uint16_t THIRD_COLUMN_COLOR_BUTTON_POS_X = 229;\r
+static constexpr uint16_t FOUR_COLUMN_COLOR_BUTTON_POS_X = 321;\r
+static constexpr uint16_t NUMBER_LABEL_POS_X = 93;\r
+static constexpr uint16_t NUMBER_LABEL_POS_Y = 53;\r
+static constexpr uint16_t NUMBER_LABEL_WIDTH = 268;\r
+static constexpr uint16_t NUMBER_LABEL_HEIGHT = 48;\r
+static constexpr uint16_t NUMBER_LABEL_FONT_SIZE = 30;\r
+static constexpr uint16_t DIAL_FONT_SIZE = 40;\r
+static constexpr uint16_t DIAL_BUTTON_BORDER_RADIUS = 20;\r
+static constexpr uint16_t BUTTON_BACKGROUND_OPA = 80;\r
+static constexpr char *KEY_0_BUTTON_ID = "key0Button";\r
+static constexpr char *KEY_1_BUTTON_ID = "key1Button";\r
+static constexpr char *KEY_2_BUTTON_ID = "key2Button";\r
+static constexpr char *KEY_3_BUTTON_ID = "key3Button";\r
+static constexpr char *KEY_4_BUTTON_ID = "key4Button";\r
+static constexpr char *KEY_5_BUTTON_ID = "key5Button";\r
+static constexpr char *KEY_6_BUTTON_ID = "key6Bbutton";\r
+static constexpr char *KEY_7_BUTTON_ID = "key7Button";\r
+static constexpr char *KEY_8_BUTTON_ID = "key8Button";\r
+static constexpr char *KEY_9_BUTTON_ID = "key9Button";\r
+static constexpr char *KEY_STAR_BUTTON_ID = "keyStarButton";\r
+static constexpr char *KEY_POUND_BUTTON_ID = "keyPoundButton";\r
+static constexpr char *DELETE_BUTTON_ID = "deleteButton";\r
+static constexpr char *DIAL_BUTTON_ID = "dialButton";\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_DIAL_PAGE, PhoneMenuDialPage, false);\r
+\r
+void PhoneMenuDialPage::OnStart(void *data)\r
+{\r
+ container_ = new UIScrollView();\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage container_ new fail");\r
+ return;\r
+ }\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetOnDragListener(this);\r
+\r
+ dialNumberLabel_ = new UILabel();\r
+ if (dialNumberLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage dialNumberLabel_ new fail");\r
+ return;\r
+ }\r
+ dialNumberLabel_->SetPosition(NUMBER_LABEL_POS_X, NUMBER_LABEL_POS_Y, NUMBER_LABEL_WIDTH, NUMBER_LABEL_HEIGHT);\r
+ dialNumberLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ dialNumberLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, NUMBER_LABEL_FONT_SIZE);\r
+ container_->Add(dialNumberLabel_);\r
+\r
+ key1Button_ = new UILabelButton();\r
+ if (key1Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key1Button_ new fail");\r
+ return;\r
+ }\r
+ key1Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key1Button_->SetViewId(KEY_1_BUTTON_ID);\r
+ key1Button_->SetText("1");\r
+ key1Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key1Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key1Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key1Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key1Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key1Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key1Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key1Button_->SetOnClickListener(this);\r
+ container_->Add(key1Button_);\r
+\r
+ key2Button_ = new UILabelButton();\r
+ if (key2Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key2Button_ new fail");\r
+ return;\r
+ }\r
+ key2Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key2Button_->SetViewId(KEY_2_BUTTON_ID);\r
+ key2Button_->SetText("2");\r
+ key2Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key2Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key2Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key2Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key2Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key2Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key2Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key2Button_->SetOnClickListener(this);\r
+ container_->Add(key2Button_);\r
+\r
+ key3Button_ = new UILabelButton();\r
+ if (key3Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key3Button_ new fail");\r
+ return;\r
+ }\r
+ key3Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key3Button_->SetViewId(KEY_3_BUTTON_ID);\r
+ key3Button_->SetText("3");\r
+ key3Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key3Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key3Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key3Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key3Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key3Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key3Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key3Button_->SetOnClickListener(this);\r
+ container_->Add(key3Button_);\r
+\r
+ deleteButton_ = new UILabelButton();\r
+ if (deleteButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage deleteButton_ new fail");\r
+ return;\r
+ }\r
+ deleteButton_->SetPosition(FOUR_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ deleteButton_->SetViewId(DELETE_BUTTON_ID);\r
+ LOADIMG::LoadBtnImage(deleteButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_DEL, IMAGE_PHONEMENU_DEL);\r
+ deleteButton_->SetOnClickListener(this);\r
+ container_->Add(deleteButton_);\r
+\r
+ key4Button_ = new UILabelButton();\r
+ if (key4Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key4Button_ new fail");\r
+ return;\r
+ }\r
+ key4Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key4Button_->SetViewId(KEY_4_BUTTON_ID);\r
+ key4Button_->SetText("4");\r
+ key4Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key4Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key4Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key4Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key4Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key4Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key4Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key4Button_->SetOnClickListener(this);\r
+ container_->Add(key4Button_);\r
+\r
+ key5Button_ = new UILabelButton();\r
+ if (key5Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key5Button_ new fail");\r
+ return;\r
+ }\r
+ key5Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key5Button_->SetViewId(KEY_5_BUTTON_ID);\r
+ key5Button_->SetText("5");\r
+ key5Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key5Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key5Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key5Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key5Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key5Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key5Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key5Button_->SetOnClickListener(this);\r
+ container_->Add(key5Button_);\r
+\r
+ key6Button_ = new UILabelButton();\r
+ if (key6Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key6Button_ new fail");\r
+ return;\r
+ }\r
+ key6Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key6Button_->SetViewId(KEY_6_BUTTON_ID);\r
+ key6Button_->SetText("6");\r
+ key6Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key6Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key6Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key6Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key6Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key6Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key6Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key6Button_->SetOnClickListener(this);\r
+ container_->Add(key6Button_);\r
+\r
+ keyStarButton_ = new UILabelButton();\r
+ if (keyStarButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage keyStarButton_ new fail");\r
+ return;\r
+ }\r
+ keyStarButton_->SetPosition(FOUR_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ keyStarButton_->SetViewId(KEY_STAR_BUTTON_ID);\r
+ LOADIMG::LoadBtnImage(keyStarButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_STAR_KEY, IMAGE_PHONEMENU_STAR_KEY);\r
+ keyStarButton_->SetOnClickListener(this);\r
+ container_->Add(keyStarButton_);\r
+\r
+ key7Button_ = new UILabelButton();\r
+ if (key7Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key7Button_ new fail");\r
+ return;\r
+ }\r
+ key7Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key7Button_->SetViewId(KEY_7_BUTTON_ID);\r
+ key7Button_->SetText("7");\r
+ key7Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key7Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key7Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key7Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key7Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key7Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key7Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key7Button_->SetOnClickListener(this);\r
+ container_->Add(key7Button_);\r
+\r
+ key8Button_ = new UILabelButton();\r
+ if (key8Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key8Button_ new fail");\r
+ return;\r
+ }\r
+ key8Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key8Button_->SetViewId(KEY_8_BUTTON_ID);\r
+ key8Button_->SetText("8");\r
+ key8Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key8Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key8Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key8Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key8Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key8Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key8Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key8Button_->SetOnClickListener(this);\r
+ container_->Add(key8Button_);\r
+\r
+ key9Button_ = new UILabelButton();\r
+ if (key9Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key9Button_ new fail");\r
+ return;\r
+ }\r
+ key9Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ key9Button_->SetViewId(KEY_9_BUTTON_ID);\r
+ key9Button_->SetText("9");\r
+ key9Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key9Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key9Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key9Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key9Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key9Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key9Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key9Button_->SetOnClickListener(this);\r
+ container_->Add(key9Button_);\r
+\r
+ keyPoundButton_ = new UILabelButton();\r
+ if (keyPoundButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage keyPoundButton_ new fail");\r
+ return;\r
+ }\r
+ keyPoundButton_->SetPosition(FOUR_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, DIAL_NORMAL_BUTTON_WIDTH,\r
+ DIAL_NORMAL_BUTTON_HEIGHT);\r
+ keyPoundButton_->SetViewId(KEY_POUND_BUTTON_ID);\r
+ LOADIMG::LoadBtnImage(keyPoundButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_POUND_KEY, IMAGE_PHONEMENU_POUND_KEY);\r
+ keyPoundButton_->SetOnClickListener(this);\r
+ container_->Add(keyPoundButton_);\r
+\r
+ key0Button_ = new UILabelButton();\r
+ if (key0Button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage key0Button_ new fail");\r
+ return;\r
+ }\r
+ key0Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FOUR_ROW_COLOR_BUTTON_POS_Y, DIAL_WIDE_BUTTON_WIDTH,\r
+ DIAL_WIDE_BUTTON_HEIGHT);\r
+ key0Button_->SetViewId(KEY_0_BUTTON_ID);\r
+ key0Button_->SetText("0");\r
+ key0Button_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DIAL_FONT_SIZE);\r
+ key0Button_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ key0Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ key0Button_->SetStyle(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA);\r
+ key0Button_->SetStyleForState(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS, UIButton::PRESSED);\r
+ key0Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Gray().full, UIButton::PRESSED);\r
+ key0Button_->SetStyleForState(STYLE_BACKGROUND_OPA, BUTTON_BACKGROUND_OPA, UIButton::PRESSED);\r
+ key0Button_->SetOnClickListener(this);\r
+ container_->Add(key0Button_);\r
+\r
+ diagButton_ = new UILabelButton();\r
+ if (diagButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage diagButton_ new fail");\r
+ return;\r
+ }\r
+ diagButton_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FOUR_ROW_COLOR_BUTTON_POS_Y, DIAL_WIDE_BUTTON_WIDTH,\r
+ DIAL_WIDE_BUTTON_HEIGHT);\r
+ diagButton_->SetViewId(DIAL_BUTTON_ID);\r
+ diagButton_->SetStyle(STYLE_BORDER_RADIUS, DIAL_BUTTON_BORDER_RADIUS);\r
+ LOADIMG::LoadBtnImage(diagButton_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_CALL, IMAGE_PHONEMENU_CALL);\r
+ diagButton_->SetOnClickListener(this);\r
+ container_->Add(diagButton_);\r
+\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+PhoneMenuDialPage::PhoneMenuDialPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage::PhoneMenuDialPage");\r
+}\r
+\r
+PhoneMenuDialPage::~PhoneMenuDialPage()\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (dialNumberLabel_ != nullptr) {\r
+ delete dialNumberLabel_;\r
+ dialNumberLabel_ = nullptr;\r
+ }\r
+ if (deleteButton_ != nullptr) {\r
+ delete deleteButton_;\r
+ deleteButton_ = nullptr;\r
+ }\r
+ if (diagButton_ != nullptr) {\r
+ delete diagButton_;\r
+ diagButton_ = nullptr;\r
+ }\r
+ if (keyStarButton_ != nullptr) {\r
+ delete keyStarButton_;\r
+ keyStarButton_ = nullptr;\r
+ }\r
+ if (keyPoundButton_ != nullptr) {\r
+ delete keyPoundButton_;\r
+ keyPoundButton_ = nullptr;\r
+ }\r
+ if (key0Button_ != nullptr) {\r
+ delete key0Button_;\r
+ key0Button_ = nullptr;\r
+ }\r
+ if (key1Button_ != nullptr) {\r
+ delete key1Button_;\r
+ key1Button_ = nullptr;\r
+ }\r
+ if (key2Button_ != nullptr) {\r
+ delete key2Button_;\r
+ key2Button_ = nullptr;\r
+ }\r
+ if (key3Button_ != nullptr) {\r
+ delete key3Button_;\r
+ key3Button_ = nullptr;\r
+ }\r
+ if (key4Button_ != nullptr) {\r
+ delete key4Button_;\r
+ key4Button_ = nullptr;\r
+ }\r
+ if (key5Button_ != nullptr) {\r
+ delete key5Button_;\r
+ key5Button_ = nullptr;\r
+ }\r
+ if (key6Button_ != nullptr) {\r
+ delete key6Button_;\r
+ key6Button_ = nullptr;\r
+ }\r
+ if (key7Button_ != nullptr) {\r
+ delete key7Button_;\r
+ key7Button_ = nullptr;\r
+ }\r
+ if (key8Button_ != nullptr) {\r
+ delete key8Button_;\r
+ key8Button_ = nullptr;\r
+ }\r
+ if (key9Button_ != nullptr) {\r
+ delete key9Button_;\r
+ key9Button_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage::~PhoneMenuDialPage");\r
+}\r
+\r
+bool PhoneMenuDialPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool PhoneMenuDialPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UILabelButton *button = dynamic_cast<UILabelButton *>(&view);\r
+ if (button == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage::OnClick dynamic_cast view fail");\r
+ return false;\r
+ }\r
+ if (strcmp(view.GetViewId(), DELETE_BUTTON_ID) == 0) {\r
+ if (!dialNumber_.empty()) {\r
+ dialNumber_.pop_back();\r
+ dialNumberLabel_->SetText(dialNumber_.c_str());\r
+ dialNumberLabel_->Invalidate();\r
+ }\r
+ } else if (strcmp(view.GetViewId(), DIAL_BUTTON_ID) == 0) {\r
+ if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_DISCONNECT_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ return false;\r
+ }\r
+ SetMicMute(false);\r
+ PhoneMenuCallerLogModel::GetInstance()->SetMicMute(false);\r
+ if (DialCall((unsigned char *)dialNumber_.c_str(), dialNumber_.size()) != OHOS_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDialPage::OnClick DialCall[fail]");\r
+ }\r
+ PhoneMenuCallerLogModel::GetInstance()->SaveCurPage();\r
+ } else {\r
+ if (strcmp(view.GetViewId(), KEY_STAR_BUTTON_ID) == 0) {\r
+ dialNumber_ += "*";\r
+ } else if (strcmp(view.GetViewId(), KEY_POUND_BUTTON_ID) == 0) {\r
+ dialNumber_ += "#";\r
+ } else {\r
+ dialNumber_ += button->GetText();\r
+ }\r
+ dialNumberLabel_->SetText(dialNumber_.c_str());\r
+ dialNumberLabel_->Invalidate();\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuDisconnectPage\r
+ * Create: 2025-07-12\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuDisconnectPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t LABEL_XPOS = 30;\r
+static constexpr uint16_t LABEL_YPOS = 257;\r
+static constexpr uint16_t LABEL_WIDTH = 396;\r
+static constexpr uint16_t LABEL_HEIGHT = 50;\r
+static constexpr uint16_t IMAGE_XPOS = 176;\r
+static constexpr uint16_t IMAGE_YPOS = 115;\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_DISCONNECT_PAGE, PhoneMenuDisconnectPage, false);\r
+\r
+void PhoneMenuDisconnectPage::OnStart(void *data)\r
+{\r
+ container_ = new UIScrollView();\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage container_ new fail");\r
+ return;\r
+ }\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetOnDragListener(this);\r
+\r
+ text_ = new UILabel();\r
+ if (text_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage text_ new fail");\r
+ return;\r
+ }\r
+ text_->SetPosition(LABEL_XPOS, LABEL_YPOS, LABEL_WIDTH, LABEL_HEIGHT);\r
+ text_->SetText("设备未连接,请连接设备!");\r
+ text_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ text_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ container_->Add(text_);\r
+\r
+ image_ = new UIImageView();\r
+ if (image_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage image_ new fail");\r
+ return;\r
+ }\r
+ image_->SetPosition(IMAGE_XPOS, IMAGE_YPOS);\r
+ LOADIMG::LoadImageViewImg(image_, PHONEMENU_IMAGE, IMAGE_PHONEMENU_DISCONNECT);\r
+ container_->Add(image_);\r
+\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+PhoneMenuDisconnectPage::PhoneMenuDisconnectPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage::PhoneMenuDisconnectPage");\r
+}\r
+\r
+PhoneMenuDisconnectPage::~PhoneMenuDisconnectPage()\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (text_ != nullptr) {\r
+ delete text_;\r
+ text_ = nullptr;\r
+ }\r
+ if (image_ != nullptr) {\r
+ delete image_;\r
+ image_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuDisconnectPage::~PhoneMenuDisconnectPage");\r
+}\r
+\r
+bool PhoneMenuDisconnectPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool PhoneMenuDisconnectPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuMainItemView\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "phonemenu/PhoneMenuMainItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_GROUP_X = 0;\r
+static constexpr uint16_t BG_GROUP_Y = 0;\r
+static constexpr uint16_t BG_GROUP_W = 426;\r
+static constexpr uint16_t BG_GROUP_H = 96;\r
+static constexpr uint16_t BG_BACKGROUND_OPA = 80;\r
+static constexpr uint16_t BG_BORDER_RADIUS = 48;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 8;\r
+static constexpr uint16_t LABEL_X = 101;\r
+static constexpr uint16_t LABEL_Y = 22;\r
+static constexpr uint16_t LABEL_W = 150;\r
+static constexpr uint16_t LABEL_H = 53;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+\r
+PhoneMenuMainItemView::PhoneMenuMainItemView()\r
+{\r
+ bg_.SetPosition(BG_GROUP_X, BG_GROUP_Y, BG_GROUP_W, BG_GROUP_H);\r
+ bg_.SetStyle(STYLE_BACKGROUND_OPA, BG_BACKGROUND_OPA);\r
+ bg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ bg_.SetStyle(STYLE_BORDER_RADIUS, BG_BORDER_RADIUS);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+ label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+\r
+ Add(&bg_);\r
+ Add(&icon_);\r
+ Add(&label_);\r
+}\r
+\r
+PhoneMenuMainItemView::~PhoneMenuMainItemView()\r
+{\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+ Remove(&bg_);\r
+}\r
+\r
+void PhoneMenuMainItemView::SetItemInfo(const PhoneMenuItem &itemInfo)\r
+{\r
+ label_.SetText(itemInfo.label);\r
+ LOADIMG::LoadImageViewImg(&icon_, PHONEMENU_IMAGE, itemInfo.iconResId);\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuMainPage\r
+ * Create: 2025-07-12\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_POS_X = 97;\r
+static constexpr uint16_t LABEL_POS_Y = 41;\r
+static constexpr uint16_t LABEL_WIDTH = 260;\r
+static constexpr uint16_t LABEL_HEIGHT = 53;\r
+static constexpr uint16_t LABEL_FONT_SIZE = 40;\r
+static constexpr uint16_t LIST_POS_X = 14;\r
+static constexpr uint16_t LIST_POS_Y = 116;\r
+static constexpr uint16_t LIST_WIDTH = 426;\r
+static constexpr uint16_t LIST_HEIGHT = 330;\r
+static constexpr uint16_t LIST_ITEM_W = 426;\r
+static constexpr uint16_t LIST_ITEM_H = 110;\r
+static constexpr uint16_t CONTAINER_TOP_BLANK_SIZE = 40;\r
+static constexpr uint16_t CONTAINER_BOTTOM_BLANK_SIZE = 100;\r
+\r
+REGIST_SLICE_PAGE(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_MAIN_PAGE, PhoneMenuMainPage, true);\r
+\r
+static PhoneMenuMainPage *g_PhoneMenuMainPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ PhoneMenuMainItemView *item = new PhoneMenuMainItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_PhoneMenuMainPageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ PhoneMenuMainItemView *item = dynamic_cast<PhoneMenuMainItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ PhoneMenuItem *itemInfo = static_cast<PhoneMenuItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+void PhoneMenuMainPage::OnStart(void *data)\r
+{\r
+ container_ = new UIScrollView();\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage container_ new fail");\r
+ return;\r
+ }\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetOnDragListener(this);\r
+ container_->SetScrollBlankSize(CONTAINER_TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+ container_->SetScrollBlankSize(CONTAINER_BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABEL_POS_X, LABEL_POS_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+ titleLabel_->SetText("电话");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE);\r
+ container_->Add(titleLabel_);\r
+\r
+ phoneMenuList_ = new UISimpleList();\r
+ if (phoneMenuList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage phoneMenuList_ new fail");\r
+ return;\r
+ }\r
+ phoneMenuList_->SetPosition(LIST_POS_X, LIST_POS_Y, LIST_WIDTH, LIST_HEIGHT);\r
+ phoneMenuList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ phoneMenuList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ phoneMenuList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+ for (uint8_t i = 0; i < PHOEN_MENU_ITEM_NUM; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&phoneMenu_[i]);\r
+ phoneMenuList_->AddContent(content);\r
+ }\r
+ phoneMenuList_->RefreshList();\r
+ container_->Add(phoneMenuList_);\r
+\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+PhoneMenuMainPage::PhoneMenuMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage::PhoneMenuMainPage");\r
+ g_PhoneMenuMainPageInstance = this;\r
+}\r
+\r
+PhoneMenuMainPage::~PhoneMenuMainPage()\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (phoneMenuList_ != nullptr) {\r
+ delete phoneMenuList_;\r
+ phoneMenuList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuMainPage::~PhoneMenuMainPage");\r
+}\r
+\r
+bool PhoneMenuMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool PhoneMenuMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), PHONE_MENU_ITEM_CONTACTS_BOOKS) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CONTACTS_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), PHONE_MENU_ITEM_RECENT_CALL) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLER_LOG_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), PHONE_MENU_ITEM_DIAL) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_DIAL_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuPresenter\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "phonemenu/PhoneMenuPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_PHONE_MENU, PhoneMenuView, PhoneMenuPresenter, PHONEMENU_ICON, PHONEMENU_ICON, "通话菜单");\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneMenuSync\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "cJSON.h"\r
+#include "wearable_log.h"\r
+#include "phonemenu/PhoneMenuSync.h"\r
+\r
+namespace OHOS {\r
+std::list<Contacts> PhoneMenuSync::list_;\r
+uint32_t PhoneMenuSync::WriteFileContact(const std::string &filePath, std::string &content)\r
+{\r
+ std::ofstream output(filePath);\r
+ if (!output.is_open()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+ return JSON_FILE_OPEN_FAIL;\r
+ }\r
+ output << content;\r
+ output.close();\r
+ return OK;\r
+}\r
+\r
+uint32_t PhoneMenuSync::ReadFileContact(const std::string &filePath)\r
+{\r
+ std::ifstream input(filePath.c_str());\r
+ if (!input.is_open()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+ return JSON_FILE_OPEN_FAIL;\r
+ }\r
+ std::stringstream buffer;\r
+ buffer << input.rdbuf();\r
+ std::string content = buffer.str();\r
+ int intsize = sizeof(content);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMenuSync::PhoneMenuSync [%s]", content.c_str());\r
+ ParseContactsMsg(content);\r
+ PrintContacts();\r
+ return OK;\r
+}\r
+\r
+uint32_t PhoneMenuSync::ParseContactsMsg(std::string &msgContent)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseContactsMsg %s\r\n", msgContent.c_str());\r
+ cJSON *root = cJSON_Parse(msgContent.c_str());\r
+ if (root == NULL) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "parse_contacts_msg cJSON_Parse, fail = %p\r\n", root);\r
+ return JSON_PARSE_FAIL;\r
+ }\r
+ if (!cJSON_IsArray(root)) {\r
+ cJSON_Delete(root);\r
+ return JSON_TYPE_FAIL;\r
+ }\r
+ list_.clear();\r
+ int arraySize = cJSON_GetArraySize(root);\r
+ for (int i = 0; i < arraySize; ++i) {\r
+ cJSON *item = cJSON_GetArrayItem(root, i);\r
+ if (cJSON_IsObject(item)) {\r
+ cJSON *cidJson = cJSON_GetObjectItem(item, "cid");\r
+ cJSON *nameJson = cJSON_GetObjectItem(item, "name");\r
+ cJSON *phoneJson = cJSON_GetObjectItem(item, "phone");\r
+ if (cidJson == nullptr || nameJson == nullptr || phoneJson == nullptr) {\r
+ return JSON_KEY_FAIL;\r
+ }\r
+ Contacts contacts;\r
+ contacts.cid_ = cidJson->valuestring;\r
+ contacts.name_ = nameJson->valuestring;\r
+ contacts.phone_ = phoneJson->valuestring;\r
+ list_.push_back(contacts);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "cid [%s], name [%s], phone [%s]", contacts.cid_.c_str(),\r
+ contacts.name_.c_str(), contacts.phone_.c_str());\r
+ }\r
+ }\r
+ cJSON_Delete(root);\r
+ return OK;\r
+}\r
+\r
+std::list<Contacts> &PhoneMenuSync::GetContacts()\r
+{\r
+ return list_;\r
+}\r
+\r
+uint32_t PhoneMenuSync::PrintContacts()\r
+{\r
+ for (auto &x : list_) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "cid[%s] name[%s] phone[%s]", x.cid_.c_str(), x.name_.c_str(),\r
+ x.phone_.c_str());\r
+ }\r
+ return OK;\r
+}\r
+\r
+uint32_t PhoneMenuSync::LookContacts(std::string &contacts)\r
+{\r
+ cJSON *contactsArrayObj = cJSON_CreateArray();\r
+ if (!contactsArrayObj) {\r
+ return JSON_CREATE_FAIL;\r
+ }\r
+ for (auto &contacts : list_) {\r
+ cJSON *contactsObj = cJSON_CreateObject();\r
+ if (!contactsObj) {\r
+ cJSON_Delete(contactsArrayObj);\r
+ return JSON_CREATE_FAIL;\r
+ }\r
+ cJSON_AddItemToObject(contactsObj, "cid", cJSON_CreateString(contacts.cid_.c_str()));\r
+ cJSON_AddItemToObject(contactsObj, "name", cJSON_CreateString(contacts.name_.c_str()));\r
+ cJSON_AddItemToObject(contactsObj, "phone", cJSON_CreateString(contacts.phone_.c_str()));\r
+ cJSON_AddItemToArray(contactsArrayObj, contactsObj);\r
+ }\r
+ char *jsonStr = cJSON_Print(contactsArrayObj);\r
+ if (!jsonStr) {\r
+ cJSON_Delete(contactsArrayObj);\r
+ return JSON_TO_STRING_FAIL;\r
+ }\r
+ contacts = jsonStr;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_lookup_contacts [%s]", jsonStr);\r
+ cJSON_Delete(contactsArrayObj);\r
+ free(jsonStr);\r
+ jsonStr = nullptr;\r
+ return OK;\r
+}\r
+\r
+uint32_t PhoneMenuSync::CleanFileContacts(const std::string &filePath)\r
+{\r
+ std::ofstream output(filePath);\r
+ if (!output.is_open()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+ return JSON_FILE_OPEN_FAIL;\r
+ }\r
+ output.close();\r
+ list_.clear();\r
+ return OK;\r
+}\r
+}
\ No newline at end of file
if (g_scoFlag != HFP_SCO_STATE_CONNECTED) {
g_scoFlag = HFP_SCO_STATE_CONNECTED;
CopyBdAddr(bdAddr);
- ScoConnectPro();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoStateChanged] SCO connecting!");
+ GraphicService::GetInstance()->PostGraphicEvent([]() {
+ ScoConnectPro();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoStateChanged] SCO connecting!");
+ });
}
break;
case HFP_SCO_STATE_CONNECTED:
{
FILE *fp = fopen(CALL_LOG_PATH, "rb");
if (fp == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AddToCallLog] fopen %s failed!", CALL_LOG_PATH);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[GetCallLog] fopen %s failed!", CALL_LOG_PATH);
return OHOS_FAILURE;
}
break;
case HFP_HF_CALL_STATE_DIALING: // 呼出,正在拨号
PhoneServiceScreenCtr(1);
- CallChangeDialPro(call);
+ GraphicService::GetInstance()->PostGraphicEvent([call]() { CallChangeDialPro(call); });
break;
- case HFP_HF_CALL_STATE_ALERTING: // 呼出,对方响铃
+ case HFP_HF_CALL_STATE_ALERTING: // 呼出,对方响铃
PhoneServiceScreenCtr(1);
- CallChangeAlertPro(call);
+ GraphicService::GetInstance()->PostGraphicEvent([call]() { CallChangeAlertPro(call); });
break;
- case HFP_HF_CALL_STATE_INCOMING: // 呼入
+ case HFP_HF_CALL_STATE_INCOMING: // 呼入
PhoneServiceScreenCtr(1);
- CallChangeIncomePro(call);
+ GraphicService::GetInstance()->PostGraphicEvent([call]() { CallChangeIncomePro(call); });
break;
- case HFP_HF_CALL_STATE_WAITING: // 呼入等待
+ case HFP_HF_CALL_STATE_WAITING: // 呼入等待
PhoneServiceScreenCtr(1);
- CallChangeIncomePro(call);
+ GraphicService::GetInstance()->PostGraphicEvent([call]() { CallChangeIncomePro(call); });
break;
case HFP_HF_CALL_STATE_FINISHED: // 拒接/结束电话
CallChangeFinishPro(call);
} else {
g_currCallState = call.state;
}
-
- if (g_currCallNum == 0) {
- g_completeCallFlag = false;
- }
}
static void CallStateChangedCb(const bd_addr_t *bdAddr, const hfp_hf_calls_info_t *call)
}
if (phoneCall == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AcceptIncomingCall] no incoming");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RejectIncomingCall] no incoming");
return OHOS_SUCCESS;
}
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: Player view\r
- * Author:\r
- * Create: 2021-07-26\r
- */\r
-\r
-#include "player/PlayersModel.h"\r
-#include "thread_adapter.h"\r
-#include "UiConfig.h"\r
-#include "bts_avrcp_controller.h"\r
-#include "bts_avrcp_target.h"\r
-#include "bts_a2dp_source.h"\r
-#include "bluetooth/BluetoothModel.h"\r
-\r
-namespace OHOS {\r
-\r
-static constexpr int VOLUME_MAXIMUM = 100;\r
-static constexpr int VOLUME_MINIMUM = 0;\r
-static constexpr int VOLUME_PER_CHANGE = 10;\r
-\r
-#define BUFFER_SIZE 15\r
-static MutexId g_mutex;\r
-PlayersModel::PlayersModel()\r
-{\r
- g_mutex = MUTEX_InitValue();\r
-}\r
-\r
-PlayersModel::~PlayersModel()\r
-{\r
- listPlayers.Clear();\r
-}\r
-\r
-bool PlayersModel::FetchedPlayersCallBack(PlayersMsg *playersMsg)\r
-{\r
- if (listPlayers.IsEmpty()) {\r
- return false;\r
- } else {\r
- MUTEX_Lock(g_mutex);\r
- *playersMsg = listPlayers.Front();\r
- listPlayers.PopFront();\r
- MUTEX_Unlock(g_mutex);\r
- }\r
- return true;\r
-}\r
-\r
-void PlayersModel::PushPlayersData(PlayersMsg playersMsg)\r
-{\r
- MUTEX_Lock(g_mutex);\r
- listPlayers.PushBack(playersMsg);\r
- MUTEX_Unlock(g_mutex);\r
-}\r
-\r
-PlayersModel *PlayersModel::GetInstance()\r
-{\r
- static PlayersModel instance;\r
- return &instance;\r
-}\r
-\r
-std::string PlayersModel::GetPlayerUri(void)\r
-{\r
- return uri;\r
-}\r
-\r
-void PlayersModel::SetPlayerUri(std::string src)\r
-{\r
- uri = src;\r
-}\r
-\r
-void PlayersModel::SetPlayButtonState(bool value)\r
-{\r
- playButtonState = value;\r
-}\r
-\r
-int PlayersModel::PlayerStat()\r
-{\r
- int32_t ret;\r
-\r
- // 设置回调函数\r
- playerCtr->SetPlayerCallback(playerCallback);\r
- // 申请资源\r
- source = std::make_shared<Source>(uri, header);\r
- if (source.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "source new fail");\r
- return OHOS_FAILURE;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Player uri %s.", uri.c_str());\r
- playerCtr->SetSource(*source);\r
- playerCtr->Prepare();\r
- ret = playerCtr->GetDuration(duration_);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%s,%d] GetDuration:%lld, ret:%d", __func__, __LINE__, duration_, ret);\r
- if (!isActivateAudioInterrupt) {\r
- // 申请焦点\r
- AudioManager& amIntance = AudioManager::GetInstance();\r
- sessionId = amIntance.MakeSessionId();\r
- if (sessionId == AUDIO_SESSION_ID_NONE) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "session invalid");\r
- return OHOS_FAILURE;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MakeSessionId %d", sessionId);\r
- playerInterruptListener = std::make_shared<PlayerInterruptListener>();\r
- if (playerInterruptListener.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerInterruptListener new fail");\r
- return OHOS_FAILURE;\r
- }\r
- playerInterruptListener->SetOwner(playerCtr);\r
- interrupt = {AUDIO_STREAM_MUSIC, sessionId, playerInterruptListener};\r
- // 激活音频中断 5s超时\r
- if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");\r
- return OHOS_FAILURE;\r
- }\r
- isActivateAudioInterrupt = true;\r
- }\r
- playerCtr->SetAudioSessionId(sessionId);\r
- // 播放\r
- ret = playerCtr->Play();\r
- if (ret != 0) {\r
- playerCtr->Stop(); // 暂停\r
- playerCtr->Reset(); // 初始化\r
- PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();\r
- if (playersPresenter != nullptr) {\r
- playersPresenter->PlayerbackReset();\r
- SetCircleProgress(100); // 100:进度100%\r
- playersPresenter->SetPlaybackProgress(circleProgress);\r
- } else {\r
- SetPlayButtonState(false);\r
- SetCircleProgress(100); // 100:进度100%\r
- }\r
- AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);\r
- isActivateAudioInterrupt = false;\r
- }\r
- return OHOS_SUCCESS;\r
-}\r
-\r
-bool PlayersModel::GetAudioInitStatus(void)\r
-{\r
- return audioInitStatus;\r
-}\r
-\r
-void PlayersModel::AudioInit(void)\r
-{\r
- if (audioInitStatus) {\r
- return;\r
- }\r
- AudioManager& amIntance = AudioManager::GetInstance();\r
- audioInitStatus = amIntance.Initialize();\r
- playerCtr = std::make_shared<Player>();\r
- if (playerCtr.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr new fail");\r
- return;\r
- }\r
- playerCallback = std::make_shared<PlayerCallbackImpl>();\r
- if (playerCallback.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCallback new fail");\r
- return;\r
- }\r
-}\r
-\r
-void PlayersModel::SetCircleProgress(int64_t value)\r
-{\r
- circleProgress = value;\r
-}\r
-\r
-int16_t PlayersModel::GetCurrentIndex(void)\r
-{\r
- return currentIndex;\r
-}\r
-\r
-void PlayersModel::SetCurrentIndex(int16_t value)\r
-{\r
- currentIndex = value;\r
-}\r
-\r
-int16_t PlayersModel::GetPlayerModel(void)\r
-{\r
- return playerModel;\r
-}\r
-\r
-void PlayersModel::SetPlayerModel(int16_t value)\r
-{\r
- playerModel = value;\r
-}\r
-\r
-void PlayersModel::SetPlayerModelAddOne(void)\r
-{\r
- playerModel++;\r
-}\r
-\r
-void PlayersModel::PlaySwitching(void)\r
-{\r
- PlayersMsg playersMsg1;\r
- playersMsg1.playerModel = GetPlayerModel();\r
- PushPlayersData(playersMsg1);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlaySwitching playerModel1 %d!!!", GetPlayerModel());\r
- int32_t ret;\r
- PlayersMsg playersMsg;\r
- if (FetchedPlayersCallBack(&playersMsg)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FetchedPlayersCallBack true");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop to play");\r
- switch (playersMsg.playerModel) {\r
- case PlayerModelState::LOOP:\r
- // 循环\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoopingPlayout!!!");\r
- LoopingPlayout();\r
- break;\r
- case PlayerModelState::SEQUENCE:\r
- // 顺序\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SequencePlayout!!!");\r
- SequencePlayout();\r
- break;\r
- case PlayerModelState::REPEATS:\r
- // 重复\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RepeatsPlayout!!!");\r
- ret = PlayersModel::GetInstance()->playerCtr->Stop(); // 停止\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);\r
- ret = PlayersModel::GetInstance()->playerCtr->Reset();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
- PlayersModel::GetInstance()->PlayerStat(); // 播放\r
- break;\r
- case PlayerModelState::RANDOM:\r
- // 随机\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RandomPlayout!!!");\r
- RandomPlayout();\r
- break;\r
- default:\r
- break;\r
- }\r
- }\r
-}\r
-\r
-int PlayersModel::PlayerInit(void)\r
-{\r
- sliceId = PlayersListGroup::GetInstance()->GetCase(currentIndex);\r
- if (sliceId == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCase %d sliceId err !!!", currentIndex);\r
- char strFile[BUFFER_SIZE] = "No music files";\r
- sliceId = strFile;\r
- }\r
- std::string strSongName = sliceId;\r
- std::string pureName = strSongName.substr(0, strSongName.rfind("."));\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerInit, url: %s ", sliceId);\r
- std::string strSrcMusic(APP_MUSIC_PATH);\r
- std::string tempStr("/");\r
- std::string strName = sliceId;\r
- uri = strSrcMusic + tempStr + strName;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerInit end!");\r
- PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();\r
- if (playersPresenter == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerInit playersPresenter GetInstance fail");\r
- return OHOS_FAILURE;\r
- }\r
- playersPresenter->SetTitleSetText(pureName.c_str());\r
- playersPresenter->SetPlaybackProgress(circleProgress);\r
- playersPresenter->SetPlayerState(playButtonState);\r
- return 0;\r
-}\r
-\r
-void PlayersModel::NextSong(int16_t index)\r
-{\r
- SetCurrentIndex(index);\r
- // 播放\r
- sliceId = PlayersListGroup::GetInstance()->GetCase(index);\r
- if (sliceId == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCase %d sliceId err!!!", index);\r
- return;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetCase sliceId %s.", sliceId);\r
- std::string strSrcMusic(APP_MUSIC_PATH);\r
- std::string tempStr("/");\r
- std::string strName = sliceId;\r
- SetPlayerUri(strSrcMusic + tempStr + strName);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uri: %s.", GetPlayerUri().c_str());\r
- std::string strSongName = sliceId;\r
- std::string pureName = strSongName.substr(0, strSongName.rfind("."));\r
- PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();\r
- if (playersPresenter != nullptr) {\r
- playersPresenter->SetTitleSetText(pureName.c_str());\r
- playersPresenter->SetPlaybackProgress(0); // 0:进度0%\r
- }\r
- int32_t ret;\r
- int32_t playerState;\r
- playerCtr->GetPlayerState(playerState);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerState Value %d.", playerState);\r
- if ((playerState == PlayerStates::PLAYER_STARTED) || (playerState == PlayerStates::PLAYER_PLAYBACK_COMPLETE)) {\r
- /* start play */\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "start play, 160.");\r
- ret = playerCtr->Stop(); // 停止\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);\r
- ret = playerCtr->Reset();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
- ret = PlayerStat(); // 播放\r
- if (ret != 0) {\r
- /* stop and exit */\r
- ret = playerCtr->Stop(); // 停止\r
- ret = playerCtr->Reset();\r
- }\r
- } else if (playerState == PlayerStates::PLAYER_PAUSED || (playerState == PlayerStates::PLAYER_IDLE)) {\r
- ret = playerCtr->Reset();\r
- AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);\r
- ClearActivateAudioInterrupt();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
- }\r
-}\r
-\r
-void PlayersModel::LoopingPlayout()\r
-{\r
- int16_t index;\r
- List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
- index = GetCurrentIndex();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoopingPlayout, index %d.", index);\r
- if ((index > playersCaseList.Size() - 1) || (index < 0)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");\r
- SetCurrentIndex(0);\r
- return;\r
- }\r
- if (GetPlayerModel() == PlayerModelState::RANDOM) {\r
- RandomPlayout();\r
- return;\r
- } else {\r
- index++; // 下一曲\r
- }\r
- if (index > playersCaseList.Size() - 1) {\r
- index = 0;\r
- }\r
- NextSong(index);\r
- SetCircleProgress(0); // 0:进度0%\r
-}\r
-\r
-void PlayersModel::SequencePlayout()\r
-{\r
- int16_t index;\r
- List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
- index = GetCurrentIndex();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SequencePlayout, index %d.", index);\r
- if ((index > playersCaseList.Size() - 1) || (index < 0)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");\r
- SetCurrentIndex(0);\r
- return;\r
- }\r
- index++; // 下一曲\r
- if (index > playersCaseList.Size() - 1) {\r
- playerCtr->Stop(); // 暂停\r
- playerCtr->Reset(); // 初始化\r
- PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();\r
- if (playersPresenter != nullptr) {\r
- playersPresenter->PlayerbackReset();\r
- } else {\r
- SetPlayButtonState(false);\r
- }\r
- SetCircleProgress(100); // 100:进度100%\r
- index = playersCaseList.Size() - 1;\r
- }\r
- NextSong(index);\r
-}\r
-\r
-void PlayersModel::RandomPlayout()\r
-{\r
- int16_t random;\r
- int16_t indexMax;\r
- srand((unsigned)time(nullptr));\r
- List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
- indexMax = playersCaseList.Size() - 1;\r
- random = (rand() % (indexMax + 1));\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RANDOM %d.", random);\r
- if ((random > playersCaseList.Size() - 1) || (random < 0)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "random err");\r
- SetCurrentIndex(0);\r
- return;\r
- }\r
- if (GetCurrentIndex() == random) {\r
- random++;\r
- if (random > playersCaseList.Size() - 1) {\r
- random = 0;\r
- }\r
- }\r
- NextSong(random);\r
- SetCircleProgress(0); // 0:进度0%\r
-}\r
-\r
-void PlayersModel::PreviousPlayout()\r
-{\r
- int16_t index;\r
- List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
- index = GetCurrentIndex();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", index);\r
- if ((index > playersCaseList.Size() - 1) || (index < 0)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");\r
- SetCurrentIndex(0);\r
- return;\r
- }\r
- index--; // 上一曲\r
- if (index < 0) {\r
- index = playersCaseList.Size() - 1;\r
- }\r
- NextSong(index);\r
- SetCircleProgress(0); // 0:进度0%\r
-}\r
-\r
-std::shared_ptr<Player> PlayersModel::GetPlayerCtr()\r
-{\r
- return playerCtr;\r
-}\r
-\r
-std::shared_ptr<PlayerInterruptListener> PlayersModel::GetPlayerIntrptListener(void)\r
-{\r
- return playerInterruptListener;\r
-}\r
-\r
-int PlayersModel::GetPlayerState(void)\r
-{\r
- int state;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] GetPlayerState");\r
-\r
- if (playerCtr.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");\r
- return ERR_RET;\r
- }\r
- playerCtr->GetPlayerState(state);\r
- return state;\r
-}\r
-\r
-bool PlayersModel::HasPlayerPlayed(void)\r
-{\r
- int state = GetPlayerState();\r
- if (state == ERR_RET) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get Player State failed!!");\r
- return false;\r
- }\r
- if (state != PlayerStates::PLAYER_STARTED && state != PlayerStates::PLAYER_PAUSED &&\r
- state != PlayerStates::PLAYER_STOPPED && state != PlayerStates::PLAYER_PLAYBACK_COMPLETE) {\r
- if (!isStopAndReset) {\r
- return false;\r
- }\r
- }\r
- return true;\r
-}\r
-\r
-/* 蓝牙连接的音频控制,对按钮属性进行设置 */\r
-void PlayersModel::ConncetBtResetButton()\r
-{\r
- int32_t connCtState = avrcp_ct_get_device_connect_state(BluetoothModel::GetInstance()->GetLastConnedAddr());\r
- int32_t connTgState = avrcp_tg_get_device_connect_state(BluetoothModel::GetInstance()->GetLastConnedAddr());\r
- if (connCtState == PROFILE_STATE_CONNECTED || connTgState == PROFILE_STATE_CONNECTED) {\r
- if (PlayersPresenter::GetInstance() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::GetInstance() == nullptr");\r
- return;\r
- }\r
- PlayersPresenter::GetInstance()->PlayerHeadsetReset();\r
- }\r
-}\r
-\r
-int PlayersModel::PlayerPlay(void)\r
-{\r
- int state;\r
- int ret;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerPlay");\r
-\r
- state = GetPlayerState();\r
- if (state == ERR_RET) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
-\r
- if (playerCtr.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
- if (state == PlayerStates::PLAYER_PAUSED || state == PlayerStates::PLAYER_STOPPED) { // 暂停状态则直接开始\r
- ret = playerCtr->Play();\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Play err, ret:%d", ret);\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
- PlayersModel::GetInstance()->SetPlayButtonState(true); // 播放控件图形同步\r
- ConncetBtResetButton(); // 蓝牙连接的音频控制,对按钮属性进行设置\r
- return NORMAL;\r
- } else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) { // 已经在播放状态则不做操作\r
- return SONG_ALREADY_PLAY;\r
- } else { // 其它情况的处理\r
- ret = PlayersModel::GetInstance()->PlayerStat();\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
- PlayersModel::GetInstance()->SetPlayButtonState(true); // 播放控件图形同步\r
- ConncetBtResetButton();\r
- return NORMAL;\r
- }\r
-}\r
-\r
-int PlayersModel::PlayerPause(void)\r
-{\r
- int state;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerPause");\r
-\r
- state = GetPlayerState();\r
- if (state == ERR_RET) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
-\r
- if (playerCtr.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
- if (state == PlayerStates::PLAYER_PAUSED) { // 暂停状态则不操作\r
- return SONG_ALREADY_PAUSE;\r
- } else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {\r
- int ret = playerCtr->Pause();\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Pause err, ret:%d!!", ret);\r
- return EXECUTE_FUNC_FAILED;\r
- } else {\r
- PlayersModel::GetInstance()->SetPlayButtonState(false);\r
- ConncetBtResetButton();\r
- return NORMAL;\r
- }\r
- } else if (state == PlayerStates::PLAYER_STOPPED) {\r
- return SONG_ALREADY_STOP;\r
- }\r
- return NORMAL;\r
-}\r
-\r
-int PlayersModel::PlayerStop(void)\r
-{\r
- int state;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerStop");\r
- state = GetPlayerState();\r
- if (state == ERR_RET) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
- if (playerCtr.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
- if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {\r
- int ret = playerCtr->Stop();\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Stop err, ret:%d", ret);\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
- ret = playerCtr->Reset();\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);\r
- return EXECUTE_FUNC_FAILED;\r
- } else {\r
- isStopAndReset = true;\r
- PlayersModel::GetInstance()->SetPlayButtonState(false);\r
- PlayersModel::GetInstance()->SetCircleProgress(0);\r
- ConncetBtResetButton();\r
- }\r
- AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);\r
- return NORMAL;\r
- } else if (state == PlayerStates::PLAYER_PAUSED) {\r
- int ret = playerCtr->Reset();\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);\r
- return EXECUTE_FUNC_FAILED;\r
- } else {\r
- PlayersModel::GetInstance()->SetPlayButtonState(false);\r
- PlayersModel::GetInstance()->SetCircleProgress(0);\r
- ConncetBtResetButton();\r
- }\r
- AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);\r
- return NORMAL;\r
- } else if (state == PlayerStates::PLAYER_STOPPED) {\r
- return SONG_ALREADY_STOP;\r
- }\r
- return NORMAL;\r
-}\r
-\r
-int PlayersModel::PreSongOperate(void)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PreSongOperate");\r
-\r
- PlayersModel::GetInstance()->PreviousPlayout();\r
- PlayersModel::GetInstance()->SetPlayButtonState(true);\r
- return NORMAL;\r
-}\r
-\r
-int PlayersModel::NextSongOperate(void)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] NextSongOperate");\r
-\r
- PlayersModel::GetInstance()->LoopingPlayout();\r
- PlayersModel::GetInstance()->SetPlayButtonState(true);\r
- return NORMAL;\r
-}\r
-\r
-int PlayersModel::IncreaseVolume(void) // 不带界面增加音量\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] IncreaseVolume");\r
-\r
- int curSound = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Presound is %d", curSound);\r
- if (curSound > VOLUME_MAXIMUM - VOLUME_PER_CHANGE) {\r
- curSound = VOLUME_MAXIMUM;\r
- } else {\r
- curSound += VOLUME_PER_CHANGE;\r
- }\r
- AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, curSound);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Now music sound is %d", curSound);\r
- return NORMAL;\r
-}\r
-\r
-int PlayersModel::DecreaseVolume(void) // 不带界面减小音量\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] DecreaseVolume");\r
-\r
- int curSound = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Presound is %d", curSound);\r
- if (curSound < VOLUME_MINIMUM + VOLUME_PER_CHANGE) {\r
- curSound = VOLUME_MINIMUM;\r
- } else {\r
- curSound -= VOLUME_PER_CHANGE;\r
- }\r
- AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, curSound);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Now music sound is %d", curSound);\r
- return NORMAL;\r
-}\r
-\r
-int32_t PlayersModel::GetPlayerstatus()\r
-{\r
- int32_t playerState;\r
- if (playerCtr.get() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::GetPlayerstatus playerCtr is nullptr");\r
- return EXECUTE_FUNC_FAILED;\r
- }\r
- playerCtr->GetPlayerState(playerState);\r
-\r
- switch (playerState) {\r
- case PLAYER_STARTED:\r
- playerState = AVRCP_PLAY_STATUS_PLAYING;\r
- break;\r
- case PLAYER_PAUSED:\r
- playerState = AVRCP_PLAY_STATUS_PAUSED;\r
- break;\r
- case PLAYER_STOPPED:\r
- playerState = AVRCP_PLAY_STATUS_STOPPED;\r
- break;\r
- default:\r
- playerState = AVRCP_PLAY_STATUS_STOPPED;\r
- break;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::GetPlayerstatus]status = [%d]", playerState);\r
- return playerState;\r
-}\r
-\r
-void PlayersModel::SetBTMusicPlay(avrcp_key_operation_t notification)\r
-{\r
- int ret;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] SetBTMusicPlay");\r
- if (BluetoothModel::GetInstance()->GetLastConnedAddr() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] GetLastConnedAddr is nullptr");\r
- return;\r
- }\r
- if (notification == AVRCP_KEY_PLAY) {\r
- ret = a2dp_src_start_playing(BluetoothModel::GetInstance()->GetLastConnedAddr()); // 设置耳机的状态为播放\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] A2dpSrcStartPlaying ret:%d", ret);\r
- avrcp_tg_notify_playback_status_changed(PlayersModel::GetInstance()->GetPlayerstatus());\r
- } else if (notification == AVRCP_KEY_PAUSE) {\r
- ret = a2dp_src_suspend_playing(BluetoothModel::GetInstance()->GetLastConnedAddr());\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] A2dpSrcSuspendPlaying ret:%d", ret); // 设置耳机的状态暂停\r
- avrcp_tg_notify_playback_status_changed(PlayersModel::GetInstance()->GetPlayerstatus());\r
- }\r
-}\r
-// 蓝牙连接和本地的音乐播放\r
-int32_t PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState)\r
-{\r
- int ret;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPlay connCtState = %d connTgState = %d", connCtState, connTgState);\r
- avrcp_key_operation_t playNotification = AVRCP_KEY_PLAY;\r
- if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPlay] BT GetPlayerCtr is nullptr ");\r
- return -1;\r
- }\r
- if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {\r
- if (playerState == PlayerStates::PLAYER_PAUSED) {\r
- if (playerInterruptListener->IsInterruptedPaused()) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");\r
- return -1;\r
- }\r
- ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play(); // 暂停后的播放\r
- PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);\r
- } else {\r
- ret = PlayersModel::GetInstance()->PlayerStat(); // 蓝牙连接播放\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnBtAndLocalPlay] BTPlayerStat err, ret:%d", ret);\r
- }\r
- PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);\r
- }\r
- } else {\r
- if (playerState == PlayerStates::PLAYER_PAUSED) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PLAYER_PAUSED play, 122.");\r
- if (playerInterruptListener->IsInterruptedPaused()) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");\r
- return -1;\r
- }\r
- ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play();\r
- } else {\r
- ret = PlayersModel::GetInstance()->PlayerStat(); // 本地播放\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);\r
- }\r
- }\r
- }\r
- return ret;\r
-}\r
-\r
-// 蓝牙连接和本地音乐的暂停\r
-int32_t PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState)\r
-{\r
- int32_t ret = 0;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPause");\r
- avrcp_key_operation_t playNotification = AVRCP_KEY_PAUSE;\r
- if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == BTUNSELECTED, 105.");\r
- if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPause] BT GetPlayerCtr is nullptr");\r
- return -1;\r
- }\r
- ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 蓝牙连接暂停\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BT Music Pause, ret:%d", ret);\r
- PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);\r
- } else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == UNSELECTED, 105.");\r
- ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 本地暂停\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Pause, ret:%d", ret);\r
- }\r
- return ret;\r
-}\r
-\r
-void PlayersModel::ClearActivateAudioInterrupt()\r
-{\r
- isActivateAudioInterrupt = false;\r
-}\r
-\r
-void PlayersModel::GetDuration(int64_t &duration)\r
-{\r
- duration = duration_;\r
-}\r
-\r
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlayersModel
+ * Create: 2025-03-23
+ */
+
+#include "thread_adapter.h"
+#include "UiConfig.h"
+#include "player/PlayersModel.h"
+
+namespace OHOS {
+
+static constexpr int VOLUME_MAXIMUM = 100;
+static constexpr int VOLUME_MINIMUM = 0;
+static constexpr int VOLUME_PER_CHANGE = 10;
+
+#define BUFFER_SIZE 15
+static MutexId g_mutex;
+PlayersModel::PlayersModel()
+{
+ g_mutex = MUTEX_InitValue();
+}
+
+PlayersModel::~PlayersModel()
+{
+ listPlayers.Clear();
+}
+
+bool PlayersModel::FetchedPlayersCallBack(PlayersMsg *playersMsg)
+{
+ if (listPlayers.IsEmpty()) {
+ return false;
+ } else {
+ MUTEX_Lock(g_mutex);
+ *playersMsg = listPlayers.Front();
+ listPlayers.PopFront();
+ MUTEX_Unlock(g_mutex);
+ }
+ return true;
+}
+
+void PlayersModel::PushPlayersData(PlayersMsg playersMsg)
+{
+ MUTEX_Lock(g_mutex);
+ listPlayers.PushBack(playersMsg);
+ MUTEX_Unlock(g_mutex);
+}
+
+PlayersModel *PlayersModel::GetInstance()
+{
+ static PlayersModel instance;
+ return &instance;
+}
+
+std::string PlayersModel::GetPlayerUri(void)
+{
+ return uri;
+}
+
+void PlayersModel::SetPlayerUri(std::string src)
+{
+ uri = src;
+}
+
+void PlayersModel::SetPlayButtonState(bool value)
+{
+ playButtonState = value;
+}
+
+int PlayersModel::PlayerStat()
+{
+ int32_t ret;
+
+ // 设置回调函数
+ playerCtr->SetPlayerCallback(playerCallback);
+ // 申请资源
+ source = std::make_shared<Source>(uri, header);
+ if (source.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "source new fail");
+ return OHOS_FAILURE;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Player uri %s.", uri.c_str());
+ playerCtr->SetSource(*source);
+ playerCtr->Prepare();
+ ret = playerCtr->GetDuration(duration_);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%s,%d] GetDuration:%lld, ret:%d", __func__, __LINE__, duration_, ret);
+ if (!isActivateAudioInterrupt) {
+ // 申请焦点
+ AudioManager& amIntance = AudioManager::GetInstance();
+ sessionId = amIntance.MakeSessionId();
+ if (sessionId == AUDIO_SESSION_ID_NONE) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "session invalid");
+ return OHOS_FAILURE;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MakeSessionId %d", sessionId);
+ playerInterruptListener = std::make_shared<PlayerInterruptListener>();
+ if (playerInterruptListener.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerInterruptListener new fail");
+ return OHOS_FAILURE;
+ }
+ playerInterruptListener->SetOwner(playerCtr);
+ interrupt = {AUDIO_STREAM_MUSIC, sessionId, playerInterruptListener};
+ // 激活音频中断 5s超时
+ if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");
+ return OHOS_FAILURE;
+ }
+ isActivateAudioInterrupt = true;
+ }
+ playerCtr->SetAudioSessionId(sessionId);
+ // 播放
+ ret = playerCtr->Play();
+ if (ret != 0) {
+ playerCtr->Stop(); // 暂停
+ playerCtr->Reset(); // 初始化
+
+ PlayersView *playersView = PlayersView::GetInstance();
+ if (playersView != nullptr) {
+ playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
+ SetCircleProgress(100); // 100:进度100%
+ playersView->SetPlaybackProgress(circleProgress);
+ } else {
+ SetPlayButtonState(false);
+ SetCircleProgress(100); // 100:进度100%
+ }
+ AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+ isActivateAudioInterrupt = false;
+ }
+ return OHOS_SUCCESS;
+}
+
+bool PlayersModel::GetAudioInitStatus(void)
+{
+ return audioInitStatus;
+}
+
+void PlayersModel::AudioInit(void)
+{
+ if (audioInitStatus) {
+ return;
+ }
+ AudioManager& amIntance = AudioManager::GetInstance();
+ audioInitStatus = amIntance.Initialize();
+ playerCtr = std::make_shared<Player>();
+ if (playerCtr.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr new fail");
+ return;
+ }
+ playerCallback = std::make_shared<PlayerCallbackImpl>();
+ if (playerCallback.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCallback new fail");
+ return;
+ }
+}
+
+void PlayersModel::SetCircleProgress(int64_t value)
+{
+ circleProgress = value;
+}
+
+int16_t PlayersModel::GetCurrentIndex(void)
+{
+ return currentIndex;
+}
+
+void PlayersModel::SetCurrentIndex(int16_t value)
+{
+ currentIndex = value;
+}
+
+int16_t PlayersModel::GetPlayerModel(void)
+{
+ return playerModel;
+}
+
+void PlayersModel::SetPlayerModel(int16_t value)
+{
+ playerModel = value;
+}
+
+void PlayersModel::SetPlayerModelAddOne(void)
+{
+ playerModel++;
+}
+
+void PlayersModel::PlaySwitching(void)
+{
+ PlayersMsg playersMsg1;
+ playersMsg1.playerModel = GetPlayerModel();
+ PushPlayersData(playersMsg1);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlaySwitching playerModel1 %d!!!", GetPlayerModel());
+ int32_t ret;
+ PlayersMsg playersMsg;
+ if (FetchedPlayersCallBack(&playersMsg)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FetchedPlayersCallBack true");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop to play");
+ switch (playersMsg.playerModel) {
+ case PlayerModelState::LOOP:
+ // 循环
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoopingPlayout!!!");
+ LoopingPlayout();
+ break;
+ case PlayerModelState::SEQUENCE:
+ // 顺序
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SequencePlayout!!!");
+ SequencePlayout();
+ break;
+ case PlayerModelState::REPEATS:
+ // 重复
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RepeatsPlayout!!!");
+ ret = PlayersModel::GetInstance()->playerCtr->Stop(); // 停止
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);
+ ret = PlayersModel::GetInstance()->playerCtr->Reset();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+ PlayersModel::GetInstance()->PlayerStat(); // 播放
+ break;
+ case PlayerModelState::RANDOM:
+ // 随机
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RandomPlayout!!!");
+ RandomPlayout();
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+int PlayersModel::PlayerInit(void)
+{
+ sliceId = PlayersListGroup::GetInstance()->GetCase(currentIndex);
+ if (sliceId == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCase %d sliceId err !!!", currentIndex);
+ char strFile[BUFFER_SIZE] = "No music files";
+ sliceId = strFile;
+ }
+ std::string strSongName = sliceId;
+ std::string pureName = strSongName.substr(0, strSongName.rfind("."));
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerInit, url: %s ", sliceId);
+ std::string strSrcMusic(APP_MUSIC_PATH);
+ std::string tempStr("/");
+ std::string strName = sliceId;
+ uri = strSrcMusic + tempStr + strName;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerInit end!");
+ PlayersView *playersView = PlayersView::GetInstance();
+ if (playersView == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerInit playersView GetInstance fail");
+ return OHOS_FAILURE;
+ }
+ playersView->TitleSetText(pureName.c_str());
+ playersView->SetPlaybackProgress(circleProgress);
+ playersView->SetPlayerState(playButtonState);
+ return 0;
+}
+
+void PlayersModel::NextSong(int16_t index)
+{
+ SetCurrentIndex(index);
+ // 播放
+ sliceId = PlayersListGroup::GetInstance()->GetCase(index);
+ if (sliceId == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCase %d sliceId err!!!", index);
+ return;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetCase sliceId %s.", sliceId);
+ std::string strSrcMusic(APP_MUSIC_PATH);
+ std::string tempStr("/");
+ std::string strName = sliceId;
+ SetPlayerUri(strSrcMusic + tempStr + strName);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uri: %s.", GetPlayerUri().c_str());
+ std::string strSongName = sliceId;
+ std::string pureName = strSongName.substr(0, strSongName.rfind("."));
+ PlayersView *playersView = PlayersView::GetInstance();
+ if (playersView != nullptr) {
+ playersView->TitleSetText(pureName.c_str());
+ playersView->SetPlaybackProgress(0); // 0:进度0%
+ }
+ int32_t ret;
+ int32_t playerState;
+ playerCtr->GetPlayerState(playerState);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerState Value %d.", playerState);
+ if ((playerState == PlayerStates::PLAYER_STARTED) || (playerState == PlayerStates::PLAYER_PLAYBACK_COMPLETE)) {
+ /* start play */
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "start play, 160.");
+ ret = playerCtr->Stop(); // 停止
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);
+ ret = playerCtr->Reset();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+ ret = PlayerStat(); // 播放
+ if (ret != 0) {
+ /* stop and exit */
+ ret = playerCtr->Stop(); // 停止
+ ret = playerCtr->Reset();
+ }
+ } else if (playerState == PlayerStates::PLAYER_PAUSED || (playerState == PlayerStates::PLAYER_IDLE)) {
+ ret = playerCtr->Reset();
+ AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+ ClearActivateAudioInterrupt();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+ }
+}
+
+void PlayersModel::LoopingPlayout()
+{
+ int16_t index;
+ List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();
+ index = GetCurrentIndex();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoopingPlayout, index %d.", index);
+ if ((index > playersCaseList.Size() - 1) || (index < 0)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
+ SetCurrentIndex(0);
+ return;
+ }
+ if (GetPlayerModel() == PlayerModelState::RANDOM) {
+ RandomPlayout();
+ return;
+ } else {
+ index++; // 下一曲
+ }
+ if (index > playersCaseList.Size() - 1) {
+ index = 0;
+ }
+ NextSong(index);
+ SetCircleProgress(0); // 0:进度0%
+}
+
+void PlayersModel::SequencePlayout()
+{
+ int16_t index;
+ List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();
+ index = GetCurrentIndex();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SequencePlayout, index %d.", index);
+ if ((index > playersCaseList.Size() - 1) || (index < 0)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
+ SetCurrentIndex(0);
+ return;
+ }
+ index++; // 下一曲
+ if (index > playersCaseList.Size() - 1) {
+ playerCtr->Stop(); // 暂停
+ playerCtr->Reset(); // 初始化
+ PlayersView *playersView = PlayersView::GetInstance();
+ if (playersView != nullptr) {
+ playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
+ } else {
+ SetPlayButtonState(false);
+ }
+ SetCircleProgress(100); // 100:进度100%
+ index = playersCaseList.Size() - 1;
+ }
+ NextSong(index);
+}
+
+void PlayersModel::RandomPlayout()
+{
+ int16_t random;
+ int16_t indexMax;
+ srand((unsigned)time(nullptr));
+ List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();
+ indexMax = playersCaseList.Size() - 1;
+ random = (rand() % (indexMax + 1));
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RANDOM %d.", random);
+ if ((random > playersCaseList.Size() - 1) || (random < 0)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "random err");
+ SetCurrentIndex(0);
+ return;
+ }
+ if (GetCurrentIndex() == random) {
+ random++;
+ if (random > playersCaseList.Size() - 1) {
+ random = 0;
+ }
+ }
+ NextSong(random);
+ SetCircleProgress(0); // 0:进度0%
+}
+
+void PlayersModel::PreviousPlayout()
+{
+ int16_t index;
+ List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();
+ index = GetCurrentIndex();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", index);
+ if ((index > playersCaseList.Size() - 1) || (index < 0)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
+ SetCurrentIndex(0);
+ return;
+ }
+ index--; // 上一曲
+ if (index < 0) {
+ index = playersCaseList.Size() - 1;
+ }
+ NextSong(index);
+ SetCircleProgress(0); // 0:进度0%
+}
+
+std::shared_ptr<Player> PlayersModel::GetPlayerCtr()
+{
+ return playerCtr;
+}
+
+std::shared_ptr<PlayerInterruptListener> PlayersModel::GetPlayerIntrptListener(void)
+{
+ return playerInterruptListener;
+}
+
+int PlayersModel::GetPlayerState(void)
+{
+ int state;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] GetPlayerState");
+
+ if (playerCtr.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+ return ERR_RET;
+ }
+ playerCtr->GetPlayerState(state);
+ return state;
+}
+
+bool PlayersModel::HasPlayerPlayed(void)
+{
+ int state = GetPlayerState();
+ if (state == ERR_RET) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get Player State failed!!");
+ return false;
+ }
+ if (state != PlayerStates::PLAYER_STARTED && state != PlayerStates::PLAYER_PAUSED &&
+ state != PlayerStates::PLAYER_STOPPED && state != PlayerStates::PLAYER_PLAYBACK_COMPLETE) {
+ if (!isStopAndReset) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/* 蓝牙连接的音频控制,对按钮属性进行设置 */
+void PlayersModel::ConncetBtResetButton()
+{
+ int32_t connCtState = avrcp_ct_get_device_connect_state(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+ int32_t connTgState = avrcp_tg_get_device_connect_state(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+ if (connCtState == PROFILE_STATE_CONNECTED || connTgState == PROFILE_STATE_CONNECTED) {
+ if (PlayersView::GetInstance() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::GetInstance() == nullptr");
+ return;
+ }
+ PlayersView::GetInstance()->PlayerHeadsetReset();
+ }
+}
+
+int PlayersModel::PlayerPlay(void)
+{
+ int state;
+ int ret;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerPlay");
+
+ state = GetPlayerState();
+ if (state == ERR_RET) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");
+ return EXECUTE_FUNC_FAILED;
+ }
+
+ if (playerCtr.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+ return EXECUTE_FUNC_FAILED;
+ }
+ if (state == PlayerStates::PLAYER_PAUSED || state == PlayerStates::PLAYER_STOPPED) { // 暂停状态则直接开始
+ if (playerInterruptListener->IsInterruptedPaused()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");
+ return EXECUTE_FUNC_FAILED;
+ }
+ ret = playerCtr->Play();
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Play err, ret:%d", ret);
+ return EXECUTE_FUNC_FAILED;
+ }
+ PlayersModel::GetInstance()->SetPlayButtonState(true); // 播放控件图形同步
+ ConncetBtResetButton(); // 蓝牙连接的音频控制,对按钮属性进行设置
+ return NORMAL;
+ } else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) { // 已经在播放状态则不做操作
+ return SONG_ALREADY_PLAY;
+ } else { // 其它情况的处理
+ ret = PlayersModel::GetInstance()->PlayerStat();
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);
+ return EXECUTE_FUNC_FAILED;
+ }
+ PlayersModel::GetInstance()->SetPlayButtonState(true); // 播放控件图形同步
+ ConncetBtResetButton();
+ return NORMAL;
+ }
+}
+
+int PlayersModel::PlayerPause(void)
+{
+ int state;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerPause");
+
+ state = GetPlayerState();
+ if (state == ERR_RET) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");
+ return EXECUTE_FUNC_FAILED;
+ }
+
+ if (playerCtr.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+ return EXECUTE_FUNC_FAILED;
+ }
+ if (state == PlayerStates::PLAYER_PAUSED) { // 暂停状态则不操作
+ return SONG_ALREADY_PAUSE;
+ } else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {
+ int ret = playerCtr->Pause();
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Pause err, ret:%d!!", ret);
+ return EXECUTE_FUNC_FAILED;
+ } else {
+ PlayersModel::GetInstance()->SetPlayButtonState(false);
+ ConncetBtResetButton();
+ return NORMAL;
+ }
+ } else if (state == PlayerStates::PLAYER_STOPPED) {
+ return SONG_ALREADY_STOP;
+ }
+ return NORMAL;
+}
+
+int PlayersModel::PlayerStop(void)
+{
+ int state;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PlayerStop");
+ state = GetPlayerState();
+ if (state == ERR_RET) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");
+ return EXECUTE_FUNC_FAILED;
+ }
+ if (playerCtr.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+ return EXECUTE_FUNC_FAILED;
+ }
+ if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {
+ int ret = playerCtr->Stop();
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Stop err, ret:%d", ret);
+ return EXECUTE_FUNC_FAILED;
+ }
+ ret = playerCtr->Reset();
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);
+ return EXECUTE_FUNC_FAILED;
+ } else {
+ isStopAndReset = true;
+ PlayersModel::GetInstance()->SetPlayButtonState(false);
+ PlayersModel::GetInstance()->SetCircleProgress(0);
+ ConncetBtResetButton();
+ }
+ AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+ return NORMAL;
+ } else if (state == PlayerStates::PLAYER_PAUSED) {
+ int ret = playerCtr->Reset();
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);
+ return EXECUTE_FUNC_FAILED;
+ } else {
+ PlayersModel::GetInstance()->SetPlayButtonState(false);
+ PlayersModel::GetInstance()->SetCircleProgress(0);
+ ConncetBtResetButton();
+ }
+ AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+ return NORMAL;
+ } else if (state == PlayerStates::PLAYER_STOPPED) {
+ return SONG_ALREADY_STOP;
+ }
+ return NORMAL;
+}
+
+int PlayersModel::PreSongOperate(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] PreSongOperate");
+
+ PlayersModel::GetInstance()->PreviousPlayout();
+ PlayersModel::GetInstance()->SetPlayButtonState(true);
+ return NORMAL;
+}
+
+int PlayersModel::NextSongOperate(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] NextSongOperate");
+
+ PlayersModel::GetInstance()->LoopingPlayout();
+ PlayersModel::GetInstance()->SetPlayButtonState(true);
+ return NORMAL;
+}
+
+int PlayersModel::IncreaseVolume(void) // 不带界面增加音量
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] IncreaseVolume");
+
+ int curSound = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Presound is %d", curSound);
+ if (curSound > VOLUME_MAXIMUM - VOLUME_PER_CHANGE) {
+ curSound = VOLUME_MAXIMUM;
+ } else {
+ curSound += VOLUME_PER_CHANGE;
+ }
+ AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, curSound);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Now music sound is %d", curSound);
+ return NORMAL;
+}
+
+int PlayersModel::DecreaseVolume(void) // 不带界面减小音量
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayersModel] DecreaseVolume");
+
+ int curSound = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Presound is %d", curSound);
+ if (curSound < VOLUME_MINIMUM + VOLUME_PER_CHANGE) {
+ curSound = VOLUME_MINIMUM;
+ } else {
+ curSound -= VOLUME_PER_CHANGE;
+ }
+ AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, curSound);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Now music sound is %d", curSound);
+ return NORMAL;
+}
+
+int32_t PlayersModel::GetPlayerstatus()
+{
+ int32_t playerState;
+ if (playerCtr.get() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::GetPlayerstatus playerCtr is nullptr");
+ return EXECUTE_FUNC_FAILED;
+ }
+ playerCtr->GetPlayerState(playerState);
+
+ switch (playerState) {
+ case PLAYER_STARTED:
+ playerState = AVRCP_PLAY_STATUS_PLAYING;
+ break;
+ case PLAYER_PAUSED:
+ playerState = AVRCP_PLAY_STATUS_PAUSED;
+ break;
+ case PLAYER_STOPPED:
+ playerState = AVRCP_PLAY_STATUS_STOPPED;
+ break;
+ default:
+ playerState = AVRCP_PLAY_STATUS_STOPPED;
+ break;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::GetPlayerstatus]status = [%d]", playerState);
+ return playerState;
+}
+
+void PlayersModel::SetBTMusicPlay(avrcp_key_operation_t notification)
+{
+ int ret;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] SetBTMusicPlay");
+ if (SettingBluetoothModel::GetInstance()->GetLastConnedAddr() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] GetLastConnedAddr is nullptr");
+ return;
+ }
+ if (notification == AVRCP_KEY_PLAY) {
+ ret = a2dp_src_start_playing(SettingBluetoothModel::GetInstance()->GetLastConnedAddr()); // 设置耳机的状态为播放
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] A2dpSrcStartPlaying ret:%d", ret);
+ avrcp_tg_notify_playback_status_changed(PlayersModel::GetInstance()->GetPlayerstatus());
+ } else if (notification == AVRCP_KEY_PAUSE) {
+ ret = a2dp_src_suspend_playing(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel::SetBTMusicPlay] A2dpSrcSuspendPlaying ret:%d", ret); // 设置耳机的状态暂停
+ avrcp_tg_notify_playback_status_changed(PlayersModel::GetInstance()->GetPlayerstatus());
+ }
+}
+// 蓝牙连接和本地的音乐播放
+int32_t PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState)
+{
+ int ret;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPlay connCtState = %d connTgState = %d", connCtState, connTgState);
+ avrcp_key_operation_t playNotification = AVRCP_KEY_PLAY;
+ if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPlay] BT GetPlayerCtr is nullptr ");
+ return -1;
+ }
+ if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {
+ if (playerState == PlayerStates::PLAYER_PAUSED) {
+ if (playerInterruptListener->IsInterruptedPaused()) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");
+ return -1;
+ }
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play(); // 暂停后的播放
+ PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);
+ } else {
+ ret = PlayersModel::GetInstance()->PlayerStat(); // 蓝牙连接播放
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnBtAndLocalPlay] BTPlayerStat err, ret:%d", ret);
+ }
+ PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);
+ }
+ } else {
+ if (playerState == PlayerStates::PLAYER_PAUSED) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PLAYER_PAUSED play, 122.");
+ if (playerInterruptListener->IsInterruptedPaused()) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");
+ return -1;
+ }
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play();
+ } else {
+ ret = PlayersModel::GetInstance()->PlayerStat(); // 本地播放
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);
+ }
+ }
+ }
+ return ret;
+}
+
+// 蓝牙连接和本地音乐的暂停
+int32_t PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState)
+{
+ int32_t ret = 0;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPause");
+ avrcp_key_operation_t playNotification = AVRCP_KEY_PAUSE;
+ if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == BTUNSELECTED, 105.");
+ if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPause] BT GetPlayerCtr is nullptr");
+ return -1;
+ }
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 蓝牙连接暂停
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BT Music Pause, ret:%d", ret);
+ PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);
+ } else {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == UNSELECTED, 105.");
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 本地暂停
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Pause, ret:%d", ret);
+ }
+ return ret;
+}
+
+void PlayersModel::ClearActivateAudioInterrupt()
+{
+ isActivateAudioInterrupt = false;
+}
+
+void PlayersModel::GetDuration(int64_t &duration)
+{
+ duration = duration_;
+}
+
}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersMusicItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "wearable_log.h"\r
+#include "player/PlayersMusicItemView.h"\r
+\r
+namespace OHOS {\r
+constexpr uint16_t STYLE_BORDER_WIDTH_VALUE = 4;\r
+constexpr uint16_t STYLE_BORDER_RADIUS_VALUE = 12;\r
+constexpr uint16_t LABEL_BUTTON_HEIGHT = 64;\r
+static constexpr uint32 BUTTON_STYLE_BACKGROUND_COLOR_VALUE = 0xFF333333;\r
+PlayersMusicItemView::PlayersMusicItemView()\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PlayersMusicItemView");\r
+ labelButton_.SetPosition(0, 0);\r
+ labelButton_.Resize(HORIZONTAL_RESOLUTION, LABEL_BUTTON_HEIGHT);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::RELEASED);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::PRESSED);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::INACTIVE);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::RELEASED);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::PRESSED);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::INACTIVE);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_RADIUS, STYLE_BORDER_RADIUS_VALUE, UIButton::RELEASED);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_RADIUS, STYLE_BORDER_RADIUS_VALUE, UIButton::PRESSED);\r
+ labelButton_.SetStyleForState(STYLE_BORDER_RADIUS, STYLE_BORDER_RADIUS_VALUE, UIButton::INACTIVE);\r
+ labelButton_.SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::RELEASED);\r
+ labelButton_.SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::PRESSED);\r
+ labelButton_.SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::INACTIVE);\r
+ labelButton_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 24); // 24: means font size\r
+ labelButton_.SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ labelButton_.SetLabelPosition(24, 0); // 24: lable x-coordinate\r
+ Add(&labelButton_);\r
+}\r
+\r
+PlayersMusicItemView::~PlayersMusicItemView()\r
+{\r
+ Remove(&labelButton_);\r
+}\r
+\r
+void PlayersMusicItemView::SetItemInfo(const PlayerCaseInfo itemInfo)\r
+{\r
+ itemInfo_ = itemInfo;\r
+ std::string strSongName = itemInfo.sliceId;\r
+ std::string pureName = strSongName.substr(0, strSongName.rfind("."));\r
+ labelButton_.SetText(pureName.c_str());\r
+ labelButton_.SetViewIndex(itemInfo.index);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "pureName.c_str(%s)", pureName.c_str());\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "pureName.index(%d)", itemInfo.index);\r
+}\r
+\r
+PlayerCaseInfo PlayersMusicItemView::GetItem()\r
+{\r
+ return itemInfo_;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersMusicListGroup\r
+ * Created: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <sys/types.h>\r
+#include <dirent.h>\r
+#include <iostream>\r
+#include <cstdlib>\r
+#include <ctime>\r
+#include <unistd.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_image.h"\r
+#include "graphic_service.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "player/PlayersModel.h"\r
+#include "player/PlayersMusicListGroup.h"\r
+#include "bts_avrcp_controller.h"\r
+#include "bts_avrcp_target.h"\r
+#include "player/PlayersMusicItemView.h"\r
+#include "player/PlayersMusicListGroup.h"\r
+\r
+namespace OHOS {\r
+constexpr uint16_t ITEM_HEIGHT = 64;\r
+static PlayersMusicListGroup* g_pPlayersMusicListGroup = nullptr;\r
+\r
+PlayersMusicListGroup::PlayersMusicListGroup()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersMusicListGroup::PlayersMusicListGroup");\r
+ g_pPlayersMusicListGroup = this;\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ SetDraggable(true);\r
+ SetTouchable(true);\r
+ SetOnClickListener(this);\r
+ SetOnDragListener(this);\r
+ musicList_ = new UISimpleList();\r
+ if (musicList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "list new fail");\r
+ return;\r
+ }\r
+ musicList_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ musicList_->SetDraggable(true);\r
+ musicList_->SetTouchable(true);\r
+ musicList_->SetThrowDrag(true);\r
+ musicList_->SetOnDragListener(this);\r
+ musicList_->SetOnClickListener(this);\r
+ musicList_->SetStartIndex(0);\r
+ RefreshMusicList();\r
+ musicList_->Invalidate();\r
+ Add(musicList_);\r
+}\r
+\r
+PlayersMusicListGroup* PlayersMusicListGroup::GetInstance(void)\r
+{\r
+ return g_pPlayersMusicListGroup;\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+ PlayersMusicItemView* item = new PlayersMusicItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0);\r
+ item->Resize(HORIZONTAL_RESOLUTION, ITEM_HEIGHT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_pPlayersMusicListGroup);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ PlayersMusicItemView* item = dynamic_cast<PlayersMusicItemView*>(view);\r
+ if (view == nullptr || data == nullptr || item == nullptr) {\r
+ return;\r
+ }\r
+ PlayerCaseInfo* content = static_cast<PlayerCaseInfo *>(data);\r
+ item->SetItemInfo(*content);\r
+}\r
+\r
+void PlayersMusicListGroup::RefreshMusicList()\r
+{\r
+ List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
+ int size = playersCaseList.Size();\r
+\r
+ musicList_->ClearAll();\r
+ musicList_->ScrollTo(0);\r
+ ListNode<PlayerCaseInfo> *node = playersCaseList.Head();\r
+ while (node != playersCaseList.End()) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ PlayerCaseInfo &itemData = node->data_;\r
+ content.data = reinterpret_cast<void *>(&itemData);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "PlayerCaseInfo.itemData(%s)", itemData.sliceId);\r
+ musicList_->AddContent(content);\r
+ node = node->next_;\r
+ }\r
+ musicList_->RefreshList();\r
+}\r
+\r
+PlayersMusicListGroup::~PlayersMusicListGroup()\r
+{\r
+ RemoveAll();\r
+ if (musicList_ != nullptr) {\r
+ musicList_->ClearAll();\r
+ delete musicList_;\r
+ musicList_ = nullptr;\r
+ }\r
+ g_pPlayersMusicListGroup = nullptr;\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(PLAYER_IAMGES);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersMusicListGroup::~PlayersMusicListGroup");\r
+}\r
+\r
+void PlayersMusicListGroup::BtnOnListData(UIView& view)\r
+{\r
+ index_ = view.GetViewIndex();\r
+ List<PlayerCaseInfo> &playersCaseList = PlayersListGroup::GetInstance()->GetCase();\r
+ ListNode<PlayerCaseInfo>* node = playersCaseList.Begin();\r
+ for (uint16_t i = 0; i < index_; i++) {\r
+ node = node->next_;\r
+ }\r
+ sliceId_ = node->data_.sliceId;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "pureName.index_(%d)", index_);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "pureName.sliceId(%s)", sliceId_);\r
+}\r
+\r
+bool PlayersMusicListGroup::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ int ret;\r
+ int32_t playerState;\r
+ uint8_t state = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;\r
+ PlayersView *playersView = PlayersView::GetInstance();\r
+ if (playersView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView null!");\r
+ return false;\r
+ }\r
+ BtnOnListData(view);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtnOnClickListListener sliceId_: %s.", sliceId_);\r
+ // 标记当前播放歌曲index_\r
+ PlayersModel::GetInstance()->SetCurrentIndex(index_);\r
+ // 本地播放文件路径和状态\r
+ std::string strSrcMusic(APP_MUSIC_PATH);\r
+ std::string tempStr("/");\r
+ std::string strName = sliceId_;\r
+ PlayersModel::GetInstance()->SetPlayerUri(strSrcMusic + tempStr + strName);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uri: %s.", PlayersModel::GetInstance()->GetPlayerUri().c_str());\r
+ std::string strSongName = sliceId_;\r
+ std::string pureName = strSongName.substr(0, strSongName.rfind("."));\r
+ playersView->TitleSetText(pureName.c_str());\r
+ SetVisible(false);\r
+ // 刷新UI\r
+ RootView::GetInstance()->Invalidate();\r
+\r
+ state = playersView->GetPlayerButtonState();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state %d", state);\r
+ if (state == UICheckBox::UICheckBoxState::UNSELECTED) {\r
+ playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);\r
+ /* start play */\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "play");\r
+ PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);\r
+ if (playerState == PlayerStates::PLAYER_PAUSED) {\r
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Reset();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
+ }\r
+ PlayersModel::GetInstance()->PlayerStat(); // 播放\r
+ } else if (state == UICheckBox::UICheckBoxState::SELECTED) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "List to play");\r
+ PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);\r
+ if (playerState == PlayerStates::PLAYER_STARTED) {\r
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Stop(); // 停止\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);\r
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Reset();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
+ }\r
+ PlayersModel::GetInstance()->PlayerStat();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool PlayersMusicListGroup::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ SetVisible(false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PlayersOptionGroup\r
+ * Created: 2025-06\r
+ */\r
+\r
+#include <string>\r
+#include <sys/types.h>\r
+#include <dirent.h>\r
+#include <iostream>\r
+#include <cstdlib>\r
+#include <ctime>\r
+#include <unistd.h>\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_image.h"\r
+#include "graphic_service.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "phonemenu/PhoneMenuView.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "player/PlayersModel.h"\r
+#include "bts_avrcp_controller.h"\r
+#include "bts_avrcp_target.h"\r
+#include "player/PlayersOptionGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t BUTTON_X = 320;\r
+static constexpr int16_t BUTTON_X2 = 313;\r
+static constexpr int16_t WATCH_BUTTON_Y = 104;\r
+static constexpr int16_t PHONE_BUTTON_Y = 194;\r
+static constexpr int16_t BLUETOOTH_BUTTON_Y = 278;\r
+static constexpr int16_t BUTTON_SIZE = 55;\r
+static constexpr int16_t LABEL_WIDTH = 155;\r
+static constexpr int16_t LABEL_HEIGHT = 40;\r
+static constexpr int16_t LABEL_X = 155;\r
+static constexpr int16_t WATCH_LABEL_Y = 108;\r
+static constexpr int16_t PHONE_LABEL_Y = 199;\r
+static constexpr int16_t BLUETOOTH_LABEL_Y = 290;\r
+static constexpr int16_t IMAGE_X = 50;\r
+static constexpr int16_t WATCH_IMAGE_Y = 98;\r
+static constexpr int16_t PHONE_IMAGE_Y = 187;\r
+static constexpr int16_t BLUETOOTH_IMAGE_Y = 278;\r
+static constexpr int16_t IMAGE_SIZE = 75;\r
+static constexpr char* BLUETOOTH_BUTTON = "BLUETOOTH_BUTTON";\r
+static PlayersOptionGroup* g_pPlayersOptionGroup = nullptr;\r
+\r
+PlayersOptionGroup::PlayersOptionGroup()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersOptionGroup::PlayersOptionGroup");\r
+ g_pPlayersOptionGroup = this;\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ SetDraggable(true);\r
+ SetTouchable(true);\r
+ SetOnClickListener(this);\r
+ SetOnDragListener(this);\r
+ InitImage();\r
+ InitButton();\r
+ InitLabel();\r
+}\r
+\r
+PlayersOptionGroup::~PlayersOptionGroup()\r
+{\r
+ RemoveAll();\r
+ if (watchLabel_ != nullptr) {\r
+ delete watchLabel_;\r
+ watchLabel_ = nullptr;\r
+ }\r
+ if (phoneLabel_ != nullptr) {\r
+ delete phoneLabel_;\r
+ phoneLabel_ = nullptr;\r
+ }\r
+ if (bluetoothLabel_ != nullptr) {\r
+ delete bluetoothLabel_;\r
+ bluetoothLabel_ = nullptr;\r
+ }\r
+ if (watchImage_ != nullptr) {\r
+ delete watchImage_;\r
+ watchImage_ = nullptr;\r
+ }\r
+ if (phoneImage_ != nullptr) {\r
+ delete phoneImage_;\r
+ phoneImage_ = nullptr;\r
+ }\r
+ if (bluetoothImage_ != nullptr) {\r
+ delete bluetoothImage_;\r
+ bluetoothImage_ = nullptr;\r
+ }\r
+ if (watchButton_ != nullptr) {\r
+ delete watchButton_;\r
+ watchButton_ = nullptr;\r
+ }\r
+ if (phoneButton_ != nullptr) {\r
+ delete phoneButton_;\r
+ phoneButton_ = nullptr;\r
+ }\r
+ if (bluetoothButton_ != nullptr) {\r
+ delete bluetoothButton_;\r
+ bluetoothButton_ = nullptr;\r
+ }\r
+ if (deleteButton != nullptr) {\r
+ delete deleteButton;\r
+ deleteButton = nullptr;\r
+ }\r
+ g_pPlayersOptionGroup = nullptr;\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(PLAYER_IAMGES);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersOptionGroup::~PlayersOptionGroup");\r
+}\r
+\r
+void PlayersOptionGroup::InitButton()\r
+{\r
+ if (watchButton_ == nullptr) {\r
+ watchButton_ = new UIRadioButton("MusicCategory");\r
+ if (watchButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "watchButton UIRadio new fail");\r
+ return;\r
+ }\r
+ }\r
+\r
+ watchButton_->SetPosition(BUTTON_X, WATCH_BUTTON_Y, BUTTON_SIZE, BUTTON_SIZE);\r
+ watchButton_->SetOnClickListener(this);\r
+ watchButton_->SetTouchable(false);\r
+\r
+ if (phoneButton_ == nullptr) {\r
+ phoneButton_ = new UIRadioButton("MusicCategory");\r
+ if (phoneButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phoneButton UIRadio new fail");\r
+ return;\r
+ }\r
+ }\r
+ phoneButton_->SetPosition(BUTTON_X, PHONE_BUTTON_Y, BUTTON_SIZE, BUTTON_SIZE);\r
+ phoneButton_->SetOnClickListener(this);\r
+ phoneButton_->SetTouchable(false);\r
+\r
+ if (bluetoothButton_ == nullptr) {\r
+ bluetoothButton_ = new UIButton();\r
+ if (bluetoothButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "settingButton UIButton new fail");\r
+ return;\r
+ }\r
+ }\r
+ bluetoothButton_->SetPosition(BUTTON_X2, BLUETOOTH_BUTTON_Y, BUTTON_SIZE, BUTTON_SIZE);\r
+ bluetoothButton_->SetOnClickListener(this);\r
+ bluetoothButton_->SetImageSrc(PNG_SETTTING_BUTTON_IMAGE, PNG_SETTTING_BUTTON_IMAGE);\r
+ bluetoothButton_->SetViewId(BLUETOOTH_BUTTON);\r
+ Add(watchButton_);\r
+ Add(phoneButton_);\r
+ Add(bluetoothButton_);\r
+}\r
+\r
+void PlayersOptionGroup::InitLabel()\r
+{\r
+ if (watchLabel_ == nullptr) {\r
+ watchLabel_ = new UILabel();\r
+ if (watchLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "watchLabel new fail");\r
+ return ;\r
+ }\r
+ }\r
+\r
+ watchLabel_->SetPosition(LABEL_X, WATCH_LABEL_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+ watchLabel_->SetText("手表音乐");\r
+ watchLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_THIRTY_SIZE);\r
+ if (phoneLabel_ == nullptr) {\r
+ phoneLabel_ = new UILabel();\r
+ if (phoneLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phoneLabel new fail");\r
+ return ;\r
+ }\r
+ }\r
+ phoneLabel_->SetPosition(LABEL_X, PHONE_LABEL_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+ phoneLabel_->SetText("手机音乐");\r
+ phoneLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_THIRTY_SIZE);\r
+ if (bluetoothLabel_ == nullptr) {\r
+ bluetoothLabel_ = new UILabel();\r
+ if (bluetoothLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothLabel new fail");\r
+ return ;\r
+ }\r
+ }\r
+ bluetoothLabel_->SetPosition(LABEL_X, BLUETOOTH_LABEL_Y, LABEL_WIDTH, LABEL_HEIGHT);\r
+ bluetoothLabel_->SetText("蓝牙音乐");\r
+ bluetoothLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_THIRTY_SIZE);\r
+ Add(watchLabel_);\r
+ Add(phoneLabel_);\r
+ Add(bluetoothLabel_);\r
+}\r
+\r
+void PlayersOptionGroup::InitImage()\r
+{\r
+ watchImage_ = new UIImageView();\r
+ if (watchImage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "watchImage new fail");\r
+ return ;\r
+ }\r
+ watchImage_->SetPosition(IMAGE_X, WATCH_IMAGE_Y, IMAGE_SIZE, IMAGE_SIZE);\r
+ watchImage_->SetSrc(PNG_WATCH_IMAGE);\r
+\r
+ phoneImage_ = new UIImageView();\r
+ if (phoneImage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phoneImage new fail");\r
+ return ;\r
+ }\r
+ phoneImage_->SetPosition(IMAGE_X, PHONE_IMAGE_Y, IMAGE_SIZE, IMAGE_SIZE);\r
+ phoneImage_->SetSrc(PNG_PHONE_IMAGE);\r
+\r
+ bluetoothImage_ = new UIImageView();\r
+ if (bluetoothImage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothImage new fail");\r
+ return ;\r
+ }\r
+ bluetoothImage_->SetPosition(IMAGE_X, BLUETOOTH_IMAGE_Y, IMAGE_SIZE, IMAGE_SIZE);\r
+ bluetoothImage_->SetSrc(PNG_BLUETOOTH_IMAGE);\r
+ Add(watchImage_);\r
+ Add(phoneImage_);\r
+ Add(bluetoothImage_);\r
+}\r
+\r
+bool PlayersOptionGroup::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), BLUETOOTH_BUTTON) == 0) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_SETTING, SettingPageId::BLUETOOTH_PAGE);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool PlayersOptionGroup::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ SetVisible(false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: Player view
- * Author:
- * Create: 2021-07-26
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: PlayersPresenter
+ * Created: 2025-06-05
*/
#include <sys/types.h>
#include <dirent.h>
#include <iostream>
#include <cstdlib>
#include <ctime>
-#include "player/PlayersPresenter.h"
#include "wearable_log.h"
#include "common/image_cache_manager.h"
#include "UiConfig.h"
#include "ui_resource_image.h"
-#include "player/PlayersView.h"
#include "player/PlayersModel.h"
-#include "bluetooth/BluetoothPresenter.h"
#include "graphic_service.h"
#include "phoneservice/PhoneService.h"
#include "main/MainViewSample.h"
-
+#include "phonemenu/PhoneMenuView.h"
#include "bts_avrcp_controller.h"
#include "bts_avrcp_target.h"
+#include "player/PlayersPresenter.h"
namespace OHOS {
-static PlayerOnDragListener *g_pPlayerOnDragListener = nullptr;
-static JumpView *g_pJumpView = nullptr;
static PlayersPresenter *g_pPlayersPresenter = nullptr;
PlayersPresenter *PlayersPresenter::GetInstance(void)
PlayersPresenter::~PlayersPresenter()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PlayersPresenter");
g_pPlayersPresenter = nullptr;
-}
-
-JumpView *JumpView::GetInstance(void)
-{
- return g_pJumpView;
-}
-
-JumpView::JumpView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "JumpView::JumpView");
- g_pJumpView = this;
- preProcessView[BLUETOOTHEARPHONEVIEW] = &JumpView::ChangeBluetoothEarPhoneView;
- preProcessView[BLUETOOTHEARLISTVIEW] = &JumpView::ChangeBluetoothEarListView;
- preProcessView[BLUETOOTHDEVICELISTVIEW] = &JumpView::ChangeBluetoothDeviceListView;
- preProcessView[BLUETOOTHEOPTIONSVIEW] = &JumpView::ChangeBluetoothOptionsView;
- preProcessView[BLUETOOTHRECONNECTVIEW] = &JumpView::ChangeBluetoothReconnectView;
- preProcessView[TIPSSUCCMESSAGEVIEW] = &JumpView::ChangeTipsSuccMessageView;
- preProcessView[TIPSCONNFAILMESSAGEVIEW] = &JumpView::ChangeTipsConnFailMessageView;
- preProcessView[TIPSFAILMESSAGEVIEW] = &JumpView::ChangeTipsFailMessageView;
- preProcessView[BLUETOOTHEVIEW] = &JumpView::ChangeBluetoothView;
-}
-
-JumpView::~JumpView()
-{
- delete bluetoothEarPhoneView;
- bluetoothEarPhoneView = nullptr;
- delete bluetoothOptionsView;
- bluetoothOptionsView = nullptr;
- delete bluetoothEarListView;
- bluetoothEarListView = nullptr;
- delete bluetoothReconnectView;
- bluetoothReconnectView = nullptr;
- delete bluetoothDeviceListView;
- bluetoothDeviceListView = nullptr;
- delete tipsSuccMessageView;
- tipsSuccMessageView = nullptr;
- delete tipsConnFailMessageView;
- tipsConnFailMessageView = nullptr;
- delete tipsFailMessageView;
- tipsFailMessageView = nullptr;
- delete bluetoothView;
- bluetoothView = nullptr;
- int i;
- for (i = BLUETOOTHEARPHONEVIEW; i <= BLUETOOTHEJUMP_MAX; i++) {
- container[i] = nullptr;
- }
- g_pJumpView = nullptr;
-}
-
-bool JumpView::ChangeBluetoothEarPhoneView(int16_t hideView, int16_t thisView)
-{
- UNUSED(hideView);
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothEarPhoneView");
- bluetoothEarPhoneView = new BluetoothEarPhoneView();
- if (bluetoothEarPhoneView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarPhoneView new fail");
- return false;
- }
- UIViewGroup *group = bluetoothEarPhoneView->InitShowUpView(); // init view
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- }
- // 动画开始
- bluetoothEarPhoneView->BtAnimatorStart();
- // 蓝牙扫描&清空列表
- bluetoothEarPhoneView->BtEnable();
- return true;
-}
-
-bool JumpView::ChangeBluetoothEarListView(int16_t hideView, int16_t thisView)
-{
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothEarListView");
- bluetoothEarListView = new BluetoothEarListView();
- if (bluetoothEarListView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarListView new fail");
- return false;
- }
- UIViewGroup *group = bluetoothEarListView->InitShowUpView(); // init view
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- } else {
- // 刷新列表
- UIList *scanList = bluetoothEarListView->GetScanUIList();
- if (scanList == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick scanList nullptr");
- return false;
- }
- scanList->RefreshList();
- }
- ResetEarListView(hideView);
- return true;
-}
-
-bool JumpView::ChangeBluetoothView(int16_t hideView, int16_t thisView)
-{
- UNUSED(hideView);
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothView");
- bluetoothView = new BluetoothView();
- if (bluetoothView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothView new fail");
- return false;
- }
- // init view
- UIViewGroup *group = bluetoothView->LoadBluetoothView();
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "JumpView::ChangeBluetoothView");
- BluetoothModel::GetInstance()->SetTagConnectView(false);
- return true;
-}
-
-bool JumpView::ChangeBluetoothOptionsView(int16_t hideView, int16_t thisView)
-{
- UNUSED(hideView);
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothOptionsView");
- bluetoothOptionsView = new BluetoothOptionsView();
- if (bluetoothOptionsView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothOptionsView new fail");
- return false;
- }
- // init view
- UIViewGroup *group = bluetoothOptionsView->InitShowUpView();
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- }
- return true;
-}
-
-bool JumpView::ChangeBluetoothDeviceListView(int16_t hideView, int16_t thisView)
-{
- UNUSED(hideView);
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothDeviceListView");
- bluetoothDeviceListView = new BluetoothDeviceListView();
- if (bluetoothDeviceListView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothDeviceListView new fail");
- return false;
- }
- // init view
- UIViewGroup *group = bluetoothDeviceListView->InitShowUpView();
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Device group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- } else {
- // 刷新列表
- UIList *deviceList = bluetoothDeviceListView->GetDeviceUIList();
- if (deviceList == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick deviceList nullptr");
- return false;
- }
- deviceList->RefreshList();
- }
- if (bluetoothDeviceListView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick bluetoothDeviceListView new fail");
- return false;
- }
- bluetoothDeviceListView->RefreshText();
-
- return true;
-}
-
-bool JumpView::ChangeBluetoothReconnectView(int16_t hideView, int16_t thisView)
-{
- UNUSED(hideView);
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeBluetoothReconnectView");
- bluetoothReconnectView = new BluetoothReconnectView();
- if (bluetoothReconnectView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothReconnectView new fail");
- return false;
- }
- // init view
- UIViewGroup *group = bluetoothReconnectView->InitShowUpView();
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- }
- BluetoothModel::GetInstance()->SetTagDisconnectView(true);
- bluetoothReconnectView->RefreshBluetoothNameLabel();
- bluetoothReconnectView->BtReconnectStart();
- return true;
-}
-
-void JumpView::ResetEarListView(int16_t hideView)
-{
- if (bluetoothEarListView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainBluetoothView::ResetEarListView bluetoothEarListView == nullptr");
- return;
- }
- bluetoothEarListView->SetCancelConnedRequestButtonRemove();
- if (hideView == BLUETOOTHEARPHONEVIEW) {
- bluetoothEarListView->SetTitleLabel("正在扫描");
- bluetoothEarListView->SetNewEquipmentButtonRemove();
- } else if (hideView == TIPSCONNFAILMESSAGEVIEW) {
- bluetoothEarListView->SetTitleLabel("扫描完成");
- bluetoothEarListView->SetNewEquipmentButtonAdd();
- RootView::GetInstance()->Invalidate();
- }
-}
-
-bool JumpView::ChangeTipsSuccMessageView(int16_t hideView, int16_t thisView)
-{
- UNUSED(hideView);
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTipsSuccMessageView");
- tipsSuccMessageView = new TipsSuccMessageView();
- if (tipsSuccMessageView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsSuccMessageView new fail");
- return false;
- }
- // init view
- UIViewGroup *group = tipsSuccMessageView->ShowUpViewInit();
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- }
- return true;
-}
-
-bool JumpView::ChangeTipsConnFailMessageView(int16_t hideView, int16_t thisView)
-{
- UNUSED(hideView);
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTipsConnFailMessageView");
- tipsConnFailMessageView = new TipsConnFailMessageView();
- if (tipsConnFailMessageView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsConnFailMessageView new fail");
- return false;
- }
- // init view
- UIViewGroup *group = tipsConnFailMessageView->ShowUpViewInit();
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- }
- if (bluetoothReconnectView == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback bluetoothReconnectView == nullptr");
- } else {
- container[BLUETOOTHRECONNECTVIEW]->SetVisible(false);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTipsConnFailMessageView SetVisible(false)");
- }
- return true;
-}
-
-bool JumpView::ChangeTipsFailMessageView(int16_t hideView, int16_t thisView)
-{
- UNUSED(hideView);
- if (container[thisView] == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTipsFailMessageView");
- tipsFailMessageView = new TipsFailMessageView();
- if (tipsFailMessageView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsFailMessageView new fail");
- return false;
- }
- // init view
- UIViewGroup *group = tipsFailMessageView->ShowUpViewInit();
- if (group == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");
- return false;
- }
- container[thisView] = group;
- MainViewSample::GetInstance()->GetRootContainer()->Add(container[thisView]);
- }
- return true;
-}
-
-bool JumpView::CheckViewParam(int16_t hideView, int16_t showView)
-{
- if (showView < 0 || showView >= BLUETOOTHEJUMP_MAX) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JumpView::CheckViewParam showView err.");
- return false;
- }
-
- if (hideView < 0 || hideView > BLUETOOTHEJUMP_MAX) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JumpView::CheckViewParam showView err.");
- return false;
- }
-
- if (hideView != BLUETOOTHEJUMP_MAX) {
- if (container[hideView] == nullptr) {
- return false;
- }
- container[hideView]->SetVisible(false);
- }
-
- if (hideView == BLUETOOTHEARLISTVIEW || showView == BLUETOOTHEARLISTVIEW) {
- BluetoothModel::GetInstance()->SetTagScanDeviceClicked(false);
- }
-
- return true;
-}
-
-void JumpView::ChangeView(int16_t hideView, int16_t showView)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "JumpView:: ChangeView %d", hideView);
- if (!CheckViewParam(hideView, showView)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JumpView::ChangeView check param err %d %d.", hideView, showView);
- return;
- }
-
- PreprosssChangeView tmpPreProcessView = preProcessView[showView];
-
- if (!(this->*tmpPreProcessView)(hideView, showView)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JumpView::ChangeView %d %d failed", showView, hideView);
- return;
- }
- container[showView]->SetVisible(true);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "JumpView:: ChangeView end!!!%d", showView);
- RootView::GetInstance()->Invalidate();
- BluetoothModel::GetInstance()->SetCurView(showView);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PlayersPresenter");
}
PlayersListGroup::~PlayersListGroup()
List<PlayerCaseInfo>& PlayersListGroup::GetCase()
{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "playersCaseList_.Size(%d)", playersCaseList_->Size());
return *playersCaseList_;
}
return OHOS_SUCCESS;
}
-ButtonOnClickListener::~ButtonOnClickListener()
-{
- delete volumeSettingView;
- volumeSettingView = nullptr;
-}
-
-// Button OnClick
-void ButtonOnClickListener::PlayerButtonOnClick()
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView GetInstance fail");
- return;
- }
-
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerButton OnClick");
- uint8_t state = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;
- int32_t playerState;
- int32_t connCtState = avrcp_ct_get_device_connect_state(BluetoothModel::GetInstance()->GetLastConnedAddr());
- int32_t connTgState = avrcp_tg_get_device_connect_state(BluetoothModel::GetInstance()->GetLastConnedAddr());
-
- state = playersView->GetPlayerButtonState();
- if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::GetInstance()->GetPlayerCtr() nullptr");
- return;
- }
- PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "buttonState = %d playerState = %d", state, playerState);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "connCtState = %d connTgState = %d", connCtState, connTgState);
-
- if (GetCurrCallNum() != 0 && GetScoConnectState() == HFP_SCO_STATE_CONNECTED) {
- if (state == UICheckBox::UICheckBoxState::SELECTED) {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
- } else {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
- }
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerButtonOnClick] calling phone");
- return;
- }
- if (state == UICheckBox::UICheckBoxState::SELECTED) {
- /* start play */
- PlayersModel::GetInstance()->ConnectBtAndLocalPlay(connCtState, connTgState, playerState);
- } else if (state == UICheckBox::UICheckBoxState::UNSELECTED) {
- PlayersModel::GetInstance()->ConnectBtAndLocalPause(connCtState, connTgState);
- }
-}
-
-void ButtonOnClickListener::SoundButtonOnClick()
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundButtonOnClick playersView nullptr err");
- return;
- }
- if (volumeSettingView == nullptr) {
- volumeSettingView = new VolumeSettingView();
- if (volumeSettingView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volumeSetting nullptr err");
- return;
- }
- if (!volumeSettingView->SetUpVolume()) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volumeSetting SetUpVolume fail");
- return;
- }
- MainViewSample::GetInstance()->GetRootContainer()->Add(volumeSettingView);
- }
- int32_t volume = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "current volume = %d", volume);
- volumeSettingView->GetProgress()->SetValue(volume);
- if (volume == 0) {
- ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_MUTE_BUTTON, PLAYER_IAMGES);
- volumeSettingView->GetDecreaseButton()->SetImageSrc(image, image);
- }
- VolumeSliderEventListener *volumeSliderEventListener = volumeSettingView->GetVolumeEventListener();
- if (volumeSliderEventListener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundButtonOnClick volumeSliderEventListener nullptr err");
- return;
- }
- volumeSliderEventListener->SetPlayerCoefficients(VOLUMEPLAYERS); // 进度条系数
- playersView->SetVisible(false);
- volumeSettingView->SetVisible(true);
- // 刷新UI
- RootView::GetInstance()->Invalidate();
-}
-
-void ButtonOnClickListener::OptionsButtonOnClick()
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OptionsButtonOnClick playersView nullptr err");
- return;
- }
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- playersView->SetVisible(false);
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEJUMP_MAX,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW);
-}
-
-void ButtonOnClickListener::PlayerModelButtonOnClick()
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerModelButtonOnClick playersView nullptr err");
- return;
- }
- switch (PlayersModel::GetInstance()->GetPlayerModel()) {
- case LOOP:
- playersView->PlayerModelButtonSetSrc(PLAYER_PLAYERSMODEL_LOOP); // 循环
- break;
- case SEQUENCE:
- playersView->PlayerModelButtonSetSrc(PLAYER_PLAYERSMODEL_SEQUENCE); // 顺序
- break;
- case REPEATS:
- playersView->PlayerModelButtonSetSrc(PLAYER_PLAYERSMODEL_REPEATS); // 重复
- break;
- case RANDOM:
- playersView->PlayerModelButtonSetSrc(PLAYER_PLAYERSMODEL_RANDOM); // 随机
- break;
- default:
- break;
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerModel %d", PlayersModel::GetInstance()->GetPlayerModel());
-}
-
-bool ButtonOnClickListener::OnClick(UIView& view, const ClickEvent& event)
-{
- UNUSED(view);
- UNUSED(event);
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::GetInstance");
- return false;
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ButtonOnClickListener OnClick");
- if (view_ == (UIView *)playersView->GetPlayerButton()) {
- PlayerButtonOnClick();
- } else if (view_ == (UIView *)playersView->GetNextButton()) {
- if (playersView->GetPlaybackProgress() != nullptr) {
- playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%
- playersView->GetPlaybackProgress()->Invalidate();
- }
- PlayersModel::GetInstance()->LoopingPlayout();
- } else if (view_ == (UIView *)playersView->GetPreButton()) {
- if (playersView->GetPlaybackProgress() != nullptr) {
- playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%
- playersView->GetPlaybackProgress()->Invalidate();
- }
- PlayersModel::GetInstance()->PreviousPlayout();
- } else if (view_ == (UIView *)playersView->GetPlayerModelButton()) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerModelButton OnClick");
- PlayersModel::GetInstance()->SetPlayerModelAddOne();
- if (PlayersModel::GetInstance()->GetPlayerModel() > RANDOM) {
- PlayersModel::GetInstance()->SetPlayerModel(LOOP);
- }
- PlayerModelButtonOnClick();
- } else if (view_ == (UIView *)playersView->GetSoundButton()) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "soundButton OnClick");
- SoundButtonOnClick();
- } else if (view_ == (UIView *)playersView->GetOptionsButton()) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "optionsButton OnClick");
- OptionsButtonOnClick();
- }
- return true;
-}
// 播放器回调
PlayerCallbackImpl::PlayerCallbackImpl()
GraphicService::GetInstance()->PostGraphicEvent([] {
PlayersView *playersView = PlayersView::GetInstance();
if (playersView != nullptr) {
- if (playersView->GetPlaybackProgress() != nullptr) {
- playersView->GetPlaybackProgress()->SetValue(100); // 100:进度100%
- playersView->GetPlaybackProgress()->Invalidate();
- }
+ playersView->SetPlaybackProgress(100); // 100:进度100%
}
});
- usleep(20000);
+ int sleepTime = 20000;
+ usleep(sleepTime);
GraphicService::GetInstance()->PostGraphicEvent(std::bind(&PlayersModel::PlaySwitching, PlayersModel::GetInstance()));
}
return;
}
- PlayersView *playersView = PlayersView::GetInstance();
-
player->GetPlayerState(state);
if (state == PLAYER_STARTED) {
ret = player->Pause();
if (ret == 0) {
- if (playersView == nullptr) {
- PlayersModel::GetInstance()->SetPlayButtonState(false);
- } else {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
- }
PlayerIntrptListener->RestFlag();
PlayerIntrptListener->SetPaused(true);
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::PausePlayer]");
return;
}
- PlayersView *playersView = PlayersView::GetInstance();
-
player->GetPlayerState(state);
if (state == PLAYER_PAUSED && PlayerIntrptListener->IsPaused()) {
ret = player->Play();
if (ret == 0) {
- if (playersView == nullptr) {
- PlayersModel::GetInstance()->SetPlayButtonState(true);
- } else {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
- }
PlayerIntrptListener->RestFlag();
PlayerIntrptListener->SetResumed(true);
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::ResumePlayer]");
void PlayerInterruptListener::ResumePlayer(void)
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::ResumePlayer] start");
- usleep(500000); // 确保界面切换完成
- if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAEKPHONE_SAMPLE ||
+ int sleepTime = 500000;
+ usleep(sleepTime); // 确保界面切换完成
+ if (NativeAbility::GetInstance().GetCurTargetId() ==
+ (VIEW_PHONE_MENU | static_cast<uint32_t>(PhoneMenuPages::PHONE_MENU_CALLING_PAGE) << PAGE_OFFSET) ||
(GetCurrCallState() != HFP_HF_CALL_STATE_FINISHED && GetScoConnectState() == HFP_SCO_STATE_CONNECTED)) {
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::ResumePlayer] this is in calling");
return; // 通话界面,禁止音乐恢复播放
}
}
}
-
-PlayerOnDragListener::PlayerOnDragListener()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerOnDragListener");
- g_pPlayerOnDragListener = this;
-}
-
-PlayerOnDragListener::~PlayerOnDragListener()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PlayerOnDragListener");
- g_pPlayerOnDragListener = nullptr;
-}
-
-PlayerOnDragListener *PlayerOnDragListener::GetInstance(void)
-{
- return g_pPlayerOnDragListener;
-}
-
-void PlayerOnDragListener::OnDragChangView(const DragEvent& event, int16_t hideView, int16_t showView, bool isStopScan)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnDragChangeView=%d showView=%d", hideView, showView);
- if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
- if (isStopScan) {
- BluetoothEarPhoneView *bluetoothEarPhoneView = BluetoothEarPhoneView::GetInstance();
- if (bluetoothEarPhoneView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarPhoneView GetInstance fail");
- return;
- }
- bluetoothEarPhoneView->BtAnimatorStop();
- bluetoothEarPhoneView->StopBtDiscovery();
- }
- // 跳转设置页面
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(hideView, showView);
- }
-}
-
-void PlayerOnDragListener::OnDragChangBluetoothView(const DragEvent& event)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnDragChangBluetoothView");
- if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DIRECTION_LEFT_TO_RIGHT");
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView GetInstance fail");
- return;
- }
- BluetoothView *bluetoothView = BluetoothView::GetInstance();
- if (bluetoothView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothView GetInstance fail");
- return;
- }
- bluetoothView->group->SetVisible(false);
- playersView->SetVisible(true);
- // 刷新UI
- RootView::GetInstance()->Invalidate();
- }
-}
-
-void PlayerOnDragListener::DropEarPhoneView(const DragEvent& event)
-{
- bool ret = BluetoothModel::GetInstance()->IsTagReturnToDeviceListView();
- if (ret) {
- OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW, true);
- } else {
- OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW, true);
- }
-}
-
-void PlayerOnDragListener::DropEarListView(const DragEvent& event)
-{
- bool ret = BluetoothModel::GetInstance()->IsTagScanDeviceClicked();
- if (ret) {
- BluetoothCaseInfo *caseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerOnDragListener::DropEarListView Addr: %02x%02x%02x%02x%02x%02x",
- caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* mac下标 0 1 2 3 4 5 */
- caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* mac下标 0 1 2 3 4 5 */
- errcode_t retVal = gap_disconnect_remote_device((const bd_addr_t *)caseInfo->addr);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerOnDragListener::DropEarListView gap_disconnect_remote_device retVal = %d", retVal);
- }
- BluetoothItemView *pbItermView = BluetoothModel::GetInstance()->GetConnectionView();
- if (pbItermView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnDragEnd The GetConnectionView nullptr.");
- } else {
- pbItermView->ConnectAnimatorStop();
- BluetoothModel::GetInstance()->SetConnectionView(nullptr);
- }
- OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHEARLISTVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW, true);
-}
-
-bool PlayerOnDragListener::OnDragEnd(UIView& view, const DragEvent& event)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayerOnDragListener::OnDragEnd- %s", view.GetViewId());
- if (view.GetViewId() == nullptr) {
- return true;
- }
- if (strcmp(view.GetViewId(), BLUETOOTH_EAR_PHONE_VIEW) == 0) {
- DropEarPhoneView(event);
- } else if (strcmp(view.GetViewId(), TIPS_SUCC_MESSAGE_VIEW) == 0) {
- OnDragChangView(event, JumpView::BluetoothJumpViewNum::TIPSSUCCMESSAGEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW, false);
- } else if (strcmp(view.GetViewId(), TIPS_FAIL_MESSAGE_VIEW) == 0) {
- OnDragChangView(event, JumpView::BluetoothJumpViewNum::TIPSFAILMESSAGEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW, false);
- } else if (strcmp(view.GetViewId(), TIPS_CONN_FAIL_MESSAGE_VIEW) == 0) {
- CorrespondingJump(event, JumpView::BluetoothJumpViewNum::TIPSCONNFAILMESSAGEVIEW);
- } else if (strcmp(view.GetViewId(), BLUETOOTH_EARLIST_VIEW) == 0) {
- DropEarListView(event);
- } else if (strcmp(view.GetViewId(), BLUETOOTH_RECONNECT_VIEW) == 0) {
- BluetoothModel::GetInstance()->SetTagDisconnectView(false);
- CorrespondingJump(event, JumpView::BluetoothJumpViewNum::BLUETOOTHRECONNECTVIEW);
- BluetoothReconnectView *bluetoothReconnectView = BluetoothReconnectView::GetInstance();
- if (bluetoothReconnectView != nullptr) {
- bluetoothReconnectView->BtReconnectStop();
- }
- } else if (strcmp(view.GetViewId(), BLUETOOTH_OPTIONS_VIEW) == 0) {
- OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW, false);
- } else if (strcmp(view.GetViewId(), BLUETOOTH_VIEW) == 0) {
- OnDragChangBluetoothView(event);
- } else if (strcmp(view.GetViewId(), BLUETOOTH_DEVICE_LIST_VIEW) == 0) {
- OnDragChangView(event, JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW, false);
- }
- return true;
-}
-
-
-void PlayerOnDragListener::CorrespondingJump(const DragEvent& event, int16_t hideView)
-{
- BluetoothModel *bluetoothModel = BluetoothModel::GetInstance();
- if (bluetoothModel == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainBluetoothView::DropView bluetoothModel == nullptr");
- return;
- }
- if (bluetoothModel->GetTagReconnectJump()) {
- OnDragChangView(event, hideView,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW, false);
- } else {
- std::list<BluetoothCaseInfo> &bluetoothScanList = BluetoothModel::GetInstance()->GetCase();
- bool ret = bluetoothScanList.empty();
- if (!ret) {
- OnDragChangView(event, hideView,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEARLISTVIEW, false);
- } else {
- OnDragChangView(event, hideView,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW, false);
- }
- }
- return;
-}
-
-bool PlayerOnDragListener::OnDrag(UIView& view, const DragEvent& event)
-{
- UNUSED(view);
- if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerbackReset playersView GetInstance fail");
- return false;
- }
- playersView->SetPlayerListGroupStatus(false);
- RootView::GetInstance()->Invalidate();
- }
- return false;
-}
-
-void PlayersPresenter::OnClickRescanButton(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RescanButtonOnClickListener OnClick");
- // 跳转正在搜索界面
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEARLISTVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW);
- return;
-}
-void PlayersPresenter::OnClickNewEquipmentButton(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NewEquipmentButtonOnClickListener OnClick");
- BluetoothModel::GetInstance()->SetTagReturnToDeviceListView(true);
- // 跳转正在搜索界面
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW);
- return;
-}
-
-void PlayersPresenter::OnClickCancelConnedRequestButton(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CancelConnedRequestButton OnClick");
- BluetoothCaseInfo *caseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ClickCancelConnedRequestButton Addr: %02x%02x%02x%02x%02x%02x",
- caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* mac下标 0 1 2 3 4 5 */
- caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* mac下标 0 1 2 3 4 5 */
- errcode_t retVal = gap_disconnect_remote_device((const bd_addr_t *)caseInfo->addr);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClickCancelConnedRequestButton DisconnectRemoteDevice retVal = %d", retVal);
-
- BluetoothModel::GetInstance()->SetTagScanDeviceClicked(false);
- // 刷新列表
- BluetoothEarListView *bluetoothEarListView = BluetoothEarListView::GetInstance();
- if (bluetoothEarListView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ClickCancelConnedRequestButton bluetoothEarListView nullptr");
- return;
- }
- if (bluetoothEarListView->GetScanUIList() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ClickCancelConnedRequestButton GetScanUIList nullptr");
- return;
- }
- bluetoothEarListView->GetScanUIList()->RefreshList();
- bluetoothEarListView->SetCancelConnedRequestButtonRemove();
- bluetoothEarListView->SetTitleLabel("扫描完成");
-
- BluetoothItemView *pbItermView = BluetoothModel::GetInstance()->GetConnectionView();
- if (pbItermView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView The GetConnectionView get failed.");
- return;
- }
- pbItermView->ConnectAnimatorStop();
- BluetoothModel::GetInstance()->SetConnectionView(nullptr);
- bluetoothEarListView->SetNewEquipmentButtonAdd();
- RootView::GetInstance()->Invalidate();
- return;
-}
-
-void PlayersPresenter::OnClickButtonUnpair(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_UNPAIR_BUTTON");
- BluetoothModel::GetInstance()->SetTagConnectNew(false);
- BluetoothOptionsView *bluetoothOptionsView = BluetoothOptionsView::GetInstance();
- if (bluetoothOptionsView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothOptionsView GetInstance fail");
- return;
- }
- bluetoothOptionsView->SetUnpair(); // 取消配对
- // 删除对应设备列表节点
- bd_addr_t bdAddr = bluetoothOptionsView->GetCurrentAddr();
- List<BluetoothCaseInfo> &bluetoothCaseList = BluetoothModel::GetInstance()->GetConnedDevicesCase();
- ListNode<BluetoothCaseInfo> *node = bluetoothCaseList.Begin();
- if (node == nullptr) {
- return;
- }
- while (node != bluetoothCaseList.End()) {
- if ((bdAddr.addr[0] == node->data_.addr[0]) && (bdAddr.addr[1] == node->data_.addr[1])
- && (bdAddr.addr[2] == node->data_.addr[2]) && (bdAddr.addr[3] == node->data_.addr[3])
- && (bdAddr.addr[4] == node->data_.addr[4]) && (bdAddr.addr[5] == node->data_.addr[5])) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bdAddr true");
- bluetoothCaseList.Remove(node);
- }
- node = node->next_;
- }
-
- // 跳转并刷新列表
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW);
-}
-
-void PlayersPresenter::OnClickButtonOptionOne(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_OPTIONONE_BUTTON");
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- BluetoothOptionsView *bluetoothOptionsView = BluetoothOptionsView::GetInstance();
- if (bluetoothOptionsView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothOptionsView GetInstance fail");
- return;
- }
- BluetoothModel::GetInstance()->SetBtStatus();
- if (BluetoothModel::GetInstance()->GetAclConnected()) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClickButtonOptionOne GetAclConnected()");
- BluetoothModel::GetInstance()->SetTagConnectNew(false);
- bluetoothOptionsView->SetBtDisconnect();
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW);
- } else {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClickButtonOptionOne GetAclConnected() fail");
- BluetoothModel::GetInstance()->SetTagReconnectJump(true);
- // 重连动画
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHRECONNECTVIEW);
- // 判断是否正在连接
- bd_addr_t *lastAddr = BluetoothModel::GetInstance()->GetLastConnedAddr();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothPresenter::ClickOptionsOneButton lastAddr: %02x%02x%02x%02x%02x%02x",
- lastAddr->addr[5], lastAddr->addr[4], lastAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
- lastAddr->addr[2], lastAddr->addr[1], lastAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
- if (bt_is_acl_connected(lastAddr)) {
- BluetoothModel::GetInstance()->SetTagConnectNew(true);
- bluetoothOptionsView->SetBtDisconnect();
- } else {
- BluetoothCaseInfo *caseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
- errcode_t retVal = BluetoothModel::GetInstance()->ConnectRemoteDevice((const bd_addr_t *)&caseInfo->addr);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ClickOptionsOneButton ConnectRemoteDevice retVal = %d", retVal);
- }
- }
-}
-
-
-void PlayersPresenter::OnClickSetting(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_SETTING_BUTTON");
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- BluetoothModel *bluetoothModel = BluetoothModel::GetInstance();
- if (bluetoothModel == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClickSetting BluetoothModel GetInstance fail");
- return;
- }
- bluetoothModel->SetTagConnectView(true);
- bluetoothModel->SetBluetoothCalleridStatus(CALLERPLAYERS);
- BluetoothModel::GetInstance()->SetTagReturnToDeviceListView(false);
- // 设备列表
- List<BluetoothCaseInfo> &bluetoothCaseList = BluetoothModel::GetInstance()->GetConnedDevicesCase();
- bool ret = bluetoothCaseList.IsEmpty();
- if (!ret) {
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW);
- } else {
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW);
- }
-}
-
-void PlayersPresenter::OnClickDelete(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_DELETE_BUTTON");
-}
-
-void PlayersPresenter::OnClickSuccBack(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_SUCC_BACK_BUTTON");
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::TIPSSUCCMESSAGEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW);
-}
-
-void PlayersPresenter::OnClickConnFailBack(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_CONN_FAIL_BACK_BUTTON");
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::TIPSCONNFAILMESSAGEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHRECONNECTVIEW);
- BluetoothCaseInfo *caseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
- errcode_t retVal = BluetoothModel::GetInstance()->ConnectRemoteDevice((const bd_addr_t *)&caseInfo->addr);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClickConnFailBack ConnectRemoteDevice retVal = %d", retVal);
-}
-
-void PlayersPresenter::OnClickFailBack(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick BLUETOOTH_FAIL_BACK_BUTTON");
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::TIPSFAILMESSAGEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW);
-}
-
-struct PlayersOnClickMapper {
- const char *id;
- void (PlayersPresenter::*func)(void);
-};
-
-static const PlayersOnClickMapper OnClickMapper[] = {
- {BLUETOOTH_RESCAN_BUTTON, &PlayersPresenter::OnClickRescanButton},
- {BLUETOOTH_NEWEQUIPMENT_BUTTON, &PlayersPresenter::OnClickNewEquipmentButton},
- {BLUETOOTH_CANCELCONNEDREQUEST_BUTTON, &PlayersPresenter::OnClickCancelConnedRequestButton},
- {BLUETOOTH_UNPAIR_BUTTON, &PlayersPresenter::OnClickButtonUnpair},
- {BLUETOOTH_OPTIONONE_BUTTON, &PlayersPresenter::OnClickButtonOptionOne},
- {BLUETOOTH_SETTING_BUTTON, &PlayersPresenter::OnClickSetting},
- {BLUETOOTH_DELETE_BUTTON, &PlayersPresenter::OnClickDelete},
- {BLUETOOTH_SUCC_BACK_BUTTON, &PlayersPresenter::OnClickSuccBack},
- {BLUETOOTH_CONN_FAIL_BACK_BUTTON, &PlayersPresenter::OnClickConnFailBack},
- {BLUETOOTH_FAIL_BACK_BUTTON, &PlayersPresenter::OnClickFailBack}
-};
-
-bool PlayersPresenter::OnClick(UIView &view, const ClickEvent &event)
-{
- uint16_t i;
- UNUSED(event);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick %s", view.GetViewId());
- for (i = 0; i < sizeof(OnClickMapper) / sizeof(OnClickMapper[0]); i++) {
- if (strcmp(view.GetViewId(), OnClickMapper[i].id) == 0) {
- (this->*(OnClickMapper[i].func))();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersPresenter::OnClick i %d", i);
- return true;
- }
- }
- return false;
-}
-
-void PlayersPresenter::SetTitleSetText(const char *text)
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetTitleSetText playersView GetInstance fail");
- return;
- }
- if (playersView->GetTitleLabel() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetTitleSetText titleLabel nullptr");
- return;
- }
- playersView->TitleSetText(text);
-}
-
-void PlayersPresenter::SetPlaybackProgress(int64_t value)
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPlaybackProgress playersView GetInstance fail");
- return;
- }
- UICircleProgress *playbackProgress = playersView->GetPlaybackProgress();
- if (playbackProgress == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playbackProgress nullptr err");
- return;
- }
- playbackProgress->SetValue(value);
- playbackProgress->Invalidate();
-}
-
-void PlayersPresenter::SetPlayerState(bool value)
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPlayerState playersView GetInstance fail");
- return;
- }
- if (value) {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
- PlayersModel::GetInstance()->SetPlayButtonState(false);
- }
-}
-
-void PlayersPresenter::PlayerbackReset(void)
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerbackReset playersView GetInstance fail");
- return;
- }
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
-}
-
-// 播放器按钮复位
-void PlayersPresenter::PlayerHeadsetReset(void)
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerbackReset playersView GetInstance fail");
- return;
- }
-
- if (playersView->GetPlayerButtonState() == UICheckBox::UICheckBoxState::UNSELECTED) {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
- } else {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
- }
-
-}
-
-void PlayersPresenter::ShowPlayerListGroup()
-{
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerbackReset playersView GetInstance fail");
- return;
- }
- // 添加list
- playersView->SetPlayerListGroupStatus(true);
- // 刷新UI
- RootView::GetInstance()->Invalidate();
- return;
-}
-
} // namespace OHOS
#include <cstdlib>
#include <unistd.h>
#include "common/image_cache_manager.h"
+#include "phoneservice/PhoneService.h"
+#include "main/LoadImg.h"
#include "ui_resource_image.h"
-#include "player/PlayersView.h"
#include "UiConfig.h"
#include "player/PlayersModel.h"
-#include "player/PlayersCaseListAdapter.h"
+#include "player/PlayersMusicItemView.h"
+#include "bts_avrcp_target.h"
+#include "bts_avrcp_controller.h"
#include "main/MainViewSample.h"
+#include "player/PlayersView.h"
namespace OHOS {
static PlayersView* g_pPlayersView = nullptr;
-
-#define STEP_LABEL_X 166
-#define STEP_LABEL_Y 30
-#define TEXT_WIDTH 120
-#define TEXT_HEIGHT 30
+static constexpr uint16_t PROGRESS_PERCENTAGE = 100;
+static constexpr uint16_t PLAYER_PERIOD = 500;
+
+static constexpr int16_t NEXT_BUTTON_POSITION_X = 331;
+static constexpr int16_t PRE_BUTTON_POSITION_X = 31;
+static constexpr int16_t BUTTON_POSITION_Y_ONE = 168;
+static constexpr int16_t PLAY_MODE_BUTTON_POSITION_X = 87;
+static constexpr int16_t SOUND_BUTTON_POSITION_X = 176;
+static constexpr int16_t OPTION_BUTTON_POSITION_X = 284;
+static constexpr int16_t BUTTON_POSITION_Y_TWO = 316;
+static constexpr int16_t PULL_BUTTON_POSITION_X = 178;
+static constexpr int16_t PULL_BUTTON_POSITION_Y = 394;
+static constexpr int16_t PLAY_OR_PAUSE_BUTTON_POSITION_X = 140;
+static constexpr int16_t PLAY_OR_PAUSE_BUTTON_POSITION_Y = 139;
+static constexpr int16_t PLAY_OR_PAUSE_BUTTON_SIZE = 172;
+static constexpr int16_t MUSIC_NAME_LABEL_POSITION_X = 72;
+static constexpr int16_t MUSIC_NAME_LABEL_POSITION_Y = 35;
+static constexpr int16_t MUSIC_NAME_LABEL_WIDTH = 300;
+static constexpr int16_t MUSIC_NAME_LABEL_HEIGHT = 53;
+static constexpr int16_t MUSIC_AUTHOR_LABEL_POSITIO0N_X = 77;
+static constexpr int16_t MUSIC_AUTHOR_LABEL_POSITION_Y = 92;
+static constexpr int16_t MUSIC_AUTHOR_LABEL_WIDTH = 300;
+static constexpr int16_t MUSIC_AUTHOR_LABEL_HEIGHT = 38;
+static constexpr char* NEXT_SONG_BUTTON = "NEXT_SONG_BUTTON";
+static constexpr char* PRE_SONG_BUTTON = "PRE_SONG_BUTTON";
+static constexpr char* PLAY_OR_PAUSE_BUTTON = "PLAY_OR_PAUSE_BUTTON";
+static constexpr char* PLAYMODE_CHANGE_BUTTON = "PLAYMODE_CHANGE_BUTTON";
+static constexpr char* VOICE_ADJUST_BUTTON = "VOICE_ADJUST_BUTTON";
+static constexpr char* OPTIONS_BUTTON = "OPTIONS_BUTTON";
+static constexpr char* PULL_BUTTON = "PULL_BUTTON";
PlayersView::PlayersView()
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::PlayersView");
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ SetDraggable(true);
+ SetTouchable(true);
+ SetOnClickListener(this);
+ SetOnDragListener(this);
g_pPlayersView = this;
}
PlayersModel::GetInstance()->SetPlayButtonState(true);
}
RemoveAll();
- listGroup->RemoveAll();
- delete list;
- list = nullptr;
- delete playerlistener;
- playerlistener = nullptr;
- delete playerButton;
- playerButton = nullptr;
- delete soundlistener;
- soundlistener = nullptr;
- delete nextButton;
- nextButton = nullptr;
- delete nextlistener;
- nextlistener = nullptr;
- delete preButton;
- preButton = nullptr;
- TearDownView();
- delete adapterText;
- adapterText = nullptr;
- delete backGround;
- delete titleLabel;
- delete subTitleLabel;
- backGround = nullptr;
- titleLabel = nullptr;
- subTitleLabel = nullptr;
- delete playbackProgress;
- playbackProgress = nullptr;
- delete jumpView;
- jumpView = nullptr;
- delete playersPresenter;
- playersPresenter = nullptr;
- delete playerOnDragListener;
- playerOnDragListener = nullptr;
+ if (bgImg_ != nullptr) {
+ delete bgImg_;
+ bgImg_ = nullptr;
+ }
+ if (musicNameLabel_ != nullptr) {
+ delete musicNameLabel_;
+ musicNameLabel_ = nullptr;
+ }
+ if (musicAuthorLabel_ != nullptr) {
+ delete musicAuthorLabel_;
+ musicAuthorLabel_ = nullptr;
+ }
+ if (optionsButton_ != nullptr) {
+ delete optionsButton_;
+ optionsButton_ = nullptr;
+ }
+ if (preButton_ != nullptr) {
+ delete preButton_;
+ preButton_ = nullptr;
+ }
+ if (nextButton_ != nullptr) {
+ delete nextButton_;
+ nextButton_ = nullptr;
+ }
+ if (soundButton_ != nullptr) {
+ delete soundButton_;
+ soundButton_ = nullptr;
+ }
+ if (playModelChangeButton_ != nullptr) {
+ delete playModelChangeButton_;
+ playModelChangeButton_ = nullptr;
+ }
+ if (pullButton_ != nullptr) {
+ delete pullButton_;
+ pullButton_ = nullptr;
+ }
+ if (playerOrPauseButton_ != nullptr) {
+ delete playerOrPauseButton_;
+ playerOrPauseButton_ = nullptr;
+ }
+ if (playbackProgress_ != nullptr) {
+ delete playbackProgress_;
+ playbackProgress_ = nullptr;
+ }
+ if (volumeSettingView_ != nullptr) {
+ delete volumeSettingView_;
+ volumeSettingView_ = nullptr;
+ }
+ if (playerOptionGroup_ != nullptr) {
+ delete playerOptionGroup_;
+ playerOptionGroup_ = nullptr;
+ }
+ if (playersMusicListGroup != nullptr) {
+ delete playersMusicListGroup;
+ playersMusicListGroup = nullptr;
+ }
}
g_pPlayersView = nullptr;
}
void PlayersView::TitleSetText(const char *text)
{
- titleLabel->SetText(text);
- titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
- titleLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
- UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+ if (musicNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::TitleSetText musicNameLabel_ is null");
+ return;
+ }
+
+ if (text && *text) {
+ musicNameLabel_->SetText(text);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::TitleSetText text nullptr");
+ musicNameLabel_->SetText("Music Name");
+ }
}
void PlayersView::PlayerModelButtonSetSrc(uint32_t playMode)
{
ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(playMode, PLAYER_IAMGES);
- playerModelButton->SetSrc(image);
+ playModelChangeButton_->SetSrc(image);
}
int16_t PlayersView::GetVolumeRank(void)
volumeSet++;
}
-UIButton *PlayersView::GetPullButton(void)
-{
- return pullButton;
-}
-
-UIButton *PlayersView::GetOptionsButton(void)
-{
- return optionsButton;
-}
-
-UIButton *PlayersView::GetPreButton(void)
-{
- return preButton;
-}
-
-UIButton *PlayersView::GetNextButton(void)
-{
- return nextButton;
-}
-
-UILabel *PlayersView::GetTitleLabel(void)
-{
- return titleLabel;
-}
-
-UICheckBox *PlayersView::GetPlayerButton(void)
-{
- return playerButton;
-}
-
-UIImageView *PlayersView::GetSoundButton(void)
-{
- return soundButton;
-}
-
-UICircleProgress *PlayersView::GetPlaybackProgress(void)
-{
- return playbackProgress;
-}
-
-UIImageView *PlayersView::GetPlayerModelButton(void)
+UICheckBox::UICheckBoxState PlayersView::GetPlayerButtonState(void)
{
- return playerModelButton;
+ return playerOrPauseButton_->GetState();
}
-UICheckBox::UICheckBoxState PlayersView::GetPlayerButtonState(void)
+void PlayersView::SetPlayerState(bool value)
{
- return playerButton->GetState();
+ if (value) {
+ SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
+ PlayersModel::GetInstance()->SetPlayButtonState(false);
+ }
}
void PlayersView::SetPlayerButtonState(UICheckBox::UICheckBoxState state)
{
- if (playerButton == nullptr) {
+ if (playerOrPauseButton_ == nullptr) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::SetPlayerButtonState playerButton nullptr");
return;
}
- return playerButton->SetState(state);
-}
-
-UIList *PlayersView::GetPlayerList(void)
-{
- return list;
+ return playerOrPauseButton_->SetState(state);
}
-void PlayersView::SetPlayerListGroupStatus(bool status)
+void PlayersView::SetPlaybackProgress(int8_t value)
{
- if (listGroup == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView listGroup is nullptr");
+ if (playbackProgress_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::playbackProgress_ nullptr");
return;
}
- UIView *vew = MainViewSample::GetInstance()->GetMainViewGroup();
- if (vew != nullptr) {
- vew->SetVisible(!status);
- }
- listGroup->SetVisible(status);
+ playbackProgress_->SetValue(value);
+ playbackProgress_->Invalidate();
return;
}
PlayersModel::GetInstance()->GetPlayerCtr()->SetVolume(leftVolume, rightVolume);
}
-void PlayersView::TearDownView()
+PlayersView* PlayersView::GetInstance(void)
{
- delete prelistener;
- prelistener = nullptr;
- delete playerModelButton;
- playerModelButton = nullptr;
- delete modellistener;
- modellistener = nullptr;
- delete soundButton;
- soundButton = nullptr;
- delete optionslistener;
- optionslistener = nullptr;
- delete optionsButton;
- optionsButton = nullptr;
- delete pullButton;
- pullButton = nullptr;
- delete listGroup;
- listGroup = nullptr;
+ return g_pPlayersView;
}
-PlayersView* PlayersView::GetInstance(void)
+bool PlayersView::InitView(void)
{
- return g_pPlayersView;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView InitView");
+ InitImage();
+ InitButton();
+ InitLabel();
+ InitCircleProgress();
+ InitSoundAdjust();
+ InitOption();
+ InitListView();
+ Invalidate();
+ return true;
}
-// list
-void PlayersView::ShowUpListView()
+void PlayersView::InitButton()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowUpListView");
- listGroup = new UIViewGroup();
- if (listGroup == nullptr) {
+ if (nextButton_ == nullptr) {
+ nextButton_ = new UIImageView();
+ }
+ if (preButton_ == nullptr) {
+ preButton_ = new UIImageView();
+ }
+ if (playerOrPauseButton_ == nullptr) {
+ playerOrPauseButton_ = new UICheckBox();
+ }
+ if (playModelChangeButton_ == nullptr) {
+ playModelChangeButton_ = new UIImageView();
+ }
+ if (soundButton_ == nullptr) {
+ soundButton_ = new UIImageView();
+ }
+ if (optionsButton_ == nullptr) {
+ optionsButton_ = new UIImageView();
+ }
+ if (pullButton_ == nullptr) {
+ pullButton_ = new UIImageView();
+ }
+ if ((nextButton_ == nullptr) || (preButton_ == nullptr) || (optionsButton_ == nullptr)
+ || (soundButton_ == nullptr) || (playModelChangeButton_ == nullptr) || (pullButton_ == nullptr)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UIButton new fail");
+ return;
+ }
+ if ((playerOrPauseButton_ == nullptr)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerOrPauseButton_ new fail");
return;
}
- listGroup->SetPosition(0, 0);
- listGroup->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
- // list type
- if (adapterText == nullptr) {
- adapterText = new PlayersCaseListAdapter();
- if (adapterText == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adapterText new fail");
- return;
- }
+ nextButton_->SetPosition(NEXT_BUTTON_POSITION_X, BUTTON_POSITION_Y_ONE);
+ nextButton_->SetViewId(NEXT_SONG_BUTTON);
+ LOADIMG::LoadImageViewImg(nextButton_, PLAYER_IAMGES, PLAYER_NEXT_BUTTON);
+ nextButton_->SetTouchable(true);
+ nextButton_->SetOnClickListener(this);
+
+ preButton_->SetPosition(PRE_BUTTON_POSITION_X, BUTTON_POSITION_Y_ONE);
+ preButton_->SetViewId(PRE_SONG_BUTTON);
+ LOADIMG::LoadImageViewImg(preButton_, PLAYER_IAMGES, PLAYER_PRE_BUTTOW);
+ preButton_->SetTouchable(true);
+ preButton_->SetOnClickListener(this);
+
+ ImageInfo *image;
+ ImageInfo *hlImage;
+ playerOrPauseButton_->SetPosition(PLAY_OR_PAUSE_BUTTON_POSITION_X, PLAY_OR_PAUSE_BUTTON_POSITION_Y,
+ PLAY_OR_PAUSE_BUTTON_SIZE, PLAY_OR_PAUSE_BUTTON_SIZE);
+ playerOrPauseButton_->SetViewId(PLAY_OR_PAUSE_BUTTON);
+ playerOrPauseButton_->SetOnClickListener(this);
+ image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PLAYER, PLAYER_IAMGES);
+ hlImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PLAYERHIGHLIGHT, PLAYER_IAMGES);
+ playerOrPauseButton_->SetImages(hlImage, image);
+
+ playModelChangeButton_->SetPosition(PLAY_MODE_BUTTON_POSITION_X, BUTTON_POSITION_Y_TWO);
+ playModelChangeButton_->SetViewId(PLAYMODE_CHANGE_BUTTON);
+ SetUpPlayerMode();
+ playModelChangeButton_->SetTouchable(true);
+ playModelChangeButton_->SetOnClickListener(this);
+
+ soundButton_->SetPosition(SOUND_BUTTON_POSITION_X, BUTTON_POSITION_Y_TWO);
+ soundButton_->SetViewId(VOICE_ADJUST_BUTTON);
+ LOADIMG::LoadImageViewImg(soundButton_, PLAYER_IAMGES, PLAYER_SOUND_IMAGE);
+ soundButton_->SetTouchable(true);
+ soundButton_->SetOnClickListener(this);
+
+ optionsButton_->SetPosition(OPTION_BUTTON_POSITION_X, BUTTON_POSITION_Y_TWO);
+ optionsButton_->SetViewId(OPTIONS_BUTTON);
+ LOADIMG::LoadImageViewImg(optionsButton_, PLAYER_IAMGES, PLAYER_OPTIONS_IMAGE);
+ optionsButton_->SetTouchable(true);
+ optionsButton_->SetOnClickListener(this);
+
+ pullButton_->SetPosition(PULL_BUTTON_POSITION_X, PULL_BUTTON_POSITION_Y);
+ pullButton_->SetViewId(PULL_BUTTON);
+ pullButton_->SetSrc(PNG_PULLUP_BUTTON);
+ pullButton_->SetTouchable(true);
+ pullButton_->SetOnClickListener(this);
+
+ Add(nextButton_);
+ Add(preButton_);
+ Add(optionsButton_);
+ Add(soundButton_);
+ Add(playModelChangeButton_);
+ Add(playerOrPauseButton_);
+ Add(pullButton_);
+}
+
+void PlayersView::InitLabel()
+{
+ musicNameLabel_ = new UILabel();
+ if (musicNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicNameLabel_ new fail");
+ return;
}
- if (list == nullptr) {
- list = new UIList(UIList::VERTICAL);
- if (list == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "list new fail");
- return;
- }
- list->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
- list->SetStartIndex(0); // 0 : list start index
- list->SetAdapter(adapterText);
- }
- listGroup->Add(list);
- MainViewSample::GetInstance()->GetRootContainer()->Add(listGroup);
- UIView::OnDragListener *dragListener = (UIView::OnDragListener*)OHOS::PlayerOnDragListener::GetInstance();
- if (dragListener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::OnDragListener fail");
+ musicNameLabel_->SetPosition(MUSIC_NAME_LABEL_POSITION_X, MUSIC_NAME_LABEL_POSITION_Y,
+ MUSIC_NAME_LABEL_WIDTH, MUSIC_NAME_LABEL_HEIGHT);
+ musicNameLabel_->SetText("Music Name");
+ musicNameLabel_->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
+ musicNameLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+ musicNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);
+ Add(musicNameLabel_);
+
+ musicAuthorLabel_ = new UILabel();
+ if (musicAuthorLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicAuthorLabel_ new fail");
return;
}
- listGroup->SetDraggable(true);
- listGroup->SetTouchable(true);
- listGroup->SetOnDragListener(dragListener);
- listGroup->SetVisible(false);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowUpListView end");
+ musicAuthorLabel_->SetPosition(MUSIC_AUTHOR_LABEL_POSITIO0N_X, MUSIC_AUTHOR_LABEL_POSITION_Y,
+ MUSIC_AUTHOR_LABEL_WIDTH, MUSIC_AUTHOR_LABEL_HEIGHT);
+ musicAuthorLabel_->SetText("Musical Authors");
+ musicAuthorLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_THIRTY_SIZE); // 30:font data
+ musicAuthorLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+ Add(musicAuthorLabel_);
}
-void PlayersView::SetUpButton(UIButton *btn, const Point& point,
- int16_t width, int16_t height, UIView::OnClickListener *listener)
+void PlayersView::InitImage()
{
- if (btn == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::SetUpButton nullptr");
+ bgImg_ = new UIImageView();
+ if (bgImg_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ new fail");
return;
}
- Add(btn);
- btn->SetPosition(point.x, point.y, width, height);
- btn->SetOnClickListener(listener);
+ bgImg_->SetPosition(0, 0);
+ LOADIMG::LoadImageViewImg(bgImg_, PLAYER_IAMGES, PLAYER_BACK_GROUND);
+ Add(bgImg_);
}
-int PlayersView::ShowUpCheckBoxButton()
+void PlayersView::InitCircleProgress()
{
- ImageInfo *image;
- ImageInfo *hlImage;
- if (playerButton == nullptr) {
- playerButton = new UICheckBox();
+ playbackProgress_ = new UICircleProgress();
+ if (playbackProgress_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playbackProgress_ new fail");
+ return;
}
- if (soundButton == nullptr) {
- soundButton = new UIImageView();
+ playbackProgress_->SetPosition(140, 139, 172, 172); // 140:x 139:y 172:width 172:height
+ playbackProgress_->SetCenterPosition(86, 86); // 86:x 86:y
+ playbackProgress_->SetRange(PLAY_PROGRESS_MAX, PLAY_PROGRESS_MIN);
+ playbackProgress_->SetRadius(86); // 86:radius
+ playbackProgress_->SetStartAngle(0);
+ playbackProgress_->SetEndAngle(360); // 360: end angle
+ playbackProgress_->SetValue(0);
+ playbackProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, Color::Gray().full);
+ playbackProgress_->SetForegroundStyle(STYLE_LINE_COLOR, Color::Red().full);
+ playbackProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, 3); // 3:width
+ playbackProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, 3); // 3:width
+ Add(playbackProgress_);
+}
+
+void PlayersView::InitSoundAdjust()
+{
+ volumeSettingView_ = new VolumeSettingView();
+ if (volumeSettingView_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volumeSetting nullptr err");
+ return;
}
- if ((playerButton == nullptr) || (soundButton == nullptr)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new fail");
- return OHOS_FAILURE;
+ if (!volumeSettingView_->SetUpVolume()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volumeSetting SetUpVolume fail");
+ return;
}
- playerlistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(playerButton));
- if (playerlistener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerlistener new fail");
- return OHOS_FAILURE;
+ int32_t volume = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "current volume = %d", volume);
+ volumeSettingView_->GetProgress()->SetValue(volume);
+ if (volume == 0) {
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_MUTE_BUTTON, PLAYER_IAMGES);
+ volumeSettingView_->GetDecreaseButton()->SetImageSrc(image, image);
}
- playerButton->SetPosition(140, 139, 172, 172); // 140:x 139:y 172:width 172:height
- playerButton->SetOnClickListener(playerlistener);
- image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PLAYER, PLAYER_IAMGES);
- hlImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PLAYERHIGHLIGHT, PLAYER_IAMGES);
- playerButton->SetImages(hlImage, image);
- Add(playerButton);
-
- soundlistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(soundButton));
- if (soundlistener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soundlistener new fail");
- return OHOS_FAILURE;
+ volumeSliderEventListener_ = volumeSettingView_->GetVolumeEventListener();
+ if (volumeSliderEventListener_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundButtonOnClick volumeSliderEventListener_ nullptr err");
+ return;
}
- soundButton->SetTouchable(true);
- soundButton->SetPosition(178, 316, 95, 76); // 178:x 316:y 95:width 76:height
- soundButton->SetOnClickListener(soundlistener);
- if (!LoadPlayerImage(soundButton, PLAYER_SOUND_IMAGE)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerModelButton LoadPlayerImage fail");
- return false;
+ volumeSettingView_->SetVisible(false);
+ Add(volumeSettingView_);
+}
+
+void PlayersView::InitOption()
+{
+ playerOptionGroup_ = new PlayersOptionGroup(); // 打开BluetoothView对应的group
+ if (playerOptionGroup_ == nullptr) {
+ return;
}
- Add(soundButton);
- return OHOS_SUCCESS;
+ playerOptionGroup_->SetVisible(false);
+ Add(playerOptionGroup_);
}
-int PlayersView::ShowUpButton()
+void PlayersView::InitListView()
{
- struct Point pointBtn;
- ImageInfo *image;
- pointBtn.x = 331; // 331:x
- pointBtn.y = 168; // 168:y
- nextlistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(nextButton));
- if (nextlistener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "nextlistener new fail");
- return OHOS_FAILURE;
- }
- SetUpButton(nextButton, pointBtn, 93, 116, nextlistener); // 93:width 116:height
- image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_NEXT_BUTTON, PLAYER_IAMGES);
- nextButton->SetImageSrc(image, image);
- pointBtn.x = 31; // 31:x
- pointBtn.y = 168; // 168:y
- prelistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(preButton));
- if (prelistener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "prelistener new fail");
- return OHOS_FAILURE;
- }
- SetUpButton(preButton, pointBtn, 86, 116, prelistener); // 86:width 116:height
- image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_PRE_BUTTOW, PLAYER_IAMGES);
- preButton->SetImageSrc(image, image);
-
- pointBtn.x = 87; // 87:x
- pointBtn.y = 316; // 316:y
- modellistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(playerModelButton));
- if (modellistener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "modellistener new fail");
- return OHOS_FAILURE;
- }
- playerModelButton->SetTouchable(true);
- playerModelButton->SetPosition(pointBtn.x, pointBtn.y, 95, 76); // 95:width 76:height
- playerModelButton->SetOnClickListener(modellistener);
- if (!ShowUpPlayerMode()) {
- return OHOS_FAILURE;
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerModel %d", PlayersModel::GetInstance()->GetPlayerModel());
- Add(playerModelButton);
-
- return OHOS_SUCCESS;
-}
-
-bool PlayersView::ShowUpPlayerMode()
+ // 遍历文件名到list链表
+ PlayersListGroup::GetInstance()->SetUpListCase();
+ PlayersModel::GetInstance()->PlayerInit();
+ playersMusicListGroup = new PlayersMusicListGroup(); // 打开BluetoothView对应的group
+ if (playersMusicListGroup == nullptr) {
+ return;
+ }
+ playersMusicListGroup->SetVisible(false);
+ Add(playersMusicListGroup);
+}
+
+void PlayersView::SetUpPlayerMode()
{
if (PlayersModel::GetInstance()->GetPlayerModel() == LOOP) {
- if (!LoadPlayerImage(playerModelButton, PLAYER_PLAYERSMODEL_LOOP)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load PLAYER_PLAYERSMODEL_LOOP fail");
- return false;
- }
+ LOADIMG::LoadImageViewImg(playModelChangeButton_, PLAYER_IAMGES, PLAYER_PLAYERSMODEL_LOOP);
} else if (PlayersModel::GetInstance()->GetPlayerModel() == SEQUENCE) {
- if (!LoadPlayerImage(playerModelButton, PLAYER_PLAYERSMODEL_SEQUENCE)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load PLAYERSMODEL_SEQUENCE fail");
- return false;
- }
+ LOADIMG::LoadImageViewImg(playModelChangeButton_, PLAYER_IAMGES, PLAYER_PLAYERSMODEL_SEQUENCE);
} else if (PlayersModel::GetInstance()->GetPlayerModel() == REPEATS) {
- if (!LoadPlayerImage(playerModelButton, PLAYER_PLAYERSMODEL_REPEATS)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load PLAYERSMODEL_REPEATS fail");
- return false;
- }
+ LOADIMG::LoadImageViewImg(playModelChangeButton_, PLAYER_IAMGES, PLAYER_PLAYERSMODEL_REPEATS);
} else if (PlayersModel::GetInstance()->GetPlayerModel() == RANDOM) {
- if (!LoadPlayerImage(playerModelButton, PLAYER_PLAYERSMODEL_RANDOM)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "load PLAYERSMODEL_RANDOM fail");
- return false;
- }
+ LOADIMG::LoadImageViewImg(playModelChangeButton_, PLAYER_IAMGES, PLAYER_PLAYERSMODEL_RANDOM);
}
- return true;
}
-int PlayersView::ShowUpButtonView()
+void PlayersView::PlayerHeadsetReset()
{
- int32_t ret = ShowUpCheckBoxButton();
- if (ret == OHOS_FAILURE) {
- return OHOS_FAILURE;
- }
- if (nextButton == nullptr) {
- nextButton = new UIButton();
- }
- if (preButton == nullptr) {
- preButton = new UIButton();
- }
- if (optionsButton == nullptr) {
- optionsButton = new UIButton();
- }
- if (pullButton == nullptr) {
- pullButton = new UIButton();
- }
- if (playerModelButton == nullptr) {
- playerModelButton = new UIImageView();
- }
- if ((nextButton == nullptr) || (preButton == nullptr) || (playerModelButton == nullptr) || (optionsButton == nullptr) ||
- (pullButton == nullptr)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UIButton new fail");
- return OHOS_FAILURE;
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowUpButtonView");
-
- ret = ShowUpButton();
- if (ret == OHOS_FAILURE) {
- return OHOS_FAILURE;
- }
- ret = ShowUpButtonOptions();
- if (ret == OHOS_FAILURE) {
- return OHOS_FAILURE;
- }
- ret = ShowUpCircleProgress();
- if (ret == OHOS_FAILURE) {
- return OHOS_FAILURE;
+ if (playerOrPauseButton_->GetState() == UICheckBox::UICheckBoxState::UNSELECTED) {
+ SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
+ } else {
+ SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
}
- return OHOS_SUCCESS;
}
-int PlayersView::ShowUpButtonOptions()
-{
- struct Point pointBtn;
- pointBtn.x = 284; // 284 : x
- pointBtn.y = 316; // 316 : y
- optionslistener = new ButtonOnClickListener(reinterpret_cast<UIView*>(optionsButton));
- if (optionslistener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "optionslistener new fail");
- return OHOS_FAILURE;
- }
- SetUpButton(optionsButton, pointBtn, 75, 76, optionslistener); // 75:width 76:height
- ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(PLAYER_OPTIONS_IMAGE, PLAYER_IAMGES);
- optionsButton->SetImageSrc(image, image);
-
- pointBtn.x = 178; // 178:x
- pointBtn.y = 394; // 394:y
- SetUpButton(pullButton, pointBtn, 95, 48, nullptr); // 95:width 48:height
- pullButton->SetImageSrc(PNG_PULLBUTTON_FACE_IMAGE, PNG_PULLBUTTON_FACE_IMAGE);
- return OHOS_SUCCESS;
-}
-
-int PlayersView::ShowUpCircleProgress()
-{
- if (playbackProgress == nullptr) {
- playbackProgress = new UICircleProgress();
- if (playbackProgress == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playbackProgress new fail");
- return OHOS_FAILURE;
- }
- }
- playbackProgress->SetPosition(140, 139, 172, 172); // 140:x 139:y 172:width 172:height
- playbackProgress->SetCenterPosition(86, 86); // 86:x 86:y
- playbackProgress->SetRange(PLAY_PROGRESS_MAX, PLAY_PROGRESS_MIN);
- playbackProgress->SetRadius(86); // 86:radius
- playbackProgress->SetStartAngle(0);
- playbackProgress->SetEndAngle(360); // 360: end angle
- playbackProgress->SetValue(0);
- playbackProgress->SetBackgroundStyle(STYLE_LINE_COLOR, Color::Gray().full);
- playbackProgress->SetForegroundStyle(STYLE_LINE_COLOR, Color::Red().full);
- playbackProgress->SetBackgroundStyle(STYLE_LINE_WIDTH, 3); // 3:width
- playbackProgress->SetForegroundStyle(STYLE_LINE_WIDTH, 3); // 3:width
- Add(playbackProgress);
- return OHOS_SUCCESS;
-}
-
-void PlayersView::CreateJumpView(void)
+void PlayersView::PreLoad(void)
{
- if (jumpView == nullptr) {
- jumpView = new JumpView();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView new fail");
- return;
+ if (!viewiInitStatus) {
+ if (InitView()) {
+ viewiInitStatus = true;
}
}
}
-void PlayersView::CreatePlayersPresenter(void)
+void PlayersView::UnLoad(void)
{
- if (playersPresenter == nullptr) {
- playersPresenter = new PlayersPresenter();
- if (playersPresenter == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersPresenter new fail");
- return;
- }
- }
+ // Players's usage scenes is complicated, so we do not release it's resources inner slice.
}
-void PlayersView::CreatePlayerOnDragListener(void)
+void PlayersView::OnInactive(void)
{
- if (playerOnDragListener == nullptr) {
- playerOnDragListener = new PlayerOnDragListener();
- if (playerOnDragListener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerOnDragListener new fail");
- return;
- }
- }
+ volumeSettingView_->SetVisible(false);
+ playersMusicListGroup->SetVisible(false);
+ SetVisible(true);
}
-bool PlayersView::InitBackGround(void)
+
+bool PlayersView::OnClick(UIView &view, const ClickEvent &event)
{
- if (backGround == nullptr) {
- backGround = new UIImageView();
- if (backGround == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGround new fail");
- return false;
+ UNUSED(event);
+ if (strcmp(view.GetViewId(), NEXT_SONG_BUTTON) == 0) {
+ playbackProgress_->SetValue(0); // 0:进度0%
+ playbackProgress_->Invalidate();
+ PlayersModel::GetInstance()->LoopingPlayout();
+ } else if (strcmp(view.GetViewId(), PRE_SONG_BUTTON) == 0) {
+ playbackProgress_->SetValue(0); // 0:进度0%
+ playbackProgress_->Invalidate();
+ PlayersModel::GetInstance()->PreviousPlayout();
+ } else if (strcmp(view.GetViewId(), PLAY_OR_PAUSE_BUTTON) == 0) {
+ PlayOrPauseButtonOnClick();
+ } else if (strcmp(view.GetViewId(), PLAYMODE_CHANGE_BUTTON) == 0) {
+ PlayersModel::GetInstance()->SetPlayerModelAddOne();
+ if (PlayersModel::GetInstance()->GetPlayerModel() > RANDOM) {
+ PlayersModel::GetInstance()->SetPlayerModel(LOOP);
}
- }
- backGround->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
- if (!LoadPlayerImage(backGround, PLAYER_BACK_GROUND)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGround LoadPlayerImage fail");
- return false;
- }
- Add(backGround);
+ SetUpPlayerMode();
+ } else if (strcmp(view.GetViewId(), VOICE_ADJUST_BUTTON) == 0) {
+ volumeSliderEventListener_->SetPlayerCoefficients(VOLUMEPLAYERS); // 进度条系数
+ volumeSettingView_->SetVisible(true);
+ } else if (strcmp(view.GetViewId(), OPTIONS_BUTTON) == 0) {
+ playerOptionGroup_->SetVisible(true);
+ } else if (strcmp(view.GetViewId(), PULL_BUTTON) == 0) {
+ // 无对应的逻辑代码,预留接口
+ }
+ Invalidate();
return true;
}
-void PlayersView::CreatePlayerMusicName()
+void PlayersView::PlayOrPauseButtonOnClick()
{
- if (titleLabel == nullptr) {
- titleLabel = new UILabel();
- if (titleLabel == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "titleLabel new fail");
- return;
- }
+ uint8_t state = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;
+ int32_t playerState;
+ int32_t connCtState = avrcp_ct_get_device_connect_state(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+ int32_t connTgState = avrcp_tg_get_device_connect_state(SettingBluetoothModel::GetInstance()->GetLastConnedAddr());
+
+ state = playerOrPauseButton_->GetState();
+ if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::GetInstance()->GetPlayerCtr() nullptr");
+ return;
}
- titleLabel->SetPosition(127, 35, 200, 53); // 127:x 35:y 200:width 53:height
- titleLabel->SetText("Music Name");
- titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);
- Add(titleLabel);
+ PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "buttonState = %d playerState = %d", state, playerState);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "connCtState = %d connTgState = %d", connCtState, connTgState);
- if (subTitleLabel == nullptr) {
- subTitleLabel = new UILabel();
- if (subTitleLabel == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "subTitleLabel new fail");
- return;
+ if (GetCurrCallNum() != 0 && GetScoConnectState() == HFP_SCO_STATE_CONNECTED) {
+ if (state == UICheckBox::UICheckBoxState::SELECTED) {
+ playerOrPauseButton_->SetState(UICheckBox::UICheckBoxState::UNSELECTED);
+ } else {
+ playerOrPauseButton_->SetState(UICheckBox::UICheckBoxState::SELECTED);
}
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerButtonOnClick] calling phone");
+ return;
+ }
+ if (state == UICheckBox::UICheckBoxState::SELECTED) {
+ /* start play */
+ PlayersModel::GetInstance()->ConnectBtAndLocalPlay(connCtState, connTgState, playerState);
+ } else if (state == UICheckBox::UICheckBoxState::UNSELECTED) {
+ PlayersModel::GetInstance()->ConnectBtAndLocalPause(connCtState, connTgState);
}
- subTitleLabel->SetPosition(77, 92, 300, 38); // 77:x 92:y 300:width 38:height
- subTitleLabel->SetText("Musical Authors");
- subTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); // 30:font data
- subTitleLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER, UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
- Add(subTitleLabel);
- return;
}
bool PlayersView::OnDragEvent(const DragEvent& event)
{
- /* 300: y limit of drag start point */
- if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) && (event.GetStartPoint().y > 300)) {
- PlayersPresenter::GetInstance()->ShowPlayerListGroup();
- return true;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView OnDrage");
+ int yMoveDistance = 300;
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) &&
+ (event.GetStartPoint().y > yMoveDistance)) {
+ PlayersMusicListGroup::GetInstance()->RefreshMusicList();
+ playersMusicListGroup->SetVisible(true);
+ return true;
}
-
+ Invalidate();
return false;
}
-bool PlayersView::InitView(void)
+void PlayersView::Update(void)
{
- int ret;
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " PlayersView InitView");
-
- if (!InitBackGround()) {
- return false;
+ if (playbackProgress_ == nullptr) {
+ return;
}
+ int32_t playerState = 0;
+ PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
- CreatePlayerMusicName();
- // changeView
- CreateJumpView();
- // OnClick
- CreatePlayersPresenter();
- // OnDrag
- CreatePlayerOnDragListener();
- // 按键设置
- ret = ShowUpButtonView();
- if (ret == OHOS_FAILURE) {
- return false;
+ if (playerState == PLAYER_STARTED) {
+ SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
+ } else {
+ SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
}
- // 遍历文件名到list链表
- PlayersListGroup::GetInstance()->SetUpListCase();
- PlayersModel::GetInstance()->PlayerInit();
- ShowUpListView();
- SetTouchable(true);
- SetDraggable(true);
- return true;
-}
-void PlayersView::PreLoad(void)
-{
- if (!viewiInitStatus) {
- if (InitView()) {
- viewiInitStatus = true;
+ if (playerState == PLAYER_STARTED) {
+ PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime_);
+ PlayersModel::GetInstance()->GetDuration(playerMusicDuration_);
+ if (playerMusicDuration_ != 0) {
+ playerProgressValue_ = (playerCurrentTime_ * PROGRESS_PERCENTAGE) / playerMusicDuration_;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerProgressValue_ %lld", playerProgressValue_);
+ } else {
+ playerProgressValue_ = 100; // 100: max progress value
}
+ PlayersModel::GetInstance()->SetCircleProgress(playerProgressValue_);
+ playbackProgress_->SetValue(playerProgressValue_);
+ playbackProgress_->Invalidate();
}
}
-void PlayersView::UnLoad(void)
+uint32_t PlayersView::GetPeriod(void)
{
- // Players's usage scenes is complicated, so we do not release it's resources inner slice.
+ return PLAYER_PERIOD;
}
-bool PlayersView::LoadPlayerImage(UIImageView *view, uint32_t resId)
-{
- std::string file = PLAYER_IAMGES;
- ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);
- if (image == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::LoadPlayerImage %x fail", resId);
- return false;
- }
- view->SetSrc(image);
- return true;
-}
}
--- /dev/null
+ /*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.
+ * Description: FloatAccessView
+ * Author: Hisi Graphic Team
+ * Created: 2025-09
+ */
+
+#include <string>
+#include <cmath>
+#include "NativeRegisterManager.h"
+#include "wearable_log.h"
+#include "components/root_view.h"
+#include "common/screen.h"
+#include "common/image_cache_manager.h"
+#include "TransitionType.h"
+#include "NativeAbility.h"
+#include "kv_store.h"
+#include "easing_equation.h"
+#include "quickaccess/FloatAccessView.h"
+
+namespace OHOS {
+constexpr uint16_t ITEM_SIZE = 60;
+constexpr uint16_t ITEM_PADDING = 10;
+constexpr uint16_t VIEW_ID_VALUE_LEN = 4;
+constexpr uint16_t EXT_OFFSET = 50;
+constexpr uint16_t MAX_FILE_NAME_LENGTH = 7;
+
+inline bool ItemIsNotNull(AppItem item)
+{
+ return item.id != VIEW_INVALID;
+}
+
+FloatAccessView* FloatAccessView::GetInstance(void)
+{
+ static FloatAccessView instance;
+ return &instance;
+}
+
+void FloatAccessView::AddItem(AppItem item, uint8_t index)
+{
+ if (index >= MAX_ITEM_SIZE) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "index value must smaller than 3");
+ return;
+ }
+ items_[index] = item;
+ SaveAppItemsData();
+}
+
+void FloatAccessView::DeleteItem(const char* label)
+{
+ if (label == nullptr) {
+ return;
+ }
+ for (int i = 0; i < MAX_ITEM_SIZE; ++i) {
+ if (strcmp(items_[i].label, label) == 0) {
+ items_[i] = {};
+ SaveAppItemsData();
+ return;
+ }
+ }
+}
+
+AppItem FloatAccessView::GetItem(uint8_t index)
+{
+ if (index >= MAX_ITEM_SIZE) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "index value must smaller than 3");
+ return {};
+ }
+ return items_[index];
+}
+
+void FloatAccessView::OnItemClick(const std::string& name)
+{
+ uint32_t targetId = NativeAbility::GetInstance().GetCurTargetId();
+ uint16_t curSlice = static_cast<uint16_t>(targetId & SLICE_MASK);
+
+ for (int i = 0; i < MAX_ITEM_SIZE; ++i) {
+ if (strcmp(items_[i].label, name.c_str()) == 0 && curSlice != items_[i].id) {
+ // 添加点击应用标记 (进入应用时,退出悬浮框,并且不显示退出动画)
+ isClickItem_ = true;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FloatAccessView::OnClick viewid = %d", items_[i].id);
+ NativeAbility::GetInstance().ChangeSlice(items_[i].id, TransitionType::TRANSITION_ZOOM);
+ return;
+ }
+ }
+}
+
+bool FloatAccessView::OnClick(UIView& view, const ClickEvent& event)
+{
+ ExitView();
+ return false;
+}
+
+void FloatAccessView::EnterApp()
+{
+ uint32_t targetId = NativeAbility::GetInstance().GetCurTargetId();
+ uint16_t curSlice = static_cast<uint16_t>(targetId & SLICE_MASK);
+
+ for (int i = 0; i < MAX_ITEM_SIZE; ++i) {
+ // 快捷应用存在且不为当前应用,则进入应用页
+ if (curSlice != (items_[i].id)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FloatAccessView::OnClick viewid = %d", items_[i].id);
+ NativeAbility::GetInstance().ChangeSlice(items_[i].id, TransitionType::TRANSITION_ZOOM);
+ return;
+ }
+ }
+}
+
+void FloatAccessView::InitView()
+{
+ if (!isInitView_) {
+ LoadAppItemsData();
+ if (GetItemSize() == 0) {
+ return;
+ } else if (GetItemSize() == 1) {
+ EnterApp();
+ } else {
+ Resize(Screen::GetInstance().GetWidth() + EXT_OFFSET, Screen::GetInstance().GetHeight() + EXT_OFFSET);
+ SetStyle(STYLE_BACKGROUND_OPA, 100); // opa 100
+ SetDraggable(false);
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
+ floatBoxView_ = new UIFloatBoxView();
+ enterCallback_ = new FloatAnimatorCallback(floatBoxView_);
+ if (floatBoxView_ == nullptr || enterCallback_ == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FloatAccessView::InitView failed, can't alloc memory");
+ return;
+ }
+ floatBoxView_->SetOnItemClickListener(this);
+ floatBoxView_->SetOnClickListener(this);
+ floatBoxView_->SetPosition(EXT_OFFSET, EXT_OFFSET,
+ Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ floatBoxView_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ floatBoxView_->SetItemSize(ITEM_SIZE);
+ floatBoxView_->SetItemSpacing(ITEM_PADDING);
+ floatBoxView_->SetDragFactor(0.4f); // 0.4 : factor
+ floatBoxView_->SetAccFactor(0.5f); // 0.5 : factor
+ floatBoxView_->SetAlignAvgSpeed(5.0f); // 5.0 : factor
+ AddAppItemsData();
+ Add(floatBoxView_);
+ isInitView_ = true;
+ }
+ }
+}
+
+void FloatAccessView::ShowView()
+{
+ if (!isInitView_) {
+ InitView();
+ }
+ if (enterCallback_ == nullptr || enterCallback_->GetState() == Animator::START) {
+ return;
+ }
+ isShowView_ = true;
+ RootView::GetInstance()->AddSystemView(this);
+ Invalidate();
+ enterCallback_->DoEnter();
+}
+
+void FloatAccessView::ExitView()
+{
+ if (!isInitView_ || !isShowView_ || enterCallback_ == nullptr || enterCallback_->GetState() == Animator::START) {
+ return;
+ }
+ if (isClickItem_) {
+ CleanView();
+ return;
+ }
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ enterCallback_->DoExit();
+}
+
+void FloatAccessView::CleanView()
+{
+ RootView::GetInstance()->RemoveSystemView(this);
+ RemoveAll();
+ if (floatBoxView_ != nullptr) {
+ delete floatBoxView_;
+ floatBoxView_ = nullptr;
+ }
+ if (enterCallback_ != nullptr) {
+ delete enterCallback_;
+ enterCallback_ = nullptr;
+ }
+ isInitView_ = false;
+ isShowView_ = false;
+ isClickItem_ = false;
+}
+
+bool FloatAccessView::IsShowView()
+{
+ return isShowView_;
+}
+
+uint8_t FloatAccessView::GetItemSize()
+{
+ uint8_t count = 0;
+ for (int i = 0; i< MAX_ITEM_SIZE; i++) {
+ if (ItemIsNotNull(items_[i])) {
+ ++count;
+ }
+ }
+ return count;
+}
+
+void FloatAccessView::LoadAppItemsData()
+{
+ // 只加载一次
+ if (isLoadData_) {
+ return;
+ }
+ char quick[MAX_ITEM_SIZE][VIEW_ID_VALUE_LEN] = {0, 0, 0};
+ // 从文件中读取快捷应用的viewId
+ (void)UtilsGetValue("quick1", quick[0], VIEW_ID_VALUE_LEN); // 0: index
+ (void)UtilsGetValue("quick2", quick[1], VIEW_ID_VALUE_LEN); // 1: index
+ (void)UtilsGetValue("quick3", quick[2], VIEW_ID_VALUE_LEN); // 2: index
+
+ List<AppItem>& nativeAppLists = NativeRegisterManager::GetInstance().GetNativeAppLists();
+ uint8_t registerNativeAppNum = nativeAppLists.Size();
+ ListNode<AppItem>* appNode = nativeAppLists.Head();
+ for (int32_t index = 0; index < registerNativeAppNum; index++) {
+ const char* viewIdStr = std::to_string(appNode->data_.id).c_str();
+ // 根据id设置应用的信息
+ for (int k = 0; k < MAX_ITEM_SIZE; k++) {
+ if (strcmp(viewIdStr, quick[k]) == 0) {
+ items_[k] = appNode->data_;
+ break;
+ }
+ }
+ appNode = appNode->next_;
+ }
+ isLoadData_ = true;
+}
+
+void FloatAccessView::AddAppItemsData()
+{
+ if (floatBoxView_ == nullptr) {
+ return;
+ }
+ FloatItem items[MAX_ITEM_SIZE];
+ int cnt = 0;
+ for (int i = 0; i < MAX_ITEM_SIZE; i++) {
+ if (ItemIsNotNull(items_[i])) {
+ std::string s(items_[i].label);
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadSingleRes(items_[i].iconSmall);
+ items[cnt++] = {s, image};
+ }
+ }
+ floatBoxView_->AddItems(items, cnt);
+}
+
+void FloatAccessView::SaveAppItemsData()
+{
+ char dest[MAX_FILE_NAME_LENGTH] = "quick"; // quick1,quick2,quick3
+ dest[MAX_FILE_NAME_LENGTH - 1] = '\0';
+ for (int i = 0; i<MAX_ITEM_SIZE; i++) {
+ if (ItemIsNotNull(items_[i])) {
+ dest[MAX_FILE_NAME_LENGTH - 2] = '1'+ i; // 2: 变量数字在倒数第二个位置
+ (void)UtilsSetValue(dest, std::to_string(items_[i].id).c_str());
+ }
+ }
+}
+
+/**
+ * @Param overshot : 超出位置占位移的比例
+ * @Param peakTime : 到达峰值的时间(0~1)
+ */
+double ReboundFunc(double distance, double t, double duration,
+ double overshot = 0.3, double peakTime = 0.6) {
+ if (t <= 0) return 0.0;
+ if (t >= duration) return distance;
+
+ double x = t / duration;
+ double peakPosition = distance * (1 + overshot);
+
+ // 使用三次贝塞尔曲线控制点确保连续性
+ if (x < peakTime) {
+ // 三次曲线: 曲速到峰值
+ double p = x / peakTime;
+ return distance * (3 * p * p - 2 * p * p * p) + (peakPosition - distance) * p * p; // 3,2: 阶数
+ } else {
+ // 平滑回弹曲线: 从峰值回弹
+ double r = (x - peakTime) / (1 - peakTime);
+ return peakPosition - (peakPosition - distance) * (3 * r * r - 2 * r * r * r); // 3,2: 阶数
+ }
+}
+
+void FloatAnimatorCallback::Callback(UIView *view)
+{
+ UIFloatBoxView* floatBoxView_ = dynamic_cast<UIFloatBoxView*>(view);
+ int16_t pos;
+ if (isExit_) {
+ pos = EasingEquation::QuadEaseOut(startPos_, endPos_, animator_->GetRunTime(), animator_->GetTime());
+ } else {
+ // 进入时使用反弹动画
+ int16_t totalTime = 100; // 100: 表示总时间为100份
+ int16_t curTime = EasingEquation::LinearEaseNone(0, totalTime, animator_->GetRunTime(), animator_->GetTime());
+ int distance = endPos_ - startPos_;
+ pos = startPos_ + ReboundFunc(distance, curTime, totalTime);
+ }
+ floatBoxView_->SetPosition(pos, pos);
+ floatBoxView_->Invalidate();
+}
+
+void FloatAnimatorCallback::DoEnter()
+{
+ isExit_ = false;
+ startPos_ = EXT_OFFSET;
+ endPos_ = -10; // -10 end pos
+ animator_->Start();
+}
+
+void FloatAnimatorCallback::DoExit()
+{
+ isExit_ = true;
+ startPos_ = 0;
+ endPos_ = EXT_OFFSET;
+ animator_->Start();
+}
+
+void FloatAnimatorCallback::OnStop(UIView& view)
+{
+ if (isExit_) {
+ FloatAccessView::GetInstance()->CleanView();
+ }
+}
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: LoadingFragment.cpp
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#include "recent_app/LoadingFragment.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+static constexpr uint8_t DEFAULT_TEXT_SIZE = 30;
+
+void LoadingFragment::OnCreateView(void* data)
+{
+ loadingLabel_ = new UILabel();
+ if (loadingLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UILabel fail");
+ return;
+ }
+ fragmentView_.Add(loadingLabel_);
+ loadingLabel_->SetText("Loading...");
+ loadingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
+ loadingLabel_->Resize(300, 100); // 300, 100: size
+ loadingLabel_->LayoutCenterOfParent();
+ loadingLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+}
+
+void LoadingFragment::OnDestroyView()
+{
+ if (loadingLabel_ != nullptr) {
+ delete loadingLabel_;
+ }
+}
+}
\ No newline at end of file
REGIST_SLICE(VIEW_RECENT_APP, RecentAppView, RecentAppPresenter);
- RecentAppPresenter::RecentAppPresenter()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppPresenter::RecentAppPresenter()");
- }
-
- RecentAppPresenter::~RecentAppPresenter() {}
-
- void RecentAppPresenter::OnResume()
- {
- if (view_ != nullptr) {
- view_->LoadContent();
- }
- }
-
- bool RecentAppPresenter::OnClick(UIView &view, const ClickEvent &event)
- {
- UIRollerView* roller = view_->GetRollerView();
- if (roller == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "roller is nullptr!");
- return false;
- }
-
- UIViewGroup* currentItemGroup = roller->GetCurrentItem();
- if (currentItemGroup == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentItemGroup is nullptr!");
- return false;
- }
-
- std::string itemName = roller->GetCurrentItemName();
- std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
- std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
-
- uint32_t sliceId = 0;
- bool isNativeSlice = true;
- if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
- sliceId = static_cast<uint32_t>(std::stoul(name));
- } else {
- isNativeSlice = false;
- }
-
- const char* viewId = view.GetViewId();
- if (viewId != nullptr && strcmp(viewId, RECENT_APP_DELETE_BTN_ID) == 0) {
- if (isNativeSlice) {
- RecentManager::GetInstance()->RemoveRecentApp(sliceId);
- } else {
- RecentManager::GetInstance()->RemoveRecentApp(name.c_str());
- }
- roller->RemoveItem(itemName);
- return true;
- }
-
- Point clickPoint = event.GetCurrentPos();
- Rect rect = currentItemGroup->GetChildrenHead()->GetRect();
- if (rect.IsContains(clickPoint)) {
- if (isNativeSlice) {
- NativeAbility::GetInstance().ChangeSlice(sliceId);
- } else {
-#ifdef JS_ENABLE
- StartJsApp(const_cast<char*>(name.c_str()));
-#endif
- }
- }
- return true;
+void RecentAppPresenter::OnResume()
+{
+ if (view_ != nullptr) {
+ view_->OnResume();
}
}
+}
*/
#include "recent_app/RecentAppView.h"
+#include "recent_app/RollerRecentAppFragment.h"
#include "wearable_log.h"
#include "common/image_cache_manager.h"
#include "common/screen.h"
#include "RecentManager.h"
namespace OHOS {
-static constexpr uint8_t DEFAULT_TEXT_SIZE = 30;
-RecentAppView::RecentAppView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppView::RecentAppView");
- loadingAnimCb_.SetRecentAppView(this);
-}
RecentAppView::~RecentAppView()
{
- if (roller_ != nullptr) {
- delete roller_;
+ if (loadingFragment_ != nullptr) {
+ loadingFragment_->DestroyView();
+ delete loadingFragment_;
+ loadingFragment_ = nullptr;
+ }
+ if (rencentAppFragment_ != nullptr) {
+ rencentAppFragment_->DestroyView();
+ delete rencentAppFragment_;
+ rencentAppFragment_ = nullptr;
}
if (loadingAnim_ != nullptr) {
if (loadingAnim_->GetState() != Animator::STOP) {
}
delete loadingAnim_;
}
- if (loadingLabel_ != nullptr) {
- delete loadingLabel_;
- }
- if (noRecentAppLabel_ != nullptr) {
- delete noRecentAppLabel_;
- }
- if (delBtn_ != nullptr) {
- delete delBtn_;
- }
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppView::~RecentAppView");
}
void RecentAppView::OnStart(void)
{
- UIViewGroup* container = GetRootContainer();
+ loadingAnimCb_.SetRecentAppView(this);
- loadingLabel_ = new UILabel();
- if (loadingLabel_ == nullptr) {
- return;
+ if (loadingFragment_ == nullptr) {
+ loadingFragment_ = new LoadingFragment();
}
- container->Add(loadingLabel_);
- loadingLabel_->SetText("Loading...");
- loadingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
- loadingLabel_->Resize(300, 100); // 300, 100: size
- loadingLabel_->LayoutCenterOfParent();
- loadingLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
- UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+ loadingFragment_->GetFragmentView()->SetPosition(0, 0, GetRootContainer()->GetWidth(),
+ GetRootContainer()->GetHeight());
+ loadingFragment_->CreateView();
+ AddViewToRootContainer(loadingFragment_->GetFragmentView());
}
-void RecentAppView::LoadContent()
+void RecentAppView::OnResume()
{
if (viewiInitStatus_) {
return;
}
- UIViewGroup* rootContainer = GetRootContainer();
if (!RecentManager::GetInstance()->IsUpdateCompleted()) {
- loadingAnim_ = new Animator(&loadingAnimCb_, roller_, 0, true);
+ loadingAnim_ = new Animator(&loadingAnimCb_, nullptr, 0, true);
if (loadingAnim_ == nullptr) {
return;
}
loadingAnim_->Start();
} else {
- LoadRecentAppContent();
+ LoadContent();
}
viewiInitStatus_ = true;
}
-void RecentAppView::LoadingAnimCb::Callback(UIView* view)
-{
- if (RecentManager::GetInstance()->IsUpdateCompleted()) {
- recentAppView_->LoadRecentAppContent();
- }
-}
-
-void RecentAppView::AddRecentAppToRoller()
+void RecentAppView::LoadContent()
{
- const List<RecentAppInfo*>& recent = RecentManager::GetInstance()->GetRecentApps();
- ListNode<RecentAppInfo*>* node = recent.Begin();
- std::string alignItemName = "";
- while (node != recent.End()) {
- RecentAppInfo* appInfo = node->data_;
- ImageInfo* imgInfo = appInfo->snapshot;
- std::string name;
- if (appInfo->isNativeSlice) {
- name = RECENT_ITEM_NATIVE_PREFIX + std::to_string(appInfo->targetId & SLICE_MASK);
- } else {
- name = RECENT_ITEM_JS_PREFIX + appInfo->bundleName;
- }
- if (imgInfo->data != nullptr) {
- roller_->AddItem(name, imgInfo);
- } else {
- std::string path(appInfo->snapshot->file, appInfo->snapshot->fileLen);
- if (appInfo->snapshot->resId == 0) {
- imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(path);
- } else {
- imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(appInfo->snapshot->resId, path);
- }
-
- if (imgInfo == nullptr) {
- GRAPHIC_LOGE("Load res failed: %s", path.c_str());
- node = node->next_;
- continue;
- }
- roller_->AddItem(name, imgInfo);
- }
- node = node->next_;
- if (alignItemName == "") {
- alignItemName = name;
- }
+ if (loadingAnim_ != nullptr) {
+ loadingAnim_->Stop();
}
- roller_->SetCurrentItem(alignItemName);
-}
-void RecentAppView::InitRecentApps()
-{
- if (delBtn_ == nullptr) {
- delBtn_ = new UILabelButton();
- }
- if (delBtn_ == nullptr) {
- GRAPHIC_LOGE("new delBtn_ failed!");
- return;
+ if (loadingFragment_ != nullptr) {
+ loadingFragment_->GetFragmentView()->SetVisible(false);
}
-
- if (roller_ == nullptr) {
- roller_ = new UIRollerView(false);
+ if (rencentAppFragment_ == nullptr) {
+ rencentAppFragment_ = new RollerRecentAppFragment();
}
- if (roller_ == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UIRollerView fail");
- return;
+ if (rencentAppFragment_ != nullptr) {
+ rencentAppFragment_->GetFragmentView()->SetPosition(0, 0, GetRootContainer()->GetWidth(),
+ GetRootContainer()->GetHeight());
+ rencentAppFragment_->CreateView();
+ AddViewToRootContainer(rencentAppFragment_->GetFragmentView());
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new RollerRecentAppFragment failed!");
}
-
- UIView::OnClickListener* onClickListener = dynamic_cast<UIView::OnClickListener*>(presenter_);
-
- GetRootContainer()->Add(roller_);
- roller_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
- roller_->SetItemSize(250, 250); // 250: item size
- roller_->SetThrowDrag(true);
- roller_->SetItemPadding(80); // 80: item padding
- roller_->SetCamDistance(380); // 380: Camera distance
- roller_->SetCamY(48); // 48: camY
- roller_->SetOnClickListener(onClickListener);
-
- GetRootContainer()->Add(delBtn_);
- delBtn_->Resize(120, 50); // 120,50: width and height
- delBtn_->LayoutCenterOfParent(0, 180); // 180: y offset
- delBtn_->SetText("delete");
- delBtn_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
- delBtn_->SetViewId(RECENT_APP_DELETE_BTN_ID);
- delBtn_->SetOnClickListener(onClickListener);
-
- AddRecentAppToRoller();
}
-void RecentAppView::LoadRecentAppContent()
+void RecentAppView::LoadingAnimCb::Callback(UIView* view)
{
- if (loadingAnim_ != nullptr) {
- loadingAnim_->Stop();
- }
-
- if (loadingLabel_ != nullptr) {
- loadingLabel_->SetVisible(false);
- }
-
- uint32_t size = RecentManager::GetInstance()->GetCurrentSize();
- if (size == 0) {
- if (noRecentAppLabel_ == nullptr) {
- noRecentAppLabel_ = new UILabel();
- }
- if (noRecentAppLabel_ != nullptr) {
- GetRootContainer()->Add(noRecentAppLabel_);
- noRecentAppLabel_->SetText("No Recent App.");
- noRecentAppLabel_->Resize(300, 100); // 300, 100: size
- noRecentAppLabel_->LayoutCenterOfParent();
- noRecentAppLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
- UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
- }
- return;
+ if (RecentManager::GetInstance()->IsUpdateCompleted()) {
+ recentAppView_->LoadContent();
}
-
- InitRecentApps();
}
}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: RollerRecentAppFragment.cpp
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#include "recent_app/RollerRecentAppFragment.h"
+#include "wearable_log.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+#include "Slice.h"
+#include "RecentManager.h"
+#include "NativeAbility.h"
+#include "msg_center_customer.h"
+
+namespace OHOS {
+static constexpr uint8_t DEFAULT_TEXT_SIZE = 30;
+
+void RollerRecentAppFragment::OnCreateView(void* data)
+{
+ LoadRecentAppContent();
+}
+
+void RollerRecentAppFragment::OnDestroyView()
+{
+ if (rollerContainer_ != nullptr) {
+ delete rollerContainer_;
+ }
+ if (noRecentAppLabel_ != nullptr) {
+ delete noRecentAppLabel_;
+ }
+ if (delBtn_ != nullptr) {
+ delete delBtn_;
+ }
+}
+
+void RollerRecentAppFragment::LoadRecentAppContent()
+{
+ uint32_t size = RecentManager::GetInstance()->GetCurrentSize();
+ if (size == 0) {
+ if (noRecentAppLabel_ == nullptr) {
+ noRecentAppLabel_ = new UILabel();
+ }
+ if (noRecentAppLabel_ != nullptr) {
+ fragmentView_.Add(noRecentAppLabel_);
+ noRecentAppLabel_->SetText("No Recent App.");
+ noRecentAppLabel_->Resize(300, 100); // 300, 100: size
+ noRecentAppLabel_->LayoutCenterOfParent();
+ noRecentAppLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+ }
+ return;
+ }
+
+ InitRecentApps();
+}
+
+void RollerRecentAppFragment::InitRecentApps()
+{
+ if (delBtn_ == nullptr) {
+ delBtn_ = new UILabelButton();
+ }
+ if (delBtn_ == nullptr) {
+ GRAPHIC_LOGE("new UILabelButton failed!");
+ return;
+ }
+
+ if (rollerContainer_ == nullptr) {
+ rollerContainer_ = new UIRollerView(false);
+ }
+ if (rollerContainer_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UIRollerView fail");
+ return;
+ }
+
+ fragmentView_.Add(rollerContainer_);
+ rollerContainer_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ rollerContainer_->SetItemSize(250, 250); // 250: item size
+ rollerContainer_->SetThrowDrag(true);
+ rollerContainer_->SetItemPadding(80); // 80: item padding
+ rollerContainer_->SetCamDistance(380); // 380: Camera distance
+ rollerContainer_->SetCamY(48); // 48: camY
+ rollerContainer_->SetOnClickListener(this);
+
+ fragmentView_.Add(delBtn_);
+ delBtn_->Resize(120, 50); // 120,50: width and height
+ delBtn_->LayoutCenterOfParent(0, 180); // 180: y offset
+ delBtn_->SetText("delete");
+ delBtn_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
+ delBtn_->SetViewId(RECENT_APP_DELETE_BTN_ID);
+ delBtn_->SetOnClickListener(this);
+
+ AddRecentAppToRoller();
+}
+
+void RollerRecentAppFragment::AddRecentAppToRoller()
+{
+ const List<RecentAppInfo*>& recent = RecentManager::GetInstance()->GetRecentApps();
+ ListNode<RecentAppInfo*>* node = recent.Begin();
+ std::string alignItemName = "";
+ while (node != recent.End()) {
+ RecentAppInfo* appInfo = node->data_;
+ ImageInfo* imgInfo = appInfo->snapshot;
+ std::string name;
+ if (appInfo->isNativeSlice) {
+ name = RECENT_ITEM_NATIVE_PREFIX + std::to_string(appInfo->targetId & SLICE_MASK);
+ } else {
+ name = RECENT_ITEM_JS_PREFIX + appInfo->bundleName;
+ }
+ if (imgInfo->data != nullptr) {
+ rollerContainer_->AddItem(name, imgInfo);
+ } else {
+ std::string path(appInfo->snapshot->file, appInfo->snapshot->fileLen);
+ if (appInfo->snapshot->resId == 0) {
+ imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(path);
+ } else {
+ imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(appInfo->snapshot->resId, path);
+ }
+
+ if (imgInfo == nullptr) {
+ GRAPHIC_LOGE("Load res failed: %s", path.c_str());
+ node = node->next_;
+ continue;
+ }
+ rollerContainer_->AddItem(name, imgInfo);
+ }
+ node = node->next_;
+ if (alignItemName == "") {
+ alignItemName = name;
+ }
+ }
+ rollerContainer_->SetCurrentItem(alignItemName);
+}
+
+bool RollerRecentAppFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+ UIViewGroup* currentItemGroup = rollerContainer_->GetCurrentItem();
+ if (currentItemGroup == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentItemGroup is nullptr!");
+ return false;
+ }
+
+ std::string itemName = rollerContainer_->GetCurrentItemName();
+ std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
+ std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
+
+ uint32_t sliceId = 0;
+ bool isNativeSlice = true;
+ if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
+ sliceId = static_cast<uint32_t>(std::stoul(name));
+ } else {
+ isNativeSlice = false;
+ }
+
+ const char* viewId = view.GetViewId();
+ if (viewId != nullptr && strcmp(viewId, RECENT_APP_DELETE_BTN_ID) == 0) {
+ if (isNativeSlice) {
+ RecentManager::GetInstance()->RemoveRecentApp(sliceId);
+ } else {
+ RecentManager::GetInstance()->RemoveRecentApp(name.c_str());
+ }
+ rollerContainer_->RemoveItem(itemName);
+ return true;
+ }
+
+ Point clickPoint = event.GetCurrentPos();
+ Rect rect = currentItemGroup->GetChildrenHead()->GetRect();
+ if (rect.IsContains(clickPoint)) {
+ if (isNativeSlice) {
+ NativeAbility::GetInstance().ChangeSlice(sliceId);
+ } else {
+#ifdef JS_ENABLE
+ StartJsApp(const_cast<char*>(name.c_str()));
+#endif
+ }
+ }
+ return true;
+}
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: SlipFlowRecentAppFragment.cpp
+ * Author:
+ * Create: 2025-07-17
+ */
+
+#include "recent_app/SlipFlowRecentAppFragment.h"
+#include "wearable_log.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+#include "Slice.h"
+#include "RecentManager.h"
+#include "NativeAbility.h"
+#include "msg_center_customer.h"
+
+namespace OHOS {
+void SlipFlowRecentAppFragment::OnCreateView(void* data)
+{
+ LoadRecentAppContent();
+}
+
+void SlipFlowRecentAppFragment::OnDestroyView()
+{
+ if (slipFlowContainer_ != nullptr) {
+ UIViewGroup* child = dynamic_cast<UIViewGroup*>(slipFlowContainer_->GetChildrenHead());
+ while (child != nullptr) {
+ UIView* node = child->GetChildrenHead();
+ child = dynamic_cast<UIViewGroup*>(child->GetNextSibling());
+ delete node;
+ }
+ delete slipFlowContainer_;
+ }
+ if (noRecentAppLabel_ != nullptr) {
+ delete noRecentAppLabel_;
+ }
+ if (slipUpNoticeLabel_ != nullptr) {
+ delete slipUpNoticeLabel_;
+ }
+}
+
+void SlipFlowRecentAppFragment::LoadRecentAppContent()
+{
+ uint32_t size = RecentManager::GetInstance()->GetCurrentSize();
+ if (size == 0) {
+ if (noRecentAppLabel_ == nullptr) {
+ noRecentAppLabel_ = new UILabel();
+ }
+ if (noRecentAppLabel_ != nullptr) {
+ fragmentView_.Add(noRecentAppLabel_);
+ noRecentAppLabel_->SetText("No Recent App.");
+ noRecentAppLabel_->Resize(300, 100); // 300, 100: size
+ noRecentAppLabel_->LayoutCenterOfParent();
+ noRecentAppLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+ }
+ return;
+ }
+
+ InitRecentApps();
+}
+
+void SlipFlowRecentAppFragment::InitRecentApps()
+{
+ if (slipFlowContainer_ == nullptr) {
+ slipFlowContainer_ = new UISlipflowView();
+ }
+ if (slipFlowContainer_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UISlipflowView fail");
+ return;
+ }
+ if (slipUpNoticeLabel_ == nullptr) {
+ slipUpNoticeLabel_ = new UILabel();
+ }
+ if (slipUpNoticeLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UILabel fail");
+ return;
+ }
+
+ fragmentView_.Add(slipFlowContainer_);
+ slipFlowContainer_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ slipFlowContainer_->SetThrowDrag(true);
+ slipFlowContainer_->SetOnClickListener(this);
+ slipFlowContainer_->SetOnSlipflowListener(this);
+ AddRecentAppToSlipFlow();
+
+ slipUpNoticeLabel_->SetPosition(127, 400, 200, 50); // 127 400 200 50: label position
+ slipUpNoticeLabel_->SetTextColor(Color::White());
+ slipUpNoticeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ slipUpNoticeLabel_->SetText("继续上滑删除");
+ slipUpNoticeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); // 30 : font size
+ slipUpNoticeLabel_->SetVisible(false);
+ fragmentView_.Add(slipUpNoticeLabel_);
+}
+
+void SlipFlowRecentAppFragment::AddImageToSlipFlow(int index)
+{
+ UIImageView* image = new UIImageView();
+ image->SetViewId(appNames_[index].c_str());
+ image->SetSrc(appImgInfos_[index]);
+ image->Resize(250, 250); // 250: page size
+ image->SetResizeMode(UIImageView::ImageResizeMode::FILL);
+ image->SetAutoEnable(false);
+ slipFlowContainer_->Add(image);
+ image->LayoutCenterOfParent();
+}
+
+void SlipFlowRecentAppFragment::AddRecentAppToSlipFlow()
+{
+ const List<RecentAppInfo*>& recent = RecentManager::GetInstance()->GetRecentApps();
+ ListNode<RecentAppInfo*>* node = recent.Begin();
+ while (node != recent.End()) {
+ RecentAppInfo* appInfo = node->data_;
+ ImageInfo* imgInfo = appInfo->snapshot;
+ std::string name;
+ if (appInfo->isNativeSlice) {
+ name = RECENT_ITEM_NATIVE_PREFIX + std::to_string(appInfo->targetId & SLICE_MASK);
+ } else {
+ name = RECENT_ITEM_JS_PREFIX + appInfo->bundleName;
+ }
+ if (imgInfo->data == nullptr) {
+ std::string path(appInfo->snapshot->file, appInfo->snapshot->fileLen);
+ if (appInfo->snapshot->resId == 0) {
+ imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(path);
+ } else {
+ imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(appInfo->snapshot->resId, path);
+ }
+
+ if (imgInfo == nullptr) {
+ GRAPHIC_LOGE("Load res failed: %s", path.c_str());
+ node = node->next_;
+ continue;
+ }
+ }
+ appNames_.PushBack(name);
+ appImgInfos_.PushBack(imgInfo);
+ node = node->next_;
+ }
+ int index = appNames_.Size() - 1;
+ while (index >= 0) {
+ AddImageToSlipFlow(index);
+ index--;
+ }
+}
+
+bool SlipFlowRecentAppFragment::OnClick(UIView &view, const ClickEvent &event)
+{
+ std::string itemName(slipFlowContainer_->GetCurrentView()->GetViewId());
+ std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
+ std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
+ UIViewGroup* currentItemGroup = dynamic_cast<UIViewGroup *>(slipFlowContainer_->GetCurrentView());
+ if (currentItemGroup == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentItemGroup is nullptr!");
+ return false;
+ }
+ uint32_t sliceId = 0;
+ bool isNativeSlice = true;
+ if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
+ sliceId = static_cast<uint32_t>(std::stoul(name));
+ } else {
+ isNativeSlice = false;
+ }
+ Point clickPoint = event.GetCurrentPos();
+ Rect rect = currentItemGroup->GetChildrenHead()->GetRect();
+ if (rect.IsContains(clickPoint)) {
+ if (isNativeSlice) {
+ NativeAbility::GetInstance().ChangeSlice(sliceId);
+ } else {
+#ifdef JS_ENABLE
+ StartJsApp(const_cast<char*>(name.c_str()));
+#endif
+ }
+ }
+ return true;
+}
+
+void SlipFlowRecentAppFragment::OnScrollUpStart()
+{
+ slipUpNoticeLabel_->SetVisible(true);
+}
+
+void SlipFlowRecentAppFragment::OnScrollUpEnd()
+{
+ slipUpNoticeLabel_->SetVisible(false);
+}
+
+bool SlipFlowRecentAppFragment::OnRemove(UIView* view)
+{
+ if (view == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Remove view is nullptr!");
+ return false;
+ }
+ std::string itemName(view->GetViewId());
+ std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
+ std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
+ uint32_t sliceId = 0;
+ bool isNativeSlice = true;
+ if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
+ sliceId = static_cast<uint32_t>(std::stoul(name));
+ } else {
+ isNativeSlice = false;
+ }
+ if (view->GetViewId() != nullptr) {
+ if (isNativeSlice) {
+ RecentManager::GetInstance()->RemoveRecentApp(sliceId);
+ } else {
+ RecentManager::GetInstance()->RemoveRecentApp(name.c_str());
+ }
+ }
+ delete view;
+ view = nullptr;
+ return true;
+}
+}
\ No newline at end of file
\r
#include "restoredefaults/RestoreDefaultsPresenter.h"\r
#include "restoredefaults/RestoreDefaultsView.h"\r
-#include "bluetooth/BluetoothModel.h"\r
#include "bts_br_gap.h"\r
#include "drag_event.h"\r
#include "cmsis_os.h"\r
bundleInfos = nullptr;\r
}\r
}\r
- StopwatchModel::GetInstance().ClearData();\r
uapi_system_reboot(SYSTEM_SOFT_REBOOT);\r
return;\r
}\r
ElementName *elementName = AbilityMsClient::GetInstance().GetTopAbility();
if (elementName != nullptr) {
g_pre_bundle_name = elementName->bundleName;
+ FreeElement(elementName);
}
g_is_native = false;
}
- NativeAbility::GetInstance().ChangeSlice(VIEW_AOD);
+ NativeAbility::GetInstance().EnterAod();
}
static void ExitAod()
uint16_t sliceId = NativeAbility::GetInstance().GetPreTargetId() & SLICE_MASK;
for (uint16_t i = 0; i < sizeof(ignore_slice_ids) / sizeof(uint16_t); i++) {
if (ignore_slice_ids[i] == sliceId) {
- NativeAbility::GetInstance().ChangeSlice(sliceId);
+ NativeAbility::GetInstance().ExitAod(sliceId);
return;
}
}
- NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+ if (OHOS::MainViewSample::GetInstance() != nullptr && !OHOS::MainViewSample::GetInstance()->IsMainClockPage()) {
+ // 当前页面为主表盘的其他页面时,切换回主表盘页面
+ OHOS::MainViewSample::GetInstance()->SwitchToClockPage();
+ }
+ NativeAbility::GetInstance().ExitAod(VIEW_MAIN_SAMPLE);
} else {
if (!g_is_native) {
Want *want = new Want();
return;
}
uint32_t preId = NativeAbility::GetInstance().GetPreTargetId();
- NativeAbility::GetInstance().SwitchSlice(preId & SLICE_MASK, preId >> PAGE_OFFSET);
+ NativeAbility::GetInstance().ExitAod(preId);
}
}
int ret = UtilsSetEnv("../bin");
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UtilsSetEnv ../user ret = %d", ret);
#endif
-
}
void ScreenModels::LoadAppMultiImages(std::string file, uint32_t startId, uint32_t lastId)
LoadAppMultiImages(CLOCK_IAMGES, CLOCK_HAND24HOUR_IMAGE_PATH, CLOCK_TUESDAY_IMAGE_PATH);
LoadAppMultiImages(COMPASS_IAMGES, COMPASS_ROTATE_CENTER_IMAGE, COMPASS_COMPASS);
LoadAppMultiImages(DROPDOWN_IAMGES, DROPDOWN_DROPDOWN_BLUETOOTH, DROPDOWN_DROPDOWN_BRI_SCREEN_B);
- LoadAppMultiImages(HEART_IAMGES, HEART_HEARTRATECOOR, HEART_HEARTRATE_TOP);
}
}
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include "settings/SettingView.h"
-#include "settings/SettingPresenter.h"
-#include "NativeRegisterManager.h"
-
-namespace OHOS {
-REGIST_MENU(VIEW_SETTING, SettingView, SettingPresenter, PNG_APPLIST_SETTING_IMAGE, PNG_APPLIST_DEFAULT_IMG, "设置");
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter\r
+ * Create: 2025-06-01\r
+ */\r
+#include "NativeRegisterManager.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/SettingView.h"\r
+#include "settings/SettingPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_SETTING, SettingView, SettingPresenter, SETTING_ICON, SETTING_ICON, "设置");\r
+\r
+SettingPresenter::~SettingPresenter()\r
+{\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(SETTING_IMAGE);\r
+}\r
+}\r
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothItemView
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "ui_resource_settings.h"
+#include "common/image_cache_manager.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/common/SettingBluetoothItemGroup.h"
+
+namespace OHOS {
+static constexpr int16_t BLUETOOTH_ITEM_X = 14;
+static constexpr int16_t BLUETOOTH_ITEM_WIDTH = 426;
+static constexpr int16_t BLUETOOTH_ITEM_HEIGHT = 129;
+static constexpr int16_t BLUETOOTH_ITEM_ICON1_X = 30;
+static constexpr int16_t BLUETOOTH_ITEM_ICON1_Y = 35;
+static constexpr int16_t BLUETOOTH_ITEM_ICON2_X = 378;
+static constexpr int16_t BLUETOOTH_ITEM_ICON2_Y = 46;
+static constexpr int16_t BLUETOOTH_ITEM_LABEL1_X = 110;
+static constexpr int16_t BLUETOOTH_ITEM_LABEL1_Y = 15;
+static constexpr int16_t BLUETOOTH_ITEM_LABEL1_STATUS_EXIST_Y = 33;
+static constexpr int16_t BLUETOOTH_ITEM_LABEL2_Y = 57;
+static constexpr int16_t BLUETOOTH_ITEM_CHARTLINE_X = 20;
+static constexpr int16_t BLUETOOTH_ITEM_CHARTLINE_Y = 78;
+static constexpr int16_t BLUETOOTH_ITEM_CHARTLINE_WIDTH = 450;
+static constexpr int16_t BLUETOOTH_ITEM_CHARTLINE_HEIGHT = 2;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_BUTTON_WIDTH = 390;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_BUTTON_HEIGHT = 83;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_LABEL_WIDTH = 240;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_LABEL_HEIGHT = 40;
+static constexpr int16_t BLUETOOTH_ITEM_ITEM_FONT_SIZE = 32;
+static constexpr int16_t BLUETOOTH_ITEM_IMAGE_SIZE = 300;
+static constexpr int16_t BLUETOOTH_ITEM_CONNSTATE_SIZE = 30;
+
+SettingBluetoothItemGroup::SettingBluetoothItemGroup()
+{
+ SetPosition(BLUETOOTH_ITEM_X, 0, BLUETOOTH_ITEM_WIDTH, BLUETOOTH_ITEM_HEIGHT);
+
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);
+ SetTouchable(true);
+ SetUpChild();
+ ImageInfo* image =
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_BG, SETTING_IMAGE);
+ background_.SetSrc(image);
+ background_.SetPosition(0, 0);
+
+ Add(&background_);
+ Add(&icon_);
+ Add(&deviceName_);
+ Add(&connectStatus_);
+ Add(&conn_);
+}
+
+SettingBluetoothItemGroup::~SettingBluetoothItemGroup()
+{
+ Remove(&background_);
+ Remove(&icon_);
+ Remove(&deviceName_);
+ Remove(&connectStatus_);
+ Remove(&conn_);
+}
+
+void SettingBluetoothItemGroup::SetItemInfo(const BtCaseInfo* itemInfo)
+{
+ if (memcpy_s(itemInfo_.deviceName, BD_NAME_LEN, itemInfo->deviceName, BD_NAME_LEN) != 0) {
+ return;
+ }
+ if (memcpy_s(itemInfo_.addr, BD_ADDR_LEN, itemInfo->addr, BD_ADDR_LEN) != 0) {
+ return;
+ }
+ itemInfo_.connect_status = itemInfo->connect_status;
+ itemInfo_.rssi = itemInfo->rssi;
+ deviceName_.SetText((const char*)itemInfo_.deviceName);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothItemGroup::SetItemInfo %s", itemInfo_.deviceName);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothItemGroup::connect_status %s", itemInfo_.connect_status.c_str());
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_BLUETOOTH, SETTING_IMAGE);
+ icon_.SetSrc(image);
+ connectStatus_.SetText(itemInfo_.connect_status.c_str());
+ if (itemInfo_.connect_status == "已连接") {
+ image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONNECT, SETTING_IMAGE);
+ conn_.SetSrc(image);
+ conn_.SetVisible(true);
+ } else {
+ conn_.SetVisible(false);
+ }
+ if (itemInfo_.connect_status == "") {
+ deviceName_.SetPosition(BLUETOOTH_ITEM_LABEL1_X, BLUETOOTH_ITEM_LABEL1_STATUS_EXIST_Y);
+ deviceName_.SetVisible(true);
+ connectStatus_.SetVisible(false);
+ } else {
+ deviceName_.SetPosition(BLUETOOTH_ITEM_LABEL1_X, BLUETOOTH_ITEM_LABEL1_Y);
+ deviceName_.SetVisible(true);
+ connectStatus_.SetVisible(true);
+ }
+}
+
+BtCaseInfo& SettingBluetoothItemGroup::GetItem()
+{
+ return itemInfo_;
+}
+
+void SettingBluetoothItemGroup::SetUpChild()
+{
+ icon_.SetPosition(BLUETOOTH_ITEM_ICON1_X, BLUETOOTH_ITEM_ICON1_Y);
+ icon_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+
+ conn_.SetPosition(BLUETOOTH_ITEM_ICON2_X, BLUETOOTH_ITEM_ICON2_Y);
+ conn_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+
+ deviceName_.Resize(BLUETOOTH_ITEM_ITEM_LABEL_WIDTH, BLUETOOTH_ITEM_ITEM_LABEL_HEIGHT);
+ deviceName_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLUETOOTH_ITEM_ITEM_FONT_SIZE);
+ deviceName_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
+ deviceName_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ deviceName_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+ deviceName_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ deviceName_.SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
+
+ connectStatus_.SetPosition(BLUETOOTH_ITEM_LABEL1_X, BLUETOOTH_ITEM_LABEL2_Y);
+ connectStatus_.Resize(BLUETOOTH_ITEM_ITEM_LABEL_WIDTH, BLUETOOTH_ITEM_ITEM_LABEL_HEIGHT);
+ connectStatus_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLUETOOTH_ITEM_CONNSTATE_SIZE);
+ connectStatus_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
+ connectStatus_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+ connectStatus_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ connectStatus_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+}
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardAddItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingCardAddItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_WIDTH = 157;\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_HEIGHT = 397;\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_MARGIN = 15;\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_IMAGE_WIDTH = 157;\r
+static constexpr int16_t SETTING_CARD_ADD_ITEM_IMAGE_HEIGHT = 157;\r
+static constexpr int16_t SETTING_CARD_ITEM_BUTTON_X = 4;\r
+static constexpr int16_t SETTING_CARD_ITEM_BUTTON_Y = 202;\r
+static constexpr int16_t SETTING_CARD_ITEM_BUTTON_WIDTH = 150;\r
+static constexpr int16_t SETTING_CARD_ITEM_BUTTON_HEIGHT = 70;\r
+\r
+SettingCardAddItemGroup::SettingCardAddItemGroup()\r
+{\r
+ SetPosition(0, 0, SETTING_CARD_ADD_ITEM_WIDTH, SETTING_CARD_ADD_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetStyle(STYLE_MARGIN_LEFT, SETTING_CARD_ADD_ITEM_MARGIN);\r
+ SetStyle(STYLE_MARGIN_RIGHT, SETTING_CARD_ADD_ITEM_MARGIN);\r
+\r
+ image_.SetAutoEnable(false);\r
+ image_.SetPosition(0, 0, SETTING_CARD_ADD_ITEM_IMAGE_WIDTH, SETTING_CARD_ADD_ITEM_IMAGE_HEIGHT);\r
+ image_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ image_.SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ image_.SetResizeMode(UIImageView::CONTAIN);\r
+\r
+ button_.SetPosition(SETTING_CARD_ITEM_BUTTON_X, SETTING_CARD_ITEM_BUTTON_Y);\r
+ button_.Resize(SETTING_CARD_ITEM_BUTTON_WIDTH, SETTING_CARD_ITEM_BUTTON_HEIGHT);\r
+ button_.SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ button_.SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ button_.SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+ button_.SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ button_.SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ button_.SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+\r
+ Add(&image_);\r
+ Add(&button_);\r
+}\r
+\r
+SettingCardAddItemGroup::~SettingCardAddItemGroup()\r
+{\r
+ if (imageData_ != nullptr && imageSrc_ != nullptr) {\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(imageSrc_);\r
+ imageData_ = nullptr;\r
+ imageSrc_ = nullptr;\r
+ }\r
+}\r
+\r
+void SettingCardAddItemGroup::UpdateItemGroup(SettingCardItemData* itemData)\r
+{\r
+ if (imageData_ != nullptr && imageSrc_ != nullptr) {\r
+ // 通过LoadSingleRes加载的图片不会自动释放\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(imageSrc_);\r
+ imageData_ = nullptr;\r
+ imageSrc_ = nullptr;\r
+ }\r
+\r
+ imageSrc_ = itemData->image;\r
+ imageData_ = ImageCacheManager::GetInstance().LoadSingleRes(imageSrc_);\r
+ image_.SetSrc(imageData_);\r
+ if (itemData->isSelect) {\r
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CARD_ADD_ADDED, SETTING_IMAGE);\r
+ button_.SetImageSrc(image, image);\r
+ button_.SetTouchable(false);\r
+ } else {\r
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CARD_ADD_ADD, SETTING_IMAGE);\r
+ button_.SetImageSrc(image, image);\r
+ button_.SetTouchable(true);\r
+ }\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffectItemGroup\r
+ * Create: 2025-04\r
+ */\r
+#include "common/image_cache_manager.h"\r
+#include "gfx_utils/graphic_log.h"\r
+#include "UiConfig.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingCardEffectSample.h"\r
+#include "settings/common/SettingCardEffectItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t NUMS_2 = 2;\r
+static constexpr int16_t SCREEN_MIDDLE = HORIZONTAL_RESOLUTION / NUMS_2;\r
+static constexpr int16_t ANIMATOR_SICON_SIZE = 148;\r
+static constexpr int16_t ANIMATOR_SICON_POINT_X = (SCREEN_MIDDLE - ANIMATOR_SICON_SIZE) / NUMS_2;\r
+static constexpr int16_t ANIMATOR_SICON_POINT_Y = 150;\r
+static constexpr int16_t BIND_IMAGE_DELAY = 180;\r
+static constexpr int16_t PAUSE_TIME = 800;\r
+static constexpr int16_t ITEM_LABEL_X = 0;\r
+static constexpr int16_t ITEM_LABEL_Y = 320;\r
+static constexpr int16_t ITEM_LABEL_WIDTH = SCREEN_MIDDLE;\r
+static constexpr int16_t ITEM_LABEL_HEIGHT = 40;\r
+static constexpr int16_t SETTING_ITEM_FONT_SIZE = 30;\r
+static constexpr int16_t BACKDROP_ICON_X = ANIMATOR_SICON_POINT_X - 21;\r
+static constexpr int16_t BACKDROP_ICON_Y = ANIMATOR_SICON_POINT_Y - 21;\r
+static constexpr int16_t BACKDROP_ICON_SIZE = 190;\r
+\r
+SettingCardEffectItemGroup::SettingCardEffectItemGroup()\r
+{\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetTouchable(true);\r
+ SetUpChild();\r
+ Add(&leftSelectIcon_);\r
+ Add(&leftPreviewIcon_);\r
+ Add(&leftAnimator_);\r
+ Add(&leftLabel_);\r
+ Add(&rightSelectIcon_);\r
+ Add(&rightPreviewIcon_);\r
+ Add(&rightAnimator_);\r
+ Add(&rightLabel_);\r
+}\r
+\r
+SettingCardEffectItemGroup::~SettingCardEffectItemGroup()\r
+{\r
+ Remove(&leftAnimator_);\r
+ Remove(&leftLabel_);\r
+ Remove(&leftSelectIcon_);\r
+ Remove(&leftPreviewIcon_);\r
+ Remove(&rightSelectIcon_);\r
+ Remove(&rightPreviewIcon_);\r
+ Remove(&rightAnimator_);\r
+ Remove(&rightLabel_);\r
+}\r
+\r
+void SettingCardEffectItemGroup::SetItemInfo(const SettingCardEffectSample& leftItemInfo,\r
+ const SettingCardEffectSample& rightItemInfo)\r
+{\r
+ leftItemInfo_ = leftItemInfo;\r
+ rightItemInfo_ = rightItemInfo;\r
+\r
+ leftLabel_.SetText(leftItemInfo_.label);\r
+ leftSelectIcon_.SetVisible(leftItemInfo_.selected);\r
+\r
+ if (!LoadMultiImages(leftItemInfo_, false)) {\r
+ GRAPHIC_LOGE("leftItemInfo_ cannot open file: %s", leftItemInfo_.resourceImage);\r
+ return;\r
+ }\r
+\r
+ rightLabel_.SetText(rightItemInfo_.label);\r
+ rightSelectIcon_.SetVisible(rightItemInfo_.selected);\r
+\r
+ if (!LoadMultiImages(rightItemInfo_, true)) {\r
+ GRAPHIC_LOGE("rightItemInfo_ cannot open file: %s", rightItemInfo_.resourceImage);\r
+ return;\r
+ }\r
+}\r
+\r
+bool SettingCardEffectItemGroup::LoadMultiImages(SettingCardEffectSample& itemInfo, bool right)\r
+{\r
+ UIImageView* previewIcon = &leftPreviewIcon_;\r
+ UIImageView* selectIcon = &leftSelectIcon_;\r
+ UIImageAnimatorView* animator = &leftAnimator_;\r
+ uint16_t animatorSiconX = ANIMATOR_SICON_POINT_X;\r
+ if (right) {\r
+ previewIcon = &rightPreviewIcon_;\r
+ selectIcon = &rightSelectIcon_;\r
+ animator = &rightAnimator_;\r
+ animatorSiconX = ANIMATOR_SICON_POINT_X + SCREEN_MIDDLE;\r
+ }\r
+\r
+ if (itemInfo.viewId == CardEffectID::UI_INVALIDE) { // -1: UI_INVALIDE\r
+ previewIcon->SetVisible(false);\r
+ selectIcon->SetVisible(false);\r
+ animator->SetVisible(false);\r
+ GRAPHIC_LOGE("itemInfo.viewId is UI_INVALIDE");\r
+ return false;\r
+ }\r
+\r
+ FILE* fp = fopen(itemInfo.resourceImage, "rb");\r
+ if (fp == nullptr) {\r
+ GRAPHIC_LOGE("cannot open file: %s", itemInfo.resourceImage);\r
+ return false;\r
+ }\r
+\r
+ previewIcon->SetSrc(ImageCacheManager::GetInstance().\r
+ LoadOneInMultiRes(itemInfo.resIds[0], itemInfo.resourceImage, fp));\r
+ selectIcon->SetSrc(ImageCacheManager::GetInstance().\r
+ LoadOneInMultiRes(itemInfo.backgroundImageId, itemInfo.resourceImage, fp));\r
+\r
+ uint8_t imageNum = itemInfo.resIds.size();\r
+ std::vector<ImageAnimatorInfo> searchImageInfo(imageNum);\r
+ for (uint8_t i = 0; i < imageNum; i++) {\r
+ searchImageInfo[i].imageInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ itemInfo.resIds[i], itemInfo.resourceImage, fp);\r
+ searchImageInfo[i].imageType = IMG_SRC_IMAGE_INFO;\r
+ searchImageInfo[i].pos.x = animatorSiconX;\r
+ searchImageInfo[i].pos.y = ANIMATOR_SICON_POINT_Y;\r
+ searchImageInfo[i].width = ANIMATOR_SICON_SIZE;\r
+ searchImageInfo[i].height = ANIMATOR_SICON_SIZE;\r
+ }\r
+ animator->SetImageAnimatorSrc(searchImageInfo.data(), imageNum, BIND_IMAGE_DELAY);\r
+ fclose(fp);\r
+ return true;\r
+}\r
+\r
+void SettingCardEffectItemGroup::SetUpChild()\r
+{\r
+ InitializeAnimator(leftAnimator_, ANIMATOR_SICON_POINT_X, ANIMATOR_SICON_POINT_Y, ANIMATOR_SICON_SIZE);\r
+\r
+ InitializeIcon(leftPreviewIcon_, ANIMATOR_SICON_POINT_X, ANIMATOR_SICON_POINT_Y, ANIMATOR_SICON_SIZE);\r
+\r
+ InitializeLabel(leftLabel_, ITEM_LABEL_X, ITEM_LABEL_Y, ITEM_LABEL_WIDTH, ITEM_LABEL_HEIGHT);\r
+\r
+ InitializeIcon(leftSelectIcon_, BACKDROP_ICON_X, BACKDROP_ICON_Y, BACKDROP_ICON_SIZE);\r
+\r
+ int rightItemX = SCREEN_MIDDLE + ANIMATOR_SICON_POINT_X;\r
+ InitializeAnimator(rightAnimator_, rightItemX, ANIMATOR_SICON_POINT_Y, ANIMATOR_SICON_SIZE);\r
+\r
+ InitializeIcon(rightPreviewIcon_, rightItemX, ANIMATOR_SICON_POINT_Y, ANIMATOR_SICON_SIZE);\r
+\r
+ rightItemX = SCREEN_MIDDLE + ITEM_LABEL_X;\r
+ InitializeLabel(rightLabel_, rightItemX, ITEM_LABEL_Y, ITEM_LABEL_WIDTH, ITEM_LABEL_HEIGHT);\r
+\r
+ rightItemX = SCREEN_MIDDLE + BACKDROP_ICON_X;\r
+ InitializeIcon(rightSelectIcon_, rightItemX, BACKDROP_ICON_Y, BACKDROP_ICON_SIZE);\r
+}\r
+\r
+void SettingCardEffectItemGroup::InitializeAnimator(UIImageAnimatorView& animator, int x, int y, int size)\r
+{\r
+ animator.SetPosition(x, y);\r
+ animator.Resize(size, size);\r
+ animator.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ animator.SetRepeat(true);\r
+ animator.SetTimeOfPause(PAUSE_TIME);\r
+}\r
+\r
+void SettingCardEffectItemGroup::InitializeIcon(UIImageView& icon, int x, int y, int size)\r
+{\r
+ icon.SetPosition(x, y);\r
+ icon.Resize(size, size);\r
+ icon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ icon.SetVisible(true);\r
+}\r
+\r
+void SettingCardEffectItemGroup::InitializeLabel(UILabel& label, int x, int y, int width, int height)\r
+{\r
+ label.SetPosition(x, y);\r
+ label.Resize(width, height);\r
+ label.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
+ label.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ label.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ label.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ label.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ label.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+}\r
+\r
+CardEffectID SettingCardEffectItemGroup::GetViewId(const ClickEvent& event)\r
+{\r
+ int16_t clickY = event.GetCurrentPos().y;\r
+ int16_t minItemY = BACKDROP_ICON_Y;\r
+ int16_t maxItemY = BACKDROP_ICON_Y + BACKDROP_ICON_SIZE + ITEM_LABEL_HEIGHT;\r
+\r
+ // Check if the click position is within the valid Y-axis range\r
+ if (clickY < minItemY || clickY > maxItemY) {\r
+ // -1 indicates an invalid UI element\r
+ return CardEffectID::UI_INVALIDE;\r
+ }\r
+\r
+ int16_t clickX = event.GetCurrentPos().x;\r
+ int16_t leftItemX = BACKDROP_ICON_X;\r
+ int16_t rightItemX = SCREEN_MIDDLE + BACKDROP_ICON_X;\r
+ int16_t itemWidth = BACKDROP_ICON_SIZE;\r
+ // Check if the click position is within the left item's X-axis range\r
+ if (clickX > leftItemX && clickX < (leftItemX + itemWidth)) {\r
+ return leftItemInfo_.viewId;\r
+ }\r
+\r
+ // Check if the click position is within the right item's X-axis range\r
+ if (clickX > rightItemX && clickX < rightItemX + itemWidth) {\r
+ return rightItemInfo_.viewId;\r
+ }\r
+\r
+ // -1 indicates an invalid UI element\r
+ return CardEffectID::UI_INVALIDE;\r
+}\r
+\r
+void SettingCardEffectItemGroup::SelectedChange()\r
+{\r
+ leftAnimator_.SetVisible(true);\r
+ leftAnimator_.Start();\r
+ leftPreviewIcon_.SetVisible(false);\r
+\r
+ rightAnimator_.SetVisible(true);\r
+ rightAnimator_.Start();\r
+ rightPreviewIcon_.SetVisible(false);\r
+}\r
+\r
+void SettingCardEffectItemGroup::Reset()\r
+{\r
+ leftAnimator_.SetVisible(false);\r
+ leftAnimator_.Stop();\r
+ leftPreviewIcon_.SetVisible(true);\r
+\r
+ rightAnimator_.SetVisible(false);\r
+ rightAnimator_.Stop();\r
+ rightPreviewIcon_.SetVisible(true);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardMgrItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/common/SettingCardMgrItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_CARD_MGR_ITEM_WIDTH = 454;\r
+static constexpr int16_t SETTING_CARD_MGR_ITEM_HEIGHT = 245;\r
+\r
+SettingCardMgrItemGroup::SettingCardMgrItemGroup()\r
+{\r
+ SetPosition(0, 0, SETTING_CARD_MGR_ITEM_WIDTH, SETTING_CARD_MGR_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+\r
+ image_.SetAutoEnable(false);\r
+ image_.SetPosition(0, 0, SETTING_CARD_MGR_ITEM_WIDTH, SETTING_CARD_MGR_ITEM_HEIGHT);\r
+ image_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ image_.SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ image_.SetResizeMode(UIImageView::CONTAIN);\r
+ Add(&image_);\r
+}\r
+\r
+SettingCardMgrItemGroup::~SettingCardMgrItemGroup()\r
+{\r
+ if (imageData_ != nullptr && imageSrc_ != nullptr) {\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(imageSrc_);\r
+ imageData_ = nullptr;\r
+ imageSrc_ = nullptr;\r
+ }\r
+}\r
+\r
+void SettingCardMgrItemGroup::UpdateItemGroup(SettingCardItemData* itemData)\r
+{\r
+ if (imageData_ != nullptr && imageSrc_ != nullptr) {\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(imageSrc_);\r
+ imageData_ = nullptr;\r
+ imageSrc_ = nullptr;\r
+ }\r
+ imageSrc_ = itemData->image;\r
+ imageData_ = ImageCacheManager::GetInstance().LoadSingleRes(imageSrc_);\r
+ image_.SetSrc(imageData_);\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopHomeItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#include <cstdint>\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "settings/common/SettingDesktopHomeItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_HOME_ITEM_WIDTH = 153;\r
+static constexpr int16_t SETTING_HOME_ITEM_HEIGHT = 205;\r
+static constexpr int16_t SETTING_HOME_ITEM_MARGIN = 13;\r
+\r
+static constexpr int16_t SETTING_HOME_BUTTON_HEIGHT = 153;\r
+static constexpr int16_t SETTING_HOME_BUTTON_RADIUS = 0;\r
+static constexpr int16_t SETTING_HOME_LABEL_X = 28;\r
+static constexpr int16_t SETTING_HOME_LABEL_Y = 167;\r
+static constexpr int16_t SETTING_HOME_LABEL_WIDTH = 98;\r
+static constexpr int16_t SETTING_HOME_LABEL_HEIGHT = 38;\r
+static constexpr int16_t SETTING_HOME_LABEL_FSIZE = 32;\r
+\r
+SettingDesktopHomeItemGroup::SettingDesktopHomeItemGroup()\r
+{\r
+ SetPosition(0, 0, SETTING_HOME_ITEM_WIDTH, SETTING_HOME_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetStyle(STYLE_MARGIN_LEFT, SETTING_HOME_ITEM_MARGIN);\r
+ SetStyle(STYLE_MARGIN_RIGHT, SETTING_HOME_ITEM_MARGIN);\r
+ SetTouchable(true);\r
+\r
+ button_.SetPosition(0, 0, SETTING_HOME_ITEM_WIDTH, SETTING_HOME_BUTTON_HEIGHT);\r
+ button_.SetStyle(STYLE_BORDER_RADIUS, SETTING_HOME_BUTTON_RADIUS);\r
+\r
+ label_.SetPosition(SETTING_HOME_LABEL_X, SETTING_HOME_LABEL_Y);\r
+ label_.Resize(SETTING_HOME_LABEL_WIDTH, SETTING_HOME_LABEL_HEIGHT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_HOME_LABEL_FSIZE);\r
+ label_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+ Add(&button_);\r
+ Add(&label_);\r
+}\r
+\r
+SettingDesktopHomeItemGroup::~SettingDesktopHomeItemGroup()\r
+{\r
+ RemoveAll();\r
+}\r
+\r
+void SettingDesktopHomeItemGroup::UpdateItemGroup(SettingDesktopHomeItemData* itemData)\r
+{\r
+ SetViewId(itemData->label);\r
+ label_.SetText(itemData->label);\r
+ ImageInfo* select = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemData->selectIcon, SETTING_IMAGE);\r
+ ImageInfo* unselect = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemData->unSelectIcon, SETTING_IMAGE);\r
+ button_.SetImages(select, unselect);\r
+ if (itemData->isSelect) {\r
+ button_.SetState(UICheckBox::SELECTED, true);\r
+ } else {\r
+ button_.SetState(UICheckBox::UNSELECTED, true);\r
+ }\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingToggleButton\r
+ * Create: 2025-06-01\r
+ */\r
+#include "common/image.h"\r
+#include "imgdecode/cache_manager.h"\r
+#include "engines/gfx/gfx_engine_manager.h"\r
+#include "settings/common/SettingToggleButton.h"\r
+\r
+namespace OHOS {\r
+constexpr uint8_t TOGGLE_BTN_UNSELECTED_OPA = 97;\r
+constexpr uint8_t TOGGLE_HALF_NUM = 2;\r
+#if DEFAULT_ANIMATION\r
+constexpr int16_t DEFAULT_ANIMATOR_TIME = 150;\r
+constexpr float BEZIER_CONTROL_POINT_X_1 = 0.2;\r
+constexpr float BEZIER_CONTROL_POINT_X_2 = 0.2;\r
+#endif\r
+\r
+SettingToggleButton::SettingToggleButton()\r
+{\r
+ backgroundOpacity_ = TOGGLE_BTN_UNSELECTED_OPA;\r
+ image_[UNSELECTED].SetSrc("");\r
+ image_[SELECTED].SetSrc("");\r
+#if DEFAULT_ANIMATION\r
+ checkBoxAnimator_.SetTime(DEFAULT_ANIMATOR_TIME);\r
+#endif\r
+ Resize(width_, height_);\r
+}\r
+\r
+void SettingToggleButton::SetTrackPadding(int16_t padding)\r
+{\r
+ trackPadding_ = padding;\r
+}\r
+\r
+void SettingToggleButton::CalculateSize()\r
+{\r
+ width_ = GetWidth() - 1; // UIView中保存的矩形宽高会比设置的宽高小1\r
+ height_ = GetHeight() - 1;\r
+\r
+ trackCorner_ = height_ / TOGGLE_HALF_NUM;\r
+ thumbRadius_ = trackCorner_ - trackPadding_;\r
+\r
+ Rect contentRect = GetContentRect();\r
+ leftCenter_ = {static_cast<int16_t>(contentRect.GetX() + trackCorner_),\r
+ static_cast<int16_t>(contentRect.GetY() + trackCorner_)};\r
+ rightCenter_ = {static_cast<int16_t>(contentRect.GetX() + width_ - trackCorner_),\r
+ static_cast<int16_t>(contentRect.GetY() + trackCorner_)};\r
+#if DEFAULT_ANIMATION\r
+ if (checkBoxAnimator_.GetState() != Animator::START) {\r
+ currentCenter_ = (state_ == SELECTED) ? rightCenter_ : leftCenter_;\r
+ backgroundOpacity_ = (state_ == SELECTED) ? OPA_OPAQUE : TOGGLE_BTN_UNSELECTED_OPA;\r
+ bgColor_ = (state_ == SELECTED) ? selectedStateColor_ : Color::White();\r
+ }\r
+#else\r
+ currentCenter_ = (state_ == SELECTED) ? rightCenter_ : leftCenter_;\r
+ backgroundOpacity_ = (state_ == SELECTED) ? OPA_OPAQUE : TOGGLE_BTN_UNSELECTED_OPA;\r
+ bgColor_ = (state_ == SELECTED) ? selectedStateColor_ : Color::White();\r
+#endif\r
+ rectMid_.SetRect(contentRect.GetX(), contentRect.GetY(), contentRect.GetX() + width_,\r
+ contentRect.GetY() + (trackCorner_ << 1) + 1);\r
+}\r
+\r
+void SettingToggleButton::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)\r
+{\r
+ if ((image_[SELECTED].GetSrcType() != IMG_SRC_UNKNOWN) && (image_[UNSELECTED].GetSrcType() != IMG_SRC_UNKNOWN)) {\r
+ UICheckBox::OnDraw(gfxDstBuffer, invalidatedArea);\r
+ } else {\r
+ CalculateSize();\r
+ BaseGfxEngine::GetInstance()->DrawRect(gfxDstBuffer, GetRect(), invalidatedArea, *style_, opaScale_);\r
+ Rect contentRect = GetContentRect();\r
+ Rect trunc = invalidatedArea;\r
+ bool isIntersect = trunc.Intersect(trunc, contentRect);\r
+ if (isIntersect == false) {\r
+ return;\r
+ }\r
+ Style styleUnSelect = StyleDefault::GetBackgroundTransparentStyle();\r
+ styleUnSelect.bgColor_ = bgColor_;\r
+ styleUnSelect.bgOpa_ = backgroundOpacity_;\r
+ styleUnSelect.borderRadius_ = trackCorner_;\r
+ BaseGfxEngine::GetInstance()->DrawRect(gfxDstBuffer, rectMid_, trunc, styleUnSelect, opaScale_);\r
+ ArcInfo arcInfoLeft = {currentCenter_, {0}, thumbRadius_, 0, CIRCLE_IN_DEGREE, nullptr};\r
+ styleUnSelect.lineColor_ = Color::White();\r
+ styleUnSelect.lineWidth_ = thumbRadius_;\r
+ BaseGfxEngine::GetInstance()->DrawArc(gfxDstBuffer, arcInfoLeft, trunc, styleUnSelect, OPA_OPAQUE,\r
+ CapType::CAP_NONE);\r
+ }\r
+}\r
+\r
+#if DEFAULT_ANIMATION\r
+void SettingToggleButton::Callback(UIView* view)\r
+{\r
+ runTime_ = checkBoxAnimator_.GetRunTime();\r
+ float x = static_cast<float>(runTime_) / checkBoxAnimator_.GetTime();\r
+ float coefficient = Interpolation::GetBezierY(x, BEZIER_CONTROL_POINT_X_1, 0, BEZIER_CONTROL_POINT_X_2, 1);\r
+ if (state_ == SELECTED) {\r
+ currentCenter_.y = rightCenter_.y;\r
+ currentCenter_.x = (rightCenter_.x - leftCenter_.x) * coefficient + leftCenter_.x;\r
+ backgroundOpacity_ = TOGGLE_BTN_UNSELECTED_OPA + (OPA_OPAQUE - TOGGLE_BTN_UNSELECTED_OPA) * coefficient;\r
+ bgColor_ = Color::GetMixColor(selectedStateColor_, Color::White(), OPA_OPAQUE * coefficient);\r
+ } else {\r
+ currentCenter_.y = leftCenter_.y;\r
+ currentCenter_.x = rightCenter_.x - (rightCenter_.x - leftCenter_.x) * coefficient;\r
+ backgroundOpacity_ = OPA_OPAQUE - (OPA_OPAQUE - TOGGLE_BTN_UNSELECTED_OPA) * coefficient;\r
+ bgColor_ = Color::GetMixColor(selectedStateColor_, Color::White(), OPA_OPAQUE * (1 - coefficient));\r
+ }\r
+ Invalidate();\r
+}\r
+\r
+void SettingToggleButton::OnStop(UIView& view)\r
+{\r
+ if (state_ == SELECTED) {\r
+ bgColor_ = selectedStateColor_;\r
+ } else {\r
+ bgColor_ = Color::White();\r
+ }\r
+ backgroundOpacity_ = (state_ == SELECTED) ? OPA_OPAQUE : TOGGLE_BTN_UNSELECTED_OPA;\r
+ Invalidate();\r
+}\r
+#endif\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingUnionItemGroup\r
+ * Create: 2025-06-01\r
+ */\r
+#include <cstdint>\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "settings/common/SettingUnionItemGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_PAGE_ITEM_WIDTH = 426;\r
+static constexpr int16_t SETTING_PAGE_ITEM_HEIGHT = 96;\r
+static constexpr int16_t SETTING_PAGE_ITEM_RADIUS = 48;\r
+static constexpr int16_t SETTING_PAGE_ITEM_MARGIN_BOTTON = 15;\r
+static constexpr int8_t SETTING_PAGE_ITEM_ICON_X = 6;\r
+static constexpr int8_t SETTING_PAGE_ITEM_ICON_Y = 6;\r
+static constexpr int8_t SETTING_PAGE_ITEM_ICON_WIDTH = 84;\r
+static constexpr int8_t SETTING_PAGE_ITEM_ICON_HEIGHT = 84;\r
+static constexpr int16_t SETTING_PAGE_ITEM_LABEL_FSIZE = 32;\r
+\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_WIDTH = 260;\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_HEIGHT = 53;\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_X = 83;\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_Y = 25;\r
+static constexpr int16_t SETTING_PAGE_STATIC_LABEL_FSIZE = 38;\r
+\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_X = 312;\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_Y = 24;\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_WIDTH = 84;\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_HEIGHT = 48;\r
+static constexpr int16_t SETTING_PAGE_TOGGLE_TRACK_PADDING = 4;\r
+\r
+static constexpr int16_t SETTING_PAGE_INPAGE_TLABEL_X = 101;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_LABEL_Y = 29;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_LABEL_WIDTH = 38;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_DLABEL_X_OFFSET = 13; // TextLabel后偏移13个像素是DataLabel的起点\r
+static constexpr int16_t SETTING_PAGE_INPAGE_DLABEL_OPA = 127;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_IMAGE_X = 380;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_IMAGE_Y = 33;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_IMAGE_WIDTH = 18;\r
+static constexpr int16_t SETTING_PAGE_INPAGE_IMAGE_HEIGHT = 31;\r
+\r
+SettingUnionItemType SettingUnionItemData::GetUnionItemType()\r
+{\r
+ return type_;\r
+}\r
+\r
+void* SettingUnionItemData::GetUnionItemData()\r
+{\r
+ return &unionItemData_;\r
+}\r
+\r
+SettingUnionItemData::SettingUnionItemData(const PlainTextItemData& itemData) {\r
+ type_ = PLAIN_TEXT;\r
+ unionItemData_.plainTextItemData = itemData;\r
+}\r
+\r
+SettingUnionItemData::SettingUnionItemData(const IconTextToggleItemData& itemData) {\r
+ type_ = ICON_TEXT_TOGGLE;\r
+ unionItemData_.iconTextToggleItemData = itemData;\r
+}\r
+\r
+SettingUnionItemData::SettingUnionItemData(const IconTextNavigationItemData& itemData) {\r
+ type_ = ICON_TEXT_NAVIGATION;\r
+ unionItemData_.iconTextNavigationItemData = itemData;\r
+}\r
+\r
+PlainTextItemView::PlainTextItemView()\r
+{\r
+ SetPosition(0, 0, SETTING_PAGE_ITEM_WIDTH, SETTING_PAGE_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetTouchable(false);\r
+\r
+ label_.SetPosition(SETTING_PAGE_STATIC_LABEL_X, SETTING_PAGE_STATIC_LABEL_Y);\r
+ label_.Resize(SETTING_PAGE_STATIC_LABEL_WIDTH, SETTING_PAGE_STATIC_LABEL_HEIGHT);\r
+ label_.SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_PAGE_STATIC_LABEL_FSIZE);\r
+ label_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ label_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ label_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ Add(&label_);\r
+}\r
+\r
+PlainTextItemView::~PlainTextItemView()\r
+{\r
+ Remove(&label_);\r
+}\r
+\r
+void PlainTextItemView::UpdateViewData(PlainTextItemData* data)\r
+{\r
+ if (data != nullptr) {\r
+ label_.SetText(data->textContent);\r
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ }\r
+}\r
+\r
+IconTextToggleItemView::IconTextToggleItemView()\r
+{\r
+ SetPosition(0, 0, SETTING_PAGE_ITEM_WIDTH, SETTING_PAGE_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetStyle(STYLE_BORDER_RADIUS, SETTING_PAGE_ITEM_RADIUS);\r
+ SetStyle(STYLE_MARGIN_BOTTOM, SETTING_PAGE_ITEM_MARGIN_BOTTON);\r
+ SetTouchable(true);\r
+\r
+ icon_.SetPosition(SETTING_PAGE_ITEM_ICON_X, SETTING_PAGE_ITEM_ICON_Y);\r
+ icon_.Resize(SETTING_PAGE_ITEM_ICON_WIDTH, SETTING_PAGE_ITEM_ICON_HEIGHT);\r
+ icon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ icon_.SetAutoEnable(false);\r
+ icon_.SetResizeMode(UIImageView::SCALE_DOWN);\r
+\r
+ label_.SetPosition(SETTING_PAGE_INPAGE_TLABEL_X, SETTING_PAGE_INPAGE_LABEL_Y);\r
+ label_.Resize(0, SETTING_PAGE_INPAGE_LABEL_WIDTH);\r
+ label_.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_PAGE_ITEM_LABEL_FSIZE);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ label_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+ toggleButton_.SetPosition(SETTING_PAGE_TOGGLE_X, SETTING_PAGE_TOGGLE_Y);\r
+ toggleButton_.Resize(SETTING_PAGE_TOGGLE_WIDTH, SETTING_PAGE_TOGGLE_HEIGHT);\r
+ toggleButton_.SetTrackPadding(SETTING_PAGE_TOGGLE_TRACK_PADDING);\r
+ toggleButton_.SetTouchable(false);\r
+\r
+ Add(&icon_);\r
+ Add(&label_);\r
+ Add(&toggleButton_);\r
+}\r
+\r
+IconTextToggleItemView::~IconTextToggleItemView()\r
+{\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+ Remove(&toggleButton_);\r
+}\r
+\r
+void IconTextToggleItemView::UpdateViewData(IconTextToggleItemData* data)\r
+{\r
+ if (data != nullptr) {\r
+ SetStyle(STYLE_BACKGROUND_COLOR, data->bgColor.full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, data->bgOpa);\r
+ icon_.SetSrc(CacheImage(data->icon));\r
+ label_.SetText(data->textContent);\r
+ toggleButton_.SetState(data->selected);\r
+ }\r
+}\r
+\r
+IconTextNavigationItemView::IconTextNavigationItemView()\r
+{\r
+ SetPosition(0, 0, SETTING_PAGE_ITEM_WIDTH, SETTING_PAGE_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetStyle(STYLE_BORDER_RADIUS, SETTING_PAGE_ITEM_RADIUS);\r
+ SetStyle(STYLE_MARGIN_BOTTOM, SETTING_PAGE_ITEM_MARGIN_BOTTON);\r
+ SetTouchable(true);\r
+\r
+ icon_.SetPosition(SETTING_PAGE_ITEM_ICON_X, SETTING_PAGE_ITEM_ICON_Y);\r
+ icon_.Resize(SETTING_PAGE_ITEM_ICON_WIDTH, SETTING_PAGE_ITEM_ICON_HEIGHT);\r
+ icon_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ icon_.SetAutoEnable(false);\r
+ icon_.SetResizeMode(UIImageView::SCALE_DOWN);\r
+\r
+ textLabel_.SetPosition(SETTING_PAGE_INPAGE_TLABEL_X, SETTING_PAGE_INPAGE_LABEL_Y);\r
+ textLabel_.Resize(0, SETTING_PAGE_INPAGE_LABEL_WIDTH);\r
+ textLabel_.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ textLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ textLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ textLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ textLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_PAGE_ITEM_LABEL_FSIZE);\r
+\r
+ dataLabel_.Resize(0, SETTING_PAGE_INPAGE_LABEL_WIDTH);\r
+ dataLabel_.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ dataLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ dataLabel_.SetStyle(STYLE_TEXT_OPA, SETTING_PAGE_INPAGE_DLABEL_OPA);\r
+ dataLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ dataLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_PAGE_ITEM_LABEL_FSIZE);\r
+\r
+ nextImage_.SetPosition(SETTING_PAGE_INPAGE_IMAGE_X, SETTING_PAGE_INPAGE_IMAGE_Y);\r
+ nextImage_.Resize(SETTING_PAGE_INPAGE_IMAGE_WIDTH, SETTING_PAGE_INPAGE_IMAGE_HEIGHT);\r
+ LOADIMG::LoadImageViewImg(&nextImage_, SETTING_IMAGE, IMAGE_MAIN_LIST_ARROW);\r
+ nextImage_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ nextImage_.SetAutoEnable(false);\r
+ nextImage_.SetResizeMode(UIImageView::SCALE_DOWN);\r
+\r
+ Add(&icon_);\r
+ Add(&textLabel_);\r
+ Add(&dataLabel_);\r
+ Add(&nextImage_);\r
+}\r
+\r
+IconTextNavigationItemView::~IconTextNavigationItemView()\r
+{\r
+ Remove(&icon_);\r
+ Remove(&textLabel_);\r
+ Remove(&dataLabel_);\r
+ Remove(&nextImage_);\r
+}\r
+\r
+void IconTextNavigationItemView::UpdateViewData(IconTextNavigationItemData* data)\r
+{\r
+ if (data != nullptr) {\r
+ SetStyle(STYLE_BACKGROUND_COLOR, data->bgColor.full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, data->bgOpa);\r
+ icon_.SetSrc(CacheImage(data->icon));\r
+ textLabel_.SetText(data->textContent);\r
+ dataLabel_.SetVisible(false);\r
+ if (data->dataContent != nullptr) {\r
+ dataLabel_.SetPosition(\r
+ SETTING_PAGE_INPAGE_TLABEL_X + textLabel_.GetTextWidth() + SETTING_PAGE_INPAGE_DLABEL_X_OFFSET,\r
+ SETTING_PAGE_INPAGE_LABEL_Y);\r
+ dataLabel_.SetText(data->dataContent);\r
+ dataLabel_.SetVisible(true);\r
+ }\r
+ nextImage_.SetVisible(data->hasSecondMenu);\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingAboutModel\r
+ * Create: 2025-06-01\r
+ */\r
+#include "bts_br_gap.h"\r
+#if !defined(_WIN32)\r
+#include "nv.h"\r
+#endif\r
+#include "nv_config/include/common.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingAboutModel.h"\r
+\r
+namespace OHOS {\r
+constexpr static uint8_t SYS_NAME_LEN = 32;\r
+\r
+std::string SettingAboutModel::GetSystemName()\r
+{\r
+#if !defined(_WIN32)\r
+ unsigned char sysName[SYS_NAME_LEN] = "";\r
+ unsigned char sysNameLen = SYS_NAME_LEN;\r
+ if (bluetooth_get_local_name(sysName, &sysNameLen) != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutModel::GetSystemName error");\r
+ return "";\r
+ }\r
+ return std::string((const char*)sysName);\r
+#else\r
+ return std::string("WATCH 2 0322");\r
+#endif\r
+}\r
+\r
+std::string SettingAboutModel::GetSystemType()\r
+{\r
+#if !defined(_WIN32)\r
+ sys_product_info_t info = {0};\r
+ uint16_t nvsize = 0;\r
+ errcode_t ret = uapi_nv_read(NV_ID_SYS_PRODUCT_INFO, sizeof(sys_product_info_t), &nvsize, (uint8_t *)&info);\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutModel::GetSystemType error, ret=%u", ret);\r
+ return "";\r
+ }\r
+ if (nvsize < sizeof(sys_product_info_t) || info.size == 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "invalid system type: nvsize=%u, info.size=%u", nvsize, info.size);\r
+ return "";\r
+ }\r
+ return std::string((const char*)info.name);\r
+#else\r
+ return std::string("WATCH-BX9");\r
+#endif\r
+}\r
+}\r
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothHeadsetEvent
+ * Create: 2022-3-22
+ */
+
+#include "settings/model/SettingBluetoothHeadsetEvent.h"
+#include "bts_avrcp_target.h"
+#include "bts_avrcp_controller.h"
+#include "player/PlayersModel.h"
+#include "graphic_service.h"
+
+using namespace OHOS;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define AVRCP_CT_AUTO_REG_TYPE 1
+uint8_t g_avrcp_tg_local_media_vol = AVRCP_ABSOLUTE_VOLUME_INVALID;
+#define BT_A2DP_MEDIA_VOL_LEVEL 100
+
+bt_avrcp_tg_bts_cbk g_avrcp_tg_audio_cb;
+avrcp_ct_callbacks_t g_avrcp_ct_cb;
+avrcp_tg_callbacks_t g_avrcp_tg_cb;
+SettingBtAvrcpTgInf g_avrcp_srv_inf;
+
+void SettingBtAvrcpVolumeChangedSyncMedia(uint8_t a2dp_volume)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "[SettingBtAvrcpVolumeChangedSyncMedia]::a2dp_volume = 0x%x\r\n", a2dp_volume);
+ int32_t audio_volume = a2dp_volume * BT_A2DP_MEDIA_VOL_LEVEL / AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_100;
+ AudioManager::GetInstance().SetVolume(AUDIO_STREAM_A2DP_MUSIC, audio_volume); /* 设置增益音量 */
+ g_avrcp_tg_local_media_vol = a2dp_volume;
+ avrcp_tg_notify_volume_changed(a2dp_volume);
+}
+
+/* tg通知媒体状态 */
+static void SettingBtAvrcpTgNotifyMeidaStatus(bt_avrcp_tg_evt_status_param *notifyEventStatusParam)
+{
+ if (notifyEventStatusParam == nullptr || notifyEventStatusParam->event_id >= AVRCP_NOTIFY_EVENT_RESERVED) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[SettingBtAvrcpTgNotifyMeidaStatus] param is error");
+ return;
+ }
+ switch (notifyEventStatusParam->event_id) {
+ case AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED:
+ avrcp_tg_notify_playback_status_changed(*(td_u8 *)notifyEventStatusParam->event_status);
+ break;
+ case AVRCP_NOTIFY_EVENT_TRACK_CHANGED:
+ avrcp_tg_notify_track_changed(*(unsigned long long *)notifyEventStatusParam->event_status);
+ break;
+ case AVRCP_NOTIFY_EVENT_TRACK_REACHED_END:
+ avrcp_tg_notify_track_reached_end();
+ break;
+ case AVRCP_NOTIFY_EVENT_TRACK_REACHED_START:
+ avrcp_tg_notify_track_reached_start();
+ break;
+ case AVRCP_NOTIFY_EVENT_PLAYBACK_POS_CHANGED:
+ avrcp_tg_notify_playback_pos_changed(*(td_u32 *)notifyEventStatusParam->event_status);
+ break;
+ case AVRCP_NOTIFY_EVENT_BATT_STATUS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_SYSTEM_STATUS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:
+ break;
+ case AVRCP_NOTIFY_EVENT_NOW_PLAYING_CONTENT_CHANGED:
+ avrcp_tg_notify_now_playing_content_changed();
+ break;
+ case AVRCP_NOTIFY_EVENT_AVAILABLE_PLAYERS_CHANGED:
+ avrcp_tg_notify_available_players_changed();
+ break;
+ case AVRCP_NOTIFY_EVENT_ADDRESSED_PLAYER_CHANGED:
+ avrcp_tg_notify_addressed_players_changed(*(td_u16 *)notifyEventStatusParam->event_status,
+ *(td_u16 *)(notifyEventStatusParam->event_status + sizeof(td_u16)));
+ break;
+ case AVRCP_NOTIFY_EVENT_UIDS_CHANGED:
+ avrcp_tg_notify_uid_changed(*(td_u16 *)notifyEventStatusParam->event_status);
+ break;
+ case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+ SettingBtAvrcpVolumeChangedSyncMedia(notifyEventStatusParam->event_status[0]);
+ break;
+ case AVRCP_NOTIFY_EVENT_RESERVED:
+ break;
+ default:
+ break;
+ }
+}
+
+void SettingPressButtonStatusCallback(td_u32 keyOperation, td_u32 keyValue)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[SettingPressButtonStatusCallback]::keyValue = 0x%x keyOperation = 0x%x",
+ keyValue, keyOperation);
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(SettingUsingPressButtonStatusCallback, keyOperation, keyValue));
+}
+
+void SettingBtAvrcpTgNotifyVolumeChangedProc(uint8_t a2dp_volume)
+{
+ int32_t audio_volume = a2dp_volume * BT_A2DP_MEDIA_VOL_LEVEL / AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_100;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "NotifyVolume = %d", audio_volume);
+ AudioManager::GetInstance().SetVolume(AUDIO_STREAM_MUSIC, audio_volume); // 耳机连接手表场景调节手表音量
+}
+
+void SettingUsingPressButtonStatusCallback(td_u32 keyOperation, td_u32 keyValue)
+{
+ bt_avrcp_tg_evt_status_param event;
+ switch (keyOperation) {
+ case AVRCP_KEY_VOLUME_UP: // 耳机控制手表加减音量不走key_operation事件
+ case AVRCP_KEY_VOLUME_DOWN: // 减小音量
+ break;
+ case AVRCP_KEY_MUTE: // 静音
+ event.event_status[0] = AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_0;
+ event.event_id = AVRCP_NOTIFY_EVENT_VOLUME_CHANGED;
+ break;
+ case AVRCP_KEY_PLAY: // 播放
+ (void)PlayersModel::GetInstance()->PlayerPlay();
+ event.event_status[0] = AVRCP_PLAY_STATUS_PLAYING;
+ event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+ break;
+ case AVRCP_KEY_STOP: // 停止
+ (void)PlayersModel::GetInstance()->PlayerStop();
+ event.event_status[0] = AVRCP_PLAY_STATUS_STOPPED;
+ event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+ break;
+ case AVRCP_KEY_PAUSE: // 暂停
+ (void)PlayersModel::GetInstance()->PlayerPause();
+ event.event_status[0] = AVRCP_PLAY_STATUS_PAUSED;
+ event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+ break;
+ case AVRCP_KEY_FORWARD: // 下一曲
+ PlayersModel::GetInstance()->LoopingPlayout();
+ event.event_status[0] = AVRCP_PLAY_STATUS_FWD_SEEK;
+ event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+ break;
+ case AVRCP_KEY_BACKWARD: // 上一曲
+ PlayersModel::GetInstance()->PreviousPlayout();
+ event.event_status[0] = AVRCP_PLAY_STATUS_REV_SEEK;
+ event.event_id = AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED;
+ break;
+ case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+ /* 手机连接手表场景,控制手表喇叭声音 */
+ event.event_status[0] = keyValue;
+ event.event_id = AVRCP_NOTIFY_EVENT_VOLUME_CHANGED;
+ SettingBtAvrcpTgNotifyVolumeChangedProc((uint8_t)keyValue);
+ default:
+ break;
+ }
+
+ SettingBtAvrcpTgNotifyMeidaStatus(&event);
+}
+
+uint8_t SettingBtAvrcpTgGetLocMediaVolume(void)
+{
+ if (g_avrcp_tg_local_media_vol == AVRCP_ABSOLUTE_VOLUME_INVALID) {
+ int32_t audio_volume = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_A2DP_MUSIC);
+ uint8_t a2dp_volume = (uint8_t)(audio_volume * AVRCP_ABSOLUTE_VOLUME_PERCENTAGE_100 / BT_A2DP_MEDIA_VOL_LEVEL);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audio_volume 0x%x, a2dp_volume 0x%x\n", audio_volume, a2dp_volume);
+ g_avrcp_tg_local_media_vol = a2dp_volume;
+ }
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get local media volume, a2dp_volume = 0x%x", g_avrcp_tg_local_media_vol);
+ return g_avrcp_tg_local_media_vol;
+}
+
+void SettingMediaStatusCallback(bt_avrcp_tg_evt_status_param *eventStatusParam)
+{
+ if (eventStatusParam == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "eventStatusParam is nullptr");
+ return;
+ }
+
+ int32_t playerStatus = PlayersModel::GetInstance()->GetPlayerstatus();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerStatus = %d", playerStatus);
+
+ switch (eventStatusParam->event_id) {
+ case AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED:
+ eventStatusParam->event_status[0] = playerStatus;
+ break;
+ case AVRCP_NOTIFY_EVENT_TRACK_CHANGED:
+ case AVRCP_NOTIFY_EVENT_TRACK_REACHED_END:
+ break;
+ case AVRCP_NOTIFY_EVENT_TRACK_REACHED_START:
+ break;
+ case AVRCP_NOTIFY_EVENT_PLAYBACK_POS_CHANGED:
+ eventStatusParam->event_status[0] = 0xFF;
+ break;
+ case AVRCP_NOTIFY_EVENT_BATT_STATUS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_SYSTEM_STATUS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:
+ break;
+ case AVRCP_NOTIFY_EVENT_NOW_PLAYING_CONTENT_CHANGED:
+ break;
+ case AVRCP_NOTIFY_EVENT_AVAILABLE_PLAYERS_CHANGED:
+ break;
+ case AVRCP_NOTIFY_EVENT_ADDRESSED_PLAYER_CHANGED:
+ break;
+ case AVRCP_NOTIFY_EVENT_UIDS_CHANGED:
+ break;
+ case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+ eventStatusParam->event_status[0] = SettingBtAvrcpTgGetLocMediaVolume();
+ break;
+ case AVRCP_NOTIFY_EVENT_RESERVED:
+ break;
+ default :
+ break;
+ }
+}
+
+void SettingConnCtStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct update conn stat:%u", state);
+ if (bdAddr == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bdaddr nullptr");
+ return;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingConnCtStateChangedCallback addr: %02x%02x%02x%02x%02x%02x ",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */
+ (void)memcpy_s(g_avrcp_srv_inf.bd_addr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
+ g_avrcp_srv_inf.avrcp_srv_conn_stat = state;
+}
+
+static bd_addr_t *SettingBtAvrcpSrvGetActiveAddr(void)
+{
+ return &g_avrcp_srv_inf.bd_addr;
+}
+
+void SettingConnectTgStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "avrcp tg update conn stat:%u", state);
+ if (bdAddr == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bdaddr nullptr");
+ return;
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingConnCtStateChangedCallback addr: %02x%02x%02x%02x%02x%02x ",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */
+ (void)memcpy_s(g_avrcp_srv_inf.bd_addr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
+ g_avrcp_srv_inf.avrcp_srv_conn_stat = state;
+
+ /* 手表耳机链接场景时,耳机控制音量是一个事件而非key_operation,故需要在手表侧向耳机注册音量变更事件 */
+ if (state == PROFILE_STATE_CONNECTED) {
+ (void)avrcp_ct_get_supported_events(SettingBtAvrcpSrvGetActiveAddr());
+ }
+}
+
+static void SettingBtAvrcpCtPressButtonRspCallback(const bd_addr_t *bd_addr, int32_t key_operation)
+{
+ if (bd_addr == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+ return;
+ }
+ if (g_avrcp_srv_inf.avrcp_button_flag == SETTING_AVRCP_SRV_RELEASED_VALUE) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct press button button_flag change:%u->%u\n",
+ g_avrcp_srv_inf.avrcp_button_flag, SETTING_AVRCP_SRV_PRESS_VALUE);
+ g_avrcp_srv_inf.avrcp_button_flag = SETTING_AVRCP_SRV_PRESS_VALUE;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct press button cbk key:%d button_flag:%u\n",
+ key_operation, g_avrcp_srv_inf.avrcp_button_flag);
+}
+
+static void SettingBtAvrcpPressReleaseButtonLog(uint32_t key_operation)
+{
+ switch (key_operation) {
+ case AVRCP_KEY_VOLUME_UP:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_VOLUME_UP\n");
+ break;
+ case AVRCP_KEY_VOLUME_DOWN:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_VOLUME_DOWN\n");
+ break;
+ case AVRCP_KEY_MUTE:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_VOLUME_MUTE\n");
+ break;
+ case AVRCP_KEY_PLAY:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_PLAY\n");
+ break;
+ case AVRCP_KEY_STOP:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_STOP\n");
+ break;
+ case AVRCP_KEY_PAUSE:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_PAUSE\n");
+ break;
+ case AVRCP_KEY_FORWARD:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_FORWARD\n");
+ break;
+ case AVRCP_KEY_BACKWARD:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_BACKWARD\n");
+ break;
+ case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AVRCP_EVENT_VOLUME_CHANGED\n");
+ break;
+ default:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "invalid\n");
+ break;
+ }
+}
+
+static void SettingBtAvrcpCtReleaseButtonRspCallback(const bd_addr_t *bd_addr, int32_t key_operation)
+{
+ UNUSED(bd_addr);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct release button cbk key:%d\n", key_operation);
+ if (g_avrcp_srv_inf.avrcp_button_flag == SETTING_AVRCP_SRV_PRESS_VALUE) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct released button button_flag change:%u->%u\n",
+ g_avrcp_srv_inf.avrcp_button_flag, SETTING_AVRCP_SRV_RELEASED_VALUE);
+ g_avrcp_srv_inf.avrcp_button_flag = SETTING_AVRCP_SRV_RELEASED_VALUE;
+ }
+ SettingBtAvrcpPressReleaseButtonLog((uint32_t)key_operation);
+}
+
+static void SettingBtAvrcpCtSupportCompanyCallback(const bd_addr_t *bd_addr, avrcp_ct_support_company_para_t *company)
+{
+ if (bd_addr == nullptr || company == nullptr || company->company_id == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+ return;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get company list:");
+ for (uint8_t i = 0; i < company->company_num; i++) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " 0x%x ", *company->company_id);
+ }
+}
+
+static void SettingBtAvrcpCtSupportEventCallback(const bd_addr_t *bd_addr, avrcp_ct_support_event_para_t *event)
+{
+ if (bd_addr == nullptr || event == nullptr || event->event_id == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+ return;
+ }
+
+ for (uint8_t i = 0; i < event->event_num; i++) {
+ if (event->event_id[i] == AVRCP_NOTIFY_EVENT_VOLUME_CHANGED) {
+ int ret = avrcp_ct_register_notification(bd_addr, event->event_id[i], 0);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "register event_id: 0x%x, ret = 0x%x", event->event_id[i], ret);
+ }
+ }
+
+ for (uint8_t i = 0; i < event->event_num; i++) {
+ if (event->event_id[i] != AVRCP_NOTIFY_EVENT_VOLUME_CHANGED) {
+ int ret = avrcp_ct_register_notification(bd_addr, event->event_id[i], 0);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "register event_id: 0x%x, ret = 0x%x", event->event_id[i], ret);
+ }
+ }
+}
+
+static void SettingBtAvrcpCtGetElementAttriCallback(const bd_addr_t *bd_addr, avrcp_ct_element_attr_para_cb_t *attr_cb_para)
+{
+ if (bd_addr == nullptr || attr_cb_para == nullptr || attr_cb_para->attr_value == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+ return;
+ }
+
+ for (uint8_t i = 0; i < attr_cb_para->attr_num; i++) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "attrId-charaId-valLen: 0x%x-0x%x-%u \n",
+ attr_cb_para->attr_value[i].attr_id,
+ attr_cb_para->attr_value[i].character_set_id,
+ attr_cb_para->attr_value[i].value_len);
+ switch (attr_cb_para->attr_value[i].attr_id) {
+ case AVRCP_CT_ELEMENT_ATTR_TITLE:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Title:");
+ break;
+ case AVRCP_CT_ELEMENT_ATTR_ARTIST_NAME:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Name:");
+ break;
+ case AVRCP_CT_ELEMENT_ATTR_ALBUM_NAME:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Album:");
+ break;
+ case AVRCP_CT_ELEMENT_ATTR_TRACK_NUMBER:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Track Number:");
+ break;
+ case AVRCP_CT_ELEMENT_ATTR_TOTAL_NUMBER_OF_TRACKS:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Total Number Of Track:");
+ break;
+ case AVRCP_CT_ELEMENT_ATTR_TRACK_GENRE:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Track GENRE:");
+ break;
+ case AVRCP_CT_ELEMENT_ATTR_TRACK_PLAYING_TIME:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Attr Track Playing Time_ms:");
+ break;
+ default:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Other:");
+ break;
+ }
+
+ uint8_t *value = (uint8_t *)(void *)malloc(attr_cb_para->attr_value[i].value_len + 1);
+ if (attr_cb_para->attr_value[i].value_len > 0 && attr_cb_para->attr_value[i].value != nullptr) {
+ if (memcpy_s(value, attr_cb_para->attr_value[i].value_len,
+ attr_cb_para->attr_value[i].value, attr_cb_para->attr_value[i].value_len) != EOK) {
+ free(value);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s fail.");
+ return;
+ }
+ }
+ value[attr_cb_para->attr_value[i].value_len] = '\0';
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " %s \n", value);
+ free(value);
+ }
+}
+
+static void SettingBtAvrcpCtGetPlayStatusCallback(const bd_addr_t *bd_addr, avrcp_ct_play_status_cb_t *status)
+{
+ if (bd_addr == nullptr || status == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+ return;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "test get play status songlen:%u, songpos:%u, playstatus:%u:",
+ status->song_length, status->song_position, status->play_status);
+}
+
+static void SettingBtAvrcpCtHdlNotifyVolumeRspCbk(avrcp_ct_notification_value_cb_t *notification)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Set local volume: 0x%x\n", notification->volume); /* 注册事件后通知的音量 */
+ SettingBtAvrcpTgNotifyVolumeChangedProc((uint8_t)notification->volume);
+}
+
+static void SettingBtAvrcpCtNotificationCallback(
+ const bd_addr_t *bd_addr, avrcp_notify_event_t event_id, avrcp_ct_notification_value_cb_t *notification)
+{
+ if (bd_addr == nullptr || notification == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");
+ return;
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ct notification cbk event_id:0x%x\n", event_id);
+ bool notify_flag = true;
+ switch (event_id) {
+ case AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "tg notify ct playback status changed :%u\n",
+ notification->play_status);
+ break;
+ case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:
+ SettingBtAvrcpCtHdlNotifyVolumeRspCbk(notification);
+ break;
+ case AVRCP_NOTIFY_EVENT_NOW_PLAYING_CONTENT_CHANGED:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "play conent changed event_id:0x%x\n", event_id);
+ break;
+ case AVRCP_NOTIFY_EVENT_TRACK_CHANGED:
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "track changed event_id:0x%x\n", event_id);
+ break;
+ case AVRCP_NOTIFY_EVENT_TRACK_REACHED_END:
+ case AVRCP_NOTIFY_EVENT_TRACK_REACHED_START:
+ case AVRCP_NOTIFY_EVENT_PLAYBACK_POS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_BATT_STATUS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_SYSTEM_STATUS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:
+ case AVRCP_NOTIFY_EVENT_AVAILABLE_PLAYERS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_ADDRESSED_PLAYER_CHANGED:
+ case AVRCP_NOTIFY_EVENT_UIDS_CHANGED:
+ case AVRCP_NOTIFY_EVENT_RESERVED:
+ default:
+ notify_flag = false;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "invalid event id event_id:0x%x\n", event_id);
+ break;
+ }
+ if (notify_flag) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "notify reg event_id: 0x%x\n", event_id);
+ avrcp_ct_register_notification(bd_addr, event_id, 0); /* TG通知变化后CT重新注册事件 */
+ }
+}
+
+void SettingInitBtHeadsetEvent()
+{
+ g_avrcp_tg_audio_cb.notify_pass_through_status_cbk = SettingPressButtonStatusCallback;
+ g_avrcp_tg_audio_cb.get_media_status_cbk = SettingMediaStatusCallback;
+
+ g_avrcp_tg_cb.conn_state_changed_cb = SettingConnectTgStateChangedCallback;
+
+ g_avrcp_ct_cb.conn_state_changed_cb = SettingConnCtStateChangedCallback;
+ g_avrcp_ct_cb.press_button_cb = SettingBtAvrcpCtPressButtonRspCallback;
+ g_avrcp_ct_cb.release_button_cb = SettingBtAvrcpCtReleaseButtonRspCallback;
+ g_avrcp_ct_cb.supported_companies_cb = SettingBtAvrcpCtSupportCompanyCallback;
+ g_avrcp_ct_cb.supported_event_cb = SettingBtAvrcpCtSupportEventCallback;
+ g_avrcp_ct_cb.element_attr_cb = SettingBtAvrcpCtGetElementAttriCallback;
+ g_avrcp_ct_cb.play_status_cb = SettingBtAvrcpCtGetPlayStatusCallback;
+ g_avrcp_ct_cb.notification_cb = SettingBtAvrcpCtNotificationCallback;
+
+ avrcp_tg_register_callbacks(&g_avrcp_tg_cb);
+ avrcp_ct_register_callbacks(&g_avrcp_ct_cb);
+ bt_avrcp_tg_register_audio_cbk(&g_avrcp_tg_audio_cb);
+}
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingSettingBluetoothModel
+ * Created: 2025-06-05
+ */
+
+#include <cstdint>
+#include "bluetooth/BluetoothWrapper.h"
+#include "player/PlayersModel.h"
+#include "phoneservice/PhoneAudio.h"
+#include "graphic_service.h"
+#include "msg_center.h"
+#include "bts_def.h"
+#include "bts_gatt_stru.h"
+#include "bts_a2dp_source.h"
+#include "bts_gatt_server.h"
+#include "bts_le_gap.h"
+#include "bts_spp.h"
+#include "osal_task.h"
+#ifdef SUPPORT_ALIPAY_SEC
+#include "alipay_feature.h"
+#endif
+#include "bts_a2dp_sink.h"
+#include "bts_feature.h"
+#include "bt_audio_hal_interface.h"
+#include "audio_manager_c_wrapper.h"
+#include "bts_avrcp_target.h"
+#include "msg_center_msg.h"
+#include "client/msg_center_client.h"
+#include "msg_center_protocol.h"
+#include "dfx_channel.h"
+#include "tcxo.h"
+#include "uiservice/ui_service.h"
+#include "network/network_listener.h"
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+#include "lwip_driver_adapter.h"
+#endif
+#include "main/PullUpDownView.h"
+#include "settings/common/SettingCommon.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingConnectionOpen.h"
+#include "findphone/FindPhoneMainPage.h"
+#include "bluetooth/BluetoothChangeBle.h"
+#include "settings/model/SettingBluetoothModel.h"
+
+namespace OHOS {
+constexpr uint16_t SETTING_BLUETOOTH_CONN_HANDLE = 64;
+constexpr uint16_t SETTING_BLUETOOTH_INTERVAL_TOMAX_MIN = 12;
+constexpr uint16_t SETTING_BLUETOOTH_INTERVAL_TOMAX_MAX = 12;
+constexpr uint16_t SETTING_BLUETOOTH_INTERVAL_TODEFAULT_MIN = 24;
+constexpr uint16_t SETTING_BLUETOOTH_INTERVAL_TODEFAULT_MAX = 48;
+constexpr uint16_t SETTING_BLUETOOTH_LATENCY = 0;
+constexpr uint16_t SETTING_BLUETOOTH_TIMEOUT_MUTIPLIER = 500;
+#define BT_SPP_TASK_STACK_SIZE 2048
+#define BT_SPP_TASK_PRI 20
+#define TEN 10
+
+static constexpr uint16_t BLUETOOTH_MAX_NUM = 20;
+static constexpr int16_t SETTING_ADDR2 = 2;
+static constexpr int16_t SETTING_ADDR3 = 3;
+static constexpr int16_t SETTING_ADDR4 = 4;
+static constexpr int16_t SETTING_ADDR5 = 5;
+static constexpr int16_t BLUETOOTH_ADDR_SET = 8;
+static constexpr int16_t WRITECB_PARA_LEGNTH_TWO = 2;
+static constexpr int16_t WRITECB_PARA_LEGNTH_NINE = 9;
+static constexpr int16_t WRITECB_PARA_LEGNTH_TEN = 10;
+static constexpr int16_t WAIT_TIME = 50;
+#define MEDIA_A2DP_SNK_INTERFACE 1
+#define A2DP_STREAM_ACCEPT_TIMER_PERIOD 500
+osal_timer g_setting_a2dp_stream_accept_timer = {nullptr, nullptr, 0, 0};
+AudioFormatConfig g_setting_audio_format_config = {AUDIO_DEFAULT, 0, 0};
+static uint16_t g_sample_svr_handle = 0;
+static uint16_t g_sample_characteristic_handle = 0;
+static uint16_t g_diag_characteristic_handle = 0;
+static uint16_t g_diag_desc_handle = 0;
+constexpr uint16_t g_sample_adv_id = 2;
+static bd_addr_t g_bd_addr = { 0 };
+
+SettingBluetoothModel::SettingBluetoothModel()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel::SettingBluetoothModel");
+}
+
+SettingBluetoothModel *SettingBluetoothModel::GetInstance(void)
+{
+ static SettingBluetoothModel instance;
+ return &instance;
+}
+
+char* SettingBluetoothModel::GetWatchName(void)
+{
+ return watchName_;
+}
+
+// 扫描设备 btEarPhoneList存在数据 设置为1 否则设置为0
+void SettingBluetoothModel::SetEarPhoneListHasData(bool status)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel EarPhoneListHasData_ = %d", status);
+ EarPhoneListHasData_ = status;
+}
+
+uint32_t SettingBluetoothModel::GetEarPhoneListHasData()
+{
+ return EarPhoneListHasData_;
+}
+
+void SettingBluetoothModel::SetDeviceName(std::string deviceName)
+{
+ deviceName_ = deviceName;
+}
+
+std::string SettingBluetoothModel::GetDeviceName()
+{
+ return deviceName_;
+}
+
+void SettingBluetoothModel::SetBlueToothConnectStatus(bool status)
+{
+ btConnectStatus_ = status;
+}
+
+bool SettingBluetoothModel::GetBlueToothConnectStatus(void)
+{
+ return btConnectStatus_;
+}
+
+void SettingBluetoothModel::SetConnectFragmentStatus(bool status)
+{
+ connectFragmentStatus_ = status;
+}
+
+bool SettingBluetoothModel::GetConnectFragmentStatus(void)
+{
+ return connectFragmentStatus_;
+}
+
+void SettingBluetoothModel::MoveMatchingDeviceToFront()
+{
+ std::list<BtCaseInfo> matchedItems;
+ std::list<BtCaseInfo> otherItems;
+ if(btScansDevicesList_.size() == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MoveMatchingDeviceToFront btScansDevicesList_ size = 0");
+ return;
+ }
+ bd_addr_t bdAddr = *(GetLastConnedAddr());
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); ++it) {
+ if ((bdAddr.addr[0] == it->addr[0]) && (bdAddr.addr[1] == it->addr[1])
+ && (bdAddr.addr[SETTING_ADDR2] == it->addr[SETTING_ADDR2])
+ && (bdAddr.addr[SETTING_ADDR3] == it->addr[SETTING_ADDR3])
+ && (bdAddr.addr[SETTING_ADDR4] == it->addr[SETTING_ADDR4])
+ && (bdAddr.addr[SETTING_ADDR5] == it->addr[SETTING_ADDR5])) {
+ matchedItems.push_back(*it);
+ } else {
+ otherItems.push_back(*it);
+ }
+ }
+
+ btScansDevicesList_.clear();
+ btScansDevicesList_.insert(btScansDevicesList_.begin(), matchedItems.begin(), matchedItems.end());
+ btScansDevicesList_.insert(btScansDevicesList_.end(), otherItems.begin(), otherItems.end());
+}
+
+void SettingBluetoothModel::UpdateConnectStatusForDevice()
+{
+ for (auto& item : btScansDevicesList_) {
+ if (std::strcmp(reinterpret_cast<const char*>(item.deviceName), deviceName_.c_str()) == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateConnectStatusForDevice deviceName:%s", item.deviceName);
+ item.connect_status = "连接中...";
+ }
+ }
+}
+
+void SettingBluetoothModel::UpdateDisconnectStatusForDevice(const bd_addr_t &bdAddr)
+{
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); ++it) {
+ if ((bdAddr.addr[0] == it->addr[0]) && (bdAddr.addr[1] == it->addr[1])
+ && (bdAddr.addr[SETTING_ADDR2] == it->addr[SETTING_ADDR2])
+ && (bdAddr.addr[SETTING_ADDR3] == it->addr[SETTING_ADDR3])
+ && (bdAddr.addr[SETTING_ADDR4] == it->addr[SETTING_ADDR4])
+ && (bdAddr.addr[SETTING_ADDR5] == it->addr[SETTING_ADDR5])) {
+ it->connect_status = "连接已经断开";
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UpdateDisconnectStatusForDevice addr: %02x%02x%02x%02x%02x%02x",
+ it->addr[SETTING_ADDR5], it->addr[SETTING_ADDR4], it->addr[SETTING_ADDR3],
+ it->addr[SETTING_ADDR2], it->addr[1], it->addr[0]);
+ }
+ }
+}
+
+void SettingBluetoothModel::UpdateConnectedStatusForDevice(const bd_addr_t &bdAddr)
+{
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); ++it) {
+ if ((bdAddr.addr[0] == it->addr[0]) && (bdAddr.addr[1] == it->addr[1])
+ && (bdAddr.addr[SETTING_ADDR2] == it->addr[SETTING_ADDR2])
+ && (bdAddr.addr[SETTING_ADDR3] == it->addr[SETTING_ADDR3])
+ && (bdAddr.addr[SETTING_ADDR4] == it->addr[SETTING_ADDR4])
+ && (bdAddr.addr[SETTING_ADDR5] == it->addr[SETTING_ADDR5])) {
+ it->connect_status = "已连接";
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UpdateConnectedStatusForDevice addr: %02x%02x%02x%02x%02x%02x",
+ it->addr[SETTING_ADDR5], it->addr[SETTING_ADDR4], it->addr[SETTING_ADDR3],
+ it->addr[SETTING_ADDR2], it->addr[1], it->addr[0]);
+ }
+ }
+}
+
+bool SettingBluetoothModel::GetConnectResultPage()
+{
+ return redirct_;
+}
+
+void SettingBluetoothModel::HandleUnpairRequest(void)
+{
+ bool ret;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingSettingBluetoothModel::HandleUnpairRequest lastConnedAddr_: %02x%02x%02x%02x%02x%02x",
+ selectedDeviceInfo_.addr[SETTING_ADDR5], selectedDeviceInfo_.addr[SETTING_ADDR4], selectedDeviceInfo_.addr[SETTING_ADDR3],
+ selectedDeviceInfo_.addr[SETTING_ADDR2], selectedDeviceInfo_.addr[1], selectedDeviceInfo_.addr[0]);
+ ret = gap_remove_pair((const bd_addr_t*)&selectedDeviceInfo_.addr);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingSettingBluetoothModel::HandleUnpairRequest gap_remove_pair %d", ret);
+}
+
+// 是否需要显示连接成功/失败的页面 在连接新耳机或者断开耳机连接时改变为true
+void SettingBluetoothModel::SetConnectResultPage(bool redirct)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBuletoothModel::SetRedirect :%d", redirct);
+ redirct_ = redirct;
+}
+
+void SettingBluetoothModel::InitBluetoothInfo(void)
+{
+ errcode_t ret;
+ unsigned char nameLen = BD_NAME_LEN;
+ memset_s(watchName_, sizeof(watchName_), 0, sizeof(watchName_));
+ ret = bluetooth_get_local_name((unsigned char *)watchName_, &nameLen);
+ // 为了实验室测试需要,客户需要自己修改
+ if ((nameLen == strlen("WatchDemo") + 1) && (strcmp("WatchDemo", watchName_) == 0)) {
+ uint32_t currentUs = uapi_tcxo_get_us();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "currentUs 0x%x", currentUs);
+ // 设置蓝牙名称
+ (void)sprintf_s(watchName_, sizeof(watchName_), "Watch%x", (currentUs & 0xFFFF));
+ ret = bluetooth_set_local_name((unsigned char*)watchName_, strlen((char*)watchName_) + 1);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bluetooth_set_local_name %s ret = %u", watchName_, ret);
+
+ // 设置蓝牙地址
+ bd_addr_t addr = {{0x1C, 0x1D, 0x2B, 0x0, 0x0, 0x0} ,0};
+ addr.addr[3] = currentUs & 0xFF;
+ addr.addr[4] = (currentUs & 0XFF00) >> 8;
+ addr.addr[5] = currentUs & 0xFF;
+ ret = bluetooth_set_local_addr(addr.addr, BD_ADDR_LEN);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bluetooth_set_local_addr [0x%x:0x%x] ret = %u", addr.addr[0], addr.addr[1], ret);
+ } else {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "watchName_: %s", watchName_);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "nameLen: %u", nameLen);
+ }
+}
+
+void SettingBluetoothModel::Init()
+{
+#ifndef SUPPORT_AUTO_OTA
+ errcode_t ret;
+
+ // 设置自动回连,ios一键双连依赖此配置
+ bts_feature_t bts_feature = { 0 };
+ bts_feature.bt_auto_reconnect_closed = 0;
+ ret = bts_set_features(&bts_feature);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt bts_set_features ret = %u", ret);
+
+ ret = enable_bt_stack();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %u", ret);
+
+ // 设置安全连接
+ gap_ble_sec_params_t sec_param = { 1, GAP_BLE_IO_CAPABILITY_NOINPUTNOOUTPUT, 1, GAP_BLE_GAP_SECURITY_MODE1_LEVEL3 };
+ ret = gap_ble_set_sec_param(&sec_param);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt gap_ble_set_sec_param ret = %u", ret);
+
+ InitBluetoothInfo();
+ SettingBtInitCallBacks();
+ wrapper_ble_register();
+#ifdef SUPPORT_ALIPAY_SEC
+ svr_alipay_bluetooth_init();
+#endif
+ SettingBtInitCallBacksEx();
+ SettingBtInitGatts();
+ SettingBtInitSpp();
+
+ /* 实验室测试需要,开机开广播 */
+ BleSettingAdvStart();
+
+ ClearScansDevicesList();
+ SetUpPairedDevicesList();
+#endif
+}
+
+void SettingBluetoothModel::ClearScansDevicesList()
+{
+ btScansDevicesList_.clear();
+}
+
+bool SettingBluetoothModel::CheckExistScanList(BtCaseInfo caseInfo)
+{
+ std::list<BtCaseInfo>::iterator node = btScansDevicesList_.begin();
+ if (btScansDevicesList_.empty()) {
+ return false;
+ }
+ while (node != btScansDevicesList_.end()) {
+ if ((caseInfo.addr[0] == node->addr[0]) && (caseInfo.addr[1] == node->addr[1])
+ && (caseInfo.addr[2] == node->addr[2]) && (caseInfo.addr[3] == node->addr[3])
+ && (caseInfo.addr[4] == node->addr[4]) && (caseInfo.addr[5] == node->addr[5])) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "true");
+ return true;
+ }
+ node++;
+ }
+ return false;
+}
+
+std::list<BtCaseInfo>& SettingBluetoothModel::GetScansDevicesList()
+{
+ return btScansDevicesList_;
+}
+
+void SettingBluetoothModel::ScansDevicesListAddCase(BtCaseInfo caseInfo)
+{
+ SetEarPhoneListHasData(true);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ScansDevicesListAddCase::caseInfo addr: %02x%02x%02x%02x%02x%02x",
+ caseInfo.addr[5], caseInfo.addr[4], caseInfo.addr[3], /* mac下标 0 1 2 3 4 5 */
+ caseInfo.addr[2], caseInfo.addr[1], caseInfo.addr[0]);
+ if (btScansDevicesList_.size() >= BLUETOOTH_MAX_NUM) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_.size is BLUETOOTH_MAX_NUM");
+ return;
+ } else {
+ btScansDevicesList_.push_back(caseInfo);
+ }
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel::ScansDevicesListAddCase after size: %d", btScansDevicesList_.size());
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel::ScansDevicesListAddCase %s", caseInfo.deviceName);
+}
+
+void SettingBluetoothModel::SetScansCaseRssi(const bd_addr_t *bdAddr, int rssi)
+{
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {
+ if ((it->addr[0] == bdAddr->addr[0]) && (it->addr[1] == bdAddr->addr[1])
+ && (it->addr[2] == bdAddr->addr[2]) && (it->addr[3] == bdAddr->addr[3])
+ && (it->addr[4] == bdAddr->addr[4]) && (it->addr[5] == bdAddr->addr[5])) {
+ it->rssi = rssi;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_ rssi:%d deviceName:%s", it->rssi, it->deviceName);
+ }
+ }
+}
+
+
+bool CompBuletoothInfo(const BtCaseInfo& a, const BtCaseInfo& b)
+{
+ if (a.rssi > b.rssi) {
+ return true;
+ }
+ return false;
+}
+
+void SettingBluetoothModel::SortScansCaseRssi()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel::SortScansCaseRssi");
+ btScansDevicesList_.sort(CompBuletoothInfo);
+}
+
+void SettingBluetoothModel::ResetScanDevicesCase(const BtCaseInfo& caseInfo)
+{
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {
+ if ((it->addr[0] == caseInfo.addr[0]) && (it->addr[1] == caseInfo.addr[1])
+ && (it->addr[2] == caseInfo.addr[2]) && (it->addr[3] == caseInfo.addr[3])
+ && (it->addr[4] == caseInfo.addr[4]) && (it->addr[5] == caseInfo.addr[5])) {
+ (void)memcpy_s(it->deviceName, BD_NAME_LEN,
+ caseInfo.deviceName, BD_NAME_LEN);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResetConnedDevicesCase deviceName:%s", it->deviceName);
+ }
+ }
+}
+
+/* 已配对设备队列 */
+void SettingBluetoothModel::SetPairedDevicesListClear()
+{
+ btPairedDevicesList_->Clear();
+}
+
+void SettingBluetoothModel::SetUpPairedDevicesList()
+{
+ if (btPairedDevicesList_ == nullptr) {
+ btPairedDevicesList_ = new List<BtCaseInfo>();
+ if (btPairedDevicesList_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothModel btPairedDevicesList_ new fail");
+ return;
+ }
+ SetPairedDevicesListClear();
+ unsigned int connedDevicesNum = 0;
+ bool ret = gap_get_paired_devices_num(&connedDevicesNum);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Setup GetPariedDevicesNum ret = %d, num = %d", ret, connedDevicesNum);
+
+ gap_paired_device_info_t *devInfo = (gap_paired_device_info_t*)malloc(sizeof(gap_paired_device_info_t) *connedDevicesNum);
+ if (devInfo == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DevInfo malloc failed %u", sizeof(gap_paired_device_info_t) *connedDevicesNum);
+ return;
+ }
+ ret = gap_get_paired_devices_list(devInfo, (int *)&connedDevicesNum);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpPairedDevicesList gap_get_paired_devices_list ret = %d", ret);
+
+ BtCaseInfo caseInfo{};
+ for (int i = 0; i < static_cast<int>(connedDevicesNum); ++i) {
+ if ((gap_get_device_class((const bd_addr_t *)devInfo[i].addr.addr) & 0x200) != 0) {
+ continue;
+ }
+ (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, devInfo[i].addr.addr, BD_ADDR_LEN);
+ (void)memcpy_s(caseInfo.deviceName, BD_NAME_LEN, devInfo[i].device_name, BD_NAME_LEN);
+ caseInfo.connect_status = "连接已经断开";
+ AddPairedDevicesCase(caseInfo);
+ btScansDevicesList_.push_back(caseInfo);
+ }
+ free(devInfo);
+ }
+}
+
+void SettingBluetoothModel::AddPairedDevicesCase(BtCaseInfo caseInfo)
+{
+ if (btPairedDevicesList_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "btPairedDevicesList_ nullptr");
+ return;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddPairedDevicesCase::caseInfo addr: %02x%02x%02x%02x%02x%02x",
+ caseInfo.addr[5], caseInfo.addr[4], caseInfo.addr[3], /* mac下标 0 1 2 3 4 5 */
+ caseInfo.addr[2], caseInfo.addr[1], caseInfo.addr[0]);
+ if (btPairedDevicesList_->Size() >= BLUETOOTH_MAX_NUM) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btPairedDevicesList_->Size is BLUETOOTH_MAX_NUM");
+ return;
+ } else {
+ btPairedDevicesList_->PushBack(caseInfo);
+ }
+}
+
+List<BtCaseInfo>& SettingBluetoothModel::GetPairedDevicesCase()
+{
+ return *btPairedDevicesList_;
+}
+
+bool SettingBluetoothModel::GetAclConnected(void)
+{
+ return aclConnected_;
+}
+
+void SettingBluetoothModel::SetAclConnected(bool tag)
+{
+ aclConnected_ = tag;
+}
+
+void SettingBluetoothModel::UpdateAclConnectStatus(bool status)
+{
+ aclConnected_ = status;
+ if (PullUpDownView::GetInstance() != nullptr) {
+ PullUpDownView::GetInstance()->UpdateBlueToothStatus(status);
+ }
+}
+
+void SettingBluetoothModel::SetSelectedDeviceInfo(BtCaseInfo *caseInfo)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetSelectedDeviceInfo: %02x%02x%02x%02x%02x%02x",
+ caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* mac챐 0 1 2 3 4 5 */
+ caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* mac챐 0 1 2 3 4 5 */
+ (void)memcpy_s(selectedDeviceInfo_.addr, BD_ADDR_LEN,
+ caseInfo->addr, BD_ADDR_LEN);
+ (void)memcpy_s(selectedDeviceInfo_.deviceName, BD_NAME_LEN,
+ caseInfo->deviceName, BD_NAME_LEN);
+}
+
+BtCaseInfo *SettingBluetoothModel::GetSelectedDeviceInfo(void)
+{
+ return &selectedDeviceInfo_;
+}
+
+void SettingBluetoothModel::SetLastConnedAddr(const bd_addr_t *addr)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetLastConnedAddr: %02x%02x%02x%02x%02x%02x",
+ addr->addr[5], addr->addr[4], addr->addr[3], /* mac챐 0 1 2 3 4 5 */
+ addr->addr[2], addr->addr[1], addr->addr[0]); /* mac챐 0 1 2 3 4 5 */
+ (void)memcpy_s(lastConnedAddr_.addr, BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);
+}
+
+bd_addr_t *SettingBluetoothModel::GetLastConnedAddr(void)
+{
+ return &lastConnedAddr_;
+}
+
+bool SettingBluetoothModel::CheckExistPairedList(BtCaseInfo caseInfo)
+{
+ ListNode<BtCaseInfo> *node = btPairedDevicesList_ ->Begin();
+ if (node == nullptr) {
+ return false;
+ } else if ((caseInfo.addr[0] == 0) && (caseInfo.addr[1] == 0)
+ && (caseInfo.addr[2] == 0) && (caseInfo.addr[3] == 0)
+ && (caseInfo.addr[4] == 0) && (caseInfo.addr[5] == 0)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistPairedList false addr: 000000000000");
+ return true;
+ }
+ while (node != btPairedDevicesList_ ->End()) {
+ if ((caseInfo.addr[0] == node->data_.addr[0]) && (caseInfo.addr[1] == node->data_.addr[1])
+ && (caseInfo.addr[2] == node->data_.addr[2]) && (caseInfo.addr[3] == node->data_.addr[3])
+ && (caseInfo.addr[4] == node->data_.addr[4]) && (caseInfo.addr[5] == node->data_.addr[5])) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistPairedList true");
+ return true;
+ }
+ node = node->next_;
+ }
+ return false;
+}
+
+void SettingBluetoothModel::AddNodeFromPairListToScanList(const bd_addr_t &bdAddr)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddNodeFromPairListToScanList");
+ // 检查扫描设备列表
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); ++it) {
+ if (memcmp(it->addr, bdAddr.addr, sizeof(bdAddr.addr)) == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddNodeFromPairListToScanList btScansDevicesList_ true");
+ return;
+ }
+ }
+
+ // 检查已配对设备列表
+ ListNode<BtCaseInfo> *node = btPairedDevicesList_->Begin();
+ bool found = false;
+ while (node != btPairedDevicesList_->End()) {
+ if (memcmp(node->data_.addr, bdAddr.addr, sizeof(bdAddr.addr)) == 0) {
+ found = true;
+ break;
+ }
+ node = node->next_;
+ }
+
+ if (found) {
+ btScansDevicesList_.push_back(node->data_);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_ error");
+ }
+}
+
+bool SettingBluetoothModel::GetAdvStartState(void)
+{
+ return advStartState_;
+}
+void SettingBluetoothModel::SetAdvStartState(bool state)
+{
+ advStartState_ = state;
+}
+
+int SettingBluetoothModel::ConnectRemoteDevice(const bd_addr_t *addr)
+{
+ /* 恢厂后耳机连接要开启BT广播否则会导致AVRCP无法音量控制 */
+ bool ret = gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE, 60);
+ if (!ret) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice gap_br_set_bt_scan_mode ret = 0x%x", ret);
+ }
+ errcode_t retVal = gap_connect_remote_device(addr);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice gap_connect_remote_device ret = 0x%x", retVal);
+ (void)memcpy_s(&remoteConnectAddr_, sizeof(bd_addr_t), addr, sizeof(bd_addr_t));
+ return retVal;
+}
+
+bool SettingBluetoothModel::ConnectRemoteCheck(const bd_addr_t *addr)
+{
+ bool ret;
+ if ((remoteConnectAddr_.addr[0] == addr->addr[0]) && (remoteConnectAddr_.addr[1] == addr->addr[1]) &&
+ (remoteConnectAddr_.addr[2] == addr->addr[2]) && (remoteConnectAddr_.addr[3] == addr->addr[3]) &&
+ (remoteConnectAddr_.addr[4] == addr->addr[4]) && (remoteConnectAddr_.addr[5] == addr->addr[5])) {
+ ret = true;
+ (void)memset_s(&remoteConnectAddr_, sizeof(bd_addr_t), 0, sizeof(bd_addr_t));
+ } else {
+ ret = false;
+ }
+ return ret;
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// 回调: gap_read_remote_rssi_value 接口的数据上报
+void SettingBtGapReadRemoteRssiEventCallback(const bd_addr_t *bdAddr, int rssi, int status)
+{
+ UNUSED(status);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapReadRemoteRssiEventCallback addr: %02x%02x%02x%02x%02x%02x",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
+ SettingBluetoothModel::GetInstance()->SetScansCaseRssi(bdAddr, rssi);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt SettingBtGapReadRemoteRssiEventCallback SetSortCaseRssi: %d status: %d", rssi, status);
+}
+
+// 回调:发现状态变化上报/扫描结束
+void SettingBtGapDiscoveryStateChangedCallback(int status)
+{
+ UNUSED(status);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt SettingBtGapDiscoveryStateChangedCallback %d", status);
+}
+
+static void LoadScanResult()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadScanResult");
+ SettingBluetoothPage* bluetoothPage = SettingBluetoothPage::GetInstance();
+ if (bluetoothPage == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bluetoothPage nullptr");
+ return;
+ }
+ bluetoothPage->SetScanStatus(false);
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadScanResult::LoadFindDeviceList");
+ bluetoothPage->LoadFindDeviceList();
+}
+
+void SettingBluetoothModel::SettingBtGapDiscoveryResultCallbakHandle(const bd_addr_t &bdAddr)
+{
+ BtCaseInfo caseInfo{};
+ (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr.addr, BD_ADDR_LEN);
+
+ unsigned char nameLen = BD_NAME_LEN;
+ bool getNameRet = gap_get_device_name(&bdAddr, caseInfo.deviceName, &nameLen);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback getNameRet(bool): %d nameLen: %d name:%s",
+ getNameRet, nameLen, caseInfo.deviceName);
+
+ if (nameLen == 0) { // 过滤未扫描到名字的设备
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nameLen == 0 return");
+ return;
+ }
+ // 去重操作
+ bool tag = SettingBluetoothModel::GetInstance()->CheckExistScanList(caseInfo);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistScanList ret = %d", tag);
+ if (!tag) {
+ SettingBluetoothModel::GetInstance()->ScansDevicesListAddCase(caseInfo); // 增加扫描设备信息
+ LoadScanResult();
+ bool ret = gap_read_remote_rssi_value(&bdAddr); // 获取rssi
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_read_remote_rssi_value ret = %d", ret);
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt SettingBtGapDiscoveryResultCallback end");
+}
+
+void SettingBtGapPairStatusChangedCallback(const bd_addr_t *bdAddr, int status)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapPairStatusChangedCallback addr: ****%02x%02x%02x%02x status: %d\n",
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], status); /* addr下标 0 1 2 3 */
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GAP_PAIR_PAIRED %d", GAP_PAIR_PAIRED);
+ if (status == GAP_PAIR_PAIRED) {
+ if (SettingBluetoothModel::GetInstance()->GetConnectFragmentStatus()) {
+ SettingBluetoothModel::GetInstance()->SetConnectFragmentStatus(false);
+ NativeAbility::GetInstance().SwitchPageInSlice(SettingPageId::MAIN_PAGE,
+ TransitionType::TRANSITION_INVALID, false);
+ }
+ }
+}
+
+void SettingBtGapPairRequestedCallback(const bd_addr_t *bdAddr)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapPairRequestedCallback addr: ****%02x%02x%02x%02x\n",
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 3 */
+}
+
+void SettingBtGapPairConfirmedCallback(const bd_addr_t *bdAddr, int req_type, int number)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapPairConfirmedCallback addr: ****%02x%02x%02x%02x req_type: %d number: %d\n",
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], /* addr下标 0 1 2 3 */
+ req_type, number);
+}
+
+// 回调:扫描结果处理/发现结果上报
+void SettingBtGapDiscoveryResultCallback(const bd_addr_t *bdAddr)
+{
+ if ((gap_get_device_class(bdAddr) & DEVICE_MAJOR_CLASS_PHONE) != 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGapDiscoveryResultCallback: Mobile Phone Device");
+ return;
+ }
+
+ if (bdAddr == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr nullptr");
+ return;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback addr: %02x%02x%02x%02x%02x%02x",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&SettingBluetoothModel::SettingBtGapDiscoveryResultCallbakHandle,
+ SettingBluetoothModel::GetInstance(), *bdAddr));
+}
+
+static void ACLConnectionSuss(const bd_addr_t &bdAddr)
+{
+ // 成功提示
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ACLConnectionSuss conn success");
+ SettingBluetoothModel::GetInstance()->SetLastConnedAddr(&bdAddr);
+ SettingBluetoothModel::GetInstance()->SetBlueToothConnectStatus(true);
+ SettingBluetoothModel::GetInstance()->UpdateConnectedStatusForDevice(bdAddr);
+ if (SettingBluetoothPage::GetInstance() != nullptr) {
+ SettingBluetoothPage::GetInstance()->LoadFindDeviceList();
+ }
+ if ((SettingBluetoothModel::GetInstance()->GetConnectResultPage() == true) &&
+ (SettingBluetoothPage::GetInstance() != nullptr)) {
+ SettingBluetoothPage::GetInstance()->ShowResultGroup(CONNECT_BLUETOOTH_SUCCESS_FRAGMENT);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetConnectResultPage is false or GetInstance is nullptr");
+ }
+ SettingBluetoothModel::GetInstance()->SetConnectResultPage(false);
+}
+
+static void ACLConnectionFail(const bd_addr_t &bdAddr)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ACLConnectionFail conn fail");
+ SettingBluetoothModel::GetInstance()->SetBlueToothConnectStatus(false);
+ SettingBluetoothModel::GetInstance()->UpdateDisconnectStatusForDevice(bdAddr);
+ if (SettingBluetoothPage::GetInstance() != nullptr) {
+ SettingBluetoothPage::GetInstance()->LoadFindDeviceList();
+ }
+ if ((SettingBluetoothModel::GetInstance()->GetConnectResultPage()) == true &&
+ (SettingBluetoothPage::GetInstance() != nullptr)) {
+ SettingBluetoothPage::GetInstance()->ShowResultGroup(CONNECT_BLUETOOTH_FAIL_FRAGMENT);
+ }
+ // 失败提示页
+ SettingBluetoothModel::GetInstance()->SetConnectResultPage(false);
+}
+
+void SettingBluetoothModel::SettingBtGapAclStateChangedHandle(gap_acl_state_t state, unsigned int reason, const bd_addr_t &bdAddr)
+{
+ if ((reason == 0x13) || (reason == 0x14) || (reason == 0x15) || (reason == 0x3D) || (reason == 0x08)) { // 连接断开
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "The peer end is disconnected.");
+ } else if (reason == 0x16) { // 主动断开连接
+ BtCaseInfo *onClickBtCaseInfo = SettingBluetoothModel::GetInstance()->GetSelectedDeviceInfo();
+ } else if ((reason == 0xb) || (reason > 0x45)) { // 0xb:重复点击连接按钮 0x45:acl状态最大参数
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reason is false.");
+ }
+
+ if ((state == GAP_ACL_STATE_CONNECTED) || (state == GAP_ACL_STATE_LE_CONNECTED)) {
+ // 将数据存入设备列表
+ BtCaseInfo *info = GetSelectedDeviceInfo();
+ bool tag = CheckExistPairedList(*info);
+ if ((!tag) && (memcmp(info->addr, bdAddr.addr, BD_ADDR_LEN) == 0)) {
+ AddPairedDevicesCase(*info);
+ }
+ // 从配对的列表里面取出数据 ,将该数据填充进入到ScanList
+ SettingBluetoothModel::GetInstance()->SetLastConnedAddr(&bdAddr);
+ SettingBluetoothModel::GetInstance()->AddNodeFromPairListToScanList(bdAddr);
+ if (SettingBluetoothModel::GetInstance()->ConnectRemoteCheck(&bdAddr)) {
+ int32_t retA2dp = a2dp_src_connect(&bdAddr);
+ if (retA2dp) {
+ ACLConnectionFail(bdAddr);
+ } else {
+ SetLastConnedAddr(&bdAddr);
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connect result 0x%x", retA2dp);
+ }
+ } else {
+ ACLConnectionFail(bdAddr);
+ }
+}
+
+void ChangeBleConnectToMax()
+{
+ if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {
+ gap_conn_param_update_t conn_param = { 0 };
+ conn_param.conn_handle = SETTING_BLUETOOTH_CONN_HANDLE;
+ conn_param.interval_min = SETTING_BLUETOOTH_INTERVAL_TOMAX_MIN;
+ conn_param.interval_max = SETTING_BLUETOOTH_INTERVAL_TOMAX_MAX;
+ conn_param.slave_latency = SETTING_BLUETOOTH_LATENCY;
+ conn_param.timeout_multiplier = SETTING_BLUETOOTH_TIMEOUT_MUTIPLIER;
+ errcode_t ret = gap_ble_connect_param_update(&conn_param);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleConnectCallback change to max interval ret:%d : latency-min:%u latency-max:%u\n",
+ ret, conn_param.interval_min, conn_param.interval_max);
+ }
+}
+
+void ChangeBleConnectToDefault()
+{
+ if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {
+ gap_conn_param_update_t conn_param = { 0 };
+ conn_param.conn_handle = SETTING_BLUETOOTH_CONN_HANDLE;
+ conn_param.interval_min = SETTING_BLUETOOTH_INTERVAL_TODEFAULT_MIN;
+ conn_param.interval_max = SETTING_BLUETOOTH_INTERVAL_TODEFAULT_MAX;
+ conn_param.slave_latency = SETTING_BLUETOOTH_LATENCY;
+ conn_param.timeout_multiplier = SETTING_BLUETOOTH_TIMEOUT_MUTIPLIER;
+ errcode_t ret = gap_ble_connect_param_update(&conn_param);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleConnectCallback change to default interval ret:%d : latency-min:%u latency-max:%u\n",
+ ret, conn_param.interval_min, conn_param.interval_max);
+ }
+}
+
+// 回调:ACL连接状态上报
+void SettingBtGapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt SettingGapAclStateChangedCallback state %d, reason %x succ or err", state, reason);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "addr: %02x%02x%02x%02x%02x%02x",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
+ static bd_addr_t gapAclConnectAddr{0}; /* 连接后保存手机地址,手表清除手机配对后查询不到class比较手机地址 */
+ if ((gap_get_device_class(bdAddr) & 0x200) != 0 || memcmp(gapAclConnectAddr.addr, bdAddr->addr, BD_ADDR_LEN) == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingGapAclStateChangedCallback: Mobile Phone Device");
+ if (state == GAP_ACL_STATE_DISCONNECTED) {
+ /* 通知msg_center,ble状态仍用bt状态,此处不区分 */
+ MsgCenterSendMsg(BT_DISCONNECTED_TO_MSGCENTER, 0, nullptr, 0);
+ SendMsgToUIService(BT_DISCONNECTED_TO_UI, 0, nullptr, 0);
+ // send to ace network
+ SettingBluetoothModel::GetInstance()->SetAclConnected(false);
+ net_connect_status_change(NETWORK_TYPE_BLUETOOTH, CONNECTION_STATUS_DISCONNECTED);
+ // 断开蓝牙连接时,若存在查找手机页面,刷新页面为断开页面
+ if (FindPhoneMainPage::GetInstance() != nullptr) {
+ FindPhoneMainPage::GetInstance()->ChangeToDisConnect();
+ }
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+ lwip_close_bt_pan();
+#endif
+ } else if (state == GAP_ACL_STATE_CONNECTED) {
+ (void)memcpy_s(gapAclConnectAddr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
+ MsgCenterSendMsg(BT_CONNECTED_TO_MSGCENTER, 0, nullptr, 0);
+ SendMsgToUIService(BT_CONNECTED_TO_UI, 0, nullptr, 0);
+ // send to ace network
+ SettingBluetoothModel::GetInstance()->SetAclConnected(true);
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+ lwip_open_bt_pan();
+#endif
+ net_connect_status_change(NETWORK_TYPE_BLUETOOTH, CONNECTION_STATUS_CONNECTED);
+ }
+ return;
+ }
+
+ GraphicService::GetInstance()->PostGraphicEvent(
+ std::bind(&SettingBluetoothModel::SettingBtGapAclStateChangedHandle, SettingBluetoothModel::GetInstance(), state, reason, *bdAddr));
+}
+
+// 回调:远端设备名称变化
+void SettingBtRemoteNameChangedCallback(const bd_addr_t *bdAddr, const unsigned char *deviceName, unsigned char length)
+{
+ if ((gap_get_device_class(bdAddr) & 0x200) != 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtRemoteNameChangedCallback: Mobile Phone Device");
+ return;
+ }
+ BtCaseInfo caseInfo{};
+ if (bdAddr == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBtRemoteNameChangedCallback addr nullptr");
+ return;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtRemoteNameChangedCallback addr: %02x%02x%02x%02x%02x%02x",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
+
+ (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
+ int ret = memcpy_s(caseInfo.deviceName, BD_NAME_LEN, deviceName, length);
+ if (ret != EOK) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBtRemoteNameChangedCallback memcpy fail!");
+ return;
+ }
+ SettingBluetoothModel::GetInstance()->ResetScanDevicesCase(caseInfo);
+}
+
+void SettingBtIsAcceptConnOnSafeModeCallback(const bd_addr_t *bdAddr, bool *res)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtIsAcceptConnOnSafeModeCallback addr: %02x%02x%02x%02x%02x%02x set *res true",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* addr下标 3 4 5 */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 */
+ *res = true;
+}
+
+static void A2dpSettingSrcConnectstateChanged(bd_addr_t *bdAddr, int connState)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectStateChangedCallback addr: %02x%02x%02x%02x%02x%02x connState: %x",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], connState); /* 2 1 0 idx */
+ if ((gap_get_device_class(bdAddr) & 0x200) != 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectstateChangedCb: Mobile Phone Device");
+ return;
+ }
+ if (connState == PROFILE_STATE_CONNECTED) {
+ uint32_t ret = avrcp_ct_connect(bdAddr);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "avrcp_ct_connect ret = 0x%x", ret);
+ PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_CONNECTED);
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(ACLConnectionSuss, *bdAddr));
+ }
+
+ if (connState == PROFILE_STATE_DISCONNECTED) {
+ PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_DISCONNECTED);
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(ACLConnectionFail, *bdAddr));
+ /* 实验室测试耳机回连场景,用户根据需要调整策略 */
+ bool ret = gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 60); // start scan
+ if (!ret) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "a2dp disc: gap_br_set_bt_scan_mode ret = 0x%x", ret);
+ }
+ }
+}
+
+static void A2dpSettingSrcPlayingStateChanged(bd_addr_t *bdAddr, int playState)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSettingSrcPlayingStateChangedCallback addr: %02x%02x%02x%02x%02x%02x playState: %x",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], playState); /* 2 1 0 idx */
+}
+
+static void A2dpSettingSrcConfigureChanged(bd_addr_t *bdAddr, a2dp_codec_info_t *info)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSettingSrcConfigurationChangedCallback addr: %02x%02x%02x%02x%02x%02x ",
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_priority: %04x codec_type: %04x sample_rate: %02x bits_per_sample: %02x channel_mode: %02x ",
+ info->codec_priority, info->codec_type, info->sample_rate, info->bits_per_sample, info->channel_mode);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x",
+ info->codec_specific1, info->codec_specific2, info->codec_specific3, info->codec_specific4);
+}
+
+static void SettingBleConnStateChangeCallback(unsigned short connId, bd_addr_t *addr, gap_ble_conn_state_t connState,
+ gap_ble_pair_state_t pairState, gap_ble_disc_reason_t discReason)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleConnStateChangeCallback connId 0x%x, connState 0x%x, pairState 0x%x",
+ connId, connState, pairState);
+ if (GAP_BLE_STATE_DISCONNECTED == connState) { // restart ble adv when disconnected
+ /* 通知msg_center,ble状态仍用bt状态,此处不区分 */
+ MsgCenterSendMsg(BT_DISCONNECTED_TO_MSGCENTER, 0, nullptr, 0);
+ msg_center_set_ble_conn_state(GAP_BLE_STATE_DISCONNECTED);
+ // send to ace network
+ net_connect_status_change(NETWORK_TYPE_BLUETOOTH_LE, CONNECTION_STATUS_DISCONNECTED);
+ // 断开蓝牙连接时,若存在查找手机页面,刷新页面为断开页面
+ if (FindPhoneMainPage::GetInstance() != nullptr) {
+ FindPhoneMainPage::GetInstance()->ChangeToDisConnect();
+ }
+ } else {
+ MsgCenterSendMsg(BT_CONNECTED_TO_MSGCENTER, 0, nullptr, 0);
+ msg_center_set_ble_conn_state(GAP_BLE_STATE_CONNECTED);
+ (void)memcpy_s(&g_bd_addr, sizeof(bd_addr_t), addr, sizeof(bd_addr_t));
+ // send to ace network
+ net_connect_status_change(NETWORK_TYPE_BLUETOOTH_LE, CONNECTION_STATUS_CONNECTED);
+ }
+ // send to ace network
+}
+
+static void SettingBleAdvStartStateCallback(uint8_t advId, adv_status_t status)
+{
+ if (g_sample_adv_id == advId) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleAdvStartStateCallback advId: %d, status:%d\n", advId, status);
+ SettingBluetoothModel::GetInstance()->SetAdvStartState(true);
+ }
+}
+
+static void SettingBleAdvStopCallback(uint8_t advId, adv_status_t status)
+{
+ if (g_sample_adv_id == advId) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleAdvStopCallback advId: %d, status:%d\n", advId, status);
+ SettingBluetoothModel::GetInstance()->SetAdvStartState(false);
+ }
+}
+
+static void SettingBleAdvTerminateCallback(uint8_t advId, adv_status_t status)
+{
+ if (g_sample_adv_id == advId) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleAdvTerminateCallback advId: %d, status:%d\n", advId, status);
+ SettingBluetoothModel::GetInstance()->SetAdvStartState(false);
+ // 此处开广播是为了实验室测试需要,客户需要自己修改
+ BleSettingAdvStart();
+ }
+}
+
+static void SettingBtGattsServiceAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, errcode_t status)
+{
+ if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0xF01F)) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsServiceAddCallback 0x%x 0x%x 0x%x",
+ status, serverId, srvcHandle);
+ uint16_t sample_id = 0xF11F;
+ uint16_t diag_id = 0xF21F;
+ gatts_add_chara_info_t character;
+ uint16_t value = 0;
+
+ memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));
+ character.chara_uuid.uuid_len = sizeof(sample_id);
+ memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&sample_id, sizeof(sample_id));
+ character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;
+ character.properties = GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP;
+ character.value_len = (uint16_t)sizeof(value);
+ character.value = (uint8_t *)(&value);
+ int ret = gatts_add_characteristic(serverId, srvcHandle, &character);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_characteristic sample ret 0x%x", ret);
+
+ memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));
+ character.chara_uuid.uuid_len = sizeof(diag_id);
+ memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&diag_id, sizeof(diag_id));
+ character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;
+ character.properties = GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP | GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_NOTIFY;
+ character.value_len = (uint16_t)sizeof(value);
+ character.value = (uint8_t *)(&value);
+
+ ret = gatts_add_characteristic(serverId, srvcHandle, &character);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_characteristic diag ret 0x%x", ret);
+
+ g_sample_svr_handle = srvcHandle;
+ }
+}
+
+static void SettingBtGattsCharacteristicAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, gatts_add_character_result_t *result, errcode_t status)
+{
+ if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0xF11F)) {
+ g_sample_characteristic_handle = result->value_handle;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsCharacteristicAddCallback 0x%x 0x%x 0x%x 0x%x",
+ status, serverId, srvcHandle, g_sample_characteristic_handle);
+ }
+ if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0xF21F)) {
+ g_diag_characteristic_handle = result->value_handle;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsCharacteristicAddCallback 0x%x 0x%x 0x%x 0x%x",
+ status, serverId, srvcHandle, g_diag_characteristic_handle);
+
+ uint8_t ccc_val[] = { 0x01, 0x00 };
+ uint16_t diag_desc = 0x0229;
+ gatts_add_desc_info_t descriptor;
+ memset_s(&descriptor, sizeof(gatts_add_desc_info_t), 0, sizeof(gatts_add_desc_info_t));
+ descriptor.desc_uuid.uuid_len = sizeof(diag_desc);
+ memcpy_s(descriptor.desc_uuid.uuid, sizeof(descriptor.desc_uuid.uuid), (char *)&diag_desc, sizeof(diag_desc));
+ descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+ descriptor.value_len = (uint16_t)sizeof(ccc_val);
+ descriptor.value = ccc_val;
+ int ret = gatts_add_descriptor(serverId, srvcHandle, &descriptor);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_descriptor diag_desc ret 0x%x", ret);
+ }
+
+ if (g_sample_characteristic_handle != 0 && g_diag_characteristic_handle !=0 && g_diag_desc_handle != 0) {
+ int ret = gatts_start_service(serverId, srvcHandle);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_start_service ret 0x%x", ret);
+ }
+}
+
+static void SettingBtGattsDescriptorAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, uint16_t descriptorHandle, errcode_t status)
+{
+ if (g_sample_svr_handle == srvcHandle) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsDescriptorAddCallback 0x%x 0x%x 0x%x 0x%x",
+ status, serverId, srvcHandle, descriptorHandle);
+ g_diag_desc_handle = descriptorHandle;
+ }
+
+ if (g_sample_characteristic_handle != 0 && g_diag_characteristic_handle !=0 && g_diag_desc_handle != 0) {
+ int ret = gatts_start_service(serverId, srvcHandle);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_start_service ret 0x%x", ret);
+ }
+}
+
+static void SettingBtGattsServiceStartCallback(uint8_t serverId, uint16_t srvcHandle, errcode_t status)
+{
+ if (g_sample_svr_handle == srvcHandle) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsServiceStartCallback 0x%x 0x%x 0x%x", status, serverId, srvcHandle);
+ }
+}
+
+static void SettingBtGattsServiceStopCallback(uint8_t serverId, uint16_t srvcHandle, errcode_t status)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsServiceStopCallback 0x%x 0x%x 0x%x", status, serverId, srvcHandle);
+}
+
+static void SettingBtGattsServiceDeleteCallback(uint8_t serverId, errcode_t status)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsServiceDeleteCallback 0x%x 0x%x", status, serverId);
+}
+
+static void SettingBtGattsRequestReadCallback(uint8_t serverId, uint16_t connId, gatts_req_read_cb_t *readCbPara, errcode_t status)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGattsRequestReadCallback handle = %u", readCbPara->handle);
+}
+
+static void SettingBtGattsRequestWriteCallback(uint8_t serverId, uint16_t connId, gatts_req_write_cb_t *writeCbPara, errcode_t status)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGattsRequestWriteCallback handle = %u", writeCbPara->handle);
+ if (g_sample_characteristic_handle == writeCbPara->handle) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBtGattsRequestWriteCallback handle = %u", writeCbPara->handle);
+ if (writeCbPara->length == 9) {
+ if (memcmp("open ctkd", writeCbPara->value, writeCbPara->length) == 0) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "enable ctkd");
+ // 一键双连使能(依赖安全连接参数配置)
+ errcode_t ret = gap_ble_set_ctkd_enable(true);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_set_ctkd_enable ret = %u", ret);
+
+ // 发起ble配对
+ ret = gap_ble_pair_remote_device(&g_bd_addr);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_pair_remote_device ret = %u ", ret);
+ }
+ } else if (writeCbPara->length == 10) {
+ if (memcmp("close ctkd", writeCbPara->value, writeCbPara->length) == 0) {
+ // 一键双连去使能
+ errcode_t ret = gap_ble_set_ctkd_enable(false);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_set_ctkd_disable ret = %u", ret);
+ }
+ }
+ } else if (g_diag_characteristic_handle == writeCbPara->handle) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "diag_gatt_write_req_cbk handle = %u", writeCbPara->handle);
+ diag_gatt_write_req_cbk(serverId, connId, writeCbPara, status);
+ } else if (g_diag_desc_handle == writeCbPara->handle) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "diag_gatt_set_handle handle = %u", writeCbPara->handle);
+ if ((writeCbPara->length == 2) && (*(char*)(writeCbPara->value) == 1)) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "open gatt channel");
+ diag_gatt_set_handle(serverId, connId, g_diag_characteristic_handle);
+ msg_center_set_trans_channel(DIAG_FRAME_FID_BT);
+ } else if ((writeCbPara->length == 2) && (*(char*)(writeCbPara->value) == 0)) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "close gatt channel");
+ diag_gatt_set_handle(0, 0, 0);
+ msg_center_set_trans_channel(DIAG_FRAME_FID_PHONE);
+ }
+ }
+}
+
+static void SettingBtGattsMtuChangedCallback(uint8_t serverId, uint16_t connId, uint16_t mtuSize, errcode_t status)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBtGattsMtuChangedCallback connId = %u mtuSize = %u", connId, mtuSize);
+}
+
+static void SettingBtA2dpSnkAcceptTimerStop(void)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer\n");
+ if (g_setting_a2dp_stream_accept_timer.timer != nullptr) {
+ (void)osal_timer_stop(&g_setting_a2dp_stream_accept_timer);
+ (void)osal_timer_destroy(&g_setting_a2dp_stream_accept_timer);
+ g_setting_a2dp_stream_accept_timer.timer = nullptr;
+ }
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer success!\n");
+}
+
+static void SettingBtA2dpSnStartAcceptHandler(unsigned long data)
+{
+ UNUSED(data);
+ bd_addr_t active_bd_addr = a2dp_snk_get_active_device();
+ a2dp_snk_start_accept(&active_bd_addr);
+ SettingBtA2dpSnkAcceptTimerStop();
+}
+
+static errcode_t SettingBtA2dpSnkStartAcceptTimer(void)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "start timer\n");
+ if (g_setting_a2dp_stream_accept_timer.timer != nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timer is running");
+ return ERRCODE_SUCC;
+ }
+
+ g_setting_a2dp_stream_accept_timer.handler = SettingBtA2dpSnStartAcceptHandler;
+ g_setting_a2dp_stream_accept_timer.interval = A2DP_STREAM_ACCEPT_TIMER_PERIOD;
+
+ int32_t timer_ret = osal_timer_init(&g_setting_a2dp_stream_accept_timer);
+ if (timer_ret != EOK) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "create timer error! ret: %x\n", timer_ret);
+ SettingBtA2dpSnkAcceptTimerStop();
+ return ERRCODE_FAIL;
+ }
+ timer_ret = osal_timer_start(&g_setting_a2dp_stream_accept_timer);
+ if (timer_ret != EOK) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "start timer error! ret: %x\n", timer_ret);
+ SettingBtA2dpSnkAcceptTimerStop();
+ return ERRCODE_FAIL;
+ }
+ return ERRCODE_SUCC;
+}
+
+static int32_t SettingBtA2dpSnkAudioCreate()
+{
+#if MEDIA_A2DP_SNK_INTERFACE
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",
+ g_setting_audio_format_config.audioFormat, g_setting_audio_format_config.channelCount, g_setting_audio_format_config.sampleRate);
+
+ int32_t ret = AudioManagerA2dpSinkSetParam(g_setting_audio_format_config);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkSetParam ret %x\n", ret);
+ ret = AudioManagerA2dpSinkCreate();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkCreate ret %x\n", ret);
+#endif
+ /* 起定时器接受音乐开始请求 */
+ (void)SettingBtA2dpSnkStartAcceptTimer();
+ return 0;
+}
+
+static int32_t SettingBtA2dpSnkAudioDestroy()
+{
+#if MEDIA_A2DP_SNK_INTERFACE
+ int32_t ret = AudioManagerA2dpSinkDestroy();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkDestroy ret %x\n", ret);
+#endif
+ return 0;
+}
+
+static void SettingBtA2dpSnkConnectStateChangedCb(bd_addr_t *bd_addr, int conn_state)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x conn_state: %x\n",
+ bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], conn_state); /* 3 2 1 0 idx */
+}
+
+static void SettingBtA2dpSnkStartStreamReqCb(bd_addr_t *bd_addr)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x \n",
+ bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */
+ SettingBtA2dpSnkAudioCreate();
+}
+
+static void SettingBtA2dpSnkPlayingStateChangedCb(bd_addr_t *bd_addr, int playing_state)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x playing_state: %x\n",
+ bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], playing_state); /* 3 2 1 0 idx */
+ if (playing_state == A2DP_NOT_PLAYING) {
+ SettingBtA2dpSnkAudioDestroy();
+ }
+}
+
+static void SettingBtA2dpSnkConfigChangedCb(bd_addr_t *bd_addr, a2dp_snk_codec_info_t *info)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x ",
+ bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,
+ "codec_priority: %04x codec_type: %04x sample_rate: %02x bits_per_sample: %02x channel_mode: %02x",
+ info->codec_priority, info->codec_type, info->sample_rate, info->bits_per_sample, info->channel_mode);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,
+ "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x\n",
+ (unsigned int)info->codec_specific1,
+ (unsigned int)info->codec_specific2,
+ (unsigned int)info->codec_specific3,
+ (unsigned int)info->codec_specific4);
+#if MEDIA_A2DP_SNK_INTERFACE
+ if (info->codec_type == A2DP_SNK_CODEC_TYPE_AAC) {
+ g_setting_audio_format_config.audioFormat = AAC_LC;
+ } else {
+ g_setting_audio_format_config.audioFormat = SBC;
+ }
+ /* channel count 1 or 2 */
+ g_setting_audio_format_config.channelCount = (info->channel_mode == A2DP_SNK_CODEC_CHANNEL_MODE_NONE ? 1 : 2);
+
+ switch (info->sample_rate) {
+ case A2DP_SNK_CODEC_SAMPLE_RATE_48000:
+ g_setting_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE48000;
+ break;
+ case A2DP_SNK_CODEC_SAMPLE_RATE_88200:
+ g_setting_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE88200;
+ break;
+ case A2DP_SNK_CODEC_SAMPLE_RATE_96000:
+ g_setting_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE96000;
+ break;
+ default:
+ g_setting_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE44100;
+ break;
+ }
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",
+ g_setting_audio_format_config.audioFormat, g_setting_audio_format_config.channelCount, g_setting_audio_format_config.sampleRate);
+#endif
+}
+
+// 注册回调函数
+static gap_call_backs_t g_settingBtGapCallBacks{};
+static a2dp_src_callbacks_t g_settingA2dprcCallbacks{};
+static gap_ble_callbacks_t g_settingGapBleCallbacks{};
+static gatts_callbacks_t g_settingBtGattsCallbacks{};
+static a2dp_snk_callbacks_t g_settingA2dpSnkCallbacks = {};
+
+
+static void SettingBleConnectCallback(uint16_t conn_id, errcode_t status, const gap_ble_conn_param_update_t *param)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBleConnectCallback conn_id:%u, interval-1:%u latency:%u timeout:%u\n",conn_id, param->interval, param->latency, param->timeout);
+}
+
+void SettingBtInitCallBacks()
+{
+ g_settingBtGapCallBacks.discovery_result_callback = SettingBtGapDiscoveryResultCallback;
+ g_settingBtGapCallBacks.discovery_state_changed_callback = SettingBtGapDiscoveryStateChangedCallback;
+ g_settingBtGapCallBacks.acl_state_changed_callbak = SettingBtGapAclStateChangedCallback;
+ g_settingBtGapCallBacks.read_remote_rssi_event_callback = SettingBtGapReadRemoteRssiEventCallback;
+ g_settingBtGapCallBacks.remote_name_changed_callback = SettingBtRemoteNameChangedCallback;
+ g_settingBtGapCallBacks.is_accept_conn_on_safe_mode_callback = SettingBtIsAcceptConnOnSafeModeCallback;
+ g_settingBtGapCallBacks.pair_status_changed_callback = SettingBtGapPairStatusChangedCallback;
+ g_settingBtGapCallBacks.pair_requested_callback = SettingBtGapPairRequestedCallback;
+ g_settingBtGapCallBacks.pair_confiremed_callback = SettingBtGapPairConfirmedCallback;
+ gap_register_callbacks(&g_settingBtGapCallBacks);
+
+ g_settingA2dprcCallbacks.connectstate_changed_cb = A2dpSettingSrcConnectstateChanged;
+ g_settingA2dprcCallbacks.configuration_changed_cb = A2dpSettingSrcConfigureChanged;
+ g_settingA2dprcCallbacks.playing_state_changed_cb = A2dpSettingSrcPlayingStateChanged;
+ a2dp_src_register_callbacks(&g_settingA2dprcCallbacks);
+
+ /* a2dp sink */
+ g_settingA2dpSnkCallbacks.connectstate_changed_cb = SettingBtA2dpSnkConnectStateChangedCb;
+ g_settingA2dpSnkCallbacks.start_stream_request_cb = SettingBtA2dpSnkStartStreamReqCb;
+ g_settingA2dpSnkCallbacks.playing_state_changed_cb = SettingBtA2dpSnkPlayingStateChangedCb;
+ g_settingA2dpSnkCallbacks.configuration_changed_cb = SettingBtA2dpSnkConfigChangedCb;
+ a2dp_snk_register_callbacks(&g_settingA2dpSnkCallbacks);
+}
+
+void SettingBtInitCallBacksEx()
+{
+ g_settingGapBleCallbacks.conn_state_change_cb = SettingBleConnStateChangeCallback;
+ g_settingGapBleCallbacks.start_adv_cb = SettingBleAdvStartStateCallback;
+ g_settingGapBleCallbacks.stop_adv_cb = SettingBleAdvStopCallback;
+ g_settingGapBleCallbacks.terminate_adv_cb = SettingBleAdvTerminateCallback;
+ g_settingGapBleCallbacks.conn_param_update_cb = SettingBleConnectCallback;
+ wrapper_gap_ble_register_callbacks(&g_settingGapBleCallbacks);
+
+ g_settingBtGattsCallbacks.add_service_cb = SettingBtGattsServiceAddCallback;
+ g_settingBtGattsCallbacks.add_characteristic_cb = SettingBtGattsCharacteristicAddCallback;
+ g_settingBtGattsCallbacks.add_descriptor_cb = SettingBtGattsDescriptorAddCallback;
+ g_settingBtGattsCallbacks.start_service_cb = SettingBtGattsServiceStartCallback;
+ g_settingBtGattsCallbacks.stop_service_cb = SettingBtGattsServiceStopCallback;
+ g_settingBtGattsCallbacks.delete_service_cb = SettingBtGattsServiceDeleteCallback;
+ g_settingBtGattsCallbacks.read_request_cb = SettingBtGattsRequestReadCallback;
+ g_settingBtGattsCallbacks.write_request_cb = SettingBtGattsRequestWriteCallback;
+ g_settingBtGattsCallbacks.mtu_changed_cb = SettingBtGattsMtuChangedCallback;
+ wrapper_gatts_register_callbacks(&g_settingBtGattsCallbacks);
+}
+
+void SettingBtInitGatts(void)
+{
+ uint16_t id = 0xF01F;
+ uint16_t ser_id = 0xFF1F;
+ uint8_t serverId = 0;
+ bt_uuid_t uuid;
+ int ret;
+
+ uuid.uuid_len = sizeof(ser_id);
+ memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));
+ ret = wrapper_gatts_register_server(&uuid, &serverId); /* 注册gatt server */
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_register_server ret: 0x%x serverId = 0x%x", ret, serverId);
+
+ uuid.uuid_len = sizeof(id);
+ memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&id, sizeof(id));
+ ret = wrapper_gatts_add_service(serverId, &uuid, true);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);
+
+ wrapper_gatts_service_start();
+}
+
+static uint8_t Char2Num(int8_t c)
+{
+ if (c >= '0' && c <= '9') {
+ return (uint8_t)(c - '0');
+ } else if (c >= 'A' && c <= 'F') {
+ return (uint8_t)(c - 'A' + TEN);
+ } else if (c >= 'a' && c <= 'f') {
+ return (uint8_t)(c - 'a' + TEN);
+ } else {
+ return 0xFF;
+ }
+}
+
+static uint32_t GenerateUuidFromString(const char *str, uint8_t len, bt_uuid_t *uuid_out)
+{
+ int slen = (int)strnlen(str, len);
+ bool new_uuid = false;
+ if (uuid_out == nullptr) {
+ return ERRCODE_INVALID_PARAM;
+ }
+
+ uuid_out->uuid_len = (uint8_t)slen / 2; /* 2: 2个字符组成一个字节,因此只取偶数个字符 */
+ for (int i = 0; i + 1 < slen; i += 2) { /* 2: 同上 */
+ uint8_t num1 = Char2Num(str[i]);
+ uint8_t num2 = Char2Num(str[i + 1]);
+ if (num1 == UINT8_MAX || num2 == UINT8_MAX) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "invalid input %c%c\n", str[i], str[i + 1]);
+ return ERRCODE_INVALID_PARAM;
+ }
+
+ uuid_out->uuid[i / 2] = (uint8_t)((num1 << BIT4) | num2); /* 2: 同上 */
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "%02x ", (uint8_t)(uuid_out->uuid[i / 2])); /* 2: 同上 */
+ }
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "\n");
+ return ERRCODE_SUCC;
+}
+
+void SettingBtSppServerCreate(const char *spp_uuid, const char *name, uint8_t name_len)
+{
+ spp_create_socket_para_t param;
+ if (GenerateUuidFromString((const char *)spp_uuid, (uint8_t)strlen(spp_uuid), ¶m.uuid) != ERRCODE_SUCC) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get uuid fail\n");
+ return;
+ }
+
+ param.socket_type = SPP_SOCKET_RFCOMM;
+ param.is_encrypt = true;
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "uuid: %s uuid_len: %u\n", spp_uuid, param.uuid.uuid_len);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "socket_type: %x is_encrypt: %d name: %s nameLen: %u\n", param.socket_type,
+ param.is_encrypt, name, name_len);
+
+ int ret = spp_server_create(¶m, name, name_len);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_create ret: %x\n", ret);
+}
+
+static int BtSppServerAcceptTaskBody(void *data)
+{
+ int server_id = (int)(intptr_t)data;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "server_id: %x\n", server_id);
+
+ int ret = spp_server_accept(server_id);
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_accept ret: %x\n", ret);
+
+ return OSAL_SUCCESS;
+}
+
+/* 等待client连接 */
+void SettingBtSppServerAccept(uint8_t server_id)
+{
+ osal_task *task = osal_kthread_create(BtSppServerAcceptTaskBody, (void *)(uintptr_t)server_id,
+ "spp_server_accept_task", BT_SPP_TASK_STACK_SIZE);
+ if (task == nullptr) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task fail\n");
+ return;
+ }
+
+ int ret = osal_kthread_set_priority(task, BT_SPP_TASK_PRI);
+ if (ret != OSAL_SUCCESS) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set pri error: %08x\n", ret);
+ }
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task success.\n");
+}
+
+void SettingBtInitSpp(void)
+{
+ char uuid[] = "1101";
+ char name[] = "COM1";
+ uint8_t name_len = strlen(name) + 1;
+ uint8_t server_id = 0;
+
+ /* 创建spp */
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create spp server uuid=%s name=%s name_len=%d\n", uuid, name, name_len);
+ SettingBtSppServerCreate(uuid, name, name_len);
+ SettingBtSppServerAccept(server_id);
+}
+
+void BleSettingAdvStart(void)
+{
+ int advId = g_sample_adv_id;
+ if (SettingBluetoothModel::GetInstance()->GetAdvStartState()) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleSettingAdvStart already started");
+ gap_ble_stop_adv(advId);
+ osDelay(50);
+ }
+ gap_ble_adv_params_t adv_para;
+ memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
+ adv_para.min_interval = 0x30;
+ adv_para.max_interval = 0x60;
+ adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
+ adv_para.channel_map = 0x7;
+ adv_para.duration = 0;
+ gap_ble_set_adv_param(advId, &adv_para);
+ gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);
+ errcode_t ret = gap_ble_start_adv(advId);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleSettingAdvStart bt gap_ble_start_adv ret = 0x%x", ret);
+}
+
+#ifdef __cplusplus
+}
+#endif
+}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardModel\r
+ * Create: 2025-06-01\r
+ */\r
+#include <cstdint>\r
+#include <algorithm>\r
+#include "dfx_reboot.h"\r
+#include "kv_store.h"\r
+#include "UiConfig.h"\r
+#include "main/MainModel.h"\r
+#include "settings/common/SettingCardEffectResourceImage.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingCardModel.h"\r
+\r
+namespace OHOS {\r
+static const int STYLE_VALUE_LEN = 128;\r
+static const char* SWIPE_EFFECT = "swipe_effect";\r
+\r
+static const std::map<CardEffectID, std::pair<const char*, std::vector<int>>> g_effectMap = {\r
+ {CardEffectID::UI_CUBE, std::make_pair("3D折叠", UI_3D_FOLD_RESIDS)},\r
+ {CardEffectID::UI_CARD_FLIP, std::make_pair("十字平滑", UI_CARD_FLIP_RESIDS)},\r
+ {CardEffectID::UI_PUSH_PRESS, std::make_pair("推压", UI_PUSH_PRESS_RESIDS)},\r
+ {CardEffectID::UI_TURN_PAGE, std::make_pair("翻页", UI_TURN_PAGE_RESIDS)},\r
+ {CardEffectID::UI_WINDMILL, std::make_pair("风车", UI_WINDMILL_RESIDS)},\r
+ {CardEffectID::UI_ZOOM, std::make_pair("缩放", UI_ZOOM_RESIDS)},\r
+};\r
+\r
+SettingCardModel::SettingCardModel()\r
+{\r
+ std::vector<SettingUnionItemData> tempUnionData = {{\r
+ PlainTextItemData{"卡片"},\r
+ IconTextNavigationItemData{SettingPageId::CARD_EFFECT_PAGE, IMAGE_CARD_LIST_CARDANIMATOR, "卡片动效",\r
+ nullptr,true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::CARD_MGR_PAGE, IMAGE_CARD_LIST_CARDMANAGER, "卡片管理",\r
+ nullptr,true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ }};\r
+ cardUnionData_.swap(tempUnionData);\r
+\r
+ selectStyle_ = CardEffectID::UI_INVALIDE;\r
+ int backgroundImageId = IMAGE_DESKTOP_BG;\r
+ const char* resourceImage = SETTING_IMAGE;\r
+ for (auto it = g_effectMap.begin(); it != g_effectMap.end(); ++it) {\r
+ effects_[it->first] = SettingCardEffectSample(it->first,\r
+ it->second.second, it->second.first,\r
+ backgroundImageId, resourceImage, false);\r
+ }\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingCardModel::GetCardUnionData()\r
+{\r
+ return cardUnionData_;\r
+}\r
+\r
+std::vector<SettingCardItemData>& SettingCardModel::GetCardData()\r
+{\r
+ RefreshCardData();\r
+ return cardData_;\r
+}\r
+\r
+void SettingCardModel::RefreshCardData()\r
+{\r
+ MainModel::GetInstance().InitCardSettings();\r
+ uint8_t selectedCardCount = MainModel::GetInstance().GetCardSettingCount();\r
+ CardId *selectedCardSettings = MainModel::GetInstance().GetCardSettings();\r
+\r
+ if (cardData_.size() != (MAX_CARD - 1)) {\r
+ cardData_.resize(MAX_CARD - 1); // 系统中的card总个数是固定的, WATCH_FACE不属于card范畴\r
+ }\r
+ for (uint8_t i = 0; i < cardData_.size(); i++) {\r
+ CardId cardId = (CardId)(i+1); // CardId是定义的枚举, WATCH_FACE=0, COMPASS=1;\r
+ uint8_t cardIndex = i; // CardIndex是cardInfoMap中的index, cardInfoMap[0]=COMPASS\r
+\r
+ const CardInfo *info = MainModel::GetInstance().GetCardInfo(cardId);\r
+ if (info == nullptr) {\r
+ continue;\r
+ }\r
+\r
+ SettingCardItemData& data = cardData_[cardIndex];\r
+ data.index = cardIndex;\r
+ data.id = info->id;\r
+ data.image = info->cardImg;\r
+ data.isSelect = false;\r
+ for (uint8_t j = 0; j < selectedCardCount; j++) {\r
+ if (selectedCardSettings[j] == cardId) {\r
+ data.isSelect = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+void SettingCardModel::AddCard(uint8_t index)\r
+{\r
+ MainModel::GetInstance().AddCardSetting(index);\r
+}\r
+\r
+void SettingCardModel::DeleteCard(uint8_t index)\r
+{\r
+ MainModel::GetInstance().DeleteCardSetting(index);\r
+}\r
+\r
+void SettingCardModel::SetSelectedCard(uint8_t cardId)\r
+{\r
+ selectedCardId_ = cardId;\r
+}\r
+\r
+uint8_t SettingCardModel::GetSelectedCard(void)\r
+{\r
+ return selectedCardId_;\r
+}\r
+\r
+void SettingCardModel::InitEffectItem(void)\r
+{\r
+ for (auto& pair : effects_) {\r
+ pair.second.selected = false;\r
+ }\r
+ CardEffectID selectStyle = this->GetSwipeEffectStyle();\r
+ effects_[selectStyle].selected = true;\r
+}\r
+\r
+std::map<CardEffectID, SettingCardEffectSample>& SettingCardModel::GetEffectListItems(void)\r
+{\r
+ return effects_;\r
+}\r
+\r
+CardEffectID SettingCardModel::GetSwipeEffectStyle(void)\r
+{\r
+ if (selectStyle_ != CardEffectID::UI_INVALIDE) {\r
+ return selectStyle_;\r
+ }\r
+ selectStyle_ = CardEffectID::UI_ZOOM;\r
+ char temp[STYLE_VALUE_LEN] = { 0 };\r
+ (void)UtilsGetValue(SWIPE_EFFECT, temp, STYLE_VALUE_LEN);\r
+ auto it = std::find_if(effects_.begin(), effects_.end(),\r
+ [temp](const std::pair<CardEffectID, SettingCardEffectSample>& pair) {\r
+ return strcmp(temp, pair.second.label) == 0;\r
+ });\r
+ if (it != effects_.end()) {\r
+ selectStyle_ = it->first;\r
+ }\r
+ return selectStyle_;\r
+}\r
+\r
+void SettingCardModel::SetSwipeEffectStyle(CardEffectID swipeId)\r
+{\r
+ if (swipeId == CardEffectID::UI_INVALIDE) {\r
+ // If the corresponding style is not found, set the default value to UI_ZOOM.\r
+ swipeId = CardEffectID::UI_ZOOM;\r
+ }\r
+ (void)UtilsSetValue(SWIPE_EFFECT, effects_[swipeId].label);\r
+ selectStyle_ = swipeId;\r
+}\r
+} // OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopModel\r
+ * Create: 2025-06-01\r
+ */\r
+#include <algorithm>\r
+#include "dirent.h"\r
+#include "UiConfig.h"\r
+#include "kv_store.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.h"\r
+#include "main/DialBinParser.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint32_t STYLE_VALUE_LEN = 32;\r
+static constexpr uint8_t SETTING_DIAL_STYLE_ROLLER_IDX = 1;\r
+static constexpr uint8_t SETTING_DIAL_STYLE_COVERFLOW_IDX = 2;\r
+static constexpr uint8_t SETTING_DIAL_STYLE_AOD_IDX = 3;\r
+\r
+SettingDesktopModel::SettingDesktopModel()\r
+{\r
+ std::vector<SettingUnionItemData> tempDesktopUnionData = {{\r
+ PlainTextItemData{"表盘与桌面"},\r
+ IconTextNavigationItemData{SettingPageId::DESKTOP_DIAL_PAGE, IMAGE_DESKTOP_LIST_DIAL, "表盘",\r
+ nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::DESKTOP_HOME_PAGE, IMAGE_DESKTOP_LIST_HOME, "桌面风格",\r
+ nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::DESKTOP_DIAL_STYLE_PAGE, IMAGE_DESKTOP_LIST_DIAL_STYLE, "表盘风格",\r
+ nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ }};\r
+ desktopUnionData_.swap(tempDesktopUnionData);\r
+\r
+ std::vector<SettingDesktopHomeItemData> tempDesktopHomeData = {{\r
+ {APPLIST_STYLE, IMAGE_DESKTOP_HOME_SELECTED_APPLIST, IMAGE_DESKTOP_HOME_UNSELECT_APPLIST, "列表", false},\r
+ {HEXAGONS_STYLE, IMAGE_DESKTOP_HOME_SELECTED_HEXAGONS, IMAGE_DESKTOP_HOME_UNSELECT_HEXAGONS, "蜂窝", false},\r
+ {FOOTBALL_STYLE, IMAGE_DESKTOP_HOME_SELECTED_FOOTBALL, IMAGE_DESKTOP_HOME_UNSELECT_FOOTBALL, "足球", false},\r
+ {WATERFALL_STYLE, IMAGE_DESKTOP_HOME_SELECTED_WATERFALL, IMAGE_DESKTOP_HOME_UNSELECT_WATERFALL, "瀑布", false},\r
+ {PLANET_STYLE, IMAGE_DESKTOP_HOME_SELECTED_PLANET, IMAGE_DESKTOP_HOME_UNSELECT_PLANET, "星球", false},\r
+ }};\r
+ desktopHomeData_.swap(tempDesktopHomeData);\r
+\r
+ std::vector<SettingUnionItemData> tempDialStyleUnionData = {{\r
+ PlainTextItemData{"表盘风格"},\r
+ IconTextToggleItemData{IMAGE_DESKTOP_DIALSTYLE_COVERFLOW, "coverflow", false,\r
+ SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ IconTextToggleItemData{IMAGE_DESKTOP_DIALSTYLE_ROLLER, "roller", false,\r
+ SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ IconTextToggleItemData{IMAGE_DESKTOP_DIALSTYLE_AOD, "息屏显示", false,\r
+ SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ }};\r
+ dialStyleUnionData_.swap(tempDialStyleUnionData);\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingDesktopModel::GetDesktopUnionData()\r
+{\r
+ return desktopUnionData_;\r
+}\r
+\r
+std::vector<SettingDesktopHomeItemData>& SettingDesktopModel::GetDesktopHomeData()\r
+{\r
+ DesktopStyle style = GetDesktopStyle();\r
+ for (auto& it : desktopHomeData_) {\r
+ it.isSelect = (it.style == style);\r
+ }\r
+ return desktopHomeData_;\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingDesktopModel::GetDialStyleUnionData()\r
+{\r
+ RefreshDialStyleUnionDataForStyle();\r
+ RefreshDialStyleUnionDataForAod();\r
+ return dialStyleUnionData_;\r
+}\r
+\r
+void SettingDesktopModel::RefreshDialStyleUnionDataForStyle()\r
+{\r
+ DialStyle style = GetDialStyle();\r
+ auto coverflowItemData = static_cast<IconTextToggleItemData*>(\r
+ dialStyleUnionData_[SETTING_DIAL_STYLE_COVERFLOW_IDX].GetUnionItemData());\r
+ auto rollerItemData = static_cast<IconTextToggleItemData*>(\r
+ dialStyleUnionData_[SETTING_DIAL_STYLE_ROLLER_IDX].GetUnionItemData());\r
+ coverflowItemData->selected = (style == DialStyle::COVERFLOW);\r
+ rollerItemData->selected = (style == DialStyle::ROLLER);\r
+}\r
+\r
+void SettingDesktopModel::RefreshDialStyleUnionDataForAod()\r
+{\r
+ auto aodItemData = static_cast<IconTextToggleItemData*>(\r
+ dialStyleUnionData_[SETTING_DIAL_STYLE_AOD_IDX].GetUnionItemData());\r
+ aodItemData->selected = MainModel::GetInstance().IsAodEnabled();\r
+}\r
+\r
+DesktopStyle SettingDesktopModel::GetDesktopStyle(void)\r
+{\r
+ DesktopStyle style;\r
+ char temp[STYLE_VALUE_LEN] = { 0 };\r
+ (void)UtilsGetValue("applist_style", temp, STYLE_VALUE_LEN);\r
+ if (strcmp(temp, "hexagons") == 0) {\r
+ style = HEXAGONS_STYLE;\r
+ } else if (strcmp(temp, "football") == 0) {\r
+ style = FOOTBALL_STYLE;\r
+ } else if (strcmp(temp, "waterfall") == 0) {\r
+ style = WATERFALL_STYLE;\r
+ } else if (strcmp(temp, "planet") == 0)\r
+ style = PLANET_STYLE;\r
+ else {\r
+ style = APPLIST_STYLE;\r
+ }\r
+ return style;\r
+}\r
+\r
+void SettingDesktopModel::SetDesktopStyle(DesktopStyle style)\r
+{\r
+ if (style == APPLIST_STYLE) {\r
+ (void)UtilsSetValue("applist_style", "list");\r
+ } else if (style == HEXAGONS_STYLE) {\r
+ (void)UtilsSetValue("applist_style", "hexagons");\r
+ } else if (style == FOOTBALL_STYLE) {\r
+ (void)UtilsSetValue("applist_style", "football");\r
+ } else if (style == WATERFALL_STYLE) {\r
+ (void)UtilsSetValue("applist_style", "waterfall");\r
+ } else if (style == PLANET_STYLE) {\r
+ (void)UtilsSetValue("applist_style", "planet");\r
+ }\r
+}\r
+\r
+uint8_t SettingDesktopModel::GetDesktopHomeDataSelect()\r
+{\r
+ DesktopStyle style = GetDesktopStyle();\r
+ for (size_t i = 0; i < desktopHomeData_.size(); i++) {\r
+ if (desktopHomeData_[i].style == style) {\r
+ return i;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+void SettingDesktopModel::SetDesktopHomeDataSelect(DesktopStyle style)\r
+{\r
+ for (auto& it : desktopHomeData_) {\r
+ it.isSelect = (it.style == style);\r
+ }\r
+ SetDesktopStyle(style);\r
+}\r
+\r
+DialStyle SettingDesktopModel::GetDialStyle()\r
+{\r
+ DialStyle style;\r
+ char temp[STYLE_VALUE_LEN] = { 0 };\r
+ (void)UtilsGetValue("set_dial_style", temp, STYLE_VALUE_LEN);\r
+ if (strcmp(temp, "DialStyle::ROLLER") == 0) {\r
+ style = DialStyle::ROLLER;\r
+ } else { // "DialStyle::COVERFLOW" or ""\r
+ style = DialStyle::COVERFLOW;\r
+ }\r
+ return style;\r
+}\r
+\r
+void SettingDesktopModel::SetDialStyle(DialStyle style)\r
+{\r
+ if (style == DialStyle::COVERFLOW) {\r
+ (void)UtilsSetValue("set_dial_style", "DialStyle::COVERFLOW");\r
+ } else if (style == DialStyle::ROLLER) {\r
+ (void)UtilsSetValue("set_dial_style", "DialStyle::ROLLER");\r
+ }\r
+}\r
+\r
+void SettingDesktopModel::SetDialStyleDataSelect(const char* DialStyleName)\r
+{\r
+ auto coverflowItemData = static_cast<IconTextToggleItemData*>(\r
+ dialStyleUnionData_[SETTING_DIAL_STYLE_COVERFLOW_IDX].GetUnionItemData());\r
+ auto rollerItemData = static_cast<IconTextToggleItemData*>(\r
+ dialStyleUnionData_[SETTING_DIAL_STYLE_ROLLER_IDX].GetUnionItemData());\r
+ auto aodItemData = static_cast<IconTextToggleItemData*>(\r
+ dialStyleUnionData_[SETTING_DIAL_STYLE_AOD_IDX].GetUnionItemData());\r
+\r
+ if (strcmp(DialStyleName, aodItemData->textContent) == 0) {\r
+ aodItemData->selected = !aodItemData->selected;\r
+ MainModel::GetInstance().EnableAod(aodItemData->selected);\r
+ } else {\r
+ DialStyle style;\r
+ rollerItemData->selected = !rollerItemData->selected;\r
+ coverflowItemData->selected = !coverflowItemData->selected;\r
+ style = rollerItemData->selected ? DialStyle::ROLLER : DialStyle::COVERFLOW;\r
+ SetDialStyle(style);\r
+ }\r
+}\r
+\r
+void SettingDesktopModel::LoadAllDial(void)\r
+{\r
+ LoadAllDialFromRam(); // 导入在线表盘\r
+ size_t dialSize = dialInfos_.size();\r
+ size_t aodSize = aodDialInfos_.size();\r
+ LoadAllDialFromFs(); // 导入离线表盘\r
+ /* 只排序离线表盘 */\r
+ std::sort(dialInfos_.begin() + dialSize, dialInfos_.end(), [](const SetDialInfo& f, const SetDialInfo& n) {\r
+ return f.dialName < n.dialName;\r
+ });\r
+ std::sort(aodDialInfos_.begin() + aodSize,\r
+ aodDialInfos_.end(),\r
+ [](const SetDialInfo &f, const SetDialInfo &n) { return f.dialName < n.dialName; });\r
+}\r
+\r
+std::vector<SetDialInfo>& SettingDesktopModel::GetDialInfo(void)\r
+{\r
+ return dialInfos_;\r
+}\r
+\r
+std::vector<SetDialInfo>& SettingDesktopModel::GetAmbientDialInfo(void)\r
+{\r
+ return aodDialInfos_;\r
+}\r
+\r
+void SettingDesktopModel::SaveDialSetting(uint8_t pageIndex)\r
+{\r
+ if (pageIndex >= dialInfos_.size()) {\r
+ return;\r
+ }\r
+ DialSetting diagSetting;\r
+ SetDialInfo &info = dialInfos_[pageIndex];\r
+ diagSetting.dialFlag = info.dialFlag;\r
+ diagSetting.dialId = info.id;\r
+ diagSetting.dialFullName = info.dialFullName;\r
+ MainModel::GetInstance().AddDialSetting(diagSetting);\r
+}\r
+\r
+void SettingDesktopModel::SetSpecifyDialSetting(const DialSetting &setting)\r
+{\r
+ hasSpecificDial_ = true;\r
+ specificDialSetting_ = setting;\r
+}\r
+\r
+void SettingDesktopModel::ClearDialInfo(void)\r
+{\r
+ for (auto iter : dialInfos_) {\r
+ if (iter.dialFlag) {\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(iter.resId, iter.dialFullName);\r
+ } else {\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(iter.imageFullName);\r
+ }\r
+ }\r
+ dialInfos_.clear();\r
+ aodDialInfos_.clear();\r
+\r
+ if (hasSpecificDial_) {\r
+ MainModel::GetInstance().GetDialSetting() = specificDialSetting_;\r
+ MainModel::GetInstance().AddDialSetting(specificDialSetting_);\r
+ }\r
+}\r
+\r
+uint8_t SettingDesktopModel::GetPageIndex(void)\r
+{\r
+ uint8_t index = 0;\r
+ DialSetting dialSetting = MainModel::GetInstance().GetDialSetting();\r
+ for (auto& iter : dialInfos_) {\r
+ if (dialSetting.dialFlag) {\r
+ if (strcmp(iter.dialFullName.c_str(), dialSetting.dialFullName.c_str()) == 0) {\r
+ return index;\r
+ }\r
+ } else {\r
+ if ((!iter.dialFlag) && (iter.id == dialSetting.dialId)) {\r
+ return index;\r
+ }\r
+ }\r
+ index++;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void SettingDesktopModel::LoadAllDialFromRam()\r
+{\r
+ for (uint8_t i = 0; i < MainModel::GetInstance().GetDialInfoNum(); i++) {\r
+ const DialInfo *info = MainModel::GetInstance().GetDialInfo(i);\r
+ if (info == nullptr) {\r
+ continue;\r
+ }\r
+ SetDialInfo dialInfo{0};\r
+ dialInfo.dialFlag = 0;\r
+ dialInfo.id = i;\r
+ dialInfo.dialName = info->dialName;\r
+ dialInfo.imageFullName = info->dialImg;\r
+ ImageInfo* imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false);\r
+ if (info == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam loadimage %s fail", info->dialImg);\r
+ continue;\r
+ }\r
+ dialInfo.preImageInfo = imageInfo;\r
+ if (info->capability == DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY) {\r
+ dialInfos_.push_back(dialInfo);\r
+ } else if (info->capability == DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY) {\r
+ aodDialInfos_.push_back(dialInfo);\r
+ } else {\r
+ dialInfos_.push_back(dialInfo);\r
+ aodDialInfos_.push_back(dialInfo);\r
+ }\r
+ }\r
+}\r
+\r
+void SettingDesktopModel::LoadAllDialFromFs()\r
+{\r
+ struct dirent *direntp;\r
+\r
+ // 打开目录\r
+ DIR *dirp = opendir(APP_DIAL_PATH);\r
+ // 遍历文件\r
+ if (dirp != nullptr) {\r
+ while ((direntp = readdir(dirp)) != nullptr) {\r
+ SetDialInfo dialInfo{0};\r
+ if (ParseDialHeader(direntp->d_name, dialInfo) != 0) {\r
+ continue;\r
+ }\r
+ if (dialInfo.capability == DIAL_DISPLAY_CAPABILITY_NORMAL_ONLY) {\r
+ dialInfos_.push_back(dialInfo);\r
+ } else if (dialInfo.capability == DIAL_DISPLAY_CAPABILITY_AMBITIENT_ONLY) {\r
+ aodDialInfos_.push_back(dialInfo);\r
+ } else {\r
+ dialInfos_.push_back(dialInfo);\r
+ aodDialInfos_.push_back(dialInfo);\r
+ }\r
+ }\r
+ }\r
+ // 关闭目录\r
+ closedir(dirp);\r
+}\r
+\r
+int32_t SettingDesktopModel::ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo)\r
+{\r
+ std::string dialFullName = APP_DIAL_PATH;\r
+ dialFullName += "/";\r
+ dialFullName += dialFileName;\r
+ FILE *fp = fopen(dialFullName.c_str(), "rb");\r
+ if (fp == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader cannot open file: %s",\r
+ dialFullName.c_str());\r
+ return -1;\r
+ }\r
+ DialPreviewInfo preInfo{0};\r
+ bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(dialFullName, fp, &preInfo);\r
+ if (!ret) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialPreviewInfo %s fail", dialFullName.c_str());\r
+ fclose(fp);\r
+ return -1;\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s", dialFullName.c_str());\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s", preInfo.dialName);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s", preInfo.description);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u", preInfo.imgId);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ParseDialHeader imageOffset: %u", preInfo.offset);\r
+ ImageInfo *info = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ preInfo.imgId, dialFullName, fp, false, preInfo.offset);\r
+ if (info == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail");\r
+ fclose(fp);\r
+ return -1;\r
+ }\r
+\r
+ dialInfo.dialFlag = 1;\r
+ dialInfo.id = 0;\r
+ dialInfo.resId = preInfo.imgId;\r
+ dialInfo.dialFullName = dialFullName;\r
+ dialInfo.dialName = preInfo.dialName;\r
+ dialInfo.description = preInfo.description;\r
+ dialInfo.preImageInfo = info;\r
+ dialInfo.capability = preInfo.capability;\r
+\r
+ fclose(fp);\r
+ return 0;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayModel\r
+ * Create: 2025-06-01\r
+ */\r
+\r
+#include "kv_store.h"\r
+#ifndef _WIN32\r
+#include "screennotify/ui_screennotify.h"\r
+#endif\r
+#include "power_display_service.h"\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "main/HealthModel.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint32_t SETTING_DISPLAY_VALUE_LEN = 32;\r
+static constexpr uint8_t SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX = 100;\r
+static constexpr uint8_t SETTING_DISPLAY_MODEL_BRI_PERCENT_DEFAULT = 50;\r
+static constexpr uint8_t SETTING_DISPLAY_MODLE_BRI_RANGE_MIN = 55;\r
+static constexpr uint8_t SETTING_DISPLAY_MODLE_BRI_RANGE_STEP = 2;\r
+static const char* SETTING_SCREEN_OFF_ALL_STR[] = {"5秒钟", "10秒钟", "15秒钟", "30秒钟", "1分钟", "5分钟"};\r
+static const char* SETTING_STEADY_ON_ALL_STR[] = {"5分钟", "10分钟", "20分钟", "30分钟", "1小时", "2小时"};\r
+enum SettingStrIndex {INDEX_0, INDEX_1, INDEX_2, INDEX_3, INDEX_4, INDEX_5, INDEX_6};\r
+\r
+SettingDisplayModel::SettingDisplayModel()\r
+{\r
+ std::vector<SettingUnionItemData> tempUnionData = {{\r
+ PlainTextItemData{"显示与亮度"},\r
+ IconTextNavigationItemData{SettingPageId::DISPLAY_BRIGHTNESS_PAGE, IMAGE_DISPLAY_LIST_ADJUST_BRIGHTNESS,\r
+ "调节亮度", nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ IconTextToggleItemData{IMAGE_DISPLAY_LIST_AUTO_ADJUST, "自动调节", false,\r
+ SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::DISPLAY_SCREEN_OFF_PAGE, IMAGE_DISPLAY_LIST_SCREEN_OFF_TIME,\r
+ "熄屏时间", nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::DISPLAY_STEADY_ON_PAGE, IMAGE_DISPLAY_LIST_SCREEN_ON_TIME,\r
+ "长亮时刻", nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},\r
+ }};\r
+ displayUnionData_.swap(tempUnionData);\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingDisplayModel::GetDisplayUnionData()\r
+{\r
+ RefreshDisplayUnionDataForAutoAdjustBrightness();\r
+ RefreshDisPlayUnionDataForScreenOffDataContext();\r
+ RefreshDisplayUnionDataForSteadyOnDataContext();\r
+ return displayUnionData_;\r
+}\r
+\r
+void SettingDisplayModel::RefreshDisplayUnionDataForAutoAdjustBrightness()\r
+{\r
+ auto toggleItemData = static_cast<IconTextToggleItemData*>(displayUnionData_[INDEX_2].GetUnionItemData());\r
+ toggleItemData->selected = GetAutoAdjustBrightness();\r
+}\r
+\r
+void SettingDisplayModel::RefreshDisPlayUnionDataForScreenOffDataContext()\r
+{\r
+ auto screenOffItemData = static_cast<IconTextNavigationItemData*>(displayUnionData_[INDEX_3].GetUnionItemData());\r
+ screenOffItemData->dataContent = GetScreenOffTimeShortStr(GetScreenOffTime());\r
+}\r
+\r
+void SettingDisplayModel::RefreshDisplayUnionDataForSteadyOnDataContext()\r
+{\r
+ auto steadyOnItemData = static_cast<IconTextNavigationItemData*>(displayUnionData_[INDEX_4].GetUnionItemData());\r
+ steadyOnItemData->dataContent = GetSteadyOnTimeShortStr(GetSteadyOnTime());\r
+}\r
+\r
+void SettingDisplayModel::InitDisplayModel()\r
+{\r
+ const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+ if (svr == nullptr) {\r
+ return;\r
+ }\r
+ // 设置亮度调节模式\r
+ SetAutoAdjustBrightness(GetAutoAdjustBrightness());\r
+ // 设置当前亮度\r
+ SetBrightness(GetBrightness());\r
+ // 设置熄屏时间\r
+ SetScreenOffTime(GetScreenOffTime());\r
+}\r
+\r
+void SettingDisplayModel::EnableSteadyOn()\r
+{\r
+ const power_display_svr_api_t *srv = power_display_svr_get_api();\r
+ if (srv == nullptr) {\r
+ return;\r
+ }\r
+ if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 0) {\r
+#if !defined(_WIN32)\r
+ // 设置应用永不返回\r
+ set_back_to_home_interval(0xFFFFFFFF);\r
+#endif\r
+ if (srv->get_screen_state() != SCREEN_ON) {\r
+ srv->turn_on_screen();\r
+ }\r
+ srv->set_screen_set_keepon_timeout((uint32_t)GetSteadyOnTime());\r
+ }\r
+}\r
+\r
+void SettingDisplayModel::DisableSteadyOn()\r
+{\r
+ const power_display_svr_api_t *srv = power_display_svr_get_api();\r
+ if (srv == nullptr) {\r
+ return;\r
+ }\r
+ if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 0) {\r
+#if !defined(_WIN32)\r
+ // 设置应用的返回时间和灭屏时间相同\r
+ set_back_to_home_interval((uint32_t)GetScreenOffTime());\r
+#endif\r
+ srv->set_screen_auto_off_timeout((uint32_t)GetScreenOffTime());\r
+ srv->set_screen_set_keepon_timeout(0);\r
+ }\r
+}\r
+\r
+bool SettingDisplayModel::GetAutoAdjustBrightness()\r
+{\r
+ uint8_t brightness = 0;\r
+ char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+ (void)UtilsGetValue("auto_adjust_brightness", temp, SETTING_DISPLAY_VALUE_LEN);\r
+ if (strcmp(temp, "auto") == 0) {\r
+ return true;\r
+ } else if (strcmp(temp, "manual") == 0) {\r
+ return false;\r
+ }\r
+ // 配置文件读取失败时, 取当前系统的设置\r
+ const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+ if (svr == nullptr) {\r
+ return false;\r
+ }\r
+ return svr->get_brightness_mode() == AUTO;\r
+}\r
+\r
+void SettingDisplayModel::SetAutoAdjustBrightness(bool isAuto)\r
+{\r
+ const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+ if (svr == nullptr) {\r
+ return;\r
+ }\r
+ if (isAuto) {\r
+ svr->set_brightness_mode(AUTO);\r
+ // 自动调节没有传感器支持, 当前设置为默认亮度\r
+ svr->set_brightness(TransBriPercentToValue(SETTING_DISPLAY_MODEL_BRI_PERCENT_DEFAULT));\r
+ (void)UtilsSetValue("auto_adjust_brightness", "auto");\r
+ } else { // 从自动调节转到非自动调节时, 设置存储的亮度值\r
+ svr->set_brightness_mode(MANUAL);\r
+ svr->set_brightness(TransBriPercentToValue(GetBrightness()));\r
+ (void)UtilsSetValue("auto_adjust_brightness", "manual");\r
+ }\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetBrightness()\r
+{\r
+ uint32_t brightness = 0;\r
+ char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+ (void)UtilsGetValue("brightness", temp, SETTING_DISPLAY_VALUE_LEN);\r
+ if (sscanf_s(temp, "%hhu", &brightness) != 1) {\r
+ // 配置文件读取失败时, 取最大亮度的50%\r
+ return SETTING_DISPLAY_MODEL_BRI_PERCENT_DEFAULT;\r
+ }\r
+ if (brightness > SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX) {\r
+ brightness = SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX;\r
+ }\r
+ return brightness;\r
+}\r
+\r
+void SettingDisplayModel::SetBrightness(uint8_t brightness)\r
+{\r
+ if (brightness > SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX) {\r
+ brightness = SETTING_DISPLAY_MODLE_BRI_PERCENT_MAX;\r
+ }\r
+ // 非自动调节时 应用传入亮度值, 否则仅保存亮度值\r
+ if (!GetAutoAdjustBrightness()) {\r
+ const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+ if (svr == nullptr) {\r
+ return;\r
+ }\r
+ svr->set_brightness(TransBriPercentToValue(brightness));\r
+ }\r
+ char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+ if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+ (void)UtilsSetValue("brightness", temp);\r
+ }\r
+}\r
+\r
+ScreenOffTime SettingDisplayModel::GetScreenOffTime()\r
+{\r
+ ScreenOffTime screenOffTime = ScreenOffTime::SECONDS_5;\r
+ char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+ (void)UtilsGetValue("screen_off_time", temp, SETTING_DISPLAY_VALUE_LEN);\r
+ if (sscanf_s(temp, "%u", &screenOffTime) == 0) {\r
+ return ScreenOffTime::SECONDS_5;\r
+ }\r
+ return screenOffTime;\r
+}\r
+\r
+void SettingDisplayModel::SetScreenOffTime(ScreenOffTime screenOffTime)\r
+{\r
+ const power_display_svr_api_t* svr = power_display_svr_get_api();\r
+ if (svr == nullptr) {\r
+ return;\r
+ }\r
+ // 设置灭屏时间\r
+ errcode_t err = svr->set_screen_auto_off_timeout((uint32_t)screenOffTime);\r
+#if !defined(_WIN32)\r
+ // 设置应用返回的时间和灭屏时间同步\r
+ set_back_to_home_interval((uint32_t)screenOffTime);\r
+#endif\r
+ // 保存灭屏时间到配置\r
+ char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+ if (sprintf_s(temp, sizeof(temp), "%u", screenOffTime) > 0) {\r
+ (void)UtilsSetValue("screen_off_time", temp);\r
+ }\r
+ return;\r
+}\r
+\r
+SteadyOnTime SettingDisplayModel::GetSteadyOnTime()\r
+{\r
+ SteadyOnTime steadyOnTime = SteadyOnTime::MINUTE_10;\r
+ char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+ (void)UtilsGetValue("steady_on_time", temp, SETTING_DISPLAY_VALUE_LEN);\r
+ if (sscanf_s(temp, "%u", &steadyOnTime) == 0) {\r
+ return SteadyOnTime::MINUTE_5;\r
+ }\r
+ return steadyOnTime;\r
+}\r
+\r
+void SettingDisplayModel::SetSteadyOnTime(SteadyOnTime steadyOnTime)\r
+{\r
+ char temp[SETTING_DISPLAY_VALUE_LEN] = "";\r
+ if (sprintf_s(temp, sizeof(temp), "%u", steadyOnTime) > 0) {\r
+ (void)UtilsSetValue("steady_on_time", temp);\r
+ }\r
+}\r
+\r
+const char** SettingDisplayModel::GetScreenOffTimeAllStr()\r
+{\r
+ return SETTING_SCREEN_OFF_ALL_STR;\r
+}\r
+\r
+const char** SettingDisplayModel::GetSteadyOnTimeAllStr()\r
+{\r
+ return SETTING_STEADY_ON_ALL_STR;\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetScreenOffTimeAllStrSize()\r
+{\r
+ return sizeof(SETTING_SCREEN_OFF_ALL_STR)/sizeof(SETTING_SCREEN_OFF_ALL_STR[0]);\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetSteadyOnTimeAllStrSize()\r
+{\r
+ return sizeof(SETTING_STEADY_ON_ALL_STR)/sizeof(SETTING_SCREEN_OFF_ALL_STR[0]);\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetScreenOffTimeIndex()\r
+{\r
+ ScreenOffTime screenOffTime = GetScreenOffTime();\r
+ switch (screenOffTime) {\r
+ case ScreenOffTime::SECONDS_5: return INDEX_0;\r
+ case ScreenOffTime::SECONDS_10: return INDEX_1;\r
+ case ScreenOffTime::SECONDS_15: return INDEX_2;\r
+ case ScreenOffTime::SECONDS_30: return INDEX_3;\r
+ case ScreenOffTime::MINUTE_1: return INDEX_4;\r
+ case ScreenOffTime::MINUTE_5: return INDEX_5;\r
+ }\r
+}\r
+\r
+uint8_t SettingDisplayModel::GetSteadyOnTimeIndex()\r
+{\r
+ SteadyOnTime steadyOnTime = GetSteadyOnTime();\r
+ switch (steadyOnTime) {\r
+ case SteadyOnTime::MINUTE_5: return INDEX_0;\r
+ case SteadyOnTime::MINUTE_10: return INDEX_1;\r
+ case SteadyOnTime::MINUTE_20: return INDEX_2;\r
+ case SteadyOnTime::MINUTE_30: return INDEX_3;\r
+ case SteadyOnTime::HOUR_1: return INDEX_4;\r
+ case SteadyOnTime::HOUR_2: return INDEX_5;\r
+ }\r
+}\r
+\r
+void SettingDisplayModel::SetScreenOffTimeIndex(uint8_t index)\r
+{\r
+ ScreenOffTime screenOffTime;\r
+ switch (index) {\r
+ case INDEX_0: screenOffTime = ScreenOffTime::SECONDS_5; break;\r
+ case INDEX_1: screenOffTime = ScreenOffTime::SECONDS_10; break;\r
+ case INDEX_2: screenOffTime = ScreenOffTime::SECONDS_15; break;\r
+ case INDEX_3: screenOffTime = ScreenOffTime::SECONDS_30; break;\r
+ case INDEX_4: screenOffTime = ScreenOffTime::MINUTE_1; break;\r
+ case INDEX_5: screenOffTime = ScreenOffTime::MINUTE_5; break;\r
+ default: return;\r
+ }\r
+ SetScreenOffTime(screenOffTime);\r
+}\r
+\r
+void SettingDisplayModel::SetSteadyOnTimeIndex(uint8_t index)\r
+{\r
+ SteadyOnTime steadyOnTime;\r
+ switch (index) {\r
+ case INDEX_0: steadyOnTime = SteadyOnTime::MINUTE_5; break;\r
+ case INDEX_1: steadyOnTime = SteadyOnTime::MINUTE_10; break;\r
+ case INDEX_2: steadyOnTime = SteadyOnTime::MINUTE_20; break;\r
+ case INDEX_3: steadyOnTime = SteadyOnTime::MINUTE_30; break;\r
+ case INDEX_4: steadyOnTime = SteadyOnTime::HOUR_1; break;\r
+ case INDEX_5: steadyOnTime = SteadyOnTime::HOUR_2; break;\r
+ default: return;\r
+ }\r
+ SetSteadyOnTime(steadyOnTime);\r
+}\r
+\r
+const char* SettingDisplayModel::GetScreenOffTimeShortStr(ScreenOffTime screenOffTime)\r
+{\r
+ switch (screenOffTime) {\r
+ case ScreenOffTime::SECONDS_5: return "5s";\r
+ case ScreenOffTime::SECONDS_10: return "10s";\r
+ case ScreenOffTime::SECONDS_15: return "15s";\r
+ case ScreenOffTime::SECONDS_30: return "30s";\r
+ case ScreenOffTime::MINUTE_1: return "1m";\r
+ case ScreenOffTime::MINUTE_5: return "5m";\r
+ }\r
+}\r
+\r
+const char* SettingDisplayModel::GetSteadyOnTimeShortStr(SteadyOnTime steadyOnTime)\r
+{\r
+ switch (steadyOnTime) {\r
+ case SteadyOnTime::MINUTE_5: return "5m";\r
+ case SteadyOnTime::MINUTE_10: return "10m";\r
+ case SteadyOnTime::MINUTE_20: return "20m";\r
+ case SteadyOnTime::MINUTE_30: return "30m";\r
+ case SteadyOnTime::HOUR_1: return "1h";\r
+ case SteadyOnTime::HOUR_2: return "2h";\r
+ }\r
+}\r
+\r
+uint8_t SettingDisplayModel::TransBriValueToPercent(uint8_t value)\r
+{\r
+ return (value - SETTING_DISPLAY_MODLE_BRI_RANGE_MIN) / SETTING_DISPLAY_MODLE_BRI_RANGE_STEP;\r
+}\r
+\r
+uint8_t SettingDisplayModel::TransBriPercentToValue(uint8_t percent)\r
+{\r
+ return percent * SETTING_DISPLAY_MODLE_BRI_RANGE_STEP + SETTING_DISPLAY_MODLE_BRI_RANGE_MIN;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingMainModel\r
+ * Create: 2025-06-01\r
+ */\r
+#include "Slice.h"\r
+#include "UiConfig.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingMainModel.h"\r
+\r
+namespace OHOS {\r
+SettingMainModel::SettingMainModel()\r
+{\r
+ std::vector<SettingUnionItemData> tempUnionData = {{\r
+ PlainTextItemData{"设置"},\r
+ IconTextNavigationItemData{SettingPageId::BLUETOOTH_PAGE, IMAGE_MAIN_LIST_BLUETOOTH, "蓝牙",\r
+ nullptr, true, SETTING_LIST_BLUETOOTH_BG_COLOR, SETTING_LIST_BLUETOOTH_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::DISPLAY_PAGE, IMAGE_MAIN_LIST_DISPLAY, "显示与亮度",\r
+ nullptr, true, SETTING_LIST_DISPLAY_BG_COLOR, SETTING_LIST_DISPLAY_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::DESKTOP_PAGE, IMAGE_MAIN_LIST_DESKTOP, "表盘与桌面",\r
+ nullptr, true, SETTING_LIST_DESKTOP_BG_COLOR, SETTING_LIST_DESKTOP_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::POWER_PAGE, IMAGE_MAIN_LIST_POWER, "电量",\r
+ nullptr, true, SETTING_LIST_POWER_BG_COLOR, SETTING_LIST_POWER_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::CARD_PAGE, IMAGE_MAIN_LIST_CARD, "卡片",\r
+ nullptr, true, SETTING_LIST_CARD_BG_COLOR, SETTING_LIST_CARD_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::SYSTEM_PAGE, IMAGE_MAIN_LIST_SYSTEM, "系统和升级",\r
+ nullptr, true, SETTING_LIST_SYSTEM_BG_COLOR, SETTING_LIST_SYSTEM_BG_COLOR_OPA},\r
+ IconTextNavigationItemData{SettingPageId::ABOUT_PAGE, IMAGE_MAIN_LIST_ABOUT, "关于",\r
+ nullptr, true, SETTING_LIST_ABOUT_BG_COLOR, SETTING_LIST_ABOUT_BG_COLOR_OPA},\r
+ }};\r
+ mainUnionData_.swap(tempUnionData);\r
+}\r
+\r
+std::vector<SettingUnionItemData>& SettingMainModel::GetMainUnionData()\r
+{\r
+ return mainUnionData_;\r
+}\r
+\r
+UIView* SettingMainModel::OnSimpleListCreate(uint8_t type)\r
+{\r
+ if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+ return new PlainTextItemView();\r
+ } else if (type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+ return new IconTextToggleItemView();\r
+ } else if (type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+ return new IconTextNavigationItemView();\r
+ }\r
+ return nullptr;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPowerModel\r
+ * Create: 2025-06-01\r
+ */\r
+#if !defined(_WIN32)\r
+#include "osal_interrupt.h"\r
+#endif\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingPowerModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr const uint8_t percentage_scale = 100; // 百分比换算基数\r
+static constexpr const uint8_t percentage_max = 100;\r
+static constexpr const uint8_t percentage_min = 0;\r
+\r
+static constexpr const uint32_t adc_reference_ratio_numerator = 450U;\r
+static constexpr const uint32_t adc_reference_ratio_denominator = 1024U / 2U;\r
+static constexpr const uint32_t millivolt_per_volt = 1000U;\r
+\r
+static constexpr const uint32_t def_samples_to_keep = 10;\r
+static constexpr const uint32_t def_samples_to_discard = 5;\r
+static constexpr const uint32_t def_adc_max_range_mv = 380;\r
+static constexpr const uint32_t def_adc_min_range_mv = 0;\r
+\r
+#if !defined(_WIN32)\r
+SettingPowerModel::SettingPowerModel()\r
+{\r
+ channel_ = ADC_CHANNEL_3;\r
+ analog_pin_ = S_AGPIO_L27;\r
+ mode_ = PIN_MODE_0;\r
+ samples_to_keep_ = def_samples_to_keep;\r
+ samples_to_discard_ = def_samples_to_discard;\r
+ // 毫伏更容易计算电量百分比\r
+ adc_max_range_mv_ = def_adc_max_range_mv;\r
+ adc_min_range_mv_ = def_adc_min_range_mv;\r
+}\r
+\r
+SettingPowerModel::~SettingPowerModel()\r
+{\r
+ adc_context_shutdown();\r
+}\r
+\r
+uint8_t SettingPowerModel::GetBatteryPowerLevel()\r
+{\r
+ uint32_t voltage = 0;\r
+ // 从adc获取电压值\r
+ if (adc_context_startup()) {\r
+ voltage = calc_voltage();\r
+ }\r
+ adc_context_shutdown();\r
+ // 根据电压值计算电量百分比\r
+ return calc_percentage(voltage);\r
+}\r
+\r
+const char* SettingPowerModel::GetPowerModelNotify()\r
+{\r
+ return "这是相对于新电池而言的电池容量。容量较低可能导致充电后,电池使用时间缩短。内建动态软硬件系统将协助克服随手表化学老化出现的性能影响。";\r
+}\r
+\r
+bool SettingPowerModel::adc_context_init()\r
+{\r
+ // 初始化pin模块\r
+ uapi_pin_init();\r
+ // 初始化高精度计数器\r
+ errcode_t err = uapi_tcxo_init();\r
+ if (err != ERRCODE_SUCC) {\r
+ return false;\r
+ }\r
+ // 设置pin脚模式\r
+ err = uapi_pin_set_mode(analog_pin_, mode_);\r
+ if (err != ERRCODE_SUCC) {\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SettingPowerModel::adc_context_startup()\r
+{\r
+ errcode_t err = uapi_adc_init(ADC_CLOCK_500KHZ); // 初始化adc\r
+ if (err != ERRCODE_SUCC) {\r
+ return false;\r
+ }\r
+ uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, true);\r
+ err = uapi_adc_open_channel(channel_);\r
+ if (err != ERRCODE_SUCC) {\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+void SettingPowerModel::adc_context_shutdown()\r
+{\r
+ errcode_t err = uapi_adc_close_channel(channel_);\r
+ if (err != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_adc_close_channel error %u", err);\r
+ }\r
+ uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, false);\r
+ uapi_adc_deinit();\r
+}\r
+\r
+uint8_t SettingPowerModel::calc_percentage(uint32_t voltage)\r
+{\r
+ if (voltage >= adc_max_range_mv_) {\r
+ return percentage_max;\r
+ }\r
+ if (voltage <= adc_min_range_mv_) {\r
+ return percentage_min;\r
+ }\r
+\r
+ uint32_t voltage_range = adc_max_range_mv_ - adc_min_range_mv_;\r
+ uint32_t rounding_term = voltage_range / 2;\r
+ uint32_t voltage_offset = voltage - adc_min_range_mv_;\r
+ return static_cast<uint8_t>((voltage_offset * percentage_scale + rounding_term) / voltage_range);\r
+}\r
+\r
+uint32_t SettingPowerModel::calc_voltage()\r
+{\r
+ // 丢弃初始帧数据\r
+ for (uint32_t i = 0; i < samples_to_discard_; i++) {\r
+ uapi_adc_manual_sample(ADC_CHANNEL_NONE);\r
+ uapi_tcxo_delay_ms((uint64_t)3); // 延迟3ms\r
+ }\r
+\r
+ uint32_t stick = 0;\r
+ uint32_t stick_count = 0;\r
+ // 采集样本数\r
+ for (uint32_t i = 0; i < samples_to_keep_; i++) {\r
+ uint32_t irq_sts = osal_irq_lock();\r
+ uint32_t sample_result =\r
+ (uint32_t)uapi_adc_manual_sample(ADC_CHANNEL_NONE); // 每次读取CHANNEL_NONE? testsuit中是这样写的\r
+ if (sample_result != 0) {\r
+ stick += sample_result;\r
+ stick_count++;\r
+ }\r
+ osal_irq_restore(irq_sts);\r
+ }\r
+ if (stick_count == 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "calc voltage error, no result");\r
+ return 0;\r
+ }\r
+ return adc_trans_sytick_to_voltages(stick / stick_count);\r
+}\r
+\r
+uint32_t SettingPowerModel::adc_trans_sytick_to_voltages(uint32_t sytick)\r
+{\r
+ // 整数运算公式:(sytick * numerator + denominator/2) / denominator\r
+ return (sytick * adc_reference_ratio_numerator + adc_reference_ratio_denominator) / adc_reference_ratio_denominator;\r
+}\r
+#else\r
+uint8_t SettingPowerModel::GetBatteryPowerLevel()\r
+{\r
+ return percentage_max;\r
+}\r
+\r
+const char* SettingPowerModel::GetPowerModelNotify()\r
+{\r
+ return "这是相对于新电池而言的电池容量。容量较低可能导致充电后,电池使用时间缩短。内建动态软硬件系统将协助克服随手表化学老化出现的性能影响。";\r
+}\r
+#endif\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingQrcodeConnModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "settings/model/SettingQrcodeConnModel.h"\r
+\r
+namespace OHOS {\r
+SettingQrcodeConnModel::SettingQrcodeConnModel() {}\r
+\r
+SettingQrcodeConnModel::~SettingQrcodeConnModel() {}\r
+\r
+SettingQrcodeConnModel &SettingQrcodeConnModel::GetInstance()\r
+{\r
+ static SettingQrcodeConnModel instance;\r
+ return instance;\r
+}\r
+}\r
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingSystemModel
+ * Create: 2025-06-01
+ */
+#include <cstring>
+#include <cstdint>
+#include <cstdio>
+#include <dirent.h>
+#include <list>
+#include <string>
+#include <sys/stat.h>
+#include <unistd.h>
+#if !defined(_WIN32)
+#include "tcxo.h"
+#include "upg.h"
+#include "upg_porting.h"
+#include "upg_definitions.h"
+#include "upg_common_porting.h"
+#endif
+#include "dfx_reboot.h"
+#include "bundlems_slite_client.h"
+#include "abilityms_slite_client.h"
+#include "bundle_info.h"
+#include "adapter.h"
+#ifdef SUPPORT_ALIPAY_SEC
+#include "alipay_feature.h"
+#endif
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "sport/SportModel.h"
+#include "gfx_utils/list.h"
+#include "bts_def.h"
+#include "bts_br_gap.h"
+#include "flashlight/FlashLightModel.h"
+#include "settings/model/SettingSystemModel.h"
+
+
+namespace OHOS {
+#define MODLE_THREAD_STACK_SIZE 4096
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_5 = 5;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_10 = 10;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_25 = 25;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_40 = 40;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_50 = 50;
+static constexpr uint8_t SETTING_SYSTEM_OTA_PERCENT_100 = 100;
+
+SettingSystemModel::SettingSystemModel()
+{
+ std::vector<SettingUnionItemData> tempUnionData = {{
+ PlainTextItemData{"系统和升级"},
+ IconTextNavigationItemData{SettingPageId::SYSTEM_OPERATION_PAGE, IMAGE_SYSTEM_LIST_POWEROFF, "关机",
+ nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},
+ IconTextNavigationItemData{SettingPageId::SYSTEM_OPERATION_PAGE, IMAGE_SYSTEM_LIST_RESTART, "重启",
+ nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},
+ IconTextNavigationItemData{SettingPageId::SYSTEM_OPERATION_PAGE, IMAGE_SYSTEM_LIST_RESUME, "恢复出厂",
+ nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},
+ IconTextNavigationItemData{SettingPageId::SYSTEM_OTA_PAGE, IMAGE_SYSTEM_LIST_OTA, "OTA升级",
+ nullptr, true, SETTING_LIST_DEFAULT_BG_COLOR, SETTING_LIST_DEFAULT_BG_COLOR_OPA},
+ }};
+ systemUnionData_.swap(tempUnionData);
+}
+
+SettingSystemModel::~SettingSystemModel()
+{
+#if !defined(_WIN32)
+ if (systemOtaTask_ != nullptr) {
+ osal_kthread_destroy(systemOtaTask_, 0);
+ }
+#endif
+}
+
+std::vector<SettingUnionItemData>& SettingSystemModel::GetSystemUnionData()
+{
+ return systemUnionData_;
+}
+
+void SettingSystemModel::SystemOperation(const char* operationName)
+{
+#if !defined(_WIN32)
+ if (strcmp(operationName, "关机") == 0) {
+ uapi_system_shutdown(0);
+ } else if (strcmp(operationName, "重启") == 0) {
+ uapi_system_reboot(SYSTEM_SOFT_REBOOT);
+ } else if (strcmp(operationName, "恢复出厂") == 0) {
+ RestoreJSApplication();
+ RestoreNativeApplication();
+ RestoreKvstore();
+ uapi_system_reboot(SYSTEM_SOFT_REBOOT);
+ }
+#endif
+}
+
+void SettingSystemModel::RestoreJSApplication()
+{
+#if !defined(_WIN32)
+ bool res = bluetooth_factory_reset();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bluetooth_factory_reset res:%u.", (uint32_t)res);
+#ifdef SUPPORT_ALIPAY_SEC
+ (void)uapi_alipay_svr_reset();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "uapi_alipay_svr_reset process.");
+#endif
+
+ BundleInfo *bundleInfos = nullptr;
+ int32_t bundleCount = 0;
+ uint32_t err = ERRCODE_FAIL;
+
+ err = BundleMsClient::GetInstance().GetBundleInfos(0, &bundleInfos, &bundleCount);
+ if (err != 0) {
+ bundleCount = 0;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Get bundleInfos Failed, errno is %d\n", err);
+ }
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "----------------- AppList Start[%d] ------------------", bundleCount);
+ for (int32_t i = 0; i<bundleCount; i++) {
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "App:%03d label:%-20s bundleName:%-20s",
+ i, bundleInfos[i].label, bundleInfos[i].bundleName);
+ ElementName* topAbility = AbilityMsClient::GetInstance().GetTopAbility();
+
+ if ((topAbility != nullptr) && (strcmp(topAbility->bundleName, bundleInfos[i].bundleName) == 0)) {
+ AbilityMsClient::GetInstance().TerminateAbility(0);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "terminate %-20s", bundleInfos[i].bundleName);
+ }
+
+ InstallParam installParam = {.installLocation = 1, .keepData = false};
+ BundleMsClient::GetInstance().Uninstall(bundleInfos[i].bundleName, &installParam,
+ SettingSystemModel::UninstallCallback);
+ FreeElement(topAbility);
+ }
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "----------------- AppList End[%d] ------------------", bundleCount);
+
+ if (bundleInfos != nullptr && bundleCount != 0) {
+ for (int32_t i = 0; i<bundleCount; i++) {
+ ClearBundleInfo(&bundleInfos[i]);
+ }
+ AdapterFree(bundleInfos);
+ bundleInfos = nullptr;
+ }
+#endif
+}
+
+void SettingSystemModel::RestoreNativeApplication()
+{
+ SportModel::GetInstance().ClearData();
+ FlashLightModel::GetInstance().SetDefault();
+}
+
+void SettingSystemModel::RestoreKvstore()
+{
+#if !defined(_WIN32)
+#ifndef XTS_SUPPORT
+ const char* path = "/user/kvstore";
+ DIR* dir = opendir(path);
+ if (!dir) return;
+ struct dirent* entry;
+ while ((entry = readdir(dir)) != nullptr) {
+ if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
+ continue;
+ std::string full_path = std::string(path) + "/" + entry->d_name;
+ struct stat statbuf;
+ if (lstat(full_path.c_str(), &statbuf) == -1)
+ continue;
+ if (!S_ISDIR(statbuf.st_mode)) {
+ unlink(full_path.c_str());
+ }
+ }
+ closedir(dir);
+#endif
+#endif
+}
+
+void SettingSystemModel::UninstallCallback(const uint8_t resultCode, const void *resultMessage)
+{
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Uninstall %-20s, %u", resultMessage, resultCode);
+}
+
+uint32_t SettingSystemModel::GetOtaPackageSize()
+{
+#if !defined(_WIN32)
+ FILE *fp = fopen(upg_get_pkg_file_path(), "rb");
+ if (fp == nullptr) {
+ return 0;
+ }
+ fseek(fp, 0L, SEEK_END);
+ uint32_t total_size = ftell(fp);
+ fclose(fp);
+
+ return total_size;
+#else
+ return 0;
+#endif
+}
+
+bool SettingSystemModel::GetOtaIsUpgrade()
+{
+ std::lock_guard<std::mutex> lock(otaOSALMtx_);
+#ifndef _WIN32
+ return systemOtaTask_ != nullptr;
+#else
+ return false;
+#endif
+}
+
+uint8_t SettingSystemModel::GetOtaNativeUpgradePercent()
+{
+ std::lock_guard<std::mutex> lock(otaOSALMtx_);
+ return otaUpgradePrecent_;
+}
+
+std::string SettingSystemModel::GetOtaNativeUpgradeMessage()
+{
+ std::lock_guard<std::mutex> lock(otaOSALMtx_);
+ return otaUpgradeMessage_;
+}
+
+void SettingSystemModel::SetOtaNativeUpgradePercent(uint8_t percent)
+{
+ std::lock_guard<std::mutex> lock(otaOSALMtx_);
+ otaUpgradePrecent_ = percent;
+}
+
+void SettingSystemModel::SetOtaNativeUpgradeMessage(std::string message)
+{
+ std::lock_guard<std::mutex> lock(otaOSALMtx_);
+ otaUpgradeMessage_ = message;
+}
+
+void SettingSystemModel::StartOtaNativeUpgrade()
+{
+#if !defined(_WIN32)
+ systemOtaTask_ = osal_kthread_create(&SettingSystemModel::SystemOta, this,
+ "sys_ota", MODLE_THREAD_STACK_SIZE);
+ if (systemOtaTask_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ota osal_wait_init error");
+ return;
+ }
+#endif
+}
+
+void SettingSystemModel::StopOtaNativeUpgrade()
+{
+#if !defined(_WIN32)
+ if (systemOtaTask_ != nullptr) {
+ osal_kthread_destroy(systemOtaTask_, 0);
+ systemOtaTask_ = nullptr;
+ }
+#endif
+}
+
+int SettingSystemModel::SystemOta(void *data)
+{
+ SettingSystemModel* model = (SettingSystemModel*)data;
+ do {
+#if !defined(_WIN32)
+ upg_prepare_info_t info;
+ model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_5);
+ model->SetOtaNativeUpgradeMessage("检查文件...");
+ info.package_len = model->GetOtaPackageSize();
+ if (info.package_len == 0) {
+ model->SetOtaNativeUpgradeMessage("检查文件失败");
+ break;
+ }
+ model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_10);
+ model->SetOtaNativeUpgradeMessage("准备中...");
+ errcode_t ret = uapi_upg_prepare(&info);
+ if (ret != ERRCODE_SUCC) {
+ model->SetOtaNativeUpgradeMessage("准备失败");
+ break;
+ }
+ model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_25);
+ model->SetOtaNativeUpgradeMessage("申请升级...");
+ ret = uapi_upg_request_upgrade(false);
+ if (ret != ERRCODE_SUCC) {
+ model->SetOtaNativeUpgradeMessage("申请升级失败");
+ break;
+ }
+ model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_40);
+ model->SetOtaNativeUpgradeMessage("备份系统...");
+ ret = upg_image_backups_update();
+ if (ret != ERRCODE_SUCC) {
+ model->SetOtaNativeUpgradeMessage("备份失败");
+ break;
+ }
+ model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_50);
+ model->SetOtaNativeUpgradeMessage("升级中...");
+ ret = uapi_upg_start();
+ if (ret != ERRCODE_SUCC) {
+ model->SetOtaNativeUpgradeMessage("升级失败");
+ break;
+ }
+ model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_100);
+ model->SetOtaNativeUpgradeMessage("即将重启...");
+ uapi_system_reboot(SYSTEM_SOFT_REBOOT);
+#else
+ model->SetOtaNativeUpgradePercent(SETTING_SYSTEM_OTA_PERCENT_100);
+ model->SetOtaNativeUpgradeMessage("即将重启...");
+#endif
+ } while (false);
+ model->StopOtaNativeUpgrade(); // 停止线程
+ return 0;
+}
+} // OHOS
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingAboutPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "settings/model/SettingAboutModel.h"\r
+#include "settings/page/SettingAboutPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::ABOUT_PAGE, SettingAboutPage, false);\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEFAULT_X = 78;\r
+static constexpr int16_t SETTING_ABOUT_DEFAULT_WIDTH = 298;\r
+static constexpr int16_t SETTING_ABOUT_DEFAULT_DATA_OPA = 168; // 66%\r
+\r
+static const char* SETTING_ABOUT_TITLE_TEXT = "关于";\r
+static const char* SETTING_ABOUT_DEVICENAME_TEXT = "设备名称";\r
+static const char* SETTING_ABOUT_DEVICETYPE_TEXT = "型号";\r
+\r
+static constexpr int16_t SETTING_ABOUT_TITLE_X = 100;\r
+static constexpr int16_t SETTING_ABOUT_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_ABOUT_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_ABOUT_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_ABOUT_TITLE_FSIZE = 38;\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_Y = 134;\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_HEIGHT = 54;\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_FSIZE = 38;\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_Y = 268;\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_HEIGHT = 54;\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_FSIZE = 38;\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_DATA_Y = 192;\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_DATA_HEIGHT = 45;\r
+static constexpr int16_t SETTING_ABOUT_DEVICENAME_DATA_FSIZE = 32;\r
+\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_DATA_Y = 322;\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_DATA_HEIGHT = 45;\r
+static constexpr int16_t SETTING_ABOUT_DEVICETYPE_DATA_FSIZE = 32;\r
+\r
+void SettingAboutPage::OnStart(void* data)\r
+{\r
+ InitTitle();\r
+ InitDeviceNameView();\r
+ InitDeviceTypeView();\r
+ AddViewToPageContainer(title_);\r
+ AddViewToPageContainer(deviceNameTitle_);\r
+ AddViewToPageContainer(deviceTypeTitle_);\r
+ AddViewToPageContainer(deviceName_);\r
+ AddViewToPageContainer(deviceType_);\r
+}\r
+\r
+void SettingAboutPage::OnResume()\r
+{\r
+ deviceName_->SetText(SettingAboutModel::GetInstance().GetSystemName().c_str());\r
+ deviceType_->SetText(SettingAboutModel::GetInstance().GetSystemType().c_str());\r
+}\r
+\r
+void SettingAboutPage::OnStop()\r
+{\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+ if (deviceNameTitle_ != nullptr) {\r
+ delete deviceNameTitle_;\r
+ deviceNameTitle_ = nullptr;\r
+ }\r
+ if (deviceTypeTitle_ != nullptr) {\r
+ delete deviceTypeTitle_;\r
+ deviceTypeTitle_ = nullptr;\r
+ }\r
+ if (deviceName_ != nullptr) {\r
+ delete deviceName_;\r
+ deviceName_ = nullptr;\r
+ }\r
+ if (deviceType_ != nullptr) {\r
+ delete deviceType_;\r
+ deviceType_ = nullptr;\r
+ }\r
+}\r
+\r
+void SettingAboutPage::InitTitle()\r
+{\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart title_ new fail");\r
+ return;\r
+ }\r
+ title_->SetPosition(SETTING_ABOUT_TITLE_X, SETTING_ABOUT_TITLE_Y);\r
+ title_->Resize(SETTING_ABOUT_TITLE_WIDTH, SETTING_ABOUT_TITLE_HEIGHT);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_ABOUT_TITLE_FSIZE);\r
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title_->SetText(SETTING_ABOUT_TITLE_TEXT);\r
+}\r
+\r
+void SettingAboutPage::InitDeviceTypeView()\r
+{\r
+ deviceTypeTitle_ = new UILabel();\r
+ if (deviceTypeTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart deviceTypeTitle_ new fail");\r
+ return;\r
+ }\r
+ deviceTypeTitle_->SetPosition(SETTING_ABOUT_DEFAULT_X, SETTING_ABOUT_DEVICETYPE_Y);\r
+ deviceTypeTitle_->Resize(SETTING_ABOUT_DEFAULT_WIDTH, SETTING_ABOUT_DEVICETYPE_HEIGHT);\r
+ deviceTypeTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ deviceTypeTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ABOUT_DEVICETYPE_FSIZE);\r
+ deviceTypeTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ deviceTypeTitle_->SetText(SETTING_ABOUT_DEVICETYPE_TEXT);\r
+\r
+ deviceType_ = new UILabel();\r
+ if (deviceType_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart deviceType_ new fail");\r
+ return;\r
+ }\r
+ deviceType_->SetPosition(SETTING_ABOUT_DEFAULT_X, SETTING_ABOUT_DEVICETYPE_DATA_Y);\r
+ deviceType_->Resize(SETTING_ABOUT_DEFAULT_WIDTH, SETTING_ABOUT_DEVICETYPE_DATA_HEIGHT);\r
+ deviceType_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ deviceType_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ABOUT_DEVICETYPE_DATA_FSIZE);\r
+ deviceType_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ deviceType_->SetStyle(STYLE_TEXT_OPA, SETTING_ABOUT_DEFAULT_DATA_OPA);\r
+}\r
+\r
+void SettingAboutPage::InitDeviceNameView()\r
+{\r
+ deviceNameTitle_ = new UILabel();\r
+ if (deviceNameTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart deviceNameTitle_ new fail");\r
+ return;\r
+ }\r
+ deviceNameTitle_->SetPosition(SETTING_ABOUT_DEFAULT_X, SETTING_ABOUT_DEVICENAME_Y);\r
+ deviceNameTitle_->Resize(SETTING_ABOUT_DEFAULT_WIDTH, SETTING_ABOUT_DEVICENAME_HEIGHT);\r
+ deviceNameTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ deviceNameTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ABOUT_DEVICENAME_FSIZE);\r
+ deviceNameTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ deviceNameTitle_->SetText(SETTING_ABOUT_DEVICENAME_TEXT);\r
+\r
+ deviceName_ = new UILabel();\r
+ if (deviceName_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingAboutPage::OnStart deviceName_ new fail");\r
+ return;\r
+ }\r
+ deviceName_->SetPosition(SETTING_ABOUT_DEFAULT_X, SETTING_ABOUT_DEVICENAME_DATA_Y);\r
+ deviceName_->Resize(SETTING_ABOUT_DEFAULT_WIDTH, SETTING_ABOUT_DEVICENAME_DATA_HEIGHT);\r
+ deviceName_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ deviceName_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ABOUT_DEVICENAME_DATA_FSIZE);\r
+ deviceName_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ deviceName_->SetStyle(STYLE_TEXT_OPA, SETTING_ABOUT_DEFAULT_DATA_OPA);\r
+}\r
+}\r
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingBluetoothPage
+ * Created: 2025-06-05
+ */
+
+#include "components/ui_simple_list.h"
+#include "components/ui_scroll_view_nested.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "ui_resource_settings.h"
+#include "ohos_timer.h"
+#include "graphic_service.h"
+#include "main/LoadImg.h"
+#include "settings/common/SettingCommon.h"
+#include "settings/common/SettingBluetoothItemGroup.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+
+namespace OHOS {
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::BLUETOOTH_PAGE, SettingBluetoothPage, false);
+
+static SettingBluetoothPage *g_pSettingBluetoothPage{nullptr};
+GraphicTimer* g_settingStopScanHandle = nullptr;
+static constexpr uint32_t SCAN_TIME = 25000;
+static constexpr int16_t SETTING_ADDR2 = 2;
+static constexpr int16_t SETTING_ADDR3 = 3;
+static constexpr int16_t SETTING_ADDR4 = 4;
+static constexpr int16_t SETTING_ADDR5 = 5;
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;
+static constexpr int16_t SETTING_LIST_POSITION_Y = 350;
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 50;
+static constexpr int16 MAX_SCR_DIS = 1000;
+static constexpr int16 LIST_POS = 20;
+static constexpr int16 SNUM_2 = 2;
+static constexpr int16_t SETTING_CONTENT_HEIGHT = 160;
+static constexpr int16_t SETTING_TITLE_Y = 39;
+static constexpr int16_t SETTING_TITLE_HEIGHT = 53;
+static constexpr int16_t SETTING_TITLE_FONT = 38;
+static constexpr int16_t SETTING_AVILABLE_Y = 102;
+static constexpr int16_t SETTING_AVILABLE_HEIGHT = 39;
+static constexpr int16_t SETTING_AVILABLE_FONT = 32;
+static constexpr int16_t SETTING_SEATCHBTN_HEIGHT = 36;
+static constexpr int16_t SETTING_SEATCHBTN_FONT = 30;
+static constexpr int16_t SETTING_ITEM_HEIGHT_ = 130;
+static constexpr int16_t SETTING_NODEVICE_Y = 150;
+static constexpr int16_t SETTING_NODEVICE_FONT = 25;
+static constexpr int16_t SETTING_RESEARCH_X = 111;
+static constexpr int16_t SETTING_RESEARCH_Y = 230;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_RESEARCH_WIDTH = 232;
+static constexpr int16_t SETTING_RESEARCH_HEIGHT = 76;
+static constexpr int16_t SETTING_IMGANI_X = 163;
+static constexpr int16_t SETTING_IMGANI_HEIGHT = 126;
+static constexpr int16_t SETTING_IMGANI_Y = 150;
+static constexpr int16_t SETTING_IMGANI_UPDATE = 120;
+static constexpr int16_t SETTING_BTLIST_X = 426;
+static constexpr int16_t SETTING_BTLIST_Y = 129;
+static constexpr int16_t SETTING_BTLIST_ROUND = 30;
+static constexpr int16_t CONTAINER_BLANK_SIZE = 100;
+static constexpr int16_t LIST_WIDTH = 416;
+static constexpr int16_t SEARCH_BTN_Y = 271;
+static constexpr int16_t LIST_CONTENT_HEIGHT = 207;
+static constexpr int16_t SETTING_RESET_RESEARCH_OFFSE5T = 50;
+static constexpr int16_t SETTING_RESETTESEARCH_OFFSE5T = 80;
+static constexpr int16_t SETTING_CONTENT_OFFSE5T_SEARCH = 85;
+static constexpr int16_t SETTING_CONTENT_OFFSE5T_NOSEARCH = 200;
+static constexpr char *RESEARCH_BUTTON = "researchButton";
+static constexpr char *OPTION_LIST = "optionList";
+static constexpr char *BT_LIST = "btList";
+
+std::vector<IconTextNavigationItemData> g_bluetoothOptionData = {
+ {SettingPageId::CONNECT_NEW_PHONE_PAGE, IMAGE_PHONE, "连接新手机",
+ nullptr, true, SETTING_LIST_ABOUT_BG_COLOR, SETTING_LIST_ABOUT_BG_COLOR_OPA},
+ {SettingPageId::QRCODE_CONN_PAGE, IMAGE_QCODE, "二维码连接",
+ nullptr, true, SETTING_LIST_ABOUT_BG_COLOR, SETTING_LIST_ABOUT_BG_COLOR_OPA}};
+
+const int g_imageAnimator[SEARCH_IMAGE_COUNT] = {
+ IMAGE_Y3_1,
+ IMAGE_Y3_2,
+ IMAGE_Y3_3,
+ IMAGE_Y3_4,
+ IMAGE_Y3_5,
+ IMAGE_Y3_6,
+ IMAGE_Y3_7,
+ IMAGE_Y3_8,
+ IMAGE_Y3_9,
+ IMAGE_Y3_10,
+ IMAGE_Y3_11,
+ IMAGE_Y3_12,
+ IMAGE_Y3_13,
+ IMAGE_Y3_14,
+ IMAGE_Y3_15,
+ IMAGE_Y3_16,
+ IMAGE_Y3_17,
+ IMAGE_Y3_18,
+ IMAGE_Y3_19,
+ IMAGE_Y3_20,
+ IMAGE_Y3_21,
+ IMAGE_Y3_22,
+ IMAGE_Y3_23,
+ IMAGE_Y3_24,
+ IMAGE_Y3_25,
+ IMAGE_Y3_26,
+ IMAGE_Y3_27,
+ IMAGE_Y3_28,
+ IMAGE_Y3_29,
+ IMAGE_Y3_30,
+ IMAGE_Y3_31,
+};
+
+SettingBluetoothPage::SettingBluetoothPage()
+{
+ g_pSettingBluetoothPage = this;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::SettingBluetoothPage");
+}
+
+SettingBluetoothPage::~SettingBluetoothPage()
+{
+ bool ret = is_bt_discovering(BT_TRANSPORT_BR_EDR);
+ if (ret) {
+ bool results = gap_br_cancel_discovery();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtScan CancelBtDiscovery results %d", results);
+ }
+ BtAnimatorStop();
+ DestoryPageView();
+ g_pSettingBluetoothPage = nullptr;
+ SettingBluetoothModel::GetInstance()->SetConnectFragmentStatus(false);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::~SettingBluetoothPage");
+}
+
+void SettingBluetoothPage::InitContentList()
+{
+ optionList_->ClearAll();
+ for (auto& it : g_bluetoothOptionData) {
+ Contents cont;
+ cont.createFunc = SettingBluetoothPage::CreateForContent;
+ cont.updateFunc = SettingBluetoothPage::UpdateForContent;
+ cont.type = SettingUnionItemType::ICON_TEXT_NAVIGATION;
+ cont.data = ⁢
+ optionList_->AddContent(cont);
+ }
+ optionList_->RefreshList();
+}
+
+SettingBluetoothPage* SettingBluetoothPage::GetInstance()
+{
+ return g_pSettingBluetoothPage;
+}
+
+void SettingBluetoothPage::SetScanStatus(bool value)
+{
+ scanStart_ = value;
+}
+
+bool SettingBluetoothPage::GetScanStatus()
+{
+ return scanStart_;
+}
+
+void SettingBluetoothPage::OnStart(void *data)
+{
+ InitPageView();
+ InitImageAnimator();
+ if (SettingBluetoothModel::GetInstance()->GetScansDevicesList().size() != 0) {
+ SettingBluetoothModel::GetInstance()->MoveMatchingDeviceToFront();
+ LoadFindDeviceList();
+ }
+ BtScan();
+ InitContentList();
+ AddViewToPageContainer(scroll_);
+ AddViewToPageContainer(connectNewPhoneFragment_->GetFragmentView());
+ AddViewToPageContainer(connectOpenFragment_->GetFragmentView());
+ AddViewToPageContainer(reconnectionFragment_->GetFragmentView());
+ AddViewToPageContainer(secondConfirmFragment_->GetFragmentView());
+ AddViewToPageContainer(unPairFragment_->GetFragmentView());
+ AddViewToPageContainer(successFragment_->GetFragmentView());
+ AddViewToPageContainer(failFragment_->GetFragmentView());
+}
+
+void SettingBluetoothPage::InitPageView()
+{
+ scroll_ = new UIScrollViewNested();
+ if (scroll_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::scroll_ new fail");
+ return;
+ }
+ scroll_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+ scroll_->SetVerticalScrollState(true);
+ scroll_->SetYScrollBarVisible(true);
+ scroll_->SetOnDragListener(this);
+ scroll_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);
+
+ connectNewPhoneFragment_ = new SettingConnectNewPhone();
+ connectNewPhoneFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ connectNewPhoneFragment_->CreateView();
+ if (connectNewPhoneFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::successFragment_ new fail");
+ return;
+ }
+ connectNewPhoneFragment_->GetFragmentView()->SetVisible(false);
+
+ connectOpenFragment_ = new SettingConnectionOpen();
+ connectOpenFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ connectOpenFragment_->CreateView();
+ if (connectOpenFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::connectOpenFragment_ new fail");
+ return;
+ }
+ connectOpenFragment_->GetFragmentView()->SetVisible(false);
+
+ reconnectionFragment_ = new SettingReconnection();
+ reconnectionFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ reconnectionFragment_->CreateView();
+ if (reconnectionFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::reconnectionFragment_ new fail");
+ return;
+ }
+ reconnectionFragment_->GetFragmentView()->SetVisible(false);
+
+ secondConfirmFragment_ = new SettingReconnectSecondConfirm();
+ secondConfirmFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ secondConfirmFragment_->CreateView();
+ if (secondConfirmFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::secondConfirmFragment_ new fail");
+ return;
+ }
+ secondConfirmFragment_->GetFragmentView()->SetVisible(false);
+
+ unPairFragment_ = new UnPairSecondConfirm();
+ unPairFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ unPairFragment_->CreateView();
+ if (unPairFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::unPairFragment_ new fail");
+ return;
+ }
+ unPairFragment_->GetFragmentView()->SetVisible(false);
+
+ successFragment_ = new SettingConnectBlueSuccess();
+ successFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ successFragment_->CreateView();
+ if (successFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::successFragment_ new fail");
+ return;
+ }
+ successFragment_->GetFragmentView()->SetVisible(false);
+
+ failFragment_ = new SettingConnectBlueFail();
+ failFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ failFragment_->CreateView();
+
+ if (failFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::failFragment_ new fail");
+ return;
+ }
+ failFragment_->GetFragmentView()->SetVisible(false);
+
+ titleLabel_ = new UILabel();
+ if (titleLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::titleLabel_ new fail");
+ return;
+ }
+ titleLabel_->SetPosition(0, SETTING_TITLE_Y, RESOLUTION_WIDTH, SETTING_TITLE_HEIGHT);
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_TITLE_FONT);
+ titleLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ titleLabel_->SetText("蓝牙");
+
+ availableDeviceLabel_ = new UILabel();
+ if (availableDeviceLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::availableDeviceLabel_ new fail");
+ return;
+ }
+ availableDeviceLabel_->SetPosition(0, SETTING_AVILABLE_Y, RESOLUTION_WIDTH, SETTING_AVILABLE_HEIGHT);
+ availableDeviceLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ availableDeviceLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_AVILABLE_FONT);
+ availableDeviceLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ availableDeviceLabel_->SetText("可用设备");
+
+ // 根据list数量下移
+ searchBtnTextLabel_ = new UILabel();
+ if (searchBtnTextLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::searchBtnTextLabel_ new fail");
+ return;
+ }
+ searchBtnTextLabel_->SetPosition(0, SEARCH_BTN_Y, RESOLUTION_WIDTH, SETTING_SEATCHBTN_HEIGHT);
+ searchBtnTextLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ searchBtnTextLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SEATCHBTN_FONT);
+ searchBtnTextLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ searchBtnTextLabel_->SetText("正在搜索...");
+ searchBtnTextLabel_->SetVisible(true);
+
+ noDeviceLabel_ = new UILabel();
+ if (noDeviceLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::noDeviceLabel_ new fail");
+ return;
+ }
+ noDeviceLabel_->SetPosition(0, SETTING_NODEVICE_Y, RESOLUTION_WIDTH, SETTING_SEATCHBTN_HEIGHT);
+ noDeviceLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ noDeviceLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_NODEVICE_FONT);
+ noDeviceLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ noDeviceLabel_->SetText("未发现附近有可用设备");
+ noDeviceLabel_->SetVisible(false);
+
+ resetResearchButton_ = new UILabelButton();
+ if (resetResearchButton_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::resetResearchButton_ new fail");
+ return;
+ }
+ resetResearchButton_->SetPosition(SETTING_RESEARCH_X, SETTING_RESEARCH_Y, SETTING_RESEARCH_WIDTH,
+ SETTING_RESEARCH_HEIGHT);
+ resetResearchButton_->SetAlign(TEXT_ALIGNMENT_CENTER);
+ resetResearchButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_AVILABLE_FONT);
+ resetResearchButton_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ resetResearchButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
+ resetResearchButton_->SetText("重新搜索");
+ resetResearchButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);
+ resetResearchButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);
+ resetResearchButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);
+ resetResearchButton_->SetViewId(RESEARCH_BUTTON);
+ resetResearchButton_->SetOnClickListener(this);
+ resetResearchButton_->SetVisible(false);
+
+ optionList_ = new UISimpleList();
+ if (optionList_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::optionList_ new fail");
+ return;
+ }
+ optionList_->SetPosition(SETTING_LIST_POSITION_X, SETTING_LIST_POSITION_Y);
+ optionList_->Resize(LIST_WIDTH, LIST_CONTENT_HEIGHT);
+ optionList_->SetDraggable(false);
+ optionList_->SetScrollBlankSize(0);
+ optionList_->SetMaxScrollDistance(0);
+ optionList_->SetViewId(OPTION_LIST);
+
+ btEarPhoneList_ = new UISimpleList();
+ if (btEarPhoneList_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitPageView::btEarPhoneList_ new fail");
+ return;
+ }
+ btEarPhoneList_->SetPosition(SETTING_LIST_POSITION_X, SETTING_NODEVICE_Y);
+ btEarPhoneList_->SetScrollBlankSize(0);
+ btEarPhoneList_->SetMaxScrollDistance(0);
+ btEarPhoneList_->SetVisible(true);
+ btEarPhoneList_->SetViewId(BT_LIST);
+
+ scroll_->Add(titleLabel_);
+ scroll_->Add(availableDeviceLabel_);
+ scroll_->Add(searchBtnTextLabel_);
+ scroll_->Add(optionList_);
+ scroll_->Add(resetResearchButton_);
+ scroll_->Add(noDeviceLabel_);
+ scroll_->Add(btEarPhoneList_);
+}
+
+void SettingBluetoothPage::LoadFindDeviceList()
+{
+ std::list<BtCaseInfo> &bluetoothCaseList = SettingBluetoothModel::GetInstance()->GetScansDevicesList();
+ btEarPhoneList_->ClearAll();
+ for (auto& it : bluetoothCaseList) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadFindDeviceList addr: %02x%02x%02x%02x%02x%02x",
+ it.addr[SETTING_ADDR5], it.addr[SETTING_ADDR4], it.addr[SETTING_ADDR3],
+ it.addr[SETTING_ADDR2], it.addr[1], it.addr[0]);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadFindDeviceList connect_status:%s", it.connect_status.c_str());
+ Contents cont;
+ cont.createFunc = SettingBluetoothPage::CreateForBtList;
+ cont.updateFunc = SettingBluetoothPage::UpdateForBtList;
+ cont.type = 1;
+ cont.data = ⁢
+ btEarPhoneList_->AddContent(cont);
+ }
+ btEarPhoneList_->Resize(SETTING_BTLIST_X, SETTING_BTLIST_Y * bluetoothCaseList.size());
+ btEarPhoneList_->SetDraggable(false);
+ btEarPhoneList_->EnableAutoAlign(true);
+ btEarPhoneList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+ btEarPhoneList_->RefreshList();
+ UpdataImageAnimatorAndList();
+ scroll_->Invalidate();
+}
+
+void SettingBluetoothPage::InitImageAnimator()
+{
+ imageAnimator_ = new UIImageAnimatorView();
+ if (imageAnimator_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::InitImageAnimator::imageAnimator_ new fail");
+ return;
+ }
+
+ imageAnimator_->SetPosition(SETTING_IMGANI_X, SETTING_IMGANI_Y, SETTING_IMGANI_HEIGHT, SETTING_IMGANI_HEIGHT);
+ for (uint8_t i = 0; i < SEARCH_IMAGE_COUNT; i++) {
+ searchImageInfo_[i].imageInfo =
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimator[i], SETTING_IMAGE);
+ searchImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;
+ searchImageInfo_[i].pos.x = SETTING_IMGANI_X;
+ searchImageInfo_[i].pos.y = SETTING_IMGANI_Y;
+ searchImageInfo_[i].width = SETTING_IMGANI_HEIGHT;
+ searchImageInfo_[i].height = SETTING_IMGANI_HEIGHT;
+ }
+ imageAnimator_->SetImageAnimatorSrc(searchImageInfo_, SEARCH_IMAGE_COUNT, SETTING_IMGANI_UPDATE);
+ imageAnimator_->SetRepeat(true);
+ imageAnimator_->SetAutoEnable(false);
+ imageAnimator_->SetResizeMode(UIImageView::FILL);
+ imageAnimator_->SetVisible(true);
+ imageAnimator_->SetSizeFixed(true);
+ scroll_->Add(imageAnimator_);
+}
+
+void SettingBluetoothPage::UpdataImageAnimatorAndList()
+{
+ int16_t imageAnimatorPosY = btEarPhoneList_->GetY() +
+ ((SettingBluetoothModel::GetInstance()->GetScansDevicesList().size()) * SETTING_ITEM_HEIGHT_);
+ imageAnimator_->SetPosition(SETTING_IMGANI_X, imageAnimatorPosY, SETTING_IMGANI_HEIGHT, SETTING_IMGANI_HEIGHT);
+ for (uint8_t i = 0; i < SEARCH_IMAGE_COUNT; i++) {
+ searchImageInfo_[i].imageInfo =
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimator[i], SETTING_IMAGE);
+ searchImageInfo_[i].imageType = IMG_SRC_IMAGE_INFO;
+ searchImageInfo_[i].pos.x = SETTING_IMGANI_X;
+ searchImageInfo_[i].pos.y = imageAnimatorPosY;
+ searchImageInfo_[i].width = SETTING_IMGANI_HEIGHT;
+ searchImageInfo_[i].height = SETTING_IMGANI_HEIGHT;
+ }
+ imageAnimator_->SetImageAnimatorSrc(searchImageInfo_, SEARCH_IMAGE_COUNT, SETTING_IMGANI_UPDATE);
+ imageAnimator_->SetRepeat(true);
+ imageAnimator_->SetAutoEnable(false);
+ imageAnimator_->SetResizeMode(UIImageView::FILL);
+ imageAnimator_->SetSizeFixed(true);
+ imageAnimator_->Invalidate();
+ imageAnimator_->Start();
+ searchBtnTextLabel_->SetPosition(0, imageAnimator_->GetY() + SETTING_IMGANI_HEIGHT);
+ resetResearchButton_->SetPosition(SETTING_RESEARCH_X, imageAnimator_->GetY() + SETTING_RESETTESEARCH_OFFSE5T);
+ optionList_->SetPosition(SETTING_LIST_POSITION_X, imageAnimator_->GetY() + SETTING_CONTENT_OFFSE5T_NOSEARCH);
+ scroll_->Invalidate();
+}
+
+void SettingBluetoothPage::BtAnimatorStart(void)
+{
+ imageAnimator_->Start();
+}
+
+void SettingBluetoothPage::BtAnimatorStop(void)
+{
+ imageAnimator_->Stop();
+}
+
+void SettingBluetoothPage::NotFindDevice()
+{
+ BtAnimatorStop();
+ searchBtnTextLabel_->SetVisible(false);
+ imageAnimator_->SetVisible(false);
+ noDeviceLabel_->SetVisible(true);
+ resetResearchButton_->SetVisible(true);
+ scroll_->Invalidate();
+}
+
+void SettingBluetoothPage::TimerFindDevice()
+{
+ BtAnimatorStop();
+ searchBtnTextLabel_->SetVisible(false);
+ imageAnimator_->SetVisible(false);
+ noDeviceLabel_->SetVisible(false);
+ resetResearchButton_->SetVisible(true);
+ scroll_->Invalidate();
+}
+
+void SettingCancelBrScanHandle(void)
+{
+ if (g_settingStopScanHandle != nullptr) {
+ g_settingStopScanHandle->Stop();
+ delete g_settingStopScanHandle;
+ g_settingStopScanHandle = nullptr;
+ }
+ bool results = gap_br_cancel_discovery();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingCancelBrScanHandle CancelBtDiscovery results %d", results);
+}
+
+void SettingEndScanHandle(void)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+ "SettingBluetoothModel::GetInstance()->GetScansDevicesList().size() results %d",
+ SettingBluetoothModel::GetInstance()->GetScansDevicesList().size());
+ SettingBluetoothPage* bluetoothPage = SettingBluetoothPage::GetInstance();
+ if (bluetoothPage == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bluetoothPage nullptr");
+ return;
+ }
+ if (SettingBluetoothModel::GetInstance()->GetScansDevicesList().size() > 0) {
+ bluetoothPage->TimerFindDevice();
+ } else {
+ // 未发现蓝牙耳机
+ bluetoothPage->NotFindDevice();
+ }
+}
+
+// 定时器回调函数
+static void SettingBluetoothScanTimerCallbackProc(void* data)
+{
+ (void)data;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Bt scan end jumpView");
+ SettingCancelBrScanHandle();
+ SettingEndScanHandle();
+}
+
+void SettingBluetoothScanTimerCallback(void* data)
+{
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(SettingBluetoothScanTimerCallbackProc, data));
+}
+
+void SettingBluetoothPage::BtScan()
+{
+ bool ret;
+ bool results;
+ SetScanStatus(true);
+ BtAnimatorStart();
+ ret = is_bt_discovering(BT_TRANSPORT_BR_EDR);
+ if (ret) {
+ results = gap_br_cancel_discovery();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtScan CancelBtDiscovery results %d", results);
+ }
+
+ results = gap_br_set_inquiry_paramters(DEVICE_MAJOR_CLASS_AUDIO_VIDEO, 0);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+ "SettingBluetoothPage gap_br_set_inquiry_paramters results %d", results);
+ results = gap_br_start_discovery();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+ "SettingBluetoothPage gap_br_start_discovery results %d", results);
+ if (g_settingStopScanHandle != nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothEarPhoneView::BtScan g_settingStopScanHandle != nullptr");
+ return;
+ }
+ uint32_t tick = GetOSTick(SCAN_TIME);
+ g_settingStopScanHandle = new GraphicTimer(tick, SettingBluetoothScanTimerCallback, nullptr, true);
+ if (g_settingStopScanHandle == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothEarPhoneView::BtScan new GraphicTimer failed!!");
+ return;
+ }
+ bool retTimer = g_settingStopScanHandle->Start();
+ if (!retTimer) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothEarPhoneView::BtScan Start failed");
+ if (g_settingStopScanHandle != nullptr) {
+ delete g_settingStopScanHandle;
+ g_settingStopScanHandle = nullptr;
+ }
+ return;
+ }
+ return;
+}
+
+void SettingBluetoothPage::StopBtScan()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothEarPhoneView::StopBtScan");
+ if (imageAnimator_->GetState() == true) {
+ SettingCancelBrScanHandle();
+ SettingEndScanHandle();
+ }
+}
+
+void SettingBluetoothPage::DestoryPageView()
+{
+ if (scroll_ != nullptr) {
+ scroll_->RemoveAll();
+ delete scroll_;
+ scroll_ = nullptr;
+ }
+ if (connectNewPhoneFragment_ != nullptr) {
+ connectNewPhoneFragment_->DestroyView();
+ delete connectNewPhoneFragment_;
+ connectNewPhoneFragment_ = nullptr;
+ }
+ if (connectOpenFragment_ != nullptr) {
+ connectOpenFragment_->DestroyView();
+ delete connectOpenFragment_;
+ connectOpenFragment_ = nullptr;
+ }
+ if (reconnectionFragment_ != nullptr) {
+ reconnectionFragment_->DestroyView();
+ delete reconnectionFragment_;
+ reconnectionFragment_ = nullptr;
+ }
+ if (secondConfirmFragment_ != nullptr) {
+ secondConfirmFragment_->DestroyView();
+ delete secondConfirmFragment_;
+ secondConfirmFragment_ = nullptr;
+ }
+ if (unPairFragment_ != nullptr) {
+ unPairFragment_->DestroyView();
+ delete unPairFragment_;
+ unPairFragment_ = nullptr;
+ }
+ if (successFragment_ != nullptr) {
+ successFragment_->DestroyView();
+ delete successFragment_;
+ successFragment_ = nullptr;
+ }
+ if (failFragment_ != nullptr) {
+ failFragment_->DestroyView();
+ delete failFragment_;
+ failFragment_ = nullptr;
+ }
+ if (optionList_ != nullptr) {
+ delete optionList_;
+ optionList_ = nullptr;
+ }
+ if (btEarPhoneList_ != nullptr) {
+ delete btEarPhoneList_;
+ btEarPhoneList_ = nullptr;
+ }
+ if (titleLabel_ != nullptr) {
+ delete titleLabel_;
+ titleLabel_ = nullptr;
+ }
+ if (noDeviceLabel_ != nullptr) {
+ delete noDeviceLabel_;
+ noDeviceLabel_ = nullptr;
+ }
+ if (searchBtnTextLabel_ != nullptr) {
+ delete searchBtnTextLabel_;
+ searchBtnTextLabel_ = nullptr;
+ }
+ if (resetResearchButton_ != nullptr) {
+ delete resetResearchButton_;
+ resetResearchButton_ = nullptr;
+ }
+ if (availableDeviceLabel_ != nullptr) {
+ delete availableDeviceLabel_;
+ availableDeviceLabel_ = nullptr;
+ }
+ if (imageAnimator_ != nullptr) {
+ delete imageAnimator_;
+ imageAnimator_ = nullptr;
+ }
+}
+
+UIView* SettingBluetoothPage::CreateForContent(uint8_t type)
+{
+ if (type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {
+ IconTextNavigationItemView* item = new IconTextNavigationItemView();
+ if (item == nullptr) {
+ return nullptr;
+ }
+ item->SetOnClickListener(g_pSettingBluetoothPage);
+ return item;
+ }
+ return nullptr;
+}
+
+void SettingBluetoothPage::UpdateForContent(UIView* view, void* data, uint8_t type)
+{
+ UNUSED(type);
+ IconTextNavigationItemView* itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);
+ if (itemGroup == nullptr || data == nullptr) {
+ return;
+ }
+ IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);
+ itemGroup->UpdateViewData(itemData);
+}
+
+UIView* SettingBluetoothPage::CreateForBtList(uint8_t type)
+{
+ UNUSED(type);
+ return new SettingBluetoothItemGroup();
+}
+
+void SettingBluetoothPage::UpdateForBtList(UIView* view, void* data, uint8_t type)
+{
+ if (view == nullptr || data == nullptr) {
+ return;
+ }
+ SettingBluetoothItemGroup* itemGroup = dynamic_cast<SettingBluetoothItemGroup*>(view);
+ if (itemGroup == nullptr) {
+ return;
+ }
+ BtCaseInfo* caseInfo = static_cast<BtCaseInfo*>(data);
+ itemGroup->SetItemInfo(caseInfo);
+ itemGroup->SetOnClickListener(g_pSettingBluetoothPage);
+}
+
+void SettingBluetoothPage::UpdateBtListContent(int16_t viewIndex)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateBtListContent");
+ std::string deviceName = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ SettingBluetoothModel::GetInstance()->UpdateConnectStatusForDevice();
+ std::list<BtCaseInfo> bluetoothCaseList = SettingBluetoothModel::GetInstance()->GetScansDevicesList();
+ for (auto& it : bluetoothCaseList) {
+ if (std::strcmp(reinterpret_cast<const char*>(it.deviceName), deviceName.c_str()) == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateBtListContent addr: %02x%02x%02x%02x%02x%02x",
+ it.addr[SETTING_ADDR5], it.addr[SETTING_ADDR4], it.addr[SETTING_ADDR3],
+ it.addr[SETTING_ADDR2], it.addr[1], it.addr[0]);
+ Contents cont;
+ cont.createFunc = SettingBluetoothPage::CreateForBtList;
+ cont.updateFunc = SettingBluetoothPage::UpdateForBtList;
+ cont.type = 1;
+ cont.data = ⁢
+ btEarPhoneList_->UpdateContent(viewIndex, cont);
+ break;
+ }
+ }
+ btEarPhoneList_->RefreshList();
+}
+
+bool SettingBluetoothPage::IsDeviceConnect()
+{
+ std::list<BtCaseInfo> bluetoothCaseList = SettingBluetoothModel::GetInstance()->GetScansDevicesList();
+ for (auto& it : bluetoothCaseList) {
+ if (it.connect_status == "已连接") {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool SettingBluetoothPage::GetImageAnimatorState()
+{
+ return imageAnimator_->GetState();
+}
+
+void SettingBluetoothPage::ChangeView(int16_t value)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeView value: %d", value);
+ if (value == BT_MAIN_PAGE) {
+ scroll_->SetVisible(true);
+ } else if (value == CONNECT_OPEN_FRAGMENT) {
+ connectOpenFragment_->RefreshFragment();
+ SettingBluetoothModel::GetInstance()->SetConnectFragmentStatus(true);
+ connectOpenFragment_->GetFragmentView()->SetVisible(true);
+ } else if (value == RECONNECT_SECOND_CONFIRM_FRAGMENT) {
+ secondConfirmFragment_->RefreshFragment();
+ secondConfirmFragment_->GetFragmentView()->SetVisible(true);
+ } else if (value == UNPAIR_CONFIRM_FRAGMENT) {
+ unPairFragment_->RefreshFragment();
+ unPairFragment_->GetFragmentView()->SetVisible(true);
+ }
+ if (imageAnimator_->GetState() == false) {
+ StartBtScan();
+ }
+}
+
+void SettingBluetoothPage::ShowResultGroup(int16_t value)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowResultGroup value: %d", value);
+ StopBtScan();
+ if (value == CONNECT_BLUETOOTH_FAIL_FRAGMENT) {
+ failFragment_->RefreshFragment();
+ failFragment_->GetFragmentView()->SetVisible(true);
+ } else if (value == CONNECT_BLUETOOTH_SUCCESS_FRAGMENT) {
+ successFragment_->RefreshFragment();
+ successFragment_->GetFragmentView()->SetVisible(true);
+ }
+}
+
+void SettingBluetoothPage::StartBtScan()
+{
+ imageAnimator_->SetVisible(true);
+ searchBtnTextLabel_->SetVisible(true);
+ noDeviceLabel_->SetVisible(false);
+ resetResearchButton_->SetVisible(false);
+ optionList_->SetPosition(SETTING_LIST_POSITION_X,
+ searchBtnTextLabel_->GetY() + SETTING_CONTENT_OFFSE5T_SEARCH);
+ BtScan();
+}
+
+bool SettingBluetoothPage::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ if (strcmp(view.GetViewId(), RESEARCH_BUTTON) == 0) {
+ StartBtScan();
+ } else if (strcmp(view.GetParent()->GetViewId(), OPTION_LIST) == 0) {
+ int16_t viewIndex = view.GetViewIndex();
+ if (viewIndex < 0 || viewIndex >= g_bluetoothOptionData.size()) {
+ return true;
+ }
+ IconTextNavigationItemData itemData = g_bluetoothOptionData[viewIndex];
+ if (itemData.pageId == SettingPageId::CONNECT_NEW_PHONE_PAGE) {
+ StopBtScan();
+ scroll_->SetVisible(false);
+ connectNewPhoneFragment_->GetFragmentView()->SetVisible(true);
+ } else {
+ NativeAbility::GetInstance().SwitchPageInSlice(itemData.pageId,
+ TransitionType::TRANSITION_INVALID, true);
+ }
+ } else if (strcmp(view.GetParent()->GetViewId(), BT_LIST) == 0) {
+ // 点击搜索到的设备进行连接
+ SettingBluetoothItemGroup *listItemViewID = dynamic_cast<SettingBluetoothItemGroup *>(&view);
+ BtCaseInfo item = listItemViewID->GetItem();
+ SettingBluetoothModel::GetInstance()->SetSelectedDeviceInfo(&item);
+ std::string connState = item.connect_status;
+ bd_addr_t addr;
+ bool flag_connect = IsDeviceConnect();
+ // 当前设备为已连接 或没有设备被连接时 才会处理点击事件
+ if ((connState == "已连接") || (!flag_connect)) {
+ SettingBluetoothModel::GetInstance()->SetDeviceName(reinterpret_cast<const char*>(item.deviceName));
+ (void)memcpy_s(addr.addr, BD_ADDR_LEN, item.addr, BD_ADDR_LEN);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingBluetoothPage::OnClick addr: %02x%02x%02x%02x%02x%02x",
+ addr.addr[SETTING_ADDR5], addr.addr[SETTING_ADDR4], addr.addr[SETTING_ADDR3],
+ addr.addr[SETTING_ADDR2], addr.addr[1], addr.addr[0]);
+ if (connState == "") {
+ errcode_t retVal = SettingBluetoothModel::GetInstance()->ConnectRemoteDevice(&addr);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice ret = %d", retVal);
+ if (retVal != 0) {
+ UpdateBtListContent(view.GetViewIndex());
+ SettingBluetoothModel::GetInstance()->SetConnectResultPage(true);
+ }
+ } else if (connState == "已连接" || connState == "连接已经断开") {
+ StopBtScan();
+ scroll_->SetVisible(false);
+ reconnectionFragment_->RefreshFragment();
+ reconnectionFragment_->GetFragmentView()->SetVisible(true);
+ }
+ }
+ }
+ scroll_->Invalidate();
+ return true;
+}
+}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardAddPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/page/SettingCardAddPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::CARD_ADD_PAGE, SettingCardAddPage, false);\r
+\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_Y = 125;\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_HEIGHT = 397;\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_DISTANCE = 1000;\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_BLANK = 40;\r
+static constexpr int16_t SETTING_CARD_ADD_LIST_SELECTPOS = HORIZONTAL_RESOLUTION / 4;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_X = 100;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_CARD_ADD_TITLE_FSIZE = 38;\r
+static const char* SETTING_CARD_ADD_TITLE_TEXT = "添加卡片";\r
+\r
+void SettingCardAddPage::OnStart(void* data)\r
+{\r
+ list_ = new UISimpleList();\r
+ if (list_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardAddPage::OnStart list_ new fail");\r
+ return;\r
+ }\r
+ list_->SetDirection(UIAbstractScroll::HORIZONTAL);\r
+ list_->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);\r
+ list_->SetPosition(0, SETTING_CARD_ADD_LIST_Y, HORIZONTAL_RESOLUTION, SETTING_CARD_ADD_LIST_HEIGHT);\r
+ list_->SetScrollBlankSize(SETTING_CARD_ADD_LIST_BLANK);\r
+ list_->SetSelectPosition(SETTING_CARD_ADD_LIST_SELECTPOS);\r
+ list_->SetMaxScrollDistance(SETTING_CARD_ADD_LIST_DISTANCE);\r
+ list_->SetDraggable(true);\r
+ list_->SetThrowDrag(true);\r
+ list_->EnableAutoAlign(true);\r
+ list_->SetIntercept(false);\r
+\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardAddPage::OnStart title_ new fail");\r
+ return;\r
+ }\r
+ title_->SetPosition(SETTING_CARD_ADD_TITLE_X, SETTING_CARD_ADD_TITLE_Y);\r
+ title_->Resize(SETTING_CARD_ADD_TITLE_WIDTH, SETTING_CARD_ADD_TITLE_HEIGHT);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_CARD_ADD_TITLE_FSIZE);\r
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title_->SetText(SETTING_CARD_ADD_TITLE_TEXT);\r
+\r
+ AddViewToPageContainer(list_);\r
+ AddViewToPageContainer(title_);\r
+}\r
+\r
+void SettingCardAddPage::OnResume()\r
+{\r
+ std::vector<SettingCardItemData>& cardData = SettingCardModel::GetInstance().GetCardData();\r
+ if (cardData.size() == 0) {\r
+ list_->SetVisible(false);\r
+ } else {\r
+ list_->ClearAll();\r
+ for(auto& it : cardData) {\r
+ it.contextPtr = this;\r
+\r
+ Contents cont;\r
+ cont.createFunc = SettingCardAddPage::OnSimpleListCreate;\r
+ cont.updateFunc = SettingCardAddPage::OnSimpleListUpdate;\r
+ cont.type = 0;\r
+ cont.data = ⁢\r
+ list_->AddContent(cont);\r
+ }\r
+ list_->SetVisible(true);\r
+ list_->RefreshList();\r
+ }\r
+}\r
+\r
+void SettingCardAddPage::OnStop()\r
+{\r
+ if (list_ != nullptr) {\r
+ delete list_;\r
+ list_ = nullptr;\r
+ }\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+}\r
+\r
+bool SettingCardAddPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ int16_t index = view.GetViewIndex();\r
+ std::vector<SettingCardItemData>& cardData = SettingCardModel::GetInstance().GetCardData();\r
+ SettingCardItemData& currData = cardData[index];\r
+\r
+ if (!currData.isSelect) {\r
+ SettingCardModel::GetInstance().AddCard(currData.index);\r
+ SettingCardModel::GetInstance().RefreshCardData();\r
+\r
+ if (cardData.size() == 0) {\r
+ list_->SetVisible(false);\r
+ }\r
+ list_->RefreshList();\r
+ }\r
+ return true;\r
+}\r
+\r
+UIView* SettingCardAddPage::OnSimpleListCreate(uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ return new SettingCardAddItemGroup();\r
+}\r
+\r
+void SettingCardAddPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SettingCardAddItemGroup* itemGroup = dynamic_cast<SettingCardAddItemGroup*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ SettingCardItemData* itemData = static_cast<SettingCardItemData*>(data);\r
+ SettingCardAddPage* page = static_cast<SettingCardAddPage*>(itemData->contextPtr);\r
+ itemGroup->UpdateItemGroup(itemData);\r
+ itemGroup->SetOnClickListener(page);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardEffecPage\r
+ * Create: 2025-04\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "NativeRegisterManager.h"\r
+#include "PageTransitionMgr.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "settings/SettingView.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/page/SettingCardEffectPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::CARD_EFFECT_PAGE, SettingCardEffecPage, false);\r
+static SettingCardEffecPage *g_pSettingCardEffecPage = nullptr;\r
+static constexpr uint8_t SETTINGS_ITEM_FONT_SIZE = 40;\r
+static constexpr int16_t SETTINGS_RESIZE_SIZE_WIDTH = HORIZONTAL_RESOLUTION;\r
+static constexpr int16_t SETTINGS_RESIZE_SIZE_HEIGHT = 60;\r
+static constexpr int16_t SETTING_TITLE_POSITION_X = 0;\r
+static constexpr int16_t SETTING_TITLE_POSITION_Y = 20;\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 0;\r
+static constexpr int16_t SETTING_LIST_POSITION_Y = 0;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 100;\r
+static constexpr int16 MAX_SCR_DIS = 454;\r
+static constexpr int16 SNUM_2 = 2;\r
+\r
+SettingCardEffecPage::SettingCardEffecPage()\r
+{\r
+ g_pSettingCardEffecPage = this;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingCardEffecPage::SettingCardEffecPage");\r
+}\r
+\r
+SettingCardEffecPage::~SettingCardEffecPage()\r
+{\r
+ g_pSettingCardEffecPage = nullptr;\r
+ if (titleText_ != nullptr) {\r
+ delete titleText_;\r
+ titleText_ = nullptr;\r
+ }\r
+\r
+ contentList_->ClearAll();\r
+ if (contentList_ != nullptr) {\r
+ delete contentList_;\r
+ contentList_ = nullptr;\r
+ }\r
+ effectListDatas_.clear();\r
+}\r
+\r
+void SettingCardEffecPage::OnStart(void* data)\r
+{\r
+ titleText_ = new UILabel();\r
+ if (titleText_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingCardEffecPage::OnStart::title is nullptr");\r
+ return;\r
+ }\r
+ titleText_->SetPosition(SETTING_TITLE_POSITION_X, SETTING_TITLE_POSITION_Y);\r
+ titleText_->Resize(SETTINGS_RESIZE_SIZE_WIDTH, SETTINGS_RESIZE_SIZE_HEIGHT);\r
+ titleText_->SetText("卡片动效");\r
+ titleText_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTINGS_ITEM_FONT_SIZE);\r
+ titleText_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleText_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ titleText_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ titleText_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ titleText_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ contentList_ = new UISimpleList();\r
+ if (contentList_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingCardEffecPage::OnStart::contentList_ is nullptr");\r
+ return;\r
+ }\r
+ contentList_->SetDirection(UIAbstractScroll::HORIZONTAL);\r
+ contentList_->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);\r
+ contentList_->SetPosition(SETTING_LIST_POSITION_X, SETTING_LIST_POSITION_Y);\r
+ contentList_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ contentList_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position\r
+ contentList_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::RIGHT);\r
+ contentList_->SetDraggable(true);\r
+ contentList_->SetThrowDrag(true);\r
+ contentList_->SetLoopState(false);\r
+ contentList_->EnableAutoAlign(true);\r
+ contentList_->SetScrollStateListener(this);\r
+ AddViewToPageContainer(contentList_);\r
+ AddViewToPageContainer(titleText_);\r
+\r
+ SettingCardModel::GetInstance().InitEffectItem();\r
+ SetCardEffectListData(SettingCardModel::GetInstance().GetEffectListItems());\r
+}\r
+\r
+bool SettingCardEffecPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ CardEffectID swipeId = CardEffectID::UI_INVALIDE;\r
+ SettingCardEffectItemGroup* setSwipeEffectView = dynamic_cast<SettingCardEffectItemGroup*>(&view);\r
+ if (setSwipeEffectView == nullptr) {\r
+ return false;\r
+ }\r
+ swipeId = setSwipeEffectView->GetViewId(event);\r
+ if (swipeId != CardEffectID::UI_INVALIDE) {\r
+ SettingCardModel::GetInstance().SetSwipeEffectStyle(swipeId);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+ }\r
+ return true;\r
+}\r
+\r
+void SettingCardEffecPage::OnItemSelected(int16 index, UIView* view)\r
+{\r
+ UNUSED(index);\r
+ if (view != nullptr) {\r
+ itemGroupSele_ = static_cast<SettingCardEffectItemGroup*>(view);\r
+ itemGroupSele_->SelectedChange();\r
+\r
+ if (preItemGroupSele_ != nullptr && preItemGroupSele_ != itemGroupSele_) {\r
+ preItemGroupSele_->Reset();\r
+ }\r
+ preItemGroupSele_ = itemGroupSele_;\r
+ }\r
+}\r
+\r
+UIView* SettingCardEffecPage::OnSimpleListCreate(uint8_t type)\r
+{\r
+ SettingCardEffectItemGroup* itemGroup = new SettingCardEffectItemGroup();\r
+ if (itemGroup == nullptr) {\r
+ return nullptr;\r
+ }\r
+ itemGroup->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ itemGroup->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ itemGroup->SetTouchable(true);\r
+ itemGroup->SetOnClickListener(g_pSettingCardEffecPage);\r
+ return itemGroup;\r
+}\r
+\r
+void SettingCardEffecPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SettingCardEffectItemGroup* itemGroup = dynamic_cast<SettingCardEffectItemGroup*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ CardEffectPair* content = static_cast<CardEffectPair*>(data);\r
+ itemGroup->SetItemInfo(content->first, content->second);\r
+}\r
+\r
+void SettingCardEffecPage::SetCardEffectListData(const std::map<CardEffectID, SettingCardEffectSample> &effectMap)\r
+{\r
+ contentList_->ClearAll();\r
+ uint16_t selectIndex = static_cast<uint16_t>(\r
+ SettingCardModel::GetInstance().GetSwipeEffectStyle()) / SNUM_2;\r
+ effectListDatas_.clear();\r
+ for (auto currentIt = effectMap.begin(); currentIt != effectMap.end(); ++currentIt) {\r
+ auto nextIt = std::next(currentIt);\r
+ CardEffectPair swipeEffectData;\r
+ swipeEffectData.first = currentIt->second;\r
+ if (nextIt != effectMap.end()) {\r
+ swipeEffectData.second = nextIt->second;\r
+ currentIt = nextIt;\r
+ } else {\r
+ SettingCardEffectSample sample;\r
+ swipeEffectData.second = sample;\r
+ }\r
+ effectListDatas_.push_back(swipeEffectData);\r
+ }\r
+ int index = 1;\r
+ for (auto currentIt = effectListDatas_.begin(); currentIt != effectListDatas_.end(); ++currentIt) {\r
+ Contents content;\r
+ content.createFunc = OnSimpleListCreate;\r
+ content.updateFunc = OnSimpleListUpdate;\r
+ content.type = index++;\r
+ content.data = reinterpret_cast<void *>(&*currentIt);\r
+ contentList_->AddContent(content);\r
+ }\r
+\r
+ contentList_->ScrollTo(selectIndex);\r
+ contentList_->ScrollBy(-SNUM_2);\r
+ contentList_->RefreshList();\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardMgrPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/page/SettingCardMgrPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::CARD_MGR_PAGE, SettingCardMgrPage, false);\r
+\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_X = 0;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_Y = 110;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_WIDTH = 454;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_HEIGHT = 245;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_BLANK = 40;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_SELECTPOS = HORIZONTAL_RESOLUTION / 2;\r
+static constexpr int16_t SETTING_CARD_MGR_LIST_DISTANCE = 1000;\r
+\r
+static constexpr int16_t SETTING_CARD_MGR_ADD_X = 184;\r
+static constexpr int16_t SETTING_CARD_MGR_ADD_Y = 16;\r
+static constexpr int16_t SETTING_CARD_MGR_ADD_WIDTH = 85;\r
+static constexpr int16_t SETTING_CARD_MGR_ADD_HEIGHT = 85;\r
+\r
+static constexpr int16_t SETTING_CARD_MGR_DEL_X = 179;\r
+static constexpr int16_t SETTING_CARD_MGR_DEL_Y = 354;\r
+static constexpr int16_t SETTING_CARD_MGR_DEL_WIDTH = 96;\r
+static constexpr int16_t SETTING_CARD_MGR_DEL_HEIGHT = 96;\r
+\r
+void SettingCardMgrPage::OnStart(void* data)\r
+{\r
+ InitListView();\r
+ InitButtonView();\r
+ AddViewToPageContainer(list_);\r
+ AddViewToPageContainer(addButton_);\r
+ AddViewToPageContainer(delButton_);\r
+}\r
+\r
+void SettingCardMgrPage::OnResume()\r
+{\r
+ std::vector<SettingCardItemData>& cardData = SettingCardModel::GetInstance().GetCardData();\r
+ list_->SetVisible(false);\r
+ list_->ClearAll();\r
+ for (auto& it : cardData) {\r
+ if (!it.isSelect) {\r
+ continue;\r
+ }\r
+ Contents cont;\r
+ cont.createFunc = SettingCardMgrPage::OnSimpleListCreate;\r
+ cont.updateFunc = SettingCardMgrPage::OnSimpleListUpdate;\r
+ cont.type = 0;\r
+ cont.data = ⁢\r
+ list_->AddContent(cont);\r
+ list_->SetVisible(true);\r
+ }\r
+ list_->RefreshList();\r
+}\r
+\r
+void SettingCardMgrPage::OnStop()\r
+{\r
+ if (list_ != nullptr) {\r
+ delete list_;\r
+ list_ = nullptr;\r
+ }\r
+ if (addButton_ != nullptr) {\r
+ delete addButton_;\r
+ addButton_ = nullptr;\r
+ }\r
+ if (delButton_ != nullptr) {\r
+ delete delButton_;\r
+ delButton_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_CARD_MGR_ADD, SETTING_IMAGE);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_CARD_MGR_DEL, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingCardMgrPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ if (strcmp(view.GetViewId(), "add") == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SettingPageId::CARD_ADD_PAGE,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ } else if (strcmp(view.GetViewId(), "del") == 0) {\r
+ uint16_t selectIndex = list_->GetSelectView()->GetViewIndex();\r
+ std::vector<SettingCardItemData>& cardData = SettingCardModel::GetInstance().GetCardData();\r
+\r
+ // 更新系统数据\r
+ SettingCardModel::GetInstance().DeleteCard(cardData[selectIndex].index);\r
+ SettingCardModel::GetInstance().RefreshCardData();\r
+\r
+ // 更新界面数据\r
+ list_->RemoveContent(selectIndex);\r
+ list_->SetVisible(false);\r
+ for (auto& it : cardData) {\r
+ if (it.isSelect) {\r
+ list_->SetVisible(true);\r
+ break;\r
+ }\r
+ }\r
+ list_->RefreshList();\r
+ }\r
+ return true;\r
+}\r
+\r
+void SettingCardMgrPage::InitListView()\r
+{\r
+ list_ = new UISimpleList();\r
+ if (list_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardMgrPage::InitListView list_ new fail");\r
+ return;\r
+ }\r
+ list_->SetDirection(UIAbstractScroll::HORIZONTAL);\r
+ list_->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);\r
+ list_->SetPosition(SETTING_CARD_MGR_LIST_X, SETTING_CARD_MGR_LIST_Y);\r
+ list_->Resize(SETTING_CARD_MGR_LIST_WIDTH, SETTING_CARD_MGR_LIST_HEIGHT);\r
+ list_->SetScrollBlankSize(SETTING_CARD_MGR_LIST_BLANK);\r
+ list_->SetSelectPosition(SETTING_CARD_MGR_LIST_SELECTPOS);\r
+ list_->SetMaxScrollDistance(SETTING_CARD_MGR_LIST_DISTANCE);\r
+ list_->SetDraggable(true);\r
+ list_->SetThrowDrag(true);\r
+ list_->EnableAutoAlign(true);\r
+ list_->SetIntercept(false);\r
+}\r
+\r
+void SettingCardMgrPage::InitButtonView()\r
+{\r
+ addButton_ = new UIButton();\r
+ if (addButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardMgrPage::InitButtonView addButton_ new fail");\r
+ return;\r
+ }\r
+ addButton_->SetPosition(SETTING_CARD_MGR_ADD_X, SETTING_CARD_MGR_ADD_Y);\r
+ addButton_->Resize(SETTING_CARD_MGR_ADD_WIDTH, SETTING_CARD_MGR_ADD_HEIGHT);\r
+ addButton_->SetViewId("add");\r
+ addButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ addButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ addButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+ ImageInfo* addImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CARD_MGR_ADD, SETTING_IMAGE);\r
+ addButton_->SetImageSrc(addImage, addImage);\r
+ addButton_->SetOnClickListener(this);\r
+\r
+ delButton_ = new UIButton();\r
+ if (delButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardMgrPage::InitButtonView delButton_ new fail");\r
+ return;\r
+ }\r
+ delButton_->SetPosition(SETTING_CARD_MGR_DEL_X, SETTING_CARD_MGR_DEL_Y);\r
+ delButton_->Resize(SETTING_CARD_MGR_DEL_WIDTH, SETTING_CARD_MGR_DEL_HEIGHT);\r
+ delButton_->SetViewId("del");\r
+ ImageInfo* delImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CARD_MGR_DEL, SETTING_IMAGE);\r
+ delButton_->SetImageSrc(delImage, delImage);\r
+ delButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ delButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ delButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+ delButton_->SetOnClickListener(this);\r
+}\r
+\r
+UIView* SettingCardMgrPage::OnSimpleListCreate(uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ return new SettingCardMgrItemGroup();\r
+}\r
+\r
+void SettingCardMgrPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SettingCardMgrItemGroup* itemGroup = dynamic_cast<SettingCardMgrItemGroup*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ SettingCardItemData* itemData = static_cast<SettingCardItemData*>(data);\r
+ itemGroup->UpdateItemGroup(itemData);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingCardPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingCardModel.h"\r
+#include "settings/page/SettingCardPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::CARD_PAGE, SettingCardPage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 30;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingCardPage *g_pSettingCardPage{nullptr};\r
+\r
+void SettingCardPage::OnStart(void* data)\r
+{\r
+ g_pSettingCardPage = this;\r
+ content_ = new UISimpleList();\r
+ if (content_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardPage::OnStart content_ new fail");\r
+ return;\r
+ }\r
+ content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+ content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+ content_->SetDraggable(true);\r
+ content_->SetThrowDrag(true);\r
+ content_->EnableAutoAlign(true);\r
+ content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+\r
+ scroll_ = new UIScrollViewNested();\r
+ if (scroll_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingCardPage::OnStart scroll_ new fail");\r
+ return;\r
+ }\r
+ scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ scroll_->SetThrowDrag(true);\r
+ scroll_->SetIntercept(true);\r
+ scroll_->Add(content_);\r
+ AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingCardPage::OnResume()\r
+{\r
+ content_->ClearAll();\r
+ for(auto& it : SettingCardModel::GetInstance().GetCardUnionData()) {\r
+ Contents cont;\r
+ cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+ cont.updateFunc = SettingCardPage::OnSimpleListUpdate;\r
+ cont.type = it.GetUnionItemType();\r
+ cont.data = ⁢\r
+ content_->AddContent(cont);\r
+ }\r
+ content_->RefreshList();\r
+}\r
+\r
+void SettingCardPage::OnStop()\r
+{\r
+ g_pSettingCardPage = nullptr;\r
+ if (scroll_ != nullptr) {\r
+ scroll_->RemoveAll();\r
+ delete scroll_;\r
+ scroll_ = nullptr;\r
+ }\r
+ if (content_ != nullptr) {\r
+ delete content_;\r
+ content_ = nullptr;\r
+ }\r
+}\r
+\r
+bool SettingCardPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+ if (viewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+ int16_t viewIndex = view.GetViewIndex();\r
+ auto& cardUnionData = SettingCardModel::GetInstance().GetCardUnionData();\r
+ if (viewIndex < 0 || viewIndex > cardUnionData.size()) {\r
+ return true;\r
+ }\r
+\r
+ SettingUnionItemData& itemData = cardUnionData[viewIndex];\r
+ if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+ NativeAbility::GetInstance().SwitchPageInSlice(data->pageId,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+void SettingCardPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+ PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+ IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingCardPage);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingCardPage);\r
+ }\r
+ return;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingConnectBlueFail
+ * Created: 2025-06-05
+ */
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "ui_resource_settings.h"
+#include "main/LoadImg.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingConnectBlueFail.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_IMG_X = 100;
+static constexpr int16_t SETTING_IMG_Y = -50;
+static constexpr int16_t SETTING_WATCH_Y = 180;
+static constexpr int16_t SETTING_WATCH_HEIGHT = 40;
+static constexpr int16_t SETTING_WATCH_FONT = 36;
+static constexpr int16_t SETTING_CONTENT_Y = 230;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_BTN_X = 65;
+static constexpr int16_t SETTING_BTN_Y = 359;
+static constexpr int16_t SETTING_BTN_WIDTH = 324;
+static constexpr int16_t SETTING_BTN_HEIGHT = 101;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+
+void SettingConnectBlueFail::OnCreateView(void* data)
+{
+ InitFailFragment();
+}
+
+void SettingConnectBlueFail::OnDestroyView()
+{
+ fragmentView_.RemoveAll();
+ if (img_ != nullptr) {
+ delete img_;
+ img_ = nullptr;
+ }
+ if (watchNameLabel_ != nullptr) {
+ delete watchNameLabel_;
+ watchNameLabel_ = nullptr;
+ }
+ if (connectStatusLabel_ != nullptr) {
+ delete connectStatusLabel_;
+ connectStatusLabel_ = nullptr;
+ }
+ if (confirmButton_ != nullptr) {
+ delete confirmButton_;
+ confirmButton_ = nullptr;
+ }
+}
+
+void SettingConnectBlueFail::InitFailFragment()
+{
+ fragmentView_.SetTouchable(true);
+ fragmentView_.SetDraggable(true);
+ fragmentView_.SetOnDragListener(this);
+ img_ = new UIImageView();
+ if (img_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitFailFragment img_ new fail");
+ return;
+ }
+ LOADIMG::LoadImageViewImg(img_, SETTING_IMAGE, IMAGE_SURPRISE);
+ img_->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);
+
+ watchNameLabel_ = new UILabel();
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitFailFragment watchNameLabel_ new fail");
+ return;
+ }
+ watchNameLabel_->SetPosition(0, SETTING_WATCH_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+ watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+ watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ watchNameLabel_->SetText(str.c_str());
+
+ connectStatusLabel_ = new UILabel();
+ if (connectStatusLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitFailFragment connectStatusLabel_ new fail");
+ return;
+ }
+ connectStatusLabel_->SetPosition(0, SETTING_CONTENT_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+ connectStatusLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ connectStatusLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+ connectStatusLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ connectStatusLabel_->SetText("连接失败,请稍后再试");
+
+ confirmButton_ = new UILabelButton();
+ if (confirmButton_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitFailFragment confirmButton_ new fail");
+ return;
+ }
+ LOADIMG::LoadBtnImage(confirmButton_, SETTING_IMAGE, IMAGE_OK_DOWN, IMAGE_OK_DOWN);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);
+ confirmButton_->SetPosition(SETTING_BTN_X, SETTING_BTN_Y, SETTING_BTN_WIDTH, SETTING_BTN_HEIGHT);
+ confirmButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ confirmButton_->SetAlign(TEXT_ALIGNMENT_CENTER);
+ confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
+ confirmButton_->SetViewId(CONFIRM_BUTTON);
+ confirmButton_->SetOnClickListener(this);
+ confirmButton_->SetVisible(true);
+
+ fragmentView_.Add(img_);
+ fragmentView_.Add(watchNameLabel_);
+ fragmentView_.Add(connectStatusLabel_);
+ fragmentView_.Add(confirmButton_);
+}
+
+void SettingConnectBlueFail::RefreshFragment()
+{
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+ return;
+ }
+ std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ watchNameLabel_->SetText(str.c_str());
+}
+
+bool SettingConnectBlueFail::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+ bool state = SettingBluetoothPage::GetInstance()->GetImageAnimatorState();
+ if (state == false) {
+ SettingBluetoothPage::GetInstance()->StartBtScan();
+ }
+ fragmentView_.SetVisible(false);
+ }
+ return true;
+}
+
+bool SettingConnectBlueFail::OnDragStart(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingConnectBlueFail::OnDrag(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingConnectBlueFail::OnDragEnd(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+}
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingConnectBlueSuccess
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "ui_resource_settings.h"
+#include "main/LoadImg.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingConnectBlueSuccess.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_IMG_X = 85;
+static constexpr int16_t SETTING_IMG_Y = -50;
+static constexpr int16_t SETTING_WATCH_Y = 180;
+static constexpr int16_t SETTING_WATCH_HEIGHT = 40;
+static constexpr int16_t SETTING_WATCH_FONT = 36;
+static constexpr int16_t SETTING_BTN_FONT = 40;
+static constexpr int16_t SETTING_CONTENT_Y = 230;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_BTN_X = 65;
+static constexpr int16_t SETTING_BTN_Y = 359;
+static constexpr int16_t SETTING_BTN_WIDTH = 324;
+static constexpr int16_t SETTING_BTN_HEIGHT = 101;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+
+void SettingConnectBlueSuccess::OnCreateView(void* data)
+{
+ InitSuccessFragment();
+}
+
+void SettingConnectBlueSuccess::OnDestroyView()
+{
+ fragmentView_.RemoveAll();
+ if (img_ != nullptr) {
+ delete img_;
+ img_ = nullptr;
+ }
+ if (watchNameLabel_ != nullptr) {
+ delete watchNameLabel_;
+ watchNameLabel_ = nullptr;
+ }
+ if (connectStatusLabel_ != nullptr) {
+ delete connectStatusLabel_;
+ connectStatusLabel_ = nullptr;
+ }
+ if (confirmButton_ != nullptr) {
+ delete confirmButton_;
+ confirmButton_ = nullptr;
+ }
+}
+
+void SettingConnectBlueSuccess::InitSuccessFragment()
+{
+ fragmentView_.SetTouchable(true);
+ fragmentView_.SetDraggable(true);
+ fragmentView_.SetOnDragListener(this);
+ img_ = new UIImageView();
+ if (img_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSuccessFragment img_ new fail");
+ return;
+ }
+ LOADIMG::LoadImageViewImg(img_, SETTING_IMAGE, IMAGE_OK);
+ img_->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);
+
+ watchNameLabel_ = new UILabel();
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSuccessFragment watchNameLabel_ new fail");
+ return;
+ }
+ watchNameLabel_->SetPosition(0, SETTING_WATCH_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+ watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+ watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ watchNameLabel_->SetText(str.c_str());
+
+ connectStatusLabel_ = new UILabel();
+ if (connectStatusLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSuccessFragment connectStatusLabel_ new fail");
+ return;
+ }
+ connectStatusLabel_->SetPosition(0, SETTING_CONTENT_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+ connectStatusLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ connectStatusLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+ connectStatusLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ connectStatusLabel_->SetText("连接成功");
+
+ confirmButton_ = new UILabelButton();
+ if (confirmButton_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSuccessFragment confirmButton_ new fail");
+ return;
+ }
+ LOADIMG::LoadBtnImage(confirmButton_, SETTING_IMAGE, IMAGE_OK_DOWN, IMAGE_OK_DOWN);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);
+ confirmButton_->SetPosition(SETTING_BTN_X, SETTING_BTN_Y, SETTING_BTN_WIDTH, SETTING_BTN_HEIGHT);
+ confirmButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ confirmButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_BTN_FONT);
+ confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
+ confirmButton_->SetViewId(CONFIRM_BUTTON);
+ confirmButton_->SetOnClickListener(this);
+ confirmButton_->SetVisible(true);
+
+ fragmentView_.Add(img_);
+ fragmentView_.Add(watchNameLabel_);
+ fragmentView_.Add(connectStatusLabel_);
+ fragmentView_.Add(confirmButton_);
+}
+
+void SettingConnectBlueSuccess::RefreshFragment()
+{
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+ return;
+ }
+ std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ watchNameLabel_->SetText(str.c_str());
+}
+
+bool SettingConnectBlueSuccess::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+ bool state = SettingBluetoothPage::GetInstance()->GetImageAnimatorState();
+ if (state == false) {
+ SettingBluetoothPage::GetInstance()->StartBtScan();
+ }
+ fragmentView_.SetVisible(false);
+ }
+ return true;
+}
+
+bool SettingConnectBlueSuccess::OnDragStart(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingConnectBlueSuccess::OnDrag(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingConnectBlueSuccess::OnDragEnd(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingConnectNewPhone\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "AppViewIDs.h"\r
+#include "uiservice/ui_service.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_settings.h"\r
+#include "settings/page/SettingBluetoothPage.h"\r
+#include "settings/page/SettingConnectNewPhone.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SETTING_CONNECT_CANCEL_WIDTH = 85;\r
+static constexpr int16_t SETTING_CONNECT_CANCEL_Y = 300;\r
+static constexpr int16_t SETTING_CONNECT_CANCEL_X = 114;\r
+static constexpr int16_t SETTING_CONNECT_CONFIRM_X = 254;\r
+static constexpr int16_t SETTING_CONNECT_TEXTFIRST_Y = 100;\r
+static constexpr int16_t SETTING_CONNECT_TEXTSECOND_Y = 150;\r
+static constexpr int16_t SETTING_CONNECT_TEXTTHIRD_Y = 200;\r
+static constexpr int16_t SETTING_UNPAIR_TEXT_HEIGHT = 50;\r
+static constexpr int16_t SETTING_UNPAIR_TEXT_FONT = 34;\r
+static constexpr char *CONFIRM_BUTTON = "confirmButton";\r
+static constexpr char *CANCEL_BUTTON = "cancelButton";\r
+\r
+void SettingConnectNewPhone::OnCreateView(void* data)\r
+{\r
+ InitNewPhoneFragment();\r
+}\r
+\r
+void SettingConnectNewPhone::OnDestroyView()\r
+{\r
+ fragmentView_.RemoveAll();\r
+ if (textFirst_ != nullptr) {\r
+ delete textFirst_;\r
+ textFirst_ = nullptr;\r
+ }\r
+ if (textSecond_ != nullptr) {\r
+ delete textSecond_;\r
+ textSecond_ = nullptr;\r
+ }\r
+ if (textThird_ != nullptr) {\r
+ delete textThird_;\r
+ textThird_ = nullptr;\r
+ }\r
+ if (cancel_ != nullptr) {\r
+ delete cancel_;\r
+ cancel_ = nullptr;\r
+ }\r
+ if (confirm_ != nullptr) {\r
+ delete confirm_;\r
+ confirm_ = nullptr;\r
+ }\r
+}\r
+\r
+void SettingConnectNewPhone::InitNewPhoneFragment()\r
+{\r
+ fragmentView_.SetTouchable(true);\r
+ fragmentView_.SetDraggable(true);\r
+ fragmentView_.SetOnDragListener(this);\r
+ std::string str1 = "将断开已连接的手机,";\r
+ std::string str2 = "同一账号的新手机会保留";\r
+ std::string str3 = "个人数据,是否继续?";\r
+ textFirst_ = new UILabel();\r
+ if (textFirst_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment textFirst_ new fail");\r
+ return;\r
+ }\r
+ textFirst_->SetPosition(0, SETTING_CONNECT_TEXTFIRST_Y, RESOLUTION_WIDTH, SETTING_UNPAIR_TEXT_HEIGHT);\r
+ textFirst_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ textFirst_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_TEXT_FONT);\r
+ textFirst_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ textFirst_->SetText(str1.c_str());\r
+\r
+ textSecond_ = new UILabel();\r
+ if (textSecond_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment textSecond_ new fail");\r
+ return;\r
+ }\r
+ textSecond_->SetPosition(0, SETTING_CONNECT_TEXTSECOND_Y, RESOLUTION_WIDTH, SETTING_UNPAIR_TEXT_HEIGHT);\r
+ textSecond_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ textSecond_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_TEXT_FONT);\r
+ textSecond_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ textSecond_->SetText(str2.c_str());\r
+\r
+ textThird_ = new UILabel();\r
+ if (textThird_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment textThird_ new fail");\r
+ return;\r
+ }\r
+ textThird_->SetPosition(0, SETTING_CONNECT_TEXTTHIRD_Y, RESOLUTION_WIDTH, SETTING_UNPAIR_TEXT_HEIGHT);\r
+ textThird_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ textThird_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_TEXT_FONT);\r
+ textThird_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ textThird_->SetText(str3.c_str());\r
+\r
+ cancel_ = new UIImageView();\r
+ if (cancel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment cancel_ new fail");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(cancel_, SETTING_IMAGE, IMAGE_CANCEL);\r
+ cancel_->SetPosition(SETTING_CONNECT_CANCEL_X,\r
+ SETTING_CONNECT_CANCEL_Y, SETTING_CONNECT_CANCEL_WIDTH, SETTING_CONNECT_CANCEL_WIDTH);\r
+ cancel_->SetTouchable(true);\r
+ cancel_->SetViewId(CANCEL_BUTTON);\r
+ cancel_->SetOnClickListener(this);\r
+ cancel_->SetVisible(true);\r
+\r
+ confirm_ = new UIButton();\r
+ if (confirm_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitNewPhoneFragment confirm_ new fail");\r
+ return;\r
+ }\r
+ confirm_->SetPosition(SETTING_CONNECT_CONFIRM_X,\r
+ SETTING_CONNECT_CANCEL_Y, SETTING_CONNECT_CANCEL_WIDTH, SETTING_CONNECT_CANCEL_WIDTH);\r
+ confirm_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+ confirm_->SetViewId(CONFIRM_BUTTON);\r
+ confirm_->SetOnClickListener(this);\r
+ confirm_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(confirm_, SETTING_IMAGE, IMAGE_OK_BLUE, IMAGE_OK_BLUE);\r
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);\r
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);\r
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);\r
+\r
+ fragmentView_.Add(textFirst_);\r
+ fragmentView_.Add(textSecond_);\r
+ fragmentView_.Add(textThird_);\r
+ fragmentView_.Add(cancel_);\r
+ fragmentView_.Add(confirm_);\r
+}\r
+\r
+bool SettingConnectNewPhone::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), CANCEL_BUTTON) == 0) {\r
+ fragmentView_.SetVisible(false);\r
+ SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);\r
+ } else if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {\r
+ fragmentView_.SetVisible(false);\r
+ SettingBluetoothPage::GetInstance()->ChangeView(CONNECT_OPEN_FRAGMENT);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SettingConnectNewPhone::OnDragStart(UIView& view, const DragEvent& event)\r
+{\r
+ return true;\r
+}\r
+\r
+bool SettingConnectNewPhone::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+ return true;\r
+}\r
+\r
+bool SettingConnectNewPhone::OnDragEnd(UIView& view, const DragEvent& event)\r
+{\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingConnectionOpen
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "main/LoadImg.h"
+#include "ui_resource_settings.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingConnectionOpen.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_IMG_X = 85;
+static constexpr int16_t SETTING_IMG_Y = -50;
+static constexpr int16_t SETTING_WATCH_Y = 180;
+static constexpr int16_t SETTING_WATCH_HEIGHT = 45;
+static constexpr int16_t SETTING_WATCH_FONT = 36;
+static constexpr int16_t SETTING_CONTENT_Y = 230;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_BTN_FONT = 40;
+static constexpr int16_t SETTING_BTN_X = 65;
+static constexpr int16_t SETTING_BTN_Y = 359;
+static constexpr int16_t SETTING_BTN_WIDTH = 324;
+static constexpr int16_t SETTING_BTN_HEIGHT = 101;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+static SettingConnectionOpen *g_pSettingConnectionOpen{nullptr};
+
+void SettingConnectionOpen::OnCreateView(void* data)
+{
+ InitConnectionOpenFragment();
+ g_pSettingConnectionOpen = this;
+}
+
+void SettingConnectionOpen::OnDestroyView()
+{
+ fragmentView_.RemoveAll();
+ if (img_ != nullptr) {
+ delete img_;
+ img_ = nullptr;
+ }
+ if (watchNameLabel_ != nullptr) {
+ delete watchNameLabel_;
+ watchNameLabel_ = nullptr;
+ }
+ if (connectStatusLabel_ != nullptr) {
+ delete connectStatusLabel_;
+ connectStatusLabel_ = nullptr;
+ }
+ if (confirmButton_ != nullptr) {
+ delete confirmButton_;
+ confirmButton_ = nullptr;
+ }
+}
+
+void SettingConnectionOpen::InitConnectionOpenFragment()
+{
+ fragmentView_.SetTouchable(true);
+ fragmentView_.SetDraggable(true);
+ fragmentView_.SetOnDragListener(this);
+ img_ = new UIImageView();
+ if (img_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitConnectionOpenFragment img_ new fail");
+ return;
+ }
+ LOADIMG::LoadImageViewImg(img_, SETTING_IMAGE, IMAGE_OK);
+ img_->SetPosition(SETTING_IMG_X, SETTING_IMG_Y);
+
+ watchNameLabel_ = new UILabel();
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitConnectionOpenFragment watchNameLabel_ new fail");
+ return;
+ }
+ watchNameLabel_->SetPosition(0, SETTING_WATCH_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+ watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+ watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ watchNameLabel_->SetText(SettingBluetoothModel::GetInstance()->GetWatchName());
+
+ connectStatusLabel_ = new UILabel();
+ if (connectStatusLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitConnectionOpenFragment connectStatusLabel_ new fail");
+ return;
+ }
+ connectStatusLabel_->SetPosition(0, SETTING_CONTENT_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+ connectStatusLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ connectStatusLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_CONYENT_HEIGHT);
+ connectStatusLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ connectStatusLabel_->SetText("连接已打开");
+
+ confirmButton_ = new UILabelButton();
+ if (confirmButton_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitConnectionOpenFragment confirmButton_ new fail");
+ return;
+ }
+ LOADIMG::LoadBtnImage(confirmButton_, SETTING_IMAGE, IMAGE_OK_DOWN, IMAGE_OK_DOWN);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);
+ confirmButton_->SetPosition(SETTING_BTN_X, SETTING_BTN_Y, SETTING_BTN_WIDTH, SETTING_BTN_HEIGHT);
+ confirmButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ confirmButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_BTN_FONT);
+ confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
+ confirmButton_->SetViewId(CONFIRM_BUTTON);
+ confirmButton_->SetOnClickListener(this);
+ confirmButton_->SetVisible(true);
+
+ fragmentView_.Add(img_);
+ fragmentView_.Add(watchNameLabel_);
+ fragmentView_.Add(connectStatusLabel_);
+ fragmentView_.Add(confirmButton_);
+}
+
+void SettingConnectionOpen::RefreshFragment()
+{
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+ return;
+ }
+ watchNameLabel_->SetText(SettingBluetoothModel::GetInstance()->GetWatchName());
+}
+
+bool SettingConnectionOpen::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+ fragmentView_.SetVisible(false);
+ SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+ SettingBluetoothModel::GetInstance()->SetConnectFragmentStatus(false);
+ }
+ return true;
+}
+
+bool SettingConnectionOpen::OnDragStart(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingConnectionOpen::OnDrag(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingConnectionOpen::OnDragEnd(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopDialPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "common/screen.h"\r
+#include "components/ui_swipe_view_nested.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingDesktopDialPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DESKTOP_DIAL_PAGE, SettingDesktopDialPage, false);\r
+\r
+static constexpr int16_t SETTING_ROLLER_ITEM_WIDTH = 250;\r
+static constexpr int16_t SETTING_ROLLER_ITEM_HEIHT = 250;\r
+static constexpr int16_t SETTING_ROLLER_ITEM_PADDING = 80;\r
+static constexpr float SETTING_ROLLER_BASE_ANGLE = 360.0;\r
+static constexpr float SETTING_ROLLER_HALF_BASE_ANGLE = 180.0;\r
+\r
+static constexpr int16_t SETTING_DIAL_BUTTON_X = -454;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_Y = 363;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_WDITH = 454*3;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_HEIGHT = 454*3;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_RADIUS = 454*3;\r
+#define SETTING_DIAL_BUTTON_COLOR Color::GetColorFromRGB(13, 159, 251) // 0xFF0D9FFB\r
+\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_X = 105;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_Y = 375;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_WIDTH = 244;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_HEIGHT = 54;\r
+static constexpr int16_t SETTING_DIAL_BUTTON_LABEL_FSIZE = 38;\r
+static const char* SETTING_DIAL_BUTTON_LABEL_TEXT = "设置";\r
+\r
+static constexpr int16_t SETTING_DIAL_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DIAL_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DIAL_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DIAL_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DIAL_TITLE_FSZIE = 38;\r
+\r
+void SettingDesktopDialPage::OnStart(void* data)\r
+{\r
+ InitDialView();\r
+ InitCtrlView();\r
+ AddViewToPageContainer(itemLabel_);\r
+ AddViewToPageContainer(coverflow_);\r
+ AddViewToPageContainer(rollerView_);\r
+}\r
+\r
+void SettingDesktopDialPage::OnResume()\r
+{\r
+ GetSlicePageContainer()->SetIntercept(true);\r
+ GetSlicePageContainer()->SetOnDragListener(nullptr); // 取消跟手返回\r
+ SettingDesktopModel::GetInstance().LoadAllDial();\r
+ const auto& dialInfo = SettingDesktopModel::GetInstance().GetDialInfo();\r
+ itemIndex_ = SettingDesktopModel::GetInstance().GetPageIndex();\r
+\r
+ if (SettingDesktopModel::GetInstance().GetDialStyle() == DialStyle::ROLLER) {\r
+ itemCount_ = 0; // 重置计数\r
+ for (const auto& iter : dialInfo) {\r
+ rollerView_->AddItem(iter.dialName, iter.preImageInfo) ? itemCount_++ : itemCount_;\r
+ }\r
+ rollerView_->SetCurrentItem(dialInfo[itemIndex_].dialName);\r
+ rollerView_->SetVisible(true);\r
+ } else { // DialStyle::COVERFLOW风格\r
+ for (const auto& iter : dialInfo) {\r
+ coverflow_->Add(iter.dialName.c_str(), iter.preImageInfo);\r
+ }\r
+ coverflow_->SetCurrentPage(itemIndex_);\r
+ coverflow_->SetVisible(true);\r
+ }\r
+ itemLabel_->SetText(dialInfo[itemIndex_].dialName.c_str());\r
+}\r
+\r
+void SettingDesktopDialPage::OnPause()\r
+{\r
+ if (SettingDesktopModel::GetInstance().GetDialStyle() == DialStyle::COVERFLOW) {\r
+ coverflow_->ClearAll();\r
+ } else {\r
+ rollerView_->ClearAll();\r
+ }\r
+ SettingDesktopModel::GetInstance().ClearDialInfo();\r
+}\r
+\r
+void SettingDesktopDialPage::OnStop()\r
+{\r
+ if (coverflow_ != nullptr) {\r
+ delete coverflow_;\r
+ coverflow_ = nullptr;\r
+ }\r
+ if (rollerView_ != nullptr) {\r
+ delete rollerView_;\r
+ rollerView_ = nullptr;\r
+ }\r
+ if (itemLabel_ != nullptr) {\r
+ delete itemLabel_;\r
+ itemLabel_ = nullptr;\r
+ }\r
+}\r
+\r
+bool SettingDesktopDialPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ SettingDesktopModel::GetInstance().SaveDialSetting(itemIndex_);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+ return true;\r
+}\r
+\r
+bool SettingDesktopDialPage::OnScroll()\r
+{\r
+ int16_t windowCenterX = HORIZONTAL_RESOLUTION / 2;\r
+ int16_t windowDistance = windowCenterX;\r
+ int16_t currItemDistance = 0;\r
+ uint16_t currItemIndex = 0;\r
+ for (uint16_t i = 0; i < coverflow_->GetChildrenNumber(); i++) {\r
+ Rect itemRect = coverflow_->GetViewByIndex(i)->GetOrigRect();\r
+ int16_t itemCenterX = itemRect.GetLeft() + itemRect.GetWidth() / 2;\r
+ int16_t itemDistance = MATH_ABS(itemCenterX - windowCenterX);\r
+ if (windowDistance > itemDistance) { // 和中心点距离最小的组件是当前显示页面\r
+ currItemIndex = i;\r
+ currItemDistance = itemDistance;\r
+ windowDistance = itemDistance;\r
+ }\r
+ }\r
+ if (currItemIndex != itemIndex_) {\r
+ itemIndex_ = currItemIndex;\r
+ const auto& dialInfo = SettingDesktopModel::GetInstance().GetDialInfo();\r
+ itemLabel_->SetText(dialInfo[itemIndex_].dialName.c_str());\r
+ }\r
+ // 公式: 透明度 = 最大透明度- 最大透明度*(组件中心点/窗口中心点); 当组件中心点=窗口中心点时, OPA的值最大\r
+ uint16_t opa = OPA_OPAQUE - (uint16_t)((int32_t)OPA_OPAQUE * currItemDistance / windowCenterX);\r
+ itemLabel_->SetStyle(STYLE_TEXT_OPA, opa);\r
+ return true;\r
+}\r
+\r
+void SettingDesktopDialPage::OnScroll(UIRollerView* roller, std::string currentItemName, float currentItemAngle)\r
+{\r
+ const float baseAngle = SETTING_ROLLER_BASE_ANGLE;\r
+ const float halfBaseAngle = SETTING_ROLLER_HALF_BASE_ANGLE;\r
+ if (FloatMoreEqual(currentItemAngle, halfBaseAngle)) {\r
+ currentItemAngle -= baseAngle;\r
+ }\r
+ if (currentItemAngle < 0) {\r
+ currentItemAngle = -currentItemAngle;\r
+ }\r
+ float maxAngle = baseAngle / itemCount_;\r
+ float coef = 1.0 - 1.0 / (maxAngle) * currentItemAngle;\r
+ itemLabel_->SetStyle(STYLE_TEXT_OPA, coef * OPA_OPAQUE);\r
+ itemLabel_->SetText(currentItemName.c_str());\r
+ auto& dialInfo = SettingDesktopModel::GetInstance().GetDialInfo();\r
+ for (uint8_t i = 0; i < dialInfo.size(); ++i) {\r
+ if (dialInfo[i].dialName == currentItemName) {\r
+ itemIndex_ = i;\r
+ }\r
+ }\r
+}\r
+\r
+void SettingDesktopDialPage::InitDialView()\r
+{\r
+ coverflow_ = new UICoverflowView();\r
+ if (coverflow_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialPage::InitDialView coverflow_ new fail");\r
+ return;\r
+ }\r
+ coverflow_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ coverflow_->SetOnCoverflowListener(this);\r
+ coverflow_->SetOnClickListener(this);\r
+ coverflow_->SetThrowDrag(true);\r
+ coverflow_->SetIntercept(true);\r
+ coverflow_->SetVisible(false);\r
+\r
+ rollerView_ = new UIRollerView();\r
+ if (rollerView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialPage::InitDialView rollerView_ new fail");\r
+ return;\r
+ }\r
+ rollerView_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ rollerView_->SetItemSize(SETTING_ROLLER_ITEM_WIDTH, SETTING_ROLLER_ITEM_HEIHT);\r
+ rollerView_->SetThrowDrag(true);\r
+ rollerView_->SetIntercept(true);\r
+ rollerView_->SetItemPadding(SETTING_ROLLER_ITEM_PADDING);\r
+ rollerView_->SetOnScrollListener(this);\r
+ rollerView_->SetOnClickListener(this);\r
+ rollerView_->SetVisible(false);\r
+}\r
+\r
+void SettingDesktopDialPage::InitCtrlView()\r
+{\r
+ itemLabel_ = new UILabel();\r
+ if (itemLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialPage::InitCtrlView itemLabel_ new fail");\r
+ return;\r
+ }\r
+ itemLabel_->SetPosition(SETTING_DIAL_TITLE_X, SETTING_DIAL_TITLE_Y);\r
+ itemLabel_->Resize(SETTING_DIAL_TITLE_WIDTH, SETTING_DIAL_TITLE_HEIGHT);\r
+ itemLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ itemLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DIAL_TITLE_FSZIE);\r
+ itemLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopDialStylePage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingDesktopDialStylePage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DESKTOP_DIAL_STYLE_PAGE, SettingDesktopDialStylePage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingDesktopDialStylePage *g_pSettingDesktopDialStylePage{nullptr};\r
+\r
+void SettingDesktopDialStylePage::OnStart(void *data)\r
+{\r
+ g_pSettingDesktopDialStylePage = this;\r
+ scroll_ = new UIScrollViewNested();\r
+ if (scroll_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialStylePage::OnStart scroll_ new fail");\r
+ return;\r
+ }\r
+ scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ scroll_->SetThrowDrag(true);\r
+ scroll_->SetIntercept(true);\r
+\r
+ content_ = new UISimpleList();\r
+ if (content_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopDialStylePage::OnStart content_ new fail");\r
+ return;\r
+ }\r
+ content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+ content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+ content_->SetDraggable(true);\r
+ content_->SetThrowDrag(true);\r
+ content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+ scroll_->Add(content_);\r
+ AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingDesktopDialStylePage::OnResume()\r
+{\r
+ content_->ClearAll();\r
+ for(auto& it : SettingDesktopModel::GetInstance().GetDialStyleUnionData()) {\r
+ Contents cont;\r
+ cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+ cont.updateFunc = SettingDesktopDialStylePage::OnSimpleListUpdate;\r
+ cont.type = it.GetUnionItemType();\r
+ cont.data = ⁢\r
+ content_->AddContent(cont);\r
+ }\r
+ content_->RefreshList();\r
+}\r
+\r
+void SettingDesktopDialStylePage::OnStop()\r
+{\r
+ g_pSettingDesktopDialStylePage = nullptr;\r
+ if (scroll_ != nullptr) {\r
+ scroll_->RemoveAll();\r
+ delete scroll_;\r
+ scroll_ = nullptr;\r
+ }\r
+ if (content_ != nullptr) {\r
+ delete content_;\r
+ content_ = nullptr;\r
+ }\r
+}\r
+\r
+bool SettingDesktopDialStylePage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+ if (viewId == (uintptr_t)ICON_TEXT_TOGGLE) {\r
+ int16_t viewIndex = view.GetViewIndex();\r
+ auto& dialStyleUnionData = SettingDesktopModel::GetInstance().GetDialStyleUnionData();\r
+ if (viewIndex < 0 || viewIndex > dialStyleUnionData.size()) {\r
+ return true;\r
+ }\r
+\r
+ SettingUnionItemData& itemData = dialStyleUnionData[viewIndex];\r
+ if (itemData.GetUnionItemType() == ICON_TEXT_TOGGLE) {\r
+ IconTextToggleItemData* data = static_cast<IconTextToggleItemData*>(itemData.GetUnionItemData());\r
+ SettingDesktopModel::GetInstance().SetDialStyleDataSelect(data->textContent);\r
+\r
+ // 刷新UnionData\r
+ SettingDesktopModel::GetInstance().GetDialStyleUnionData();\r
+ content_->RefreshList();\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+\r
+void SettingDesktopDialStylePage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+ PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+ IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingDesktopDialStylePage);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingDesktopDialStylePage);\r
+ }\r
+ return;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopHomePage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingDesktopHomePage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DESKTOP_HOME_PAGE, SettingDesktopHomePage, false);\r
+\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LIST_Y = 130;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LSIT_HEIGHT = 205;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LIST_BLANK = 0;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LIST_DISTANCE = 1000;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_LIST_SELECTPOS = HORIZONTAL_RESOLUTION / 4;\r
+\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DESKTOP_HOME_TITLE_FSIZE = 38;\r
+static const char* SETTING_DESKTOP_HOME_TITLE_TEXT = "桌面风格";\r
+\r
+void SettingDesktopHomePage::OnStart(void* data)\r
+{\r
+ list_ = new UISimpleList();\r
+ if (list_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopHomePage::OnStart list_ new fail");\r
+ return;\r
+ }\r
+ list_->SetDirection(UIAbstractScroll::HORIZONTAL);\r
+ list_->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);\r
+ list_->SetPosition(0, SETTING_DESKTOP_HOME_LIST_Y);\r
+ list_->Resize(HORIZONTAL_RESOLUTION, SETTING_DESKTOP_HOME_LSIT_HEIGHT);\r
+ list_->SetScrollBlankSize(SETTING_DESKTOP_HOME_LIST_BLANK);\r
+ list_->SetSelectPosition(SETTING_DESKTOP_HOME_LIST_SELECTPOS);\r
+ list_->SetDraggable(true);\r
+ list_->SetThrowDrag(true);\r
+ list_->EnableAutoAlign(true);\r
+ list_->SetMaxScrollDistance(SETTING_DESKTOP_HOME_LIST_DISTANCE);\r
+ list_->SetIntercept(false);\r
+\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopHomePage::OnStart title_ new fail");\r
+ return;\r
+ }\r
+ title_->SetPosition(SETTING_DESKTOP_HOME_TITLE_X, SETTING_DESKTOP_HOME_TITLE_Y);\r
+ title_->Resize(SETTING_DESKTOP_HOME_TITLE_WIDTH, SETTING_DESKTOP_HOME_TITLE_HEIGHT);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DESKTOP_HOME_TITLE_FSIZE);\r
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title_->SetText(SETTING_DESKTOP_HOME_TITLE_TEXT);\r
+\r
+ AddViewToPageContainer(list_);\r
+ AddViewToPageContainer(title_);\r
+}\r
+\r
+void SettingDesktopHomePage::OnResume()\r
+{\r
+ list_->ClearAll();\r
+ for(auto& it : SettingDesktopModel::GetInstance().GetDesktopHomeData()) {\r
+ it.contextPtr = this;\r
+ Contents cont;\r
+ cont.createFunc = SettingDesktopHomePage::OnSimpleListCreate;\r
+ cont.updateFunc = SettingDesktopHomePage::OnSimpleListUpdate;\r
+ cont.type = 0;\r
+ cont.data = ⁢\r
+ list_->AddContent(cont);\r
+ }\r
+ list_->RefreshList();\r
+}\r
+\r
+void SettingDesktopHomePage::OnStop()\r
+{\r
+ if (list_ != nullptr) {\r
+ delete list_;\r
+ list_ = nullptr;\r
+ }\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+}\r
+\r
+bool SettingDesktopHomePage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ int16_t index = view.GetViewIndex();\r
+ int16_t currIndex = SettingDesktopModel::GetInstance().GetDesktopHomeDataSelect();\r
+ auto& desktopHomeData = SettingDesktopModel::GetInstance().GetDesktopHomeData();\r
+ if (index != currIndex && index >= 0 && (size_t)index < desktopHomeData.size()) {\r
+ SettingDesktopModel::GetInstance().SetDesktopHomeDataSelect((DesktopStyle)desktopHomeData[index].style);\r
+ list_->RefreshList();\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+ }\r
+ return true;\r
+}\r
+\r
+UIView* SettingDesktopHomePage::OnSimpleListCreate(uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ return new SettingDesktopHomeItemGroup();\r
+}\r
+\r
+void SettingDesktopHomePage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SettingDesktopHomeItemGroup* itemGroup = dynamic_cast<SettingDesktopHomeItemGroup*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ SettingDesktopHomeItemData* itemData = static_cast<SettingDesktopHomeItemData*>(data);\r
+ SettingDesktopHomePage* page = static_cast<SettingDesktopHomePage*>(itemData->contextPtr);\r
+ itemGroup->UpdateItemGroup(itemData);\r
+ itemGroup->SetOnClickListener(page);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDesktopPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingDesktopPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DESKTOP_PAGE, SettingDesktopPage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingDesktopPage *g_pSettingDesktopPage{nullptr};\r
+\r
+void SettingDesktopPage::OnStart(void *data)\r
+{\r
+ g_pSettingDesktopPage = this;\r
+ content_ = new UISimpleList();\r
+ if (content_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::OnStart content_ new fail");\r
+ return;\r
+ }\r
+ content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+ content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+ content_->SetDraggable(true);\r
+ content_->SetThrowDrag(true);\r
+ content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+\r
+ scroll_ = new UIScrollViewNested();\r
+ if (scroll_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::OnStart scroll_ new fail");\r
+ return;\r
+ }\r
+ scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ scroll_->SetThrowDrag(true);\r
+ scroll_->SetIntercept(true);\r
+ scroll_->SetOnDragListener(this);\r
+ scroll_->Add(content_);\r
+ AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingDesktopPage::OnResume()\r
+{\r
+ content_->ClearAll();\r
+ for (SettingUnionItemData& it : SettingDesktopModel::GetInstance().GetDesktopUnionData()) {\r
+ Contents cont;\r
+ cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+ cont.updateFunc = SettingDesktopPage::OnSimpleListUpdate;\r
+ cont.type = it.GetUnionItemType();\r
+ cont.data = ⁢\r
+ content_->AddContent(cont);\r
+ }\r
+ content_->RefreshList();\r
+}\r
+\r
+void SettingDesktopPage::OnStop()\r
+{\r
+ if (scroll_ != nullptr) {\r
+ scroll_->RemoveAll();\r
+ delete scroll_;\r
+ scroll_ = nullptr;\r
+ }\r
+ if (content_ != nullptr) {\r
+ delete content_;\r
+ content_ = nullptr;\r
+ }\r
+ g_pSettingDesktopPage = nullptr;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::~SettingDesktopPage");\r
+}\r
+\r
+bool SettingDesktopPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+ if (viewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+ int16_t viewIndex = view.GetViewIndex();\r
+ auto& desktopUnionData = SettingDesktopModel::GetInstance().GetDesktopUnionData();\r
+ if (viewIndex < 0 || viewIndex > desktopUnionData.size()) {\r
+ return true;\r
+ }\r
+\r
+ SettingUnionItemData& itemData = desktopUnionData[viewIndex];\r
+ if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+ NativeAbility::GetInstance().SwitchPageInSlice(data->pageId,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+void SettingDesktopPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+ PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+ IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingDesktopPage);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingDesktopPage);\r
+ }\r
+ return;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayBrightnessPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "settings/page/SettingDisplayBrightnessPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DISPLAY_BRIGHTNESS_PAGE, SettingDisplayBrightnessPage, false);\r
+\r
+static constexpr int8_t SETTING_DISPLAY_TEMP_STR_LEN = 10;\r
+static constexpr uint8_t SETTING_DISPLAY_BRIGHTNESS_MAX = 100;\r
+static constexpr uint8_t SETTING_DISPLAY_BRIGHTNESS_MIN = 0;\r
+static constexpr int16_t SETTING_DISPLAY_BRIGHTNESS_AUTO_TIME = 300;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_TITLE_FSIZE = 38;\r
+static const char* SETTING_DISPLAY_BRI_TITLE_TEXT = "调整亮度";\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_X = 127;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_Y = 127;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_WIDTH = 200;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_HEIGHT = 200;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_LINE_WIDTH = 25;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESS_RADIUS = 100;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_START_ANGLE = 360;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_END_ANGLE = 0;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_X = 173;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_Y = 187;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_WIDTH = 108;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_HEIGHT = 60;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_PROGRESSNUM_FSIZE = 59;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_X = 343;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_Y = 187;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_WIDTH = 80;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_HEIGHT = 80;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_ADD_OPA = 37;\r
+static const char* SETTING_DISPLAY_BRI_ADD_BUTTON_ID = "add";\r
+\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_X = 31;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_Y = 187;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_WIDTH = 80;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_HEIGHT = 80;\r
+static constexpr int16_t SETTING_DISPLAY_BRI_SUB_OPA = 37;\r
+static const char* SETTING_DISPLAY_BRI_SUB_BUTTON_ID = "sub";\r
+\r
+void SettingDisplayBrightnessPage::OnStart(void* data)\r
+{\r
+ InitProgressView();\r
+ InitButtonView();\r
+ AddViewToPageContainer(title_);\r
+ AddViewToPageContainer(progress_);\r
+ AddViewToPageContainer(progressNum_);\r
+ AddViewToPageContainer(add_);\r
+ AddViewToPageContainer(sub_);\r
+}\r
+\r
+void SettingDisplayBrightnessPage::OnResume()\r
+{\r
+ char temp[SETTING_DISPLAY_TEMP_STR_LEN] = "";\r
+ uint8_t brightness = SettingDisplayModel::GetInstance().GetBrightness();\r
+ progress_->SetValue(brightness);\r
+ if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+ progressNum_->SetText(temp);\r
+ }\r
+}\r
+\r
+void SettingDisplayBrightnessPage::OnPause()\r
+{\r
+ animator_->Stop();\r
+}\r
+\r
+void SettingDisplayBrightnessPage::OnStop()\r
+{\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+ if (progress_ != nullptr) {\r
+ delete progress_;\r
+ progress_ = nullptr;\r
+ }\r
+ if (progressNum_ != nullptr) {\r
+ delete progressNum_;\r
+ progressNum_ = nullptr;\r
+ }\r
+ if (add_ != nullptr) {\r
+ delete add_;\r
+ add_ = nullptr;\r
+ }\r
+ if (sub_ != nullptr) {\r
+ delete sub_;\r
+ sub_ = nullptr;\r
+ }\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DESKTOP_BRIGHTNESS_FG, SETTING_IMAGE);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DISPLAY_BRIGHTNESS_ADD, SETTING_IMAGE);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DISPLAY_BRIGHTNESS_SUB, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingDisplayBrightnessPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ char temp[SETTING_DISPLAY_TEMP_STR_LEN] = "";\r
+ if (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_ADD_BUTTON_ID) == 0) {\r
+ uint8_t brightness = SettingDisplayModel::GetInstance().GetBrightness();\r
+ if (brightness != SETTING_DISPLAY_BRIGHTNESS_MAX) {\r
+ brightness++;\r
+ SettingDisplayModel::GetInstance().SetBrightness(brightness);\r
+ progress_->SetValue(brightness);\r
+ if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+ progressNum_->SetText(temp);\r
+ }\r
+ }\r
+ } else if (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_SUB_BUTTON_ID) == 0) {\r
+ uint8_t brightness = SettingDisplayModel::GetInstance().GetBrightness();\r
+ if (brightness != SETTING_DISPLAY_BRIGHTNESS_MIN) {\r
+ brightness--;\r
+ SettingDisplayModel::GetInstance().SetBrightness(brightness);\r
+ progress_->SetValue(brightness);\r
+ if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+ progressNum_->SetText(temp);\r
+ }\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SettingDisplayBrightnessPage::OnLongPress(UIView& view, const LongPressEvent& event)\r
+{\r
+ if (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_ADD_BUTTON_ID) == 0) {\r
+ if (curLongPressButton_ == nullptr) {\r
+ curLongPressButton_ = add_;\r
+ animator_->Start();\r
+ }\r
+ } else if (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_SUB_BUTTON_ID) == 0) {\r
+ if (curLongPressButton_ == nullptr) {\r
+ curLongPressButton_ = sub_;\r
+ animator_->Start();\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SettingDisplayBrightnessPage::OnRelease(UIView& view, const ReleaseEvent& event)\r
+{\r
+ animator_->Stop();\r
+ curLongPressButton_ = nullptr;\r
+ return true;\r
+}\r
+\r
+bool SettingDisplayBrightnessPage::OnDragEnd(UIView& view, const DragEvent& event)\r
+{\r
+ if (view.GetViewId() &&\r
+ (strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_ADD_BUTTON_ID) == 0 ||\r
+ strcmp(view.GetViewId(), SETTING_DISPLAY_BRI_SUB_BUTTON_ID) == 0)) {\r
+ animator_->Stop();\r
+ curLongPressButton_ = nullptr;\r
+ }\r
+ return false;\r
+}\r
+\r
+void SettingDisplayBrightnessPage::Callback(UIView* view)\r
+{\r
+ static uint32_t lastRunTime = 0;\r
+ uint32_t currRunTime = animator_->GetRunTime();\r
+ if (currRunTime - lastRunTime < SETTING_DISPLAY_BRIGHTNESS_AUTO_TIME) {\r
+ return;\r
+ }\r
+ lastRunTime = currRunTime;\r
+ char temp[SETTING_DISPLAY_TEMP_STR_LEN] = "";\r
+ uint8_t brightness = SettingDisplayModel::GetInstance().GetBrightness();\r
+ if (curLongPressButton_ == add_ && brightness != SETTING_DISPLAY_BRIGHTNESS_MAX) {\r
+ brightness++;\r
+ } else if (curLongPressButton_ == sub_ && brightness != SETTING_DISPLAY_BRIGHTNESS_MIN) {\r
+ brightness--;\r
+ }\r
+ SettingDisplayModel::GetInstance().SetBrightness(brightness);\r
+ progress_->SetValue(brightness);\r
+ if (sprintf_s(temp, sizeof(temp), "%u", brightness) > 0) {\r
+ progressNum_->SetText(temp);\r
+ }\r
+}\r
+\r
+void SettingDisplayBrightnessPage::InitProgressView()\r
+{\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitProgressView title_ new fail");\r
+ return;\r
+ }\r
+ title_->SetPosition(SETTING_DISPLAY_BRI_TITLE_X, SETTING_DISPLAY_BRI_TITLE_Y);\r
+ title_->Resize(SETTING_DISPLAY_BRI_TITLE_WIDTH, SETTING_DISPLAY_BRI_TITLE_HEIGHT);\r
+ title_->SetTextColor(Color::White());\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DISPLAY_BRI_TITLE_FSIZE);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetText(SETTING_DISPLAY_BRI_TITLE_TEXT);\r
+\r
+ progress_ = new UICircleProgress();\r
+ if (progress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitProgressView progress_ new fail");\r
+ return;\r
+ }\r
+ progress_->SetPosition(SETTING_DISPLAY_BRI_PROGRESS_X, SETTING_DISPLAY_BRI_PROGRESS_Y);\r
+ progress_->Resize(SETTING_DISPLAY_BRI_PROGRESS_WIDTH, SETTING_DISPLAY_BRI_PROGRESS_HEIGHT);\r
+ ImageInfo* fgImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DESKTOP_BRIGHTNESS_FG, SETTING_IMAGE);\r
+ ImageInfo* bgImage = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DESKTOP_BRIGHTNESS_BG, SETTING_IMAGE);\r
+ progress_->SetImage(fgImage, bgImage);\r
+ progress_->SetBackgroundStyle(STYLE_LINE_WIDTH, SETTING_DISPLAY_BRI_PROGRESS_LINE_WIDTH);\r
+ progress_->SetForegroundStyle(STYLE_LINE_WIDTH, SETTING_DISPLAY_BRI_PROGRESS_LINE_WIDTH);\r
+ progress_->SetProgressImagePosition(0, 0);\r
+ progress_->SetBackgroundImagePosition(0, 0);\r
+ progress_->SetCenterPosition(SETTING_DISPLAY_BRI_PROGRESS_RADIUS, SETTING_DISPLAY_BRI_PROGRESS_RADIUS);\r
+ progress_->SetRadius(SETTING_DISPLAY_BRI_PROGRESS_RADIUS);\r
+ progress_->SetStartAngle(SETTING_DISPLAY_BRI_START_ANGLE);\r
+ progress_->SetEndAngle(SETTING_DISPLAY_BRI_END_ANGLE);\r
+\r
+ progressNum_ = new UILabel();\r
+ if (progressNum_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitProgressView progressNum_ new fail");\r
+ return;\r
+ }\r
+ progressNum_->SetPosition(SETTING_DISPLAY_BRI_PROGRESSNUM_X, SETTING_DISPLAY_BRI_PROGRESSNUM_Y);\r
+ progressNum_->Resize(SETTING_DISPLAY_BRI_PROGRESSNUM_WIDTH, SETTING_DISPLAY_BRI_PROGRESSNUM_HEIGHT);\r
+ progressNum_->SetTextColor(Color::White());\r
+ progressNum_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_BRI_PROGRESSNUM_FSIZE);\r
+ progressNum_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+}\r
+\r
+void SettingDisplayBrightnessPage::InitButtonView()\r
+{\r
+ add_ = new UIButton();\r
+ if (add_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitButtonView add_ new fail");\r
+ return;\r
+ }\r
+ add_->SetPosition(SETTING_DISPLAY_BRI_ADD_X, SETTING_DISPLAY_BRI_ADD_Y);\r
+ add_->Resize(SETTING_DISPLAY_BRI_ADD_WIDTH, SETTING_DISPLAY_BRI_ADD_HEIGHT);\r
+ ImageInfo* addImage =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DISPLAY_BRIGHTNESS_ADD, SETTING_IMAGE);\r
+ add_->SetImageSrc(addImage, addImage);\r
+ add_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ add_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ add_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_BRI_ADD_OPA, UIButton::RELEASED);\r
+ add_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_BRI_ADD_OPA, UIButton::PRESSED);\r
+ add_->SetViewId(SETTING_DISPLAY_BRI_ADD_BUTTON_ID);\r
+ add_->SetDraggable(true);\r
+ add_->SetOnClickListener(this);\r
+ add_->SetOnTouchListener(this);\r
+ add_->SetOnLongPressListener(this);\r
+ add_->SetOnDragListener(this);\r
+ add_->SetIntercept(true);\r
+\r
+ sub_ = new UIButton();\r
+ if (sub_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitButtonView sub_ new fail");\r
+ return;\r
+ }\r
+ sub_->SetPosition(SETTING_DISPLAY_BRI_SUB_X, SETTING_DISPLAY_BRI_SUB_Y);\r
+ sub_->Resize(SETTING_DISPLAY_BRI_SUB_WIDTH, SETTING_DISPLAY_BRI_SUB_HEIGHT);\r
+ ImageInfo* subImage =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DISPLAY_BRIGHTNESS_SUB, SETTING_IMAGE);\r
+ sub_->SetImageSrc(subImage, subImage);\r
+ sub_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ sub_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ sub_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_BRI_SUB_OPA, UIButton::RELEASED);\r
+ sub_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_BRI_SUB_OPA, UIButton::PRESSED);\r
+ sub_->SetViewId(SETTING_DISPLAY_BRI_SUB_BUTTON_ID);\r
+ sub_->SetDraggable(true);\r
+ sub_->SetOnClickListener(this);\r
+ sub_->SetOnTouchListener(this);\r
+ sub_->SetOnLongPressListener(this);\r
+ sub_->SetOnDragListener(this);\r
+ sub_->SetIntercept(true);\r
+\r
+ animator_ = new Animator(this, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayBrightness::InitButtonView animator_ new fail");\r
+ return;\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "settings/page/SettingDisplayPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DISPLAY_PAGE, SettingDisplayPage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingDisplayPage *g_pSettingDisplayPage{nullptr};\r
+\r
+void SettingDisplayPage::OnStart(void *data)\r
+{\r
+ g_pSettingDisplayPage = this;\r
+ scroll_ = new UIScrollViewNested();\r
+ if (scroll_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayPage::OnStart scroll_ new fail");\r
+ return;\r
+ }\r
+ scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ scroll_->SetThrowDrag(true);\r
+ scroll_->SetTouchable(true);\r
+ scroll_->SetDraggable(true);\r
+ scroll_->SetIntercept(true);\r
+\r
+ content_ = new UISimpleList();\r
+ if (content_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayPage::OnStart content_ new fail");\r
+ return;\r
+ }\r
+ content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+ content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+ content_->SetDraggable(true);\r
+ content_->SetThrowDrag(true);\r
+ content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+ scroll_->Add(content_);\r
+ AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingDisplayPage::OnResume()\r
+{\r
+ content_->ClearAll();\r
+ for(auto& it : SettingDisplayModel::GetInstance().GetDisplayUnionData()) {\r
+ Contents cont;\r
+ cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+ cont.updateFunc = SettingDisplayPage::OnSimpleListUpdate;\r
+ cont.type = it.GetUnionItemType();\r
+ cont.data = ⁢\r
+ content_->AddContent(cont);\r
+ }\r
+ content_->RefreshList();\r
+}\r
+\r
+void SettingDisplayPage::OnStop()\r
+{\r
+ g_pSettingDisplayPage = nullptr;\r
+ if (scroll_ != nullptr) {\r
+ scroll_->RemoveAll();\r
+ delete scroll_;\r
+ scroll_ = nullptr;\r
+ }\r
+ if (content_ != nullptr) {\r
+ delete content_;\r
+ content_ = nullptr;\r
+ }\r
+}\r
+\r
+bool SettingDisplayPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+ if (viewId == (uintptr_t)ICON_TEXT_TOGGLE) {\r
+ int16_t viewIndex = view.GetViewIndex();\r
+ auto& displayUnionData = SettingDisplayModel::GetInstance().GetDisplayUnionData();\r
+ if (viewIndex < 0 || viewIndex > displayUnionData.size()) {\r
+ return true;\r
+ }\r
+\r
+ SettingDisplayModel::GetInstance().SetAutoAdjustBrightness(\r
+ !SettingDisplayModel::GetInstance().GetAutoAdjustBrightness());\r
+ SettingDisplayModel::GetInstance().RefreshDisplayUnionDataForAutoAdjustBrightness();\r
+ content_->RefreshList();\r
+ } else if (viewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+ int16_t viewIndex = view.GetViewIndex();\r
+ auto& displayUnionData = SettingDisplayModel::GetInstance().GetDisplayUnionData();\r
+ if (viewIndex < 0 || viewIndex > displayUnionData.size()) {\r
+ return true;\r
+ }\r
+\r
+ SettingUnionItemData& itemData = displayUnionData[viewIndex];\r
+ if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+ NativeAbility::GetInstance().SwitchPageInSlice(data->pageId,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+void SettingDisplayPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+ PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+ IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingDisplayPage);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingDisplayPage);\r
+ }\r
+ return;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplayScreenOffPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "settings/page/SettingDisplayScreenOffPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DISPLAY_SCREEN_OFF_PAGE,\r
+ SettingDisplayScreenOffPage, false);\r
+\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_TITLE_FSIZE = 38;\r
+static const char* SETTING_DISPLAY_SCREEN_TITLE_TEXT = "熄屏时间";\r
+\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_X = 64;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_Y = 118;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_WIDTH = 321;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_HEIGHT = 218;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_FSIZE = 44;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_PICKER_ITEM_HEIGHT = 84;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_X = 63;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_Y = 358;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_WIDTH = 328;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_HEIGHT = 94;\r
+static constexpr int16_t SETTING_DISPLAY_SCREEN_BUTTON_BG_OPA = 51;\r
+static const char* SETTING_DISPLAY_SCREEN_BUTTON_ID = "button";\r
+\r
+void SettingDisplayScreenOffPage::OnStart(void* data)\r
+{\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayScreenOffTimePage::OnStart title_ new fail");\r
+ return;\r
+ }\r
+ title_->SetPosition(SETTING_DISPLAY_SCREEN_TITLE_X, SETTING_DISPLAY_SCREEN_TITLE_Y);\r
+ title_->Resize(SETTING_DISPLAY_SCREEN_TITLE_WIDTH, SETTING_DISPLAY_SCREEN_TITLE_HEIGHT);\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DISPLAY_SCREEN_TITLE_FSIZE);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetTextColor(Color::White());\r
+ title_->SetText(SETTING_DISPLAY_SCREEN_TITLE_TEXT);\r
+\r
+ picker_ = new UIPicker();\r
+ if (picker_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayScreenOffTimePage::OnStart picker_ new fail");\r
+ return;\r
+ }\r
+ picker_->SetPosition(SETTING_DISPLAY_SCREEN_PICKER_X, SETTING_DISPLAY_SCREEN_PICKER_Y);\r
+ picker_->Resize(SETTING_DISPLAY_SCREEN_PICKER_WIDTH, SETTING_DISPLAY_SCREEN_PICKER_HEIGHT);\r
+ picker_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ picker_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_SCREEN_PICKER_FSIZE);\r
+ picker_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_SCREEN_PICKER_FSIZE);\r
+ picker_->SetItemHeight(SETTING_DISPLAY_SCREEN_PICKER_ITEM_HEIGHT);\r
+ picker_->SetTextColor(SETTING_LIST_DEFAULT_BG_COLOR, Color::White());\r
+ picker_->SetIntercept(true);\r
+\r
+ button_ = new UIButton();\r
+ if (button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplayScreenOffTimePage::OnStart button_ new fail");\r
+ return;\r
+ }\r
+ button_->SetPosition(SETTING_DISPLAY_SCREEN_BUTTON_X, SETTING_DISPLAY_SCREEN_BUTTON_Y);\r
+ button_->Resize(SETTING_DISPLAY_SCREEN_BUTTON_WIDTH, SETTING_DISPLAY_SCREEN_BUTTON_HEIGHT);\r
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DISPLAY_OK, SETTING_IMAGE);\r
+ button_->SetImageSrc(image, image);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_SCREEN_BUTTON_BG_OPA, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_SCREEN_BUTTON_BG_OPA, UIButton::PRESSED);\r
+ button_->SetStyleForState(STYLE_IMAGE_OPA, OPA_OPAQUE, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_IMAGE_OPA, OPA_OPAQUE, UIButton::PRESSED);\r
+ button_->SetViewId(SETTING_DISPLAY_SCREEN_BUTTON_ID);\r
+ button_->SetOnClickListener(this);\r
+\r
+ AddViewToPageContainer(title_);\r
+ AddViewToPageContainer(picker_);\r
+ AddViewToPageContainer(button_);\r
+}\r
+\r
+void SettingDisplayScreenOffPage::OnResume()\r
+{\r
+ const char** data = SettingDisplayModel::GetInstance().GetScreenOffTimeAllStr();\r
+ uint8_t size = SettingDisplayModel::GetInstance().GetScreenOffTimeAllStrSize();\r
+ uint8_t selectIndex = SettingDisplayModel::GetInstance().GetScreenOffTimeIndex();\r
+ picker_->SetValues(data, size);\r
+ picker_->SetSelected(selectIndex);\r
+}\r
+\r
+void SettingDisplayScreenOffPage::OnStop()\r
+{\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+ if (picker_ != nullptr) {\r
+ delete picker_;\r
+ picker_ = nullptr;\r
+ }\r
+ if (button_ != nullptr) {\r
+ delete button_;\r
+ button_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DISPLAY_OK, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingDisplayScreenOffPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SETTING_DISPLAY_SCREEN_BUTTON_ID) == 0) {\r
+ uint8_t index = picker_->GetSelected();\r
+ SettingDisplayModel::GetInstance().SetScreenOffTimeIndex(index);\r
+ NativeAbility::GetInstance().BackToPrevSlicePage();\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingDisplaySteadyOnPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingDisplayModel.h"\r
+#include "settings/page/SettingDisplaySteadyOnPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::DISPLAY_STEADY_ON_PAGE,\r
+ SettingDisplaySteadyOnPage, false);\r
+\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_X = 100;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_TITLE_FSIZE = 38;\r
+static const char* SETTING_DISPLAY_STEADY_TITLE_TEXT = "长亮时刻";\r
+\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_X = 64;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_Y = 118;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_WIDTH = 321;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_HEIGHT = 218;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_FSIZE = 44;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_PICKER_ITEM_HEIGHT = 84;\r
+\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_X = 63;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_Y = 358;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_WIDTH = 328;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_HEIGHT = 94;\r
+static constexpr int16_t SETTING_DISPLAY_STEADY_BUTTON_BG_OPA = 51;\r
+static const char* SETTING_DISPLAY_STEADY_BUTTON_ID = "button";\r
+\r
+void SettingDisplaySteadyOnPage::OnStart(void* data)\r
+{\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplaySteadyOnTimePage::OnStart title_ new fail");\r
+ return;\r
+ }\r
+ title_->SetPosition(SETTING_DISPLAY_STEADY_TITLE_X, SETTING_DISPLAY_STEADY_TITLE_Y);\r
+ title_->Resize(SETTING_DISPLAY_STEADY_TITLE_WIDTH, SETTING_DISPLAY_STEADY_TITLE_HEIGHT);\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_DISPLAY_STEADY_TITLE_FSIZE);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetTextColor(Color::White());\r
+ title_->SetText(SETTING_DISPLAY_STEADY_TITLE_TEXT);\r
+\r
+ picker_ = new UIPicker();\r
+ if (picker_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplaySteadyOnTimePage::OnStart picker_ new fail");\r
+ return;\r
+ }\r
+ picker_->SetPosition(SETTING_DISPLAY_STEADY_PICKER_X, SETTING_DISPLAY_STEADY_PICKER_Y);\r
+ picker_->Resize(SETTING_DISPLAY_STEADY_PICKER_WIDTH, SETTING_DISPLAY_STEADY_PICKER_HEIGHT);\r
+ picker_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ picker_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_STEADY_PICKER_FSIZE);\r
+ picker_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_DISPLAY_STEADY_PICKER_FSIZE);\r
+ picker_->SetItemHeight(SETTING_DISPLAY_STEADY_PICKER_ITEM_HEIGHT);\r
+ picker_->SetTextColor(SETTING_LIST_DEFAULT_BG_COLOR, Color::White());\r
+ picker_->SetIntercept(true);\r
+\r
+ button_ = new UIButton();\r
+ if (button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingDisplaySteadyOnTimePage::OnStart button_ new fail");\r
+ return;\r
+ }\r
+ button_->SetPosition(SETTING_DISPLAY_STEADY_BUTTON_X, SETTING_DISPLAY_STEADY_BUTTON_Y);\r
+ button_->Resize(SETTING_DISPLAY_STEADY_BUTTON_WIDTH, SETTING_DISPLAY_STEADY_BUTTON_HEIGHT);\r
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_DISPLAY_OK, SETTING_IMAGE);\r
+ button_->SetImageSrc(image, image);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_STEADY_BUTTON_BG_OPA, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_OPA, SETTING_DISPLAY_STEADY_BUTTON_BG_OPA, UIButton::PRESSED);\r
+ button_->SetStyleForState(STYLE_IMAGE_OPA, OPA_OPAQUE, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_IMAGE_OPA, OPA_OPAQUE, UIButton::PRESSED);\r
+ button_->SetViewId(SETTING_DISPLAY_STEADY_BUTTON_ID);\r
+ button_->SetOnClickListener(this);\r
+\r
+ AddViewToPageContainer(title_);\r
+ AddViewToPageContainer(picker_);\r
+ AddViewToPageContainer(button_);\r
+}\r
+\r
+void SettingDisplaySteadyOnPage::OnResume()\r
+{\r
+ const char** data = SettingDisplayModel::GetInstance().GetSteadyOnTimeAllStr();\r
+ uint8_t size = SettingDisplayModel::GetInstance().GetSteadyOnTimeAllStrSize();\r
+ uint8_t selectIndex = SettingDisplayModel::GetInstance().GetSteadyOnTimeIndex();\r
+ picker_->SetValues(data, size);\r
+ picker_->SetSelected(selectIndex);\r
+}\r
+\r
+void SettingDisplaySteadyOnPage::OnStop()\r
+{\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+ if (picker_ != nullptr) {\r
+ delete picker_;\r
+ picker_ = nullptr;\r
+ }\r
+ if (button_ != nullptr) {\r
+ delete button_;\r
+ button_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_DISPLAY_OK, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingDisplaySteadyOnPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SETTING_DISPLAY_STEADY_BUTTON_ID) == 0) {\r
+ uint8_t index = picker_->GetSelected();\r
+ SettingDisplayModel::GetInstance().SetSteadyOnTimeIndex(index);\r
+ NativeAbility::GetInstance().BackToPrevSlicePage();\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingMainPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingDesktopModel.h"\r
+#include "settings/page/SettingMainPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::MAIN_PAGE, SettingMainPage, true);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingMainPage *g_pSettingMainPage = nullptr;\r
+\r
+void SettingMainPage::OnStart(void *data)\r
+{\r
+ g_pSettingMainPage = this;\r
+ simpleList_ = new UISimpleList();\r
+ if (simpleList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart simpleList_ new fail");\r
+ return;\r
+ }\r
+ simpleList_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+ simpleList_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ simpleList_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+ simpleList_->SetTouchable(true);\r
+ simpleList_->SetDraggable(true);\r
+ simpleList_->SetThrowDrag(true);\r
+ simpleList_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+ scrollView_ = new UIScrollViewNested();\r
+ if (scrollView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart scrollView_ new fail");\r
+ return;\r
+ }\r
+ scrollView_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scrollView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ scrollView_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ scrollView_->SetThrowDrag(true);\r
+ scrollView_->Add(simpleList_);\r
+ AddViewToPageContainer(scrollView_);\r
+ if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // 滑动跟手返回\r
+ scrollView_->SetOnDragListener(this);\r
+ }\r
+}\r
+\r
+void SettingMainPage::OnResume()\r
+{\r
+ simpleList_->ClearAll();\r
+ for(auto& it : SettingMainModel::GetInstance().GetMainUnionData()) {\r
+ Contents cont;\r
+ cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+ cont.updateFunc = SettingMainPage::OnSimpleListUpdate;\r
+ cont.type = it.GetUnionItemType();\r
+ cont.data = ⁢\r
+ simpleList_->AddContent(cont);\r
+ }\r
+ simpleList_->RefreshList();\r
+}\r
+\r
+void SettingMainPage::OnStop()\r
+{\r
+ g_pSettingMainPage = this;\r
+ if (scrollView_ != nullptr) {\r
+ scrollView_->RemoveAll();\r
+ delete scrollView_;\r
+ scrollView_ = nullptr;\r
+ }\r
+ if (simpleList_ != nullptr) {\r
+ delete simpleList_;\r
+ simpleList_ = nullptr;\r
+ }\r
+}\r
+\r
+bool SettingMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ return false;\r
+}\r
+\r
+bool SettingMainPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ uintptr_t simpleListViewId = (uintptr_t)view.GetViewId();\r
+ if (simpleListViewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+ int16_t viewIndex = view.GetViewIndex();\r
+ auto& mainUnionData = SettingMainModel::GetInstance().GetMainUnionData();\r
+ if (viewIndex < 0 || viewIndex > mainUnionData.size()) {\r
+ return true;\r
+ }\r
+\r
+ SettingUnionItemData& itemData = mainUnionData[viewIndex];\r
+ if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+ NativeAbility::GetInstance().SwitchPageInSlice(data->pageId,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+void SettingMainPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+ PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+ IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingMainPage);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingMainPage);\r
+ }\r
+ return;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPowerPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include <sys/time.h>\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "common/screen.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/common/SettingCommon.h"\r
+#include "settings/model/SettingPowerModel.h"\r
+#include "settings/page/SettingPowerPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::POWER_PAGE, SettingPowerPage, false);\r
+\r
+#define SETTING_POWER_LEVEL_ARRAY_SIZE 10\r
+#define SETTING_VIEW_TEXT_SIZE 16\r
+static constexpr int16_t SETTING_POWER_SCROLL_BLANK = 60;\r
+static constexpr int16_t SETTING_POWER_TITLE_X = 100;\r
+static constexpr int16_t SETTING_POWER_TITLE_Y = 39;\r
+static constexpr int16_t SETTING_POWER_TITLE_WIDTH = 254;\r
+static constexpr int16_t SETTING_POWER_TITLE_HEIGHT = 53;\r
+static constexpr int16_t SETTING_POWER_TITLE_FSIZE = 38;\r
+static const char* SETTING_POWER_TITLE_TEXT = "电量";\r
+\r
+static constexpr int16_t SETTING_POWER_POWERDESC_X = 76;\r
+static constexpr int16_t SETTING_POWER_POWERDESC_Y = 113;\r
+static constexpr int16_t SETTING_POWER_POWERDESC_WIDTH = 193;\r
+static constexpr int16_t SETTING_POWER_POWERDESC_HEIGHT = 55;\r
+static constexpr int16_t SETTING_POWER_POWERDESC_FSIZE = 48;\r
+static const char* SETTING_POWER_POWERDESC_TEXT = "当前电量";\r
+\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_X = 286;\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_Y = 113;\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_WIDTH = 122;\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_HEIGHT = 55;\r
+static constexpr int16_t SETTING_POWER_BATTERYPERCENTAGE_FSIZE = 48;\r
+#define SETTING_POWER_BATTERYPERCENTAGE_COLOR Color::GetColorFromRGB(9, 148, 69)\r
+\r
+static constexpr int16_t SETTING_POWER_TIME_X = 145;\r
+static constexpr int16_t SETTING_POWER_TIME_Y = 172;\r
+static constexpr int16_t SETTING_POWER_TIME_WIDTH = 165;\r
+static constexpr int16_t SETTING_POWER_TIME_HEIGHT = 55;\r
+static constexpr int16_t SETTING_POWER_TIME_FSIZE = 36;\r
+\r
+static constexpr int16_t SETTING_POWER_GROUP_X = 20;\r
+static constexpr int16_t SETTING_POWER_GROUP_Y = 234;\r
+static constexpr int16_t SETTING_POWER_GROUP_WIDTH = 414;\r
+static constexpr int16_t SETTING_POWER_GROUP_HEIGHT = 91;\r
+static constexpr int16_t SETTING_POWER_GROUP_RADIUS = 48;\r
+\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_X = 34;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_Y = 29;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_WIDTH = 128;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_HEIGHT = 38;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_FSIZE = 32;\r
+static const char* SETTING_POWER_GROUP_BATTERY_TEXT = "电池健康";\r
+\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_X = 295;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_Y = 29;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_WIDTH = 84;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_HEIGHT = 38;\r
+static constexpr int16_t SETTING_POWER_GROUP_BATTERY_LEVEL_FSIZE = 32;\r
+\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_X = 59;\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_Y = 365;\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_WIDTH = 336;\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_LINE_HEIGHT = 36;\r
+static constexpr int16_t SETTING_POWER_DETAILSDESC_FSIZE = 24;\r
+\r
+void SettingPowerPage::OnStart(void* data)\r
+{\r
+ scrollView_ = new UIScrollViewNested();\r
+ if (scrollView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::OnStart scrollView_ new fail");\r
+ return;\r
+ }\r
+ scrollView_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scrollView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ scrollView_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ scrollView_->SetScrollBlankSize(SETTING_POWER_SCROLL_BLANK, UIAbstractScroll::Direction::BOTTOM);\r
+ scrollView_->SetThrowDrag(true);\r
+ scrollView_->SetIntercept(true);\r
+ InitPowerView();\r
+ InitBatteryStatusView();\r
+ InitNotify();\r
+ batteryStatusGroup_->Add(batteryLabel_);\r
+ batteryStatusGroup_->Add(batteryLevel_);\r
+ scrollView_->Add(title_);\r
+ scrollView_->Add(powerDesc_);\r
+ scrollView_->Add(batteryPercentage_);\r
+ scrollView_->Add(timeLabel_);\r
+ scrollView_->Add(batteryStatusGroup_);\r
+ scrollView_->Add(detailsDesc_);\r
+ AddViewToPageContainer(scrollView_);\r
+}\r
+\r
+void SettingPowerPage::OnResume()\r
+{\r
+ char tempBuffer[SETTING_POWER_LEVEL_ARRAY_SIZE] = "";\r
+ if (sprintf_s(tempBuffer, sizeof(tempBuffer), "%u%%",\r
+ SettingPowerModel::GetInstance().GetBatteryPowerLevel()) > 0) {\r
+ batteryPercentage_->SetText(tempBuffer);\r
+ batteryLevel_->SetText(tempBuffer);\r
+ }\r
+ detailsDesc_->SetText(SettingPowerModel::GetInstance().GetPowerModelNotify());\r
+ timeAnimator_->Start();\r
+}\r
+\r
+void SettingPowerPage::OnPause()\r
+{\r
+ timeAnimator_->Stop();\r
+}\r
+\r
+void SettingPowerPage::OnStop()\r
+{\r
+ if (scrollView_ != nullptr) {\r
+ scrollView_->RemoveAll();\r
+ delete scrollView_;\r
+ scrollView_ = nullptr;\r
+ }\r
+ if (batteryStatusGroup_ != nullptr) {\r
+ batteryStatusGroup_->RemoveAll();\r
+ delete batteryStatusGroup_;\r
+ batteryStatusGroup_ = nullptr;\r
+ }\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+ if (powerDesc_ != nullptr) {\r
+ delete powerDesc_;\r
+ powerDesc_ = nullptr;\r
+ }\r
+ if (batteryPercentage_ != nullptr) {\r
+ delete batteryPercentage_;\r
+ batteryPercentage_ = nullptr;\r
+ }\r
+ if (timeLabel_ != nullptr) {\r
+ delete timeLabel_;\r
+ timeLabel_ = nullptr;\r
+ }\r
+ if (batteryLabel_ != nullptr) {\r
+ delete batteryLabel_;\r
+ batteryLabel_ = nullptr;\r
+ }\r
+ if (batteryLevel_ != nullptr) {\r
+ delete batteryLevel_;\r
+ batteryLevel_ = nullptr;\r
+ }\r
+ if (detailsDesc_ != nullptr) {\r
+ delete detailsDesc_;\r
+ detailsDesc_ = nullptr;\r
+ }\r
+ if (timeAnimator_ != nullptr) {\r
+ delete timeAnimator_;\r
+ timeAnimator_ = nullptr;\r
+ }\r
+}\r
+\r
+void SettingPowerPage::Callback(UIView* view)\r
+{\r
+ char temp[SETTING_VIEW_TEXT_SIZE];\r
+ time_t seconds = time(nullptr);\r
+ struct tm tm_data;\r
+#if !defined(_WIN32)\r
+ localtime_r(&seconds, &tm_data);\r
+#else\r
+ localtime_s(&tm_data, &seconds);\r
+#endif\r
+ if (sprintf_s(temp, sizeof(temp), "今天%02d:%02d", tm_data.tm_hour, tm_data.tm_min) > 0) {\r
+ ((UILabel*)view)->SetText(temp);\r
+ }\r
+}\r
+\r
+void SettingPowerPage::InitPowerView()\r
+{\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitPowerView title_ new fail");\r
+ return;\r
+ }\r
+ title_->SetPosition(SETTING_POWER_TITLE_X, SETTING_POWER_TITLE_Y);\r
+ title_->Resize(SETTING_POWER_TITLE_WIDTH, SETTING_POWER_TITLE_HEIGHT);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_POWER_TITLE_FSIZE);\r
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title_->SetText(SETTING_POWER_TITLE_TEXT);\r
+\r
+ powerDesc_ = new UILabel();\r
+ if (powerDesc_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitPowerView powerDesc_ new fail");\r
+ return;\r
+ }\r
+ powerDesc_->SetPosition(SETTING_POWER_POWERDESC_X, SETTING_POWER_POWERDESC_Y);\r
+ powerDesc_->Resize(SETTING_POWER_POWERDESC_WIDTH, SETTING_POWER_POWERDESC_HEIGHT);\r
+ powerDesc_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ powerDesc_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_POWERDESC_FSIZE);\r
+ powerDesc_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ powerDesc_->SetText(SETTING_POWER_POWERDESC_TEXT);\r
+\r
+ batteryPercentage_ = new UILabel();\r
+ if (batteryPercentage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitPowerView batteryPercentage_ new fail");\r
+ return;\r
+ }\r
+ batteryPercentage_->SetPosition(SETTING_POWER_BATTERYPERCENTAGE_X, SETTING_POWER_BATTERYPERCENTAGE_Y);\r
+ batteryPercentage_->Resize(SETTING_POWER_BATTERYPERCENTAGE_WIDTH, SETTING_POWER_BATTERYPERCENTAGE_HEIGHT);\r
+ batteryPercentage_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ batteryPercentage_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_BATTERYPERCENTAGE_FSIZE);\r
+ batteryPercentage_->SetStyle(STYLE_TEXT_COLOR, SETTING_POWER_BATTERYPERCENTAGE_COLOR.full);\r
+\r
+ timeLabel_ = new UILabel();\r
+ if (timeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitPowerView timeLabel_ new fail");\r
+ return;\r
+ }\r
+ timeLabel_->SetPosition(SETTING_POWER_TIME_X, SETTING_POWER_TIME_Y);\r
+ timeLabel_->Resize(SETTING_POWER_TIME_WIDTH, SETTING_POWER_TIME_HEIGHT);\r
+ timeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ timeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_TIME_FSIZE);\r
+ timeLabel_->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+}\r
+\r
+void SettingPowerPage::InitBatteryStatusView()\r
+{\r
+ batteryStatusGroup_ = new UIViewGroup();\r
+ if (batteryStatusGroup_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitBatteryStatusView batteryStatusGroup_ new fail");\r
+ return;\r
+ }\r
+ batteryStatusGroup_->SetPosition(SETTING_POWER_GROUP_X, SETTING_POWER_GROUP_Y);\r
+ batteryStatusGroup_->Resize(SETTING_POWER_GROUP_WIDTH, SETTING_POWER_GROUP_HEIGHT);\r
+ batteryStatusGroup_->SetStyle(STYLE_BACKGROUND_COLOR, SETTING_LIST_DEFAULT_BG_COLOR.full);\r
+ batteryStatusGroup_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ batteryStatusGroup_->SetStyle(STYLE_BORDER_RADIUS, SETTING_POWER_GROUP_RADIUS);\r
+\r
+ batteryLabel_ = new UILabel();\r
+ if (batteryLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitBatteryStatusView batteryLabel_ new fail");\r
+ return;\r
+ }\r
+ batteryLabel_->SetPosition(SETTING_POWER_GROUP_BATTERY_X, SETTING_POWER_GROUP_BATTERY_Y);\r
+ batteryLabel_->Resize(SETTING_POWER_GROUP_BATTERY_WIDTH, SETTING_POWER_GROUP_BATTERY_HEIGHT);\r
+ batteryLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ batteryLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_GROUP_BATTERY_FSIZE);\r
+ batteryLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ batteryLabel_->SetText(SETTING_POWER_GROUP_BATTERY_TEXT);\r
+\r
+ batteryLevel_ = new UILabel();\r
+ if (batteryLevel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::InitBatteryStatusView batteryLevel_ new fail");\r
+ return;\r
+ }\r
+ batteryLevel_->SetPosition(SETTING_POWER_GROUP_BATTERY_LEVEL_X, SETTING_POWER_GROUP_BATTERY_LEVEL_Y);\r
+ batteryLevel_->Resize(SETTING_POWER_GROUP_BATTERY_LEVEL_WIDTH, SETTING_POWER_GROUP_BATTERY_LEVEL_HEIGHT);\r
+ batteryLevel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ batteryLevel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_GROUP_BATTERY_LEVEL_FSIZE);\r
+ batteryLevel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+}\r
+\r
+void SettingPowerPage::InitNotify()\r
+{\r
+ detailsDesc_ = new UILabel();\r
+ if (detailsDesc_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::OnStart::batteryPercentage_ new fail");\r
+ return;\r
+ }\r
+ detailsDesc_->SetPosition(SETTING_POWER_DETAILSDESC_X, SETTING_POWER_DETAILSDESC_Y);\r
+ detailsDesc_->Resize(SETTING_POWER_DETAILSDESC_WIDTH, SETTING_POWER_DETAILSDESC_LINE_HEIGHT);\r
+ detailsDesc_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ detailsDesc_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ detailsDesc_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_POWER_DETAILSDESC_FSIZE);\r
+ detailsDesc_->SetStyle(STYLE_LINE_HEIGHT, SETTING_POWER_DETAILSDESC_LINE_HEIGHT);\r
+ detailsDesc_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+ timeAnimator_ = new Animator(this, timeLabel_, 0, true);\r
+ if (timeAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingPowerPage::OnStart::timeAnimator_ new fail");\r
+ return;\r
+ }\r
+}\r
+};
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingQrcodeConnPage
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/common/SettingCommon.h"
+#include "settings/model/SettingQrcodeConnModel.h"
+#include "settings/page/SettingQrcodeConnPage.h"
+
+namespace OHOS {
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::QRCODE_CONN_PAGE, SettingQrcodeConnPage, false);
+static const uint32_t QRCODE_POS_X = 101;
+static const uint32_t QRCODE_POS_Y = 85;
+static const uint32_t QRCODE_WIDTH = 232;
+static const uint32_t QRCODE_HEIGHT = 232;
+static const uint32_t PAD_SIZE = 10;
+static const uint32_t QRCODE_CONTENT_POS_Y = 350;
+static const uint32_t QRCODE_CONTENT_HEIGHT = 50;
+static const uint32_t QRCODE_CONTENT_FONT = 36;
+
+SettingQrcodeConnPage::SettingQrcodeConnPage()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::SettingQrcodeConnPage");
+}
+
+SettingQrcodeConnPage::~SettingQrcodeConnPage()
+{
+ if (group_ != nullptr) {
+ group_->RemoveAll();
+ delete group_;
+ group_ = nullptr;
+ }
+ if (qrcode_ != nullptr) {
+ delete qrcode_;
+ qrcode_ = nullptr;
+ }
+ if (content_ != nullptr) {
+ delete content_;
+ content_ = nullptr;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::~SettingQrcodeConnPage");
+}
+
+void SettingQrcodeConnPage::InitView()
+{
+ group_ = new UIScrollViewNested();
+ if (group_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::InitView::group_ new fail");
+ return;
+ }
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ group_->SetStyle(STYLE_BACKGROUND_OPA, 0);
+
+ qrcode_ = new UIQrcode();
+ if (qrcode_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::InitView::qrcode_ new fail");
+ return;
+ }
+ qrcode_->SetPosition(QRCODE_POS_X, QRCODE_POS_Y, QRCODE_WIDTH, QRCODE_HEIGHT);
+ qrcode_->SetQrcodeInfo(SettingBluetoothModel::GetInstance()->GetWatchName());
+ qrcode_->SetStyle(STYLE_PADDING_LEFT, PAD_SIZE);
+ qrcode_->SetStyle(STYLE_PADDING_RIGHT, PAD_SIZE);
+ qrcode_->SetStyle(STYLE_PADDING_TOP, PAD_SIZE);
+ qrcode_->SetStyle(STYLE_PADDING_BOTTOM, PAD_SIZE);
+ group_->Add(qrcode_);
+
+ content_ = new UILabel();
+ if (content_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::InitView::content_ new fail");
+ return;
+ }
+ content_->SetPosition(0, QRCODE_CONTENT_POS_Y, RESOLUTION_WIDTH, QRCODE_CONTENT_HEIGHT);
+ content_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ content_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, QRCODE_CONTENT_FONT);
+ content_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ content_->SetText("扫码连接设备");
+ group_->Add(content_);
+ AddViewToPageContainer(group_);
+}
+
+void SettingQrcodeConnPage::OnStart(void *data)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingQrcodeConnPage::OnStart");
+ InitView();
+}
+}
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingReconnectSecondConfirm
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "ui_resource_settings.h"
+#include "main/LoadImg.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingReconnectSecondConfirm.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_ADDR2 = 2;
+static constexpr int16_t SETTING_ADDR3 = 3;
+static constexpr int16_t SETTING_ADDR4 = 4;
+static constexpr int16_t SETTING_ADDR5 = 5;
+static constexpr int16_t SETTING_RECO_TITLE_Y = 60;
+static constexpr int16_t SETTING_RECO_TITLE_HEIGHT = 40;
+static constexpr int16_t SETTING_RECO_TITLE_FONT = 38;
+static constexpr int16_t SETTING_RECO_CONTENT1_Y = 135;
+static constexpr int16_t SETTING_RECO_CONTENT2_X = 30;
+static constexpr int16_t SETTING_RECO_CONTENT2_Y = 180;
+static constexpr int16_t SETTING_RECO_CONTENT3_Y = 225;
+static constexpr int16_t SETTING_RECO_CONTENT_Y = 130;
+static constexpr int16_t SETTING_RECO_CONYENT_HEIGHT = 115;
+static constexpr int16_t SETTING_RECO_CONYENT1_HEIGHT = 50;
+static constexpr int16_t SETTING_RECO_CONTENT_FONT = 35;
+static constexpr int16_t SETTING_RECO_CONYENT_WIDTH = 394;
+static constexpr int16_t SETTING_RECO_BTN_WIDTH = 85;
+static constexpr int16_t SETTING_RECO_BTN_Y = 300;
+static constexpr int16_t SETTING_RECO_BTN_X1 = 114;
+static constexpr int16_t SETTING_RECO_BTN_X2 = 254;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+static constexpr char *CANCEL_BUTTON = "cancelButton";
+
+void SettingReconnectSecondConfirm::OnCreateView(void* data)
+{
+ InitSecondConfirmFragment();
+}
+
+void SettingReconnectSecondConfirm::OnDestroyView()
+{
+ fragmentView_.RemoveAll();
+ if (title_ != nullptr) {
+ delete title_;
+ title_ = nullptr;
+ }
+ if (contentFirst_ != nullptr) {
+ delete contentFirst_;
+ contentFirst_ = nullptr;
+ }
+ if (contentSecond_ != nullptr) {
+ delete contentSecond_;
+ contentSecond_ = nullptr;
+ }
+ if (contentThird_ != nullptr) {
+ delete contentThird_;
+ contentThird_ = nullptr;
+ }
+ if (cancel_ != nullptr) {
+ delete cancel_;
+ cancel_ = nullptr;
+ }
+ if (confirm_ != nullptr) {
+ delete confirm_;
+ confirm_ = nullptr;
+ }
+}
+
+void SettingReconnectSecondConfirm::InitSecondConfirmFragment()
+{
+ fragmentView_.SetTouchable(true);
+ fragmentView_.SetDraggable(true);
+ fragmentView_.SetOnDragListener(this);
+
+ title_ = new UILabel();
+ if (title_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment title_ new fail");
+ return;
+ }
+ title_->SetPosition(0, SETTING_RECO_TITLE_Y, RESOLUTION_WIDTH, SETTING_RECO_TITLE_HEIGHT);
+ if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+ title_->SetText("确定断开连接?");
+ } else {
+ title_->SetText("确定重新连接?");
+ }
+
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_RECO_TITLE_FONT);
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ std::string str1 = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ std::string str = "";
+ std::string str2 = "";
+ if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+ str = "此操作将会断开您与";
+ str2 = "以下设备的连接:";
+ } else {
+ str = "此操作您将会与以下";
+ str2 = "设备进行重新连接:";
+ }
+ contentFirst_ = new UILabel();
+ if (contentFirst_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment contentFirst_ new fail");
+ return;
+ }
+ contentFirst_->SetPosition(0, SETTING_RECO_CONTENT1_Y,
+ RESOLUTION_WIDTH, SETTING_RECO_CONYENT1_HEIGHT);
+ contentFirst_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ contentFirst_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_RECO_CONTENT_FONT);
+ contentFirst_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ contentFirst_->SetText(str.c_str());
+
+ contentSecond_ = new UILabel();
+ if (contentSecond_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment contentSecond_ new fail");
+ return;
+ }
+ contentSecond_->SetPosition(SETTING_RECO_CONTENT2_X, SETTING_RECO_CONTENT2_Y,
+ SETTING_RECO_CONYENT_WIDTH, SETTING_RECO_CONYENT1_HEIGHT);
+ contentSecond_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ contentSecond_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_RECO_CONTENT_FONT);
+ contentSecond_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ contentSecond_->SetText(str2.c_str());
+
+ contentThird_ = new UILabel();
+ if (contentThird_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment contentThird_ new fail");
+ return;
+ }
+ contentThird_->SetPosition(0, SETTING_RECO_CONTENT3_Y,
+ RESOLUTION_WIDTH, SETTING_RECO_CONYENT1_HEIGHT);
+ contentThird_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ contentThird_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_RECO_CONTENT_FONT);
+ contentThird_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ contentThird_->SetText(str1.c_str());
+
+ cancel_ = new UIImageView();
+ if (cancel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment cancel_ new fail");
+ return;
+ }
+ LOADIMG::LoadImageViewImg(cancel_, SETTING_IMAGE, IMAGE_CANCEL);
+ cancel_->SetPosition(SETTING_RECO_BTN_X1, SETTING_RECO_BTN_Y, SETTING_RECO_BTN_WIDTH, SETTING_RECO_BTN_WIDTH);
+ cancel_->SetTouchable(true);
+ cancel_->SetViewId(CANCEL_BUTTON);
+ cancel_->SetOnClickListener(this);
+ cancel_->SetVisible(true);
+ confirm_ = new UILabelButton();
+ if (confirm_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitSecondConfirmFragment confirm_ new fail");
+ return;
+ }
+ confirm_->SetPosition(SETTING_RECO_BTN_X2, SETTING_RECO_BTN_Y, SETTING_RECO_BTN_WIDTH, SETTING_RECO_BTN_WIDTH);
+ confirm_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
+ confirm_->SetViewId(CONFIRM_BUTTON);
+ confirm_->SetOnClickListener(this);
+ confirm_->SetVisible(true);
+ LOADIMG::LoadBtnImage(confirm_, SETTING_IMAGE, IMAGE_OK_BLUE, IMAGE_OK_BLUE);
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);
+
+ fragmentView_.Add(title_);
+ fragmentView_.Add(contentFirst_);
+ fragmentView_.Add(contentSecond_);
+ fragmentView_.Add(contentThird_);
+ fragmentView_.Add(cancel_);
+ fragmentView_.Add(confirm_);
+}
+
+bool SettingReconnectSecondConfirm::OnClick(UIView &view, const ClickEvent &event)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingReconnectSecondConfirm OnClick");
+ UNUSED(event);
+ if (strcmp(view.GetViewId(), CANCEL_BUTTON) == 0) {
+ fragmentView_.SetVisible(false);
+ SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+ } else if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+ bd_addr_t addr;
+ BtCaseInfo *info = SettingBluetoothModel::GetInstance()->GetSelectedDeviceInfo();
+ if (memcpy_s(addr.addr, BD_ADDR_LEN, info->addr, BD_ADDR_LEN) != EOK) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s failed");
+ return false;
+ }
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SettingReconnectSecondConfirmPage addr: %02x%02x%02x%02x%02x%02x",
+ addr.addr[SETTING_ADDR5], addr.addr[SETTING_ADDR4], addr.addr[SETTING_ADDR3],
+ addr.addr[SETTING_ADDR2], addr.addr[1], addr.addr[0]);
+ if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+ errcode_t retVal = gap_disconnect_remote_device(&addr); // 断开连接
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Disconnect SelectedDevice retVal = %d", retVal);
+ if (retVal == 0) {
+ SettingBluetoothModel::GetInstance()->UpdateDisconnectStatusForDevice(addr);
+ SettingBluetoothModel::GetInstance()->SetConnectResultPage(false);
+ SettingBluetoothModel::GetInstance()->SetBlueToothConnectStatus(false);
+ }
+ } else {
+ if (SettingBluetoothModel::GetInstance()->ConnectRemoteDevice(&addr) == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "connect SelectedDevice");
+ SettingBluetoothModel::GetInstance()->SetLastConnedAddr(&addr);
+ SettingBluetoothModel::GetInstance()->UpdateConnectStatusForDevice();
+ SettingBluetoothModel::GetInstance()->SetConnectResultPage(true);
+ SettingBluetoothModel::GetInstance()->SetBlueToothConnectStatus(true);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice failed");
+ }
+ }
+ fragmentView_.SetVisible(false);
+ SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+ }
+ return true;
+}
+
+void SettingReconnectSecondConfirm::RefreshFragment()
+{
+ if (contentFirst_ == nullptr || contentSecond_ == nullptr || contentThird_ == nullptr ||
+ title_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+ return;
+ }
+ std::string str1 = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ std::string str = "";
+ std::string str2 = "";
+ bool status = SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus();
+ if (status) {
+ str = "此操作将会断开您与";
+ str2 = "以下设备的连接:";
+ title_->SetText("确定断开连接?");
+ } else {
+ str = "此操作您将会与以下";
+ str2 = "设备进行重新连接:";
+ title_->SetText("确定重新连接?");
+ }
+ contentFirst_->SetText(str.c_str());
+ contentSecond_->SetText(str2.c_str());
+ contentThird_->SetText(str1.c_str());
+}
+
+
+bool SettingReconnectSecondConfirm::OnDragStart(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingReconnectSecondConfirm::OnDrag(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingReconnectSecondConfirm::OnDragEnd(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+}
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingReconnection
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "main/LoadImg.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/page/SettingReconnection.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_WATCH_Y = 105;
+static constexpr int16_t SETTING_WATCH_HEIGHT = 40;
+static constexpr int16_t SETTING_WATCH_FONT = 36;
+static constexpr int16_t SETTING_CONTENT_Y = 155;
+static constexpr int16_t SETTING_CONYENT_HEIGHT = 40;
+static constexpr int16_t SETTING_RECO_X = 111;
+static constexpr int16_t SETTING_RECO1_Y = 230;
+static constexpr int16_t SETTING_RECO2_Y = 321;
+static constexpr int16_t SETTING_RECO_WIDTH = 232;
+static constexpr int16_t SETTING_RECO_HEIGHT = 76;
+static constexpr int16_t SETTING_RECO_FONT = 32;
+static constexpr int16_t SETTING_RECO_BTN_WIDTH = 90;
+static constexpr int16_t SETTING_RECO_BTN_Y = 320;
+static constexpr int16_t SETTING_RECO_BTN_X1 = 85;
+static constexpr int16_t SETTING_RECO_BTN_X2 = 279;
+static constexpr char *RECONNECT_BUTTON = "reconnectionButton";
+static constexpr char *UNPAIR_BUTTON = "unpairButton";
+
+void SettingReconnection::OnCreateView(void* data)
+{
+ InitReconnectionFragment();
+}
+
+void SettingReconnection::OnDestroyView()
+{
+ fragmentView_.RemoveAll();
+ if (watchNameLabel_ != nullptr) {
+ delete watchNameLabel_;
+ watchNameLabel_ = nullptr;
+ }
+ if (connectStatusLabel_ != nullptr) {
+ delete connectStatusLabel_;
+ connectStatusLabel_ = nullptr;
+ }
+ if (reconnectionButton_ != nullptr) {
+ delete reconnectionButton_;
+ reconnectionButton_ = nullptr;
+ }
+ if (unpair_ != nullptr) {
+ delete unpair_;
+ unpair_ = nullptr;
+ }
+}
+
+void SettingReconnection::InitReconnectionFragment()
+{
+ fragmentView_.SetTouchable(true);
+ fragmentView_.SetDraggable(true);
+ fragmentView_.SetOnDragListener(this);
+ watchNameLabel_ = new UILabel();
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitReconnectionFragment watchNameLabel_ new fail");
+ return;
+ }
+ watchNameLabel_->SetPosition(0, SETTING_WATCH_Y, RESOLUTION_WIDTH, SETTING_WATCH_HEIGHT);
+ watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+ watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ watchNameLabel_->SetText(str.c_str());
+
+ connectStatusLabel_ = new UILabel();
+ if (connectStatusLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitReconnectionFragment connectStatusLabel_ new fail");
+ return;
+ }
+ connectStatusLabel_->SetPosition(0, SETTING_CONTENT_Y, RESOLUTION_WIDTH, SETTING_CONYENT_HEIGHT);
+ connectStatusLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ connectStatusLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_WATCH_FONT);
+ connectStatusLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+ connectStatusLabel_->SetText("已连接");
+ } else {
+ connectStatusLabel_->SetText("未连接");
+ }
+
+ reconnectionButton_ = new UILabelButton();
+ if (reconnectionButton_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitReconnectionFragment recButton_ new fail");
+ return;
+ }
+ reconnectionButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);
+ reconnectionButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);
+ reconnectionButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);
+ reconnectionButton_->SetPosition(SETTING_RECO_X, SETTING_RECO1_Y, SETTING_RECO_WIDTH, SETTING_RECO_HEIGHT);
+ if (SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus()) {
+ reconnectionButton_->SetText("断开连接");
+ } else {
+ reconnectionButton_->SetText("重新连接");
+ }
+
+ reconnectionButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_RECO_FONT);
+ reconnectionButton_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ reconnectionButton_->SetViewId(RECONNECT_BUTTON);
+ reconnectionButton_->SetOnClickListener(this);
+ reconnectionButton_->SetVisible(true);
+
+ unpair_ = new UIImageView();
+ if (unpair_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitReconnectionFragment unpair_ new fail");
+ return;
+ }
+ unpair_->SetPosition(SETTING_RECO_X, SETTING_RECO2_Y, SETTING_RECO_WIDTH, SETTING_RECO_HEIGHT);
+ LOADIMG::LoadImageViewImg(unpair_, SETTING_IMAGE, IMAGE_UNPAIR);
+ unpair_->SetTouchable(true);
+ unpair_->SetViewId(UNPAIR_BUTTON);
+ unpair_->SetOnClickListener(this);
+
+ fragmentView_.Add(watchNameLabel_);
+ fragmentView_.Add(connectStatusLabel_);
+ fragmentView_.Add(reconnectionButton_);
+ fragmentView_.Add(unpair_);
+}
+
+void SettingReconnection::RefreshFragment()
+{
+ if (reconnectionButton_ == nullptr || connectStatusLabel_ == nullptr || watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RefreshFragment fail");
+ return;
+ }
+ bool status = SettingBluetoothModel::GetInstance()->GetBlueToothConnectStatus();
+ if (status) {
+ reconnectionButton_->SetText("断开连接");
+ } else {
+ reconnectionButton_->SetText("重新连接");
+ }
+ if (status) {
+ connectStatusLabel_->SetText("已连接");
+ } else {
+ connectStatusLabel_->SetText("未连接");
+ }
+ std::string str = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ watchNameLabel_->SetText(str.c_str());
+}
+
+bool SettingReconnection::OnClick(UIView &view, const ClickEvent &event)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClick");
+ UNUSED(event);
+ if (strcmp(view.GetViewId(), RECONNECT_BUTTON) == 0) {
+ fragmentView_.SetVisible(false);
+ SettingBluetoothPage::GetInstance()->ChangeView(RECONNECT_SECOND_CONFIRM_FRAGMENT);
+ } else if (strcmp(view.GetViewId(), UNPAIR_BUTTON) == 0) {
+ fragmentView_.SetVisible(false);
+ SettingBluetoothPage::GetInstance()->ChangeView(UNPAIR_CONFIRM_FRAGMENT);
+ }
+ return true;
+}
+
+bool SettingReconnection::OnDragStart(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingReconnection::OnDrag(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool SettingReconnection::OnDragEnd(UIView& view, const DragEvent& event)
+{
+ fragmentView_.SetVisible(false);
+ SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+ return true;
+}
+}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemOperationPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingSystemModel.h"\r
+#include "settings/page/SettingSystemOperationPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::SYSTEM_OPERATION_PAGE, SettingSystemOperationPage, false);\r
+\r
+#define SYSTEM_SLIDER_LABEL_TEXT_SIZE 20\r
+#define SETTING_SYSTEM_OPERATION_POWEROFF_FG_COLOR Color::GetColorFromRGB(250, 60, 60) // 0xFA3C3CFF\r
+#define SETTING_SYSTEM_OPERATION_RESTART_FG_COLOR Color::GetColorFromRGB(100, 206, 122) // 0x6ACE7AFF\r
+#define SETTING_SYSTEM_OPERATION_RESUME_FG_COLOR Color::GetColorFromRGB(153, 153, 153) // 0x999999FF\r
+\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_X = 55;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_Y = 135;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_WIDTH = 349;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_HEIGHT = 96;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_RADIUS = 88;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_KNOBWIDTH = 84;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_RANGE_MAX = 349;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_RANGE_MIN = 0;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_START_POINT = 50;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_START_RANG_MAX = 110;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_START_RANG_MIN = 10;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_END_POINT = 299;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_RIGHT_POINT = 249;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDE_BORDER_WIDTH = 16;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDE_FG_OPA = 128;\r
+\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_X = 177;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_Y = 164;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_WIDTH = 192;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_HEIGHT = 38;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_SLIDER_LABEL_FSIZE = 32;\r
+\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_X = 184;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_Y = 294;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_WIDTH = 85;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_HEIGHT = 85;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_RADIUS = 45;\r
+\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_X = 194;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_Y = 394;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_WIDTH = 64;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_HEIGHT = 38;\r
+static constexpr int16_t SETTING_SYSTEM_OPERATION_BUTTON_LABEL_FSIZE = 32;\r
+static const char* SETTING_SYSTEM_OPERATION_BUTTON_LABEL_TEXT = "取消";\r
+\r
+SettingSystemOperationPage::SettingSystemOperationPage()\r
+{\r
+ std::map<std::string, OperationData> tempData = {\r
+ {"关机", {SETTING_SYSTEM_OPERATION_POWEROFF_FG_COLOR, IMAGE_SYSTEM_LIST_POWEROFF}},\r
+ {"重启", {SETTING_SYSTEM_OPERATION_RESTART_FG_COLOR, IMAGE_SYSTEM_LIST_RESTART}},\r
+ {"恢复出厂", {SETTING_SYSTEM_OPERATION_RESUME_FG_COLOR, IMAGE_SYSTEM_LIST_RESUME}},\r
+ };\r
+ operationData_.swap(tempData);\r
+}\r
+\r
+void SettingSystemOperationPage::OnStart(void* data)\r
+{\r
+ operationName_ = static_cast<const char*>(data);\r
+ InitSliderView();\r
+ InitButtonView();\r
+ RefreshSlider();\r
+ AddViewToPageContainer(slider_);\r
+ AddViewToPageContainer(button_);\r
+ AddViewToPageContainer(sliderLabel_);\r
+ AddViewToPageContainer(buttonDescription_);\r
+}\r
+\r
+void SettingSystemOperationPage::OnResume()\r
+{\r
+ GetSlicePageContainer()->SetIntercept(true);\r
+ GetSlicePageContainer()->SetOnDragListener(nullptr); // 取消跟手返回\r
+ if (sliderLabel_ != nullptr) {\r
+ char temp[SYSTEM_SLIDER_LABEL_TEXT_SIZE];\r
+ if (sprintf_s(temp, sizeof(temp), "滑动%s", operationName_.c_str()) > 0) {\r
+ sliderLabel_->SetText(temp);\r
+ }\r
+ }\r
+}\r
+\r
+void SettingSystemOperationPage::OnStop()\r
+{\r
+ if (slider_ != nullptr) {\r
+ delete slider_;\r
+ slider_ = nullptr;\r
+ }\r
+ if (sliderLabel_ != nullptr) {\r
+ delete sliderLabel_;\r
+ sliderLabel_ = nullptr;\r
+ }\r
+ if (button_ != nullptr) {\r
+ delete button_;\r
+ button_ = nullptr;\r
+ }\r
+ if (buttonDescription_ != nullptr) {\r
+ delete buttonDescription_;\r
+ buttonDescription_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(operationData_[operationName_].sliderKnobImage, SETTING_IMAGE);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_SYSTEM_OPERATION_CLOSE, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingSystemOperationPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), "slider") == 0) {\r
+ // Slide的click需要视为无效点击\r
+ slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+ } else if (strcmp(view.GetViewId(), "button") == 0) {\r
+ NativeAbility::GetInstance().BackToPrevSlicePage();\r
+ }\r
+ return true;\r
+}\r
+\r
+void SettingSystemOperationPage::OnChange(int32_t value)\r
+{\r
+ // 若滑动开始的坐标在这个区域则允许滑动\r
+ if (value > SETTING_SYSTEM_OPERATION_SLIDER_START_RANG_MIN &&\r
+ value < SETTING_SYSTEM_OPERATION_SLIDER_START_RANG_MAX) {\r
+ sliderBegin_ = true;\r
+ }\r
+ // 若起点不在指定区域 或 往不允许的滑动区域滑动, 则重置为区域起点\r
+ if (!sliderBegin_ || value < SETTING_SYSTEM_OPERATION_SLIDER_START_POINT) {\r
+ slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+ }\r
+ // 若起点在指定区域, 终点超过允许的滑动区域, 则重置为区域终点\r
+ if (sliderBegin_ && value > SETTING_SYSTEM_OPERATION_SLIDER_END_POINT) {\r
+ slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_END_POINT);\r
+ }\r
+ // 按照滑动坐标修改label的透明度 滑动坐标[50, 299] label透明度[255, 6]\r
+ uint8_t labelOPA = OPA_OPAQUE - (slider_->GetValue() - SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+ sliderLabel_->SetStyle(STYLE_TEXT_OPA, labelOPA);\r
+}\r
+\r
+void SettingSystemOperationPage::OnRelease(int32_t value)\r
+{\r
+ if (sliderBegin_ && value > SETTING_SYSTEM_OPERATION_SLIDER_RIGHT_POINT) {\r
+ SettingSystemModel::GetInstance().SystemOperation(operationName_.c_str());\r
+ }\r
+ slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+ sliderLabel_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sliderBegin_ = false;\r
+}\r
+\r
+void SettingSystemOperationPage::InitSliderView()\r
+{\r
+ slider_ = new UISlider();\r
+ if (slider_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOperationPage::InitSliderView slider_ new fail");\r
+ return;\r
+ }\r
+ slider_->SetPosition(SETTING_SYSTEM_OPERATION_SLIDER_X, SETTING_SYSTEM_OPERATION_SLIDER_Y);\r
+ slider_->Resize(SETTING_SYSTEM_OPERATION_SLIDER_WIDTH, SETTING_SYSTEM_OPERATION_SLIDER_HEIGHT);\r
+ slider_->SetViewId("slider");\r
+ slider_->SetSliderRadius(SETTING_SYSTEM_OPERATION_SLIDER_RADIUS, SETTING_SYSTEM_OPERATION_SLIDER_RADIUS);\r
+ slider_->SetKnobWidth(SETTING_SYSTEM_OPERATION_SLIDER_KNOBWIDTH);\r
+ slider_->SetRange(SETTING_SYSTEM_OPERATION_SLIDER_RANGE_MAX, SETTING_SYSTEM_OPERATION_SLIDER_RANGE_MIN);\r
+ slider_->SetValue(SETTING_SYSTEM_OPERATION_SLIDER_START_POINT);\r
+ slider_->SetSliderEventListener(this);\r
+ slider_->SetOnClickListener(this);\r
+ slider_->SetIntercept(true);\r
+\r
+ sliderLabel_ = new UILabel();\r
+ if (sliderLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOperationPage::InitSliderView sliderlabel new fail");\r
+ return;\r
+ }\r
+ sliderLabel_->SetPosition(SETTING_SYSTEM_OPERATION_SLIDER_LABEL_X, SETTING_SYSTEM_OPERATION_SLIDER_LABEL_Y);\r
+ sliderLabel_->Resize(SETTING_SYSTEM_OPERATION_SLIDER_LABEL_WIDTH, SETTING_SYSTEM_OPERATION_SLIDER_LABEL_HEIGHT);\r
+ sliderLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ sliderLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYSTEM_OPERATION_SLIDER_LABEL_FSIZE);\r
+ sliderLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sliderLabel_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sliderLabel_->SetStyle(STYLE_BACKGROUND_COLOR, SETTING_LIST_DEFAULT_BG_COLOR.full);\r
+}\r
+\r
+void SettingSystemOperationPage::InitButtonView()\r
+{\r
+ button_ = new UIButton();\r
+ if (button_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOperationPage::InitButtonView button_ new fail");\r
+ return;\r
+ }\r
+ button_->SetPosition(SETTING_SYSTEM_OPERATION_BUTTON_X, SETTING_SYSTEM_OPERATION_BUTTON_Y);\r
+ button_->Resize(SETTING_SYSTEM_OPERATION_BUTTON_WIDTH, SETTING_SYSTEM_OPERATION_BUTTON_HEIGHT);\r
+ button_->SetViewId("button");\r
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SYSTEM_OPERATION_CLOSE, SETTING_IMAGE);\r
+ button_->SetImageSrc(image, image);\r
+ button_->SetStyle(STYLE_BORDER_RADIUS, SETTING_SYSTEM_OPERATION_BUTTON_RADIUS);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ button_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ button_->SetOnClickListener(this);\r
+\r
+ buttonDescription_ = new UILabel();\r
+ if (buttonDescription_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOperationPage::InitButtonView buttonlabel new fail");\r
+ return;\r
+ }\r
+ buttonDescription_->SetPosition(SETTING_SYSTEM_OPERATION_BUTTON_LABEL_X, SETTING_SYSTEM_OPERATION_BUTTON_LABEL_Y);\r
+ buttonDescription_->Resize(SETTING_SYSTEM_OPERATION_BUTTON_LABEL_WIDTH, SETTING_SYSTEM_OPERATION_BUTTON_LABEL_HEIGHT);\r
+ buttonDescription_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ buttonDescription_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYSTEM_OPERATION_BUTTON_LABEL_FSIZE);\r
+ buttonDescription_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ buttonDescription_->SetText(SETTING_SYSTEM_OPERATION_BUTTON_LABEL_TEXT);\r
+}\r
+\r
+void SettingSystemOperationPage::RefreshSlider()\r
+{\r
+ slider_->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, SETTING_LIST_DEFAULT_BG_COLOR.full);\r
+ slider_->SetForegroundStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ slider_->SetBackgroundStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ slider_->SetForegroundStyle(STYLE_BORDER_OPA, OPA_TRANSPARENT);\r
+ slider_->SetForegroundStyle(STYLE_BORDER_WIDTH, SETTING_SYSTEM_OPERATION_SLIDE_BORDER_WIDTH);\r
+ slider_->SetForegroundStyle(STYLE_BACKGROUND_OPA, SETTING_SYSTEM_OPERATION_SLIDE_FG_OPA);\r
+\r
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ operationData_[operationName_].sliderKnobImage, SETTING_IMAGE);\r
+ slider_->SetKnobImage(image);\r
+ slider_->SetForegroundStyle(STYLE_BACKGROUND_COLOR, operationData_[operationName_].sliderBgColor.full);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemOtaPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingSystemModel.h"\r
+#include "settings/page/SettingSystemOtaPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::SYSTEM_OTA_PAGE, SettingSystemOtaPage, false);\r
+\r
+#define SETTING_MID_UPGRADE_LABEL_TEXT_SIZE 4\r
+#define SETTING_SYS_OTA_MIDPRORESS_BG_LINE_COLOR Color::GetColorFromRGB(217, 217, 217)\r
+#define SETTING_SYS_OTA_MIDPRORESS_FG_LINE_COLOR Color::GetColorFromRGB(68, 132, 255)\r
+static constexpr int16_t SETTING_SYS_OTA_MAX_PERCENTER = 100;\r
+static constexpr int16_t SETTING_SYS_OTA_PREBUTTON_X = 154;\r
+static constexpr int16_t SETTING_SYS_OTA_PREBUTTON_Y = 130;\r
+static constexpr int16_t SETTING_SYS_OTA_PREBUTTON_WIDTH = 146;\r
+static constexpr int16_t SETTING_SYS_OTA_PREBUTTON_HEIGHT = 146;\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_X = 20;\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_Y = 326;\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_WIDTH = 414;\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_HEIGHT = 44;\r
+static constexpr int16_t SETTING_SYS_OTA_PRELABEL_FSIZE = 36;\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_X = 89;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_Y = 92;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_WIDTH = 276;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_HEIGHT = 276;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_LINEWIDTH = 20;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_CENTPOS_X = 138;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_CENTPOS_Y = 138;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPRORESS_RADUIS = 138;\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_X = 160;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_Y = 163;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_WIDTH = 102;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_HEIGHT = 72;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDLABEL_FSIZE = 60;\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_X = 160+102;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_Y = 187;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_WIDTH = 32;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_HEIGHT = 40;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDPERCENT_FSIZE = 36;\r
+static const char* SETTING_SYS_OTA_MIDPERCENT_TEXT = "%";\r
+\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_X = 15;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_Y = 246;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_WIDTH = 424;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_HEIGHT = 44;\r
+static constexpr int16_t SETTING_SYS_OTA_MIDMESSAGE_FSIZE = 36;\r
+\r
+void SettingSystemOtaPage::OnStart(void* data)\r
+{\r
+ InitPreGroupView();\r
+ InitMidCircleView();\r
+ InitMidMessageView();\r
+ preUpgradeGroup_->Add(preUpgradeButton_);\r
+ preUpgradeGroup_->Add(preUpgradeLabel_);\r
+ midUpgradeGroup_->Add(midUpgradeProress_);\r
+ midUpgradeGroup_->Add(midUpgradeLabel_);\r
+ midUpgradeGroup_->Add(midUpgradePercent_);\r
+ midUpgradeGroup_->Add(midUpgradeMessage_);\r
+ AddViewToPageContainer(preUpgradeGroup_);\r
+ AddViewToPageContainer(midUpgradeGroup_);\r
+}\r
+\r
+void SettingSystemOtaPage::OnResume()\r
+{\r
+ // 判断是否正在升级中\r
+ if (!SettingSystemModel::GetInstance().GetOtaIsUpgrade()) {\r
+ preUpgradeGroup_->SetVisible(true);\r
+ midUpgradeGroup_->SetVisible(false);\r
+ // 检查OTA升级包是否存在\r
+ if (SettingSystemModel::GetInstance().GetOtaPackageSize() != 0) {\r
+ preUpgradeButton_->Enable();\r
+ ImageInfo* image =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SYSTEM_OTA_UPDATE, SETTING_IMAGE);\r
+ preUpgradeButton_->SetImageSrc(image, image);\r
+ preUpgradeLabel_->SetText("点击开始升级");\r
+ preUpgradeButton_->SetOnClickListener(this);\r
+ } else {\r
+ ImageInfo* image =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SYSTEM_OTA_UNUPDATE, SETTING_IMAGE);\r
+ preUpgradeButton_->Disable();\r
+ preUpgradeButton_->SetImageSrc(image, image);\r
+ preUpgradeLabel_->SetText("暂无可升级镜像");\r
+ preUpgradeButton_->SetOnClickListener(nullptr);\r
+ }\r
+ } else {\r
+ preUpgradeGroup_->SetVisible(false);\r
+ midUpgradeGroup_->SetVisible(true);\r
+ upgradeAnimator_->Start();\r
+ }\r
+}\r
+\r
+void SettingSystemOtaPage::OnPause()\r
+{\r
+ upgradeAnimator_->Stop();\r
+}\r
+\r
+void SettingSystemOtaPage::OnStop()\r
+{\r
+ if (upgradeAnimator_ != nullptr) {\r
+ delete upgradeAnimator_;\r
+ upgradeAnimator_ = nullptr;\r
+ }\r
+ if (preUpgradeGroup_ != nullptr) {\r
+ preUpgradeGroup_->RemoveAll();\r
+ delete preUpgradeGroup_;\r
+ preUpgradeGroup_ = nullptr;\r
+ }\r
+ if (midUpgradeGroup_ != nullptr) {\r
+ midUpgradeGroup_->RemoveAll();\r
+ delete midUpgradeGroup_;\r
+ midUpgradeGroup_ = nullptr;\r
+ }\r
+ if (preUpgradeButton_ != nullptr) {\r
+ delete preUpgradeButton_;\r
+ preUpgradeButton_ = nullptr;\r
+ }\r
+ if (preUpgradeLabel_ != nullptr) {\r
+ delete preUpgradeLabel_;\r
+ preUpgradeLabel_ = nullptr;\r
+ }\r
+ if (midUpgradeProress_ != nullptr) {\r
+ delete midUpgradeProress_;\r
+ midUpgradeProress_ = nullptr;\r
+ }\r
+ if (midUpgradeLabel_ != nullptr) {\r
+ delete midUpgradeLabel_;\r
+ midUpgradeLabel_ = nullptr;\r
+ }\r
+ if (midUpgradePercent_ != nullptr) {\r
+ delete midUpgradePercent_;\r
+ midUpgradePercent_ = nullptr;\r
+ }\r
+ if (midUpgradeMessage_ != nullptr) {\r
+ delete midUpgradeMessage_;\r
+ midUpgradeMessage_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_SYSTEM_OTA_UPDATE, SETTING_IMAGE);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(IMAGE_SYSTEM_OTA_UNUPDATE, SETTING_IMAGE);\r
+}\r
+\r
+bool SettingSystemOtaPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ preUpgradeGroup_->SetVisible(false);\r
+ midUpgradeGroup_->SetVisible(true);\r
+ SettingSystemModel::GetInstance().StartOtaNativeUpgrade();\r
+ upgradeAnimator_->Start();\r
+ return true;\r
+}\r
+\r
+void SettingSystemOtaPage::Callback(UIView* view)\r
+{\r
+ char temp[SETTING_MID_UPGRADE_LABEL_TEXT_SIZE] = "";\r
+ uint8_t percent = SettingSystemModel::GetInstance().GetOtaNativeUpgradePercent();\r
+ std::string message = SettingSystemModel::GetInstance().GetOtaNativeUpgradeMessage();\r
+ if (sprintf_s(temp, sizeof(temp), "%u", percent) > 0) {\r
+ midUpgradeLabel_->SetText(temp);\r
+ }\r
+ midUpgradeProress_->SetValue(percent);\r
+ midUpgradeMessage_->SetText(message.c_str());\r
+ if (percent >= SETTING_SYS_OTA_MAX_PERCENTER || !SettingSystemModel::GetInstance().GetOtaIsUpgrade()) {\r
+ upgradeAnimator_->Stop();\r
+ }\r
+}\r
+\r
+void SettingSystemOtaPage::InitPreGroupView()\r
+{\r
+ upgradeAnimator_ = new Animator(this, nullptr, 0, true);\r
+ if (upgradeAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitPreGroupView upgradeAnimator_ new fail");\r
+ return;\r
+ }\r
+ preUpgradeGroup_ = new UIViewGroup();\r
+ if (preUpgradeGroup_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitPreGroupView preUpgradeGroup_ new fail");\r
+ return;\r
+ }\r
+ preUpgradeGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ preUpgradeGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ preUpgradeGroup_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+\r
+ preUpgradeButton_ = new UIButton();\r
+ if (preUpgradeButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitPreGroupView preUpgradeButton_ new fail");\r
+ return;\r
+ }\r
+ preUpgradeButton_->SetPosition(SETTING_SYS_OTA_PREBUTTON_X, SETTING_SYS_OTA_PREBUTTON_Y);\r
+ preUpgradeButton_->Resize(SETTING_SYS_OTA_PREBUTTON_WIDTH, SETTING_SYS_OTA_PREBUTTON_WIDTH);\r
+ preUpgradeButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ preUpgradeButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+\r
+ preUpgradeLabel_ = new UILabel();\r
+ if (preUpgradeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitPreGroupView preUpgradeLabel_ new fail");\r
+ return;\r
+ }\r
+ preUpgradeLabel_->SetPosition(SETTING_SYS_OTA_PRELABEL_X, SETTING_SYS_OTA_PRELABEL_Y);\r
+ preUpgradeLabel_->Resize(SETTING_SYS_OTA_PRELABEL_WIDTH, SETTING_SYS_OTA_PRELABEL_HEIGHT);\r
+ preUpgradeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ preUpgradeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYS_OTA_PRELABEL_FSIZE);\r
+ preUpgradeLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+}\r
+\r
+void SettingSystemOtaPage::InitMidCircleView()\r
+{\r
+ midUpgradeGroup_ = new UIViewGroup();\r
+ if (midUpgradeGroup_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidCircleView midUpgradeGroup_ new fail");\r
+ return;\r
+ }\r
+ midUpgradeGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ midUpgradeGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ midUpgradeGroup_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+\r
+ midUpgradeProress_ = new UICircleProgress();\r
+ if (midUpgradeProress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidCircleView preUpgradeButton_ new fail");\r
+ return;\r
+ }\r
+ midUpgradeProress_->SetPosition(SETTING_SYS_OTA_MIDPRORESS_X, SETTING_SYS_OTA_MIDPRORESS_Y);\r
+ midUpgradeProress_->Resize(SETTING_SYS_OTA_MIDPRORESS_WIDTH, SETTING_SYS_OTA_MIDPRORESS_HEIGHT);\r
+ midUpgradeProress_->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ midUpgradeProress_->SetBackgroundStyle(STYLE_LINE_COLOR, SETTING_SYS_OTA_MIDPRORESS_BG_LINE_COLOR.full);\r
+ midUpgradeProress_->SetBackgroundStyle(STYLE_LINE_WIDTH, SETTING_SYS_OTA_MIDPRORESS_LINEWIDTH);\r
+ midUpgradeProress_->SetForegroundStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ midUpgradeProress_->SetForegroundStyle(STYLE_LINE_COLOR, SETTING_SYS_OTA_MIDPRORESS_FG_LINE_COLOR.full);\r
+ midUpgradeProress_->SetForegroundStyle(STYLE_LINE_WIDTH, SETTING_SYS_OTA_MIDPRORESS_LINEWIDTH);\r
+ midUpgradeProress_->SetCenterPosition(SETTING_SYS_OTA_MIDPRORESS_CENTPOS_X, SETTING_SYS_OTA_MIDPRORESS_CENTPOS_Y);\r
+ midUpgradeProress_->SetRadius(SETTING_SYS_OTA_MIDPRORESS_RADUIS);\r
+}\r
+\r
+void SettingSystemOtaPage::InitMidMessageView()\r
+{\r
+ midUpgradeLabel_ = new UILabel();\r
+ if (midUpgradeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidMessageView preUpgradeLabel_ new fail");\r
+ return;\r
+ }\r
+ midUpgradeLabel_->SetPosition(SETTING_SYS_OTA_MIDLABEL_X, SETTING_SYS_OTA_MIDLABEL_Y);\r
+ midUpgradeLabel_->Resize(SETTING_SYS_OTA_MIDLABEL_WIDTH, SETTING_SYS_OTA_MIDLABEL_HEIGHT);\r
+ midUpgradeLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ midUpgradeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYS_OTA_MIDLABEL_FSIZE);\r
+ midUpgradeLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+ midUpgradePercent_ = new UILabel();\r
+ if (midUpgradePercent_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidMessageView midUpgradePercent_ new fail");\r
+ return;\r
+ }\r
+ midUpgradePercent_->SetPosition(SETTING_SYS_OTA_MIDPERCENT_X, SETTING_SYS_OTA_MIDPERCENT_Y);\r
+ midUpgradePercent_->Resize(SETTING_SYS_OTA_MIDPERCENT_WIDTH, SETTING_SYS_OTA_MIDPERCENT_HEIGHT);\r
+ midUpgradePercent_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ midUpgradePercent_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYS_OTA_MIDPERCENT_FSIZE);\r
+ midUpgradePercent_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ midUpgradePercent_->SetText("%");\r
+\r
+ midUpgradeMessage_ = new UILabel();\r
+ if (midUpgradeMessage_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemOtaPage::InitMidMessageView midUpgradeMessage_ new fail");\r
+ return;\r
+ }\r
+ midUpgradeMessage_->SetPosition(SETTING_SYS_OTA_MIDMESSAGE_X, SETTING_SYS_OTA_MIDMESSAGE_Y);\r
+ midUpgradeMessage_->Resize(SETTING_SYS_OTA_MIDMESSAGE_WIDTH, SETTING_SYS_OTA_MIDMESSAGE_HEIGHT);\r
+ midUpgradeMessage_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ midUpgradeMessage_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_SYS_OTA_MIDMESSAGE_FSIZE);\r
+ midUpgradeMessage_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingSystemPage\r
+ * Create: 2025-06-01\r
+ */\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "NativeAbility.h"\r
+#include "settings/model/SettingMainModel.h"\r
+#include "settings/model/SettingSystemModel.h"\r
+#include "settings/page/SettingSystemPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_SETTING, SettingPageId::SYSTEM_PAGE, SettingSystemPage, false);\r
+\r
+static constexpr int16_t SETTING_LIST_POSITION_X = 14;\r
+static constexpr int16_t SETTING_LIST_WIDTH = 426;\r
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 96;\r
+static constexpr int16 MAX_SCR_DIS = 1000;\r
+static constexpr int16 SNUM_2 = 2;\r
+static SettingSystemPage *g_pSettingSystemPage = nullptr;\r
+\r
+void SettingSystemPage::OnStart(void* data)\r
+{\r
+ g_pSettingSystemPage = this;\r
+ content_ = new UISimpleList();\r
+ if (content_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemPage::OnStart content_ new fail");\r
+ return;\r
+ }\r
+ content_->SetPosition(SETTING_LIST_POSITION_X, 0, SETTING_LIST_WIDTH, HORIZONTAL_RESOLUTION);\r
+ content_->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ content_->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2);\r
+ content_->SetDraggable(true);\r
+ content_->SetThrowDrag(true);\r
+ content_->SetMaxScrollDistance(MAX_SCR_DIS);\r
+\r
+ scroll_ = new UIScrollViewNested();\r
+ if (scroll_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingSystemPage::OnStart scroll_ new fail");\r
+ return;\r
+ }\r
+ scroll_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ scroll_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ scroll_->SetThrowDrag(true);\r
+ scroll_->SetIntercept(true);\r
+ scroll_->Add(content_);\r
+ AddViewToPageContainer(scroll_);\r
+}\r
+\r
+void SettingSystemPage::OnResume()\r
+{\r
+ content_->ClearAll();\r
+ for(auto& it : SettingSystemModel::GetInstance().GetSystemUnionData()) {\r
+ Contents cont;\r
+ cont.createFunc = SettingMainModel::OnSimpleListCreate;\r
+ cont.updateFunc = SettingSystemPage::OnSimpleListUpdate;\r
+ cont.type = it.GetUnionItemType();\r
+ cont.data = ⁢\r
+ content_->AddContent(cont);\r
+ }\r
+ content_->RefreshList();\r
+}\r
+\r
+void SettingSystemPage::OnStop()\r
+{\r
+ g_pSettingSystemPage = nullptr;\r
+ if (scroll_ != nullptr) {\r
+ scroll_->RemoveAll();\r
+ delete scroll_;\r
+ scroll_ = nullptr;\r
+ }\r
+ if (content_ != nullptr) {\r
+ delete content_;\r
+ content_ = nullptr;\r
+ }\r
+}\r
+\r
+bool SettingSystemPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ uintptr_t viewId = (uintptr_t)view.GetViewId();\r
+ if (viewId == (uintptr_t)ICON_TEXT_NAVIGATION) {\r
+ int16_t viewIndex = view.GetViewIndex();\r
+ auto& sysUnionData = SettingSystemModel::GetInstance().GetSystemUnionData();\r
+ if (viewIndex < 0 || viewIndex > sysUnionData.size()) {\r
+ return true;\r
+ }\r
+\r
+ SettingUnionItemData& itemData = sysUnionData[viewIndex];\r
+ if (itemData.GetUnionItemType() == ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemData* data = static_cast<IconTextNavigationItemData*>(itemData.GetUnionItemData());\r
+ NativeAbility::GetInstance().SwitchPageInSlice(data->pageId, TransitionType::TRANSITION_INVALID,\r
+ true, (void*)data->textContent, strlen(data->textContent) + 1);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+void SettingSystemPage::OnSimpleListUpdate(UIView* view, void* data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ if (type == SettingUnionItemType::PLAIN_TEXT) {\r
+ PlainTextItemView *itemGroup = dynamic_cast<PlainTextItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ PlainTextItemData* itemData = static_cast<PlainTextItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_TOGGLE) {\r
+ IconTextToggleItemView *itemGroup = dynamic_cast<IconTextToggleItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextToggleItemData* itemData = static_cast<IconTextToggleItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingSystemPage);\r
+ } else if(type == SettingUnionItemType::ICON_TEXT_NAVIGATION) {\r
+ IconTextNavigationItemView *itemGroup = dynamic_cast<IconTextNavigationItemView*>(view);\r
+ if (itemGroup == nullptr) {\r
+ return;\r
+ }\r
+ IconTextNavigationItemData* itemData = static_cast<IconTextNavigationItemData*>(data);\r
+ itemGroup->UpdateViewData(itemData);\r
+ itemGroup->SetOnClickListener(g_pSettingSystemPage);\r
+ }\r
+ return;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: UnPairSecondConfirm
+ * Created: 2025-06-05
+ */
+
+#include "wearable_log.h"
+#include "SlicePageFactory.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
+#include "ui_resource_settings.h"
+#include "main/LoadImg.h"
+#include "settings/page/SettingBluetoothPage.h"
+#include "settings/model/SettingBluetoothModel.h"
+#include "settings/page/UnPairSecondConfirm.h"
+
+namespace OHOS {
+static constexpr int16_t SETTING_ADDR2 = 2;
+static constexpr int16_t SETTING_ADDR3 = 3;
+static constexpr int16_t SETTING_ADDR4 = 4;
+static constexpr int16_t SETTING_ADDR5 = 5;
+static constexpr int16_t SETTING_UNPAIR_TITLE_Y = 60;
+static constexpr int16_t SETTING_UNPAIR_TITLE_HEIGHT = 40;
+static constexpr int16_t SETTING_UNPAIR_TITLE_FONT = 38;
+static constexpr int16_t SETTING_UNPAIR_CONTENT1_X = 30;
+static constexpr int16_t SETTING_UNPAIR_CONTENT1_Y = 135;
+static constexpr int16_t SETTING_UNPAIR_CONTENT2_Y = 180;
+static constexpr int16_t SETTING_UNPAIR_CONTENT3_Y = 225;
+static constexpr int16_t SETTING_UNPAIR_CONYENT_WIDTH = 394;
+static constexpr int16_t SETTING_UNPAIR_CONYENT_HEIGHT = 50;
+static constexpr int16_t SETTING_UNPAIR_CONTENT2_HEIGHT = 115;
+static constexpr int16_t SETTING_UNPAIR_CONTENT1_FONT = 35;
+static constexpr int16_t SETTING_UNPAIR_BTN_WIDTH = 85;
+static constexpr int16_t SETTING_UNPAIR_CANCEL_Y = 300;
+static constexpr int16_t SETTING_UNPAIR_CANCEL_X = 114;
+static constexpr int16_t SETTING_UNPAIR_CONFIRM_X = 254;
+static constexpr char *CONFIRM_BUTTON = "confirmButton";
+static constexpr char *CANCEL_BUTTON = "cancelButton";
+
+void UnPairSecondConfirm::OnCreateView(void* data)
+{
+ InitUnpairFragment();
+}
+
+void UnPairSecondConfirm::OnDestroyView()
+{
+ fragmentView_.RemoveAll();
+ if (title_ != nullptr) {
+ delete title_;
+ title_ = nullptr;
+ }
+ if (contentFirst_ != nullptr) {
+ delete contentFirst_;
+ contentFirst_ = nullptr;
+ }
+ if (contentSecond_ != nullptr) {
+ delete contentSecond_;
+ contentSecond_ = nullptr;
+ }
+ if (watchNameLabel_ != nullptr) {
+ delete watchNameLabel_;
+ watchNameLabel_ = nullptr;
+ }
+ if (cancel_ != nullptr) {
+ delete cancel_;
+ cancel_ = nullptr;
+ }
+ if (confirm_ != nullptr) {
+ delete confirm_;
+ confirm_ = nullptr;
+ }
+}
+
+void UnPairSecondConfirm::InitUnpairFragment()
+{
+ fragmentView_.SetTouchable(true);
+ fragmentView_.SetDraggable(true);
+ fragmentView_.SetOnDragListener(this);
+ title_ = new UILabel();
+ if (title_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment title_ new fail");
+ return;
+ }
+ title_->SetPosition(0, SETTING_UNPAIR_TITLE_Y, RESOLUTION_WIDTH, SETTING_UNPAIR_TITLE_HEIGHT);
+ title_->SetText("确定取消配对?");
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_UNPAIR_TITLE_FONT);
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ std::string str1 = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ std::string str = "此操作将会取消您与";
+ std::string str2 = "以下设备的配对:";
+ contentFirst_ = new UILabel();
+ if (contentFirst_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment contentFirst_ new fail");
+ return;
+ }
+ contentFirst_->SetPosition(0, SETTING_UNPAIR_CONTENT1_Y,
+ RESOLUTION_WIDTH, SETTING_UNPAIR_CONYENT_HEIGHT);
+ contentFirst_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ contentFirst_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_CONTENT1_FONT);
+ contentFirst_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ contentFirst_->SetText(str.c_str());
+
+ contentSecond_ = new UILabel();
+ if (contentSecond_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment contentSecond_ new fail");
+ return;
+ }
+ contentSecond_->SetPosition(SETTING_UNPAIR_CONTENT1_X, SETTING_UNPAIR_CONTENT2_Y,
+ SETTING_UNPAIR_CONYENT_WIDTH, SETTING_UNPAIR_CONYENT_HEIGHT);
+ contentSecond_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ contentSecond_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_CONTENT1_FONT);
+ contentSecond_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ contentSecond_->SetText(str2.c_str());
+
+ watchNameLabel_ = new UILabel();
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment watchNameLabel_ new fail");
+ return;
+ }
+ watchNameLabel_->SetPosition(0, SETTING_UNPAIR_CONTENT3_Y,
+ RESOLUTION_WIDTH, SETTING_UNPAIR_CONYENT_HEIGHT);
+ watchNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ watchNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_UNPAIR_CONTENT1_FONT);
+ watchNameLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ watchNameLabel_->SetText(str1.c_str());
+
+ cancel_ = new UIImageView();
+ if (cancel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment cancel_ new fail");
+ return;
+ }
+ LOADIMG::LoadImageViewImg(cancel_, SETTING_IMAGE, IMAGE_CANCEL);
+ cancel_->SetPosition(SETTING_UNPAIR_CANCEL_X,
+ SETTING_UNPAIR_CANCEL_Y, SETTING_UNPAIR_BTN_WIDTH, SETTING_UNPAIR_BTN_WIDTH);
+ cancel_->SetTouchable(true);
+ cancel_->SetViewId(CANCEL_BUTTON);
+ cancel_->SetOnClickListener(this);
+ cancel_->SetVisible(true);
+ confirm_ = new UILabelButton();
+ if (confirm_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::InitUnpairFragment confirm_ new fail");
+ return;
+ }
+ confirm_->SetPosition(SETTING_UNPAIR_CONFIRM_X,
+ SETTING_UNPAIR_CANCEL_Y, SETTING_UNPAIR_BTN_WIDTH, SETTING_UNPAIR_BTN_WIDTH);
+ confirm_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
+ confirm_->SetViewId(CONFIRM_BUTTON);
+ confirm_->SetOnClickListener(this);
+ confirm_->SetVisible(true);
+ LOADIMG::LoadBtnImage(confirm_, SETTING_IMAGE, IMAGE_OK_BLUE, IMAGE_OK_BLUE);
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::PRESSED);
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::RELEASED);
+ confirm_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Blue().full, UIButton::INACTIVE);
+
+ fragmentView_.Add(title_);
+ fragmentView_.Add(contentFirst_);
+ fragmentView_.Add(contentSecond_);
+ fragmentView_.Add(watchNameLabel_);
+ fragmentView_.Add(cancel_);
+ fragmentView_.Add(confirm_);
+}
+
+void UnPairSecondConfirm::RefreshFragment()
+{
+ if (watchNameLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::RefreshFragment fail");
+ return;
+ }
+ std::string str1 = SettingBluetoothModel::GetInstance()->GetDeviceName();
+ watchNameLabel_->SetText(str1.c_str());
+}
+
+bool UnPairSecondConfirm::OnClick(UIView &view, const ClickEvent &event)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UnPairSecondConfirm::OnClick");
+ UNUSED(event);
+ if (strcmp(view.GetViewId(), CANCEL_BUTTON) == 0) {
+ // 此处仅退出页面,耳机仍存在,需要通知主页面 此时存在耳机列表,蓝牙主页通过该变量做出对应的显示
+ fragmentView_.SetVisible(false);
+ SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+ } else if (strcmp(view.GetViewId(), CONFIRM_BUTTON) == 0) {
+ SettingBluetoothModel::GetInstance()->HandleUnpairRequest();
+ bd_addr_t clickAddr;
+ (void)memcpy_s(clickAddr.addr, BD_ADDR_LEN,
+ SettingBluetoothModel::GetInstance()->GetSelectedDeviceInfo()->addr, BD_ADDR_LEN);
+ std::list<BtCaseInfo> &bluetoothCaseList = SettingBluetoothModel::GetInstance()->GetScansDevicesList();
+ for (auto it = bluetoothCaseList.begin(); it != bluetoothCaseList.end(); it++) {
+ if ((clickAddr.addr[0] == it->addr[0]) && (clickAddr.addr[1] == it->addr[1])
+ && (clickAddr.addr[SETTING_ADDR2] == it->addr[SETTING_ADDR2])
+ && (clickAddr.addr[SETTING_ADDR3] == it->addr[SETTING_ADDR3])
+ && (clickAddr.addr[SETTING_ADDR4] == it->addr[SETTING_ADDR4])
+ && (clickAddr.addr[SETTING_ADDR5] == it->addr[SETTING_ADDR5])) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClick unpair device_name:%s", it->deviceName);
+ bluetoothCaseList.erase(it);
+ }
+ }
+ fragmentView_.SetVisible(false);
+ SettingBluetoothPage::GetInstance()->LoadFindDeviceList();
+ SettingBluetoothPage::GetInstance()->ChangeView(BT_MAIN_PAGE);
+ }
+ return true;
+}
+
+bool UnPairSecondConfirm::OnDragStart(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool UnPairSecondConfirm::OnDrag(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool UnPairSecondConfirm::OnDragEnd(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepDetailsPage\r
+ * Created: 2025-06-05\r
+ */\r
+#include <sys/time.h>\r
+#include <string>\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepModel.h"\r
+#include "sleep/SleepDetailsPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_X = 97;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_Y = 31;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_WIDTH = 260;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_HEIGHT = 53;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE1_X = 77;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE1_Y = 215;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_X = 103;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_Y = 205;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_WIDTH = 80;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_HEIGHT = 29;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_FONT_SIZE = 28;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE2_Y = 254;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE3_Y = 291;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE4_Y = 330;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_Y = 244;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_WIDTH = 150;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_HEIGHT = 38;\r
+static constexpr int16_t SLEEPDETAIL_LIGHT_Y = 283;\r
+static constexpr int16_t SLEEPDETAIL_DEEP_Y = 322;\r
+static constexpr int16_t SLEEPDETAIL_GRAYBG_X = 62;\r
+static constexpr int16_t SLEEPDETAIL_GRAYBG_Y = 185;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_X = 180;\r
+static constexpr int16_t SLEEPDETAIL_ACTUAL_NORECODE_X = 96;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_Y = 100;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_WIDTH = 200;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_HEIGHT = 35;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPDETAIL_LABEL_WIDTH = 160;\r
+static constexpr int16_t SLEEPDETAIL_PADDING_RIGHT = 30;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTEXT_X = 220;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_NORECORD_X = 179;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_NORECORD_Y = 110;\r
+static constexpr int16_t SLEEPDETAIL_SOBERTIMETEXT_X = 300;\r
+static constexpr int16_t SLEEPDETAIL_SOBERTIMETEXT_Y = 190;\r
+static constexpr int16_t SLEEPDETAIL_RAPIDTIMETEXT_Y = 230;\r
+static constexpr int16_t SLEEPDETAIL_LIGHTIMETEXT_Y = 270;\r
+static constexpr int16_t SLEEPDETAIL_DEEPIMETEXT_Y = 310;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE = 40;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT = 50;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE = 40;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTE_X = 230;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTE_Y = 116;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOUR_X = 135;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOUR_Y = 100;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOURTEXT_X = 170;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTETEXT_X = 280;\r
+static constexpr int16_t ACTUALHOURS_X = 140;\r
+static constexpr int16_t ACTUALHOURSTEXT_X = 180;\r
+static constexpr int16_t ACTUALMINUTESTEXT_X = 270;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_DEATIL_PAGE, SleepDetailsPage, false);\r
+\r
+SleepDetailsPage::SleepDetailsPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepDetailsPage::SleepDetailsPage");\r
+}\r
+\r
+SleepDetailsPage::~SleepDetailsPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+\r
+ if (sleepTitleLabel_ != nullptr) {\r
+ delete sleepTitleLabel_;\r
+ sleepTitleLabel_ = nullptr;\r
+ }\r
+\r
+ if (actualSleepNorecordTimeLabel_ != nullptr) {\r
+ delete actualSleepNorecordTimeLabel_;\r
+ actualSleepNorecordTimeLabel_ = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeHoursLabel_ != nullptr) {\r
+ delete actualSleepTimeHoursLabel_;\r
+ actualSleepTimeHoursLabel_ = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeHoursUnitLabel_ != nullptr) {\r
+ delete actualSleepTimeHoursUnitLabel_;\r
+ actualSleepTimeHoursUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeMinutesLabel_ != nullptr) {\r
+ delete actualSleepTimeMinutesLabel_;\r
+ actualSleepTimeMinutesLabel_ = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeMinutesUnitLabel_ != nullptr) {\r
+ delete actualSleepTimeMinutesUnitLabel_;\r
+ actualSleepTimeMinutesUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (grayBgImg_ != nullptr) {\r
+ delete grayBgImg_;\r
+ grayBgImg_ = nullptr;\r
+ }\r
+\r
+ if (redPointImg_ != nullptr) {\r
+ delete redPointImg_;\r
+ redPointImg_ = nullptr;\r
+ }\r
+\r
+ if (soberingTimeLabel_ != nullptr) {\r
+ delete soberingTimeLabel_;\r
+ soberingTimeLabel_ = nullptr;\r
+ }\r
+\r
+ if (soberingTimeUnitLabel_ != nullptr) {\r
+ delete soberingTimeUnitLabel_;\r
+ soberingTimeUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (orangePointImg_ != nullptr) {\r
+ delete orangePointImg_;\r
+ orangePointImg_ = nullptr;\r
+ }\r
+\r
+ if (rapidEyeMovementLabel_ != nullptr) {\r
+ delete rapidEyeMovementLabel_;\r
+ rapidEyeMovementLabel_ = nullptr;\r
+ }\r
+\r
+ if (rapidEyeMovementUnitLabel_ != nullptr) {\r
+ delete rapidEyeMovementUnitLabel_;\r
+ rapidEyeMovementUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (greenPointImg_ != nullptr) {\r
+ delete greenPointImg_;\r
+ greenPointImg_ = nullptr;\r
+ }\r
+\r
+ if (lightSleepTimeLabel_ != nullptr) {\r
+ delete lightSleepTimeLabel_;\r
+ lightSleepTimeLabel_ = nullptr;\r
+ }\r
+\r
+ if (lightSleepTimeUnitLabel_ != nullptr) {\r
+ delete lightSleepTimeUnitLabel_;\r
+ lightSleepTimeUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (bluePointImg_ != nullptr) {\r
+ delete bluePointImg_;\r
+ bluePointImg_ = nullptr;\r
+ }\r
+\r
+ if (deepSleepTimeLabel_ != nullptr) {\r
+ delete deepSleepTimeLabel_;\r
+ deepSleepTimeLabel_ = nullptr;\r
+ }\r
+\r
+ if (deepSleepTimeUnitLabel_ != nullptr) {\r
+ delete deepSleepTimeUnitLabel_;\r
+ deepSleepTimeUnitLabel_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(SLEEP_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepDetailsPage::~SleepDetailsPage");\r
+}\r
+\r
+void SleepDetailsPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ is nullptr");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group_->SetViewId("sleepDetails");\r
+\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ is nullptr");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(bgImg_, SLEEP_IMAGE, IMAGE_SLEEP_BACKGROUND);\r
+ bgImg_->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group_->Add(bgImg_);\r
+\r
+ sleepTitleLabel_ = new UILabel();\r
+ if (sleepTitleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepTitleLabel_ is nullptr");\r
+ return;\r
+ }\r
+ sleepTitleLabel_->SetPosition(SLEEPDETAIL_SLEEP_X, SLEEPDETAIL_SLEEP_Y);\r
+ sleepTitleLabel_->Resize(SLEEPDETAIL_SLEEP_WIDTH, SLEEPDETAIL_SLEEP_HEIGHT);\r
+ sleepTitleLabel_->SetText("睡眠");\r
+ sleepTitleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sleepTitleLabel_->SetTextColor(Color::White());\r
+ sleepTitleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPDETAIL_SLEEP_FONT_SIZE);\r
+ sleepTitleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(sleepTitleLabel_);\r
+\r
+ InitPage();\r
+\r
+ if (GetRecord() == true) {\r
+ InitDetailPage();\r
+ } else {\r
+ InitNoDeatilPage();\r
+ };\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void SleepDetailsPage::InitSoberingTime()\r
+{\r
+ redPointImg_ = new UIImageView();\r
+ if (redPointImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "redPointImg_ is nullptr");\r
+ return;\r
+ }\r
+ redPointImg_->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE1_Y);\r
+ LOADIMG::LoadImageViewImg(redPointImg_, SLEEP_IMAGE, IMAGE_SLEEP_RED_CIR);\r
+ group_->Add(redPointImg_);\r
+ soberingTimeLabel_ = new UILabel();\r
+ if (soberingTimeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeLabel_ is nullptr");\r
+ return;\r
+ }\r
+ soberingTimeLabel_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+ soberingTimeLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ soberingTimeLabel_->SetText("清醒");\r
+ soberingTimeLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ soberingTimeLabel_->SetTextColor(Color::White());\r
+ soberingTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ soberingTimeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(soberingTimeLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitRapidEyeMovement()\r
+{\r
+ orangePointImg_ = new UIImageView();\r
+ if (orangePointImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "orangePointImg_ is nullptr");\r
+ return;\r
+ }\r
+ orangePointImg_->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE2_Y);\r
+ LOADIMG::LoadImageViewImg(orangePointImg_, SLEEP_IMAGE, IMAGE_SLEEP_ORANGE_CIR);\r
+ group_->Add(orangePointImg_);\r
+\r
+ rapidEyeMovementLabel_ = new UILabel();\r
+ if (rapidEyeMovementLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementLabel_ is nullptr");\r
+ return;\r
+ }\r
+ rapidEyeMovementLabel_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_RAPID_Y);\r
+ rapidEyeMovementLabel_->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ rapidEyeMovementLabel_->SetText("快速动眼");\r
+ rapidEyeMovementLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ rapidEyeMovementLabel_->SetTextColor(Color::White());\r
+ rapidEyeMovementLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ rapidEyeMovementLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(rapidEyeMovementLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitLightSleepTime()\r
+{\r
+ greenPointImg_ = new UIImageView();\r
+ if (greenPointImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "greenPointImg_ is nullptr");\r
+ return;\r
+ }\r
+ greenPointImg_->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE3_Y);\r
+ LOADIMG::LoadImageViewImg(greenPointImg_, SLEEP_IMAGE, IMAGE_SLEEP_GREEN_CIR);\r
+ group_->Add(greenPointImg_);\r
+\r
+ lightSleepTimeLabel_ = new UILabel();\r
+ if (lightSleepTimeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeLabel_ is nullptr");\r
+ return;\r
+ }\r
+ lightSleepTimeLabel_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_LIGHT_Y);\r
+ lightSleepTimeLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ lightSleepTimeLabel_->SetText("浅睡");\r
+ lightSleepTimeLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ lightSleepTimeLabel_->SetTextColor(Color::White());\r
+ lightSleepTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ lightSleepTimeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(lightSleepTimeLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitDeepSleepTime()\r
+{\r
+ bluePointImg_ = new UIImageView();\r
+ if (bluePointImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluePointImg_ is nullptr");\r
+ return;\r
+ }\r
+ bluePointImg_->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE4_Y);\r
+ LOADIMG::LoadImageViewImg(bluePointImg_, SLEEP_IMAGE, IMAGE_SLEEP_BLUE_CIR);\r
+ group_->Add(bluePointImg_);\r
+\r
+ deepSleepTimeLabel_ = new UILabel();\r
+ if (deepSleepTimeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeLabel_ is nullptr");\r
+ return;\r
+ }\r
+ deepSleepTimeLabel_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_DEEP_Y);\r
+ deepSleepTimeLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ deepSleepTimeLabel_->SetText("深睡");\r
+ deepSleepTimeLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ deepSleepTimeLabel_->SetTextColor(Color::White());\r
+ deepSleepTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ deepSleepTimeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(deepSleepTimeLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitPage()\r
+{\r
+ grayBgImg_ = new UIImageView();\r
+ if (grayBgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "grayBgImg_ is nullptr");\r
+ return;\r
+ }\r
+ grayBgImg_->SetPosition(SLEEPDETAIL_GRAYBG_X, SLEEPDETAIL_GRAYBG_Y);\r
+ LOADIMG::LoadImageViewImg(grayBgImg_, SLEEP_IMAGE, IMAGE_SLEEP_RECORD_BG);\r
+ group_->Add(grayBgImg_);\r
+\r
+ // 加载详情四项\r
+ InitSoberingTime();\r
+ InitRapidEyeMovement();\r
+ InitLightSleepTime();\r
+ InitDeepSleepTime();\r
+}\r
+\r
+void SleepDetailsPage::LoadDeatilActualSleepTime()\r
+{\r
+ actualSleepTimeHoursLabel_ = new UILabel();\r
+ if (actualSleepTimeHoursLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursLabel_ is nullptr");\r
+ return;\r
+ }\r
+ actualSleepTimeHoursLabel_->SetPosition(SLEEPDETAIL_ACTUALHOUR_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+ actualSleepTimeHoursLabel_->Resize(SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+ actualSleepTimeHoursLabel_->SetTextColor(Color::White());\r
+ actualSleepTimeHoursLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE);\r
+ group_->Add(actualSleepTimeHoursLabel_);\r
+\r
+ actualSleepTimeHoursUnitLabel_ = new UILabel();\r
+ if (actualSleepTimeHoursUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ actualSleepTimeHoursUnitLabel_->SetText("小时");\r
+ actualSleepTimeHoursUnitLabel_->SetPosition(SLEEPDETAIL_ACTUALHOURTEXT_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+ actualSleepTimeHoursUnitLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ actualSleepTimeHoursUnitLabel_->SetTextColor(Color::White());\r
+ actualSleepTimeHoursUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ group_->Add(actualSleepTimeHoursUnitLabel_);\r
+\r
+ actualSleepTimeMinutesLabel_ = new UILabel();\r
+ if (actualSleepTimeMinutesLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeMinutesLabel_ is nullptr");\r
+ return;\r
+ }\r
+\r
+ actualSleepTimeMinutesLabel_->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+ actualSleepTimeMinutesLabel_->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+ actualSleepTimeMinutesLabel_->SetTextColor(Color::White());\r
+ actualSleepTimeMinutesLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE);\r
+ group_->Add(actualSleepTimeMinutesLabel_);\r
+\r
+ actualSleepTimeMinutesUnitLabel_ = new UILabel();\r
+ if (actualSleepTimeMinutesUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursLabel_ is nullptr");\r
+ return;\r
+ }\r
+\r
+ actualSleepTimeMinutesUnitLabel_->SetText("分钟");\r
+ actualSleepTimeMinutesUnitLabel_->SetPosition(SLEEPDETAIL_ACTUALMINUTETEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+ actualSleepTimeMinutesUnitLabel_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ actualSleepTimeMinutesUnitLabel_->SetTextColor(Color::White());\r
+ actualSleepTimeMinutesUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ group_->Add(actualSleepTimeMinutesUnitLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ LoadDeatilActualSleepTime();\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+ actualSleepTimeHoursLabel_->SetText(std::to_string(hours).c_str());\r
+ actualSleepTimeMinutesLabel_->SetText(std::to_string(minutes).c_str());\r
+}\r
+\r
+void SleepDetailsPage::InitDetailPage()\r
+{\r
+ InitActualSleepTime(SleepModel::GetInstance().GetSleepTime());\r
+\r
+ soberingTimeUnitLabel_ = new UILabel();\r
+ if (soberingTimeUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ soberingTimeUnitLabel_->SetText((SetTimeUnit(SleepModel::GetInstance().GetSoberingTime())).c_str());\r
+ soberingTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+ soberingTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ soberingTimeUnitLabel_->SetTextColor(Color::White());\r
+ soberingTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ soberingTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ soberingTimeUnitLabel_->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+ group_->Add(soberingTimeUnitLabel_);\r
+\r
+ rapidEyeMovementUnitLabel_ = new UILabel();\r
+ if (rapidEyeMovementUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ rapidEyeMovementUnitLabel_->SetText((SetTimeUnit(SleepModel::GetInstance().GetRapidEyeMovementTime())).c_str());\r
+ rapidEyeMovementUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_RAPID_Y);\r
+ rapidEyeMovementUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ rapidEyeMovementUnitLabel_->SetTextColor(Color::White());\r
+ rapidEyeMovementUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ rapidEyeMovementUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ rapidEyeMovementUnitLabel_->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+ group_->Add(rapidEyeMovementUnitLabel_);\r
+\r
+ lightSleepTimeUnitLabel_ = new UILabel();\r
+ if (lightSleepTimeUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ lightSleepTimeUnitLabel_->SetText((SetTimeUnit(SleepModel::GetInstance().GetLightSleepTime())).c_str());\r
+ lightSleepTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_LIGHT_Y);\r
+ lightSleepTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ lightSleepTimeUnitLabel_->SetTextColor(Color::White());\r
+ lightSleepTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ lightSleepTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ lightSleepTimeUnitLabel_->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+ group_->Add(lightSleepTimeUnitLabel_);\r
+\r
+ deepSleepTimeUnitLabel_ = new UILabel();\r
+ if (deepSleepTimeUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ deepSleepTimeUnitLabel_->SetText((SetTimeUnit(SleepModel::GetInstance().GetDeepSleepTime())).c_str());\r
+ deepSleepTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_DEEP_Y);\r
+ deepSleepTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ deepSleepTimeUnitLabel_->SetTextColor(Color::White());\r
+ deepSleepTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ deepSleepTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ deepSleepTimeUnitLabel_->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+ group_->Add(deepSleepTimeUnitLabel_);\r
+}\r
+\r
+void SleepDetailsPage::InitNoDeatilPage()\r
+{\r
+ actualSleepNorecordTimeLabel_ = new UILabel();\r
+ if (actualSleepNorecordTimeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepNorecordTimeLabel_ is nullptr");\r
+ return;\r
+ }\r
+ actualSleepNorecordTimeLabel_->SetText("无记录");\r
+ actualSleepNorecordTimeLabel_->SetPosition(SLEEPDETAIL_ACTUALSLEEP_NORECORD_X, SLEEPDETAIL_ACTUALSLEEP_NORECORD_Y);\r
+ actualSleepNorecordTimeLabel_->Resize(SLEEPDETAIL_ACTUAL_NORECODE_X, SLEEPDETAIL_SOBERINGTIME_WIDTH);\r
+ actualSleepNorecordTimeLabel_->SetTextColor(Color::White());\r
+ actualSleepNorecordTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEP_FONT_SIZE);\r
+ group_->Add(actualSleepNorecordTimeLabel_);\r
+\r
+ soberingTimeUnitLabel_ = new UILabel();\r
+ if (soberingTimeUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ soberingTimeUnitLabel_->SetText("--");\r
+ soberingTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+ soberingTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ soberingTimeUnitLabel_->SetTextColor(Color::White());\r
+ soberingTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ soberingTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(soberingTimeUnitLabel_);\r
+\r
+ rapidEyeMovementUnitLabel_ = new UILabel();\r
+ if (rapidEyeMovementUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ rapidEyeMovementUnitLabel_->SetText("--");\r
+ rapidEyeMovementUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_RAPID_Y);\r
+ rapidEyeMovementUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ rapidEyeMovementUnitLabel_->SetTextColor(Color::White());\r
+ rapidEyeMovementUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ rapidEyeMovementUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(rapidEyeMovementUnitLabel_);\r
+\r
+ lightSleepTimeUnitLabel_ = new UILabel();\r
+ if (lightSleepTimeUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ lightSleepTimeUnitLabel_->SetText("--");\r
+ lightSleepTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_LIGHT_Y);\r
+ lightSleepTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ lightSleepTimeUnitLabel_->SetTextColor(Color::White());\r
+ lightSleepTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ lightSleepTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(lightSleepTimeUnitLabel_);\r
+\r
+ deepSleepTimeUnitLabel_ = new UILabel();\r
+ if (deepSleepTimeUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ deepSleepTimeUnitLabel_->SetText("--");\r
+ deepSleepTimeUnitLabel_->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_DEEP_Y);\r
+ deepSleepTimeUnitLabel_->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ deepSleepTimeUnitLabel_->SetTextColor(Color::White());\r
+ deepSleepTimeUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ deepSleepTimeUnitLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(deepSleepTimeUnitLabel_);\r
+}\r
+\r
+std::string SleepDetailsPage::SetTimeUnit(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+ std::string str = "";\r
+ if ((hours == 0) && (minutes != 0)) {\r
+ str = std::to_string(minutes) + "分钟";\r
+ } else if ((hours != 0) && (minutes == 0)) {\r
+ str = std::to_string(hours) + "小时";\r
+ } else if ((hours != 0) && (minutes != 0)) {\r
+ str = std::to_string(hours) + "小时" + std::to_string(minutes) + "分钟";\r
+ } else if ((hours == 0) && (minutes == 0)) {\r
+ str = "---";\r
+ }\r
+ return str;\r
+}\r
+\r
+bool SleepDetailsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+ if (GetRecord() == false) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_TARGET_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ } else if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SleepDetailsPage::GetRecord()\r
+{\r
+ if (SleepModel::GetInstance().GetRecord()) {\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "common/image_cache_manager.h"\r
+#include "diag_service.h"\r
+#include "msg_center_device.h"\r
+#include "diag_common.h"\r
+#include "sleep/SleepTargetTime.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepMainPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t SLEEPMAIN_SLEEP_X = 97;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_Y = 31;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_WIDTH = 260;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_HEIGHT = 53;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_X = 179;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_Y = 260;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_WIDTH = 96;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_HEIGHT = 48;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPMAIN_TIPS_X = 78;\r
+static constexpr int16_t SLEEPMAIN_TIPS_Y = 310;\r
+static constexpr int16_t SLEEPMAIN_TIPS_WIDTH = 300;\r
+static constexpr int16_t SLEEPMAIN_TIPS_HEIGHT = 130;\r
+static constexpr int16_t SLEEPMAIN_TIPS_FONT_SIZE = 24;\r
+static constexpr int16_t SLEEPMAIN_TIPS_FONT_SIZE_TWO = 28;\r
+static constexpr int16_t SLEEPMAIN_SCORE_X = 164;\r
+static constexpr int16_t SLEEPMAIN_SCORE_Y = 129;\r
+static constexpr int16_t SLEEPMAIN_SCORE_WIDTH = 95;\r
+static constexpr int16_t SLEEPMAIN_SCORE_HEIGHT = 65;\r
+static constexpr int16_t SLEEPMAIN_SCORE_FONT_SIZE = 56;\r
+static constexpr int16_t SLEEPMAIN_MOONNORECORD_X = 154;\r
+static constexpr int16_t SLEEPMAIN_MOONNORECORD_Y = 60;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_FONT_SIZE = 21;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_1 = 20;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_2 = 40;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_3 = 60;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_4 = 80;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_5 = 100;\r
+static constexpr int16_t SLEEP_FONT_SIZE_LARGE = 40;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_X = 265;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_Y = 161;\r
+static constexpr int16_t SLEEP_LABEL_WIDTH = 48;\r
+static constexpr int16_t SLEEP_LABEL_HEIGHT = 29;\r
+static constexpr int16_t SLEEP_TIME_LABEL_WIDTH = 100;\r
+static constexpr int16_t SLEEP_TIME_LABEL_HEIGHT = 50;\r
+static constexpr int16_t SLEEPMAIN_SETTING_X = 280;\r
+static constexpr int16_t SLEEPMAIN_SETTING_Y = 374;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTE_X = 230;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTE_Y = 319;\r
+static constexpr int16_t SLEEPMAIN_ACTUALHOUR_X = 135;\r
+static constexpr int16_t ACTUALMINUTES_Y = 303;\r
+static constexpr int16_t SLEEPMAIN_ACTUALHOURTEXT_X = 170;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPMAIN_HEIGHT = 50;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTETEXT_X = 280;\r
+static constexpr int16_t SLEEPMAIN_CIR_HIGHT = 444;\r
+static constexpr int16_t SLEEPMAIN_CIR_X = 228;\r
+static constexpr int16_t SLEEPMAIN_CIR_Y = 228;\r
+static constexpr int16_t SLEEPMAIN_CIR_RADIUS = 215;\r
+static constexpr int16_t SLEEPMAIN_CIR_ANGLE = 360;\r
+static constexpr int16_t SLEEPMAIN_CIR_RANGE = 100;\r
+static constexpr int16_t SLEEPMAIN_CIR_LINE_WIDTH = 10;\r
+static constexpr int16_t SLEEPMAIN_SCORE = 100;\r
+static constexpr int16_t SLEEPMAIN_RATE = 100;\r
+static constexpr float MINUTE_HOUR = 60.0f;\r
+static constexpr int16_t TARGETTIME_LABEL_Y = 363;\r
+static constexpr int16_t TARGETTIMEBUTTON_X = 137;\r
+static constexpr int16_t TARGETTIME_LABEL_WIDTH = 184;\r
+static constexpr int16_t TARGETTIME_LABEL_HEIGHT = 46;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_R = 181;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_G = 402;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_B = 255;\r
+static constexpr int16_t MAIN_SLEEP_OPT = 110;\r
+static constexpr int16_t MAIN_SLEEP_RANGE = 10;\r
+static constexpr int16_t MAIN_SLEEP_POSX_2 = 2;\r
+static constexpr int16_t MAIN_SLEEP_POSX_3 = 3;\r
+static constexpr int16_t MAIN_SLEEP_POSX_4 = 4;\r
+static constexpr int16_t MAIN_SLEEP_MOON_POSX = 198;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_HEIGHT = 192;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_X = 131;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_Y = 200;\r
+static constexpr int16_t MAIN_SLEEP_STAR1_X = 145;\r
+static constexpr int16_t MAIN_SLEEP_STAR2_X = 180;\r
+static constexpr int16_t MAIN_SLEEP_STAR3_X = 215;\r
+static constexpr int16_t MAIN_SLEEP_STAR4_X = 250;\r
+static constexpr int16_t MAIN_SLEEP_STAR5_X = 285;\r
+static constexpr int16_t MAIN_SLEEP_STAR_Y = 255;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_TEXT_FONT_SIZE = 55;\r
+static constexpr int16_t MAIN_SLEEP_STAR_NUM = 5;\r
+static constexpr int16_t SLEEP_MOON_NO_RECORD_X = 128;\r
+static constexpr char *TARGET_TIME = "targetTime";\r
+static constexpr int16_t g_posX[MAIN_SLEEP_STAR_NUM] = {MAIN_SLEEP_STAR1_X, MAIN_SLEEP_STAR2_X, MAIN_SLEEP_STAR3_X, MAIN_SLEEP_STAR4_X,\r
+ MAIN_SLEEP_STAR5_X};\r
+static constexpr int16_t g_posY = MAIN_SLEEP_STAR_Y;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE, SleepMainPage, true);\r
+\r
+SleepMainPage::SleepMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepMainPage::SleepMainPage");\r
+}\r
+\r
+SleepMainPage::~SleepMainPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (imageViewMain_ != nullptr) {\r
+ delete imageViewMain_;\r
+ imageViewMain_ = nullptr;\r
+ }\r
+\r
+ if (sleepTitleLabel_ != nullptr) {\r
+ delete sleepTitleLabel_;\r
+ sleepTitleLabel_ = nullptr;\r
+ }\r
+\r
+ if (moonNoRecordImg_ != nullptr) {\r
+ delete moonNoRecordImg_;\r
+ moonNoRecordImg_ = nullptr;\r
+ }\r
+\r
+ if (moonImg_ != nullptr) {\r
+ delete moonImg_;\r
+ moonImg_ = nullptr;\r
+ }\r
+\r
+ if (noRecordLabel_ != nullptr) {\r
+ delete noRecordLabel_;\r
+ noRecordLabel_ = nullptr;\r
+ }\r
+\r
+ if (tipsLabel_ != nullptr) {\r
+ delete tipsLabel_;\r
+ tipsLabel_ = nullptr;\r
+ }\r
+\r
+ if (sleepScoresLabel_ != nullptr) {\r
+ delete sleepScoresLabel_;\r
+ sleepScoresLabel_ = nullptr;\r
+ }\r
+\r
+ if (scoreUnitLabel_ != nullptr) {\r
+ delete scoreUnitLabel_;\r
+ scoreUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (sleepScoreTextLabel_ != nullptr) {\r
+ delete sleepScoreTextLabel_;\r
+ sleepScoreTextLabel_ = nullptr;\r
+ }\r
+\r
+ if (scoreStarImg1_ != nullptr) {\r
+ delete scoreStarImg1_;\r
+ scoreStarImg1_ = nullptr;\r
+ }\r
+\r
+ if (scoreStarImg2_ != nullptr) {\r
+ delete scoreStarImg2_;\r
+ scoreStarImg2_ = nullptr;\r
+ }\r
+\r
+ if (scoreStarImg3_ != nullptr) {\r
+ delete scoreStarImg3_;\r
+ scoreStarImg3_ = nullptr;\r
+ }\r
+ if (scoreStarImg4_ != nullptr) {\r
+ delete scoreStarImg4_;\r
+ scoreStarImg4_ = nullptr;\r
+ }\r
+\r
+ if (scoreStarImg5_ != nullptr) {\r
+ delete scoreStarImg5_;\r
+ scoreStarImg5_ = nullptr;\r
+ }\r
+\r
+ if (settingImg_ != nullptr) {\r
+ delete settingImg_;\r
+ settingImg_ = nullptr;\r
+ }\r
+\r
+ if (targetTimeLabel_ != nullptr) {\r
+ delete targetTimeLabel_;\r
+ targetTimeLabel_ = nullptr;\r
+ }\r
+\r
+ if (targetSleepTimeHoursLabel_ != nullptr) {\r
+ delete targetSleepTimeHoursLabel_;\r
+ targetSleepTimeHoursLabel_ = nullptr;\r
+ }\r
+\r
+ if (targetSleepTimeHoursUnitLabel_ != nullptr) {\r
+ delete targetSleepTimeHoursUnitLabel_;\r
+ targetSleepTimeHoursUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (targetSleepTimeMinutesLabel_ != nullptr) {\r
+ delete targetSleepTimeMinutesLabel_;\r
+ targetSleepTimeMinutesLabel_ = nullptr;\r
+ }\r
+\r
+ if (targetSleepTimeMinutesUnitLabel_ != nullptr) {\r
+ delete targetSleepTimeMinutesUnitLabel_;\r
+ targetSleepTimeMinutesUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (targetTimeButton_ != nullptr) {\r
+ delete targetTimeButton_;\r
+ targetTimeButton_ = nullptr;\r
+ }\r
+\r
+ if (circleProgress_ != nullptr) {\r
+ delete circleProgress_;\r
+ circleProgress_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(SLEEP_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepMainPage::~SleepMainPage");\r
+}\r
+\r
+void SleepMainPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ is nullptr");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group_->SetViewId("sleepMain");\r
+\r
+ imageViewMain_ = new UIImageView();\r
+ if (imageViewMain_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "imageViewMain_ is nullptr");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(imageViewMain_, SLEEP_IMAGE, IMAGE_SLEEP_BACKGROUND);\r
+ imageViewMain_->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group_->Add(imageViewMain_);\r
+\r
+ if (GetRecord() == false) {\r
+ InitNoRecordPage();\r
+ } else {\r
+ InitRecordPage();\r
+ }\r
+\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void SleepMainPage::InitNoRecordPage()\r
+{\r
+ sleepTitleLabel_ = new UILabel();\r
+ if (sleepTitleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepTitleLabel_ is nullptr");\r
+ return;\r
+ }\r
+ sleepTitleLabel_->SetPosition(SLEEPMAIN_SLEEP_X, SLEEPMAIN_SLEEP_Y);\r
+ sleepTitleLabel_->Resize(SLEEPMAIN_SLEEP_WIDTH, SLEEPMAIN_SLEEP_HEIGHT);\r
+ sleepTitleLabel_->SetText("睡眠");\r
+ sleepTitleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sleepTitleLabel_->SetTextColor(Color::White());\r
+ sleepTitleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPMAIN_SLEEP_FONT_SIZE);\r
+ sleepTitleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(sleepTitleLabel_);\r
+\r
+ moonNoRecordImg_ = new UIImageView();\r
+ if (moonNoRecordImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moonNoRecordImg_ is nullptr");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(moonNoRecordImg_, SLEEP_IMAGE, IMAGE_SLEEP_NORECORD_SLEEP);\r
+ moonNoRecordImg_->SetPosition(SLEEP_MOON_NO_RECORD_X, SLEEPMAIN_MOONNORECORD_Y);\r
+ group_->Add(moonNoRecordImg_);\r
+\r
+ noRecordLabel_ = new UILabel();\r
+ if (noRecordLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "noRecordLabel_ is nullptr");\r
+ return;\r
+ }\r
+ noRecordLabel_->SetPosition(SLEEPMAIN_NORECORD_X, SLEEPMAIN_NORECORD_Y);\r
+ noRecordLabel_->Resize(SLEEPMAIN_NORECORD_WIDTH, SLEEPMAIN_NORECORD_HEIGHT);\r
+ noRecordLabel_->SetText("无记录");\r
+ noRecordLabel_->SetTextColor(Color::White());\r
+ noRecordLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_NORECORD_FONT_SIZE);\r
+ noRecordLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(noRecordLabel_);\r
+\r
+ tipsLabel_ = new UILabel();\r
+ if (tipsLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsLabel_ is nullptr");\r
+ return;\r
+ }\r
+ tipsLabel_->SetPosition(SLEEPMAIN_TIPS_X, SLEEPMAIN_TIPS_Y);\r
+ tipsLabel_->Resize(SLEEPMAIN_TIPS_WIDTH, SLEEPMAIN_TIPS_HEIGHT);\r
+ tipsLabel_->SetText("睡眠时间过短或睡眠中动作幅度大,手表可能检测不到睡眠");\r
+ tipsLabel_->SetTextColor(Color::White());\r
+ tipsLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE_TWO);\r
+ tipsLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(tipsLabel_);\r
+}\r
+\r
+void SleepMainPage::InitRecordPage()\r
+{\r
+ SleepModel::GetInstance().SendData();\r
+ InitCircleProgress();\r
+ moonImg_ = new UIImageView();\r
+ if (moonImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moonImg_ is nullptr");\r
+ return;\r
+ }\r
+ moonImg_->SetPosition(MAIN_SLEEP_MOON_POSX, TARGETTIME_LABEL_HEIGHT);\r
+ LOADIMG::LoadImageViewImg(moonImg_, SLEEP_IMAGE, IMAGE_SLEEP_RECORD_SLEEP);\r
+ group_->Add(moonImg_);\r
+\r
+ sleepScoresLabel_ = new UILabel();\r
+ if (sleepScoresLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepScoresLabel_ is nullptr");\r
+ return;\r
+ }\r
+ sleepScoresLabel_->SetText(std::to_string(GetSleepingScores()).c_str());\r
+ sleepScoresLabel_->SetPosition(SLEEPMAIN_SCORE_X, SLEEPMAIN_SCORE_Y);\r
+ sleepScoresLabel_->Resize(SLEEPMAIN_SCORE_WIDTH, SLEEPMAIN_SCORE_HEIGHT);\r
+ sleepScoresLabel_->SetTextColor(Color::White());\r
+ sleepScoresLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sleepScoresLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPMAIN_SCORE_FONT_SIZE);\r
+ sleepScoresLabel_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(sleepScoresLabel_);\r
+\r
+ scoreUnitLabel_ = new UILabel();\r
+ if (scoreUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ scoreUnitLabel_->SetText("分");\r
+ scoreUnitLabel_->SetPosition(SLEEPMAIN_SCORETEXT_X, SLEEPMAIN_SCORETEXT_Y);\r
+ scoreUnitLabel_->Resize(MAIN_SLEEP_SCORE_TEXT_FONT_SIZE, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ scoreUnitLabel_->SetTextColor(Color::White());\r
+ scoreUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_SCORETEXT_FONT_SIZE);\r
+ group_->Add(scoreUnitLabel_);\r
+ ScoreDisplay();\r
+\r
+ sleepScoreTextLabel_ = new UILabel();\r
+ if (sleepScoreTextLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepScoreTextLabel_ is nullptr");\r
+ return;\r
+ }\r
+ sleepScoreTextLabel_->SetText("夜间睡眠得分");\r
+ sleepScoreTextLabel_->Resize(MAIN_SLEEP_SCORE_HEIGHT, SLEEPMAIN_NORECORD_HEIGHT);\r
+ sleepScoreTextLabel_->SetPosition(MAIN_SLEEP_SCORE_X, MAIN_SLEEP_SCORE_Y);\r
+ sleepScoreTextLabel_->SetTextColor(Color::White());\r
+ sleepScoreTextLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE);\r
+ group_->Add(sleepScoreTextLabel_);\r
+\r
+ // 显示具体睡觉时间\r
+ LoadActualSleepTime(SleepModel::GetInstance().GetSleepTime());\r
+\r
+ // 加载目标按钮\r
+ LoadTargetTimeButton(SleepModel::GetInstance().GetTargetTime());\r
+}\r
+\r
+void SleepMainPage::InitScoreDisplayPicture()\r
+{\r
+ scoreStarImg1_ = new UIImageView();\r
+ if (scoreStarImg1_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg1_ is nullptr");\r
+ return;\r
+ }\r
+ scoreStarImg1_->SetPosition(g_posX[0], g_posY);\r
+ group_->Add(scoreStarImg1_);\r
+\r
+ scoreStarImg2_ = new UIImageView();\r
+ if (scoreStarImg2_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg2_ is nullptr");\r
+ return;\r
+ }\r
+ scoreStarImg2_->SetPosition(g_posX[1], g_posY);\r
+ group_->Add(scoreStarImg2_);\r
+\r
+ scoreStarImg3_ = new UIImageView();\r
+ if (scoreStarImg3_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg3_ is nullptr");\r
+ return;\r
+ }\r
+ scoreStarImg3_->SetPosition(g_posX[MAIN_SLEEP_POSX_2], g_posY);\r
+ group_->Add(scoreStarImg3_);\r
+\r
+ scoreStarImg4_ = new UIImageView();\r
+ if (scoreStarImg4_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg4_ is nullptr");\r
+ return;\r
+ }\r
+ scoreStarImg4_->SetPosition(g_posX[MAIN_SLEEP_POSX_3], g_posY);\r
+ group_->Add(scoreStarImg4_);\r
+\r
+ scoreStarImg5_ = new UIImageView();\r
+ if (scoreStarImg5_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreStarImg5_ is nullptr");\r
+ return;\r
+ }\r
+ scoreStarImg5_->SetPosition(g_posX[MAIN_SLEEP_POSX_4], g_posY);\r
+ group_->Add(scoreStarImg5_);\r
+}\r
+\r
+void SleepMainPage::ScoreDisplay()\r
+{\r
+ InitScoreDisplayPicture();\r
+ if (GetSleepingScores() < SLEEP_SCORE_THRESHOLD_1) {\r
+ LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_1 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_2) {\r
+ LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_2 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_3) {\r
+ LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_3 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_4) {\r
+ LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_4 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_5) {\r
+ LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_GRAY);\r
+ } else if (GetSleepingScores() == SLEEP_SCORE_THRESHOLD_5) {\r
+ LOADIMG::LoadImageViewImg(scoreStarImg1_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg2_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg3_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg4_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreStarImg5_, SLEEP_IMAGE, IMAGE_SLEEP_STAR_YELLOW);\r
+ }\r
+}\r
+\r
+void SleepMainPage::InitSleepTimeLabel()\r
+{\r
+ targetSleepTimeHoursLabel_ = new UILabel();\r
+ if (targetSleepTimeHoursLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeHoursLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetSleepTimeHoursLabel_->SetPosition(SLEEPMAIN_ACTUALHOUR_X, ACTUALMINUTES_Y);\r
+ targetSleepTimeHoursLabel_->Resize(SLEEPMAIN_HEIGHT, SLEEPMAIN_HEIGHT);\r
+ targetSleepTimeHoursLabel_->SetTextColor(Color::White());\r
+ targetSleepTimeHoursLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEP_FONT_SIZE_LARGE);\r
+ group_->Add(targetSleepTimeHoursLabel_);\r
+\r
+ targetSleepTimeHoursUnitLabel_ = new UILabel();\r
+ if (targetSleepTimeHoursUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeHoursUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetSleepTimeHoursUnitLabel_->SetPosition(SLEEPMAIN_ACTUALHOURTEXT_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+ targetSleepTimeHoursUnitLabel_->Resize(SLEEP_LABEL_WIDTH, SLEEP_LABEL_HEIGHT);\r
+ targetSleepTimeHoursUnitLabel_->SetTextColor(Color::White());\r
+ targetSleepTimeHoursUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ targetSleepTimeHoursUnitLabel_->SetText("小时");\r
+ group_->Add(targetSleepTimeHoursUnitLabel_);\r
+\r
+ targetSleepTimeMinutesLabel_ = new UILabel();\r
+ if (targetSleepTimeMinutesLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeMinutesLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetSleepTimeMinutesLabel_->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, ACTUALMINUTES_Y);\r
+ targetSleepTimeMinutesLabel_->Resize(SLEEP_TIME_LABEL_WIDTH, SLEEP_TIME_LABEL_HEIGHT);\r
+ targetSleepTimeMinutesLabel_->SetTextColor(Color::White());\r
+ targetSleepTimeMinutesLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEP_FONT_SIZE_LARGE);\r
+ group_->Add(targetSleepTimeMinutesLabel_);\r
+\r
+ targetSleepTimeMinutesUnitLabel_ = new UILabel();\r
+ if (targetSleepTimeMinutesUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeMinutesUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetSleepTimeMinutesUnitLabel_->SetPosition(SLEEPMAIN_ACTUALMINUTETEXT_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+ targetSleepTimeMinutesUnitLabel_->Resize(SLEEP_LABEL_WIDTH, SLEEP_LABEL_HEIGHT);\r
+ targetSleepTimeMinutesUnitLabel_->SetTextColor(Color::White());\r
+ targetSleepTimeMinutesUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ targetSleepTimeMinutesUnitLabel_->SetText("分钟");\r
+ group_->Add(targetSleepTimeMinutesUnitLabel_);\r
+}\r
+\r
+void SleepMainPage::LoadTargetTimeButton(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+ std::string str = "";\r
+ if ((hours == 0) && (minutes != 0)) {\r
+ str = std::to_string(minutes) + "分钟";\r
+ } else if ((hours != 0) && (minutes == 0)) {\r
+ str = std::to_string(hours) + "小时";\r
+ } else if ((hours != 0) && (minutes != 0)) {\r
+ if (minutes < MAIN_SLEEP_RANGE && hours >= MAIN_SLEEP_RANGE) {\r
+ str = " " + std::to_string(hours) + ":0" + std::to_string(minutes);\r
+ } else if (hours < MAIN_SLEEP_RANGE && minutes >= MAIN_SLEEP_RANGE) {\r
+ str = " 0" + std::to_string(hours) + ":" + std::to_string(minutes);\r
+ } else if (minutes < MAIN_SLEEP_RANGE && hours < MAIN_SLEEP_RANGE) {\r
+ str = " 0" + std::to_string(hours) + ":0" + std::to_string(minutes);\r
+ } else if (minutes >= MAIN_SLEEP_RANGE && hours >= MAIN_SLEEP_RANGE) {\r
+ str = " " + std::to_string(hours) + ":" + std::to_string(minutes);\r
+ }\r
+ }\r
+ targetTimeButton_ = new UILabelButton();\r
+ if (targetTimeButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTimeButton_ is nullptr");\r
+ return;\r
+ }\r
+ targetTimeButton_->SetPosition(TARGETTIMEBUTTON_X, TARGETTIME_LABEL_Y);\r
+ targetTimeButton_->SetViewId(TARGET_TIME);\r
+ targetTimeButton_->SetOnClickListener(this);\r
+ targetTimeButton_->SetStyle(\r
+ STYLE_BACKGROUND_COLOR,\r
+ Color::GetColorFromRGBA(MAIN_SLEEP_COLOR_R, MAIN_SLEEP_COLOR_G, MAIN_SLEEP_COLOR_B, MAIN_SLEEP_OPT).full);\r
+ targetTimeButton_->SetStyleForState(\r
+ STYLE_BACKGROUND_COLOR,\r
+ Color::GetColorFromRGBA(MAIN_SLEEP_COLOR_R, MAIN_SLEEP_COLOR_G, MAIN_SLEEP_COLOR_B, MAIN_SLEEP_OPT).full,\r
+ UIButton::PRESSED);\r
+ targetTimeButton_->Resize(TARGETTIME_LABEL_WIDTH, TARGETTIME_LABEL_HEIGHT);\r
+ targetTimeButton_->SetTextColor(Color::White());\r
+ targetTimeButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ group_->Add(targetTimeButton_);\r
+\r
+ targetTimeLabel_ = new UILabel();\r
+ if (targetTimeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTimeLabel_ is nullptr");\r
+ return;\r
+ }\r
+ std::string targetUnit = "目标" + str;\r
+ targetTimeLabel_->SetText(targetUnit.c_str());\r
+ targetTimeLabel_->SetPosition(SLEEPMAIN_MOONNORECORD_X, TARGETTIME_LABEL_Y);\r
+ targetTimeLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ targetTimeLabel_->Resize(TARGETTIME_LABEL_WIDTH, TARGETTIME_LABEL_HEIGHT);\r
+ targetTimeLabel_->SetTextColor(Color::White());\r
+ targetTimeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ targetTimeLabel_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(targetTimeLabel_);\r
+\r
+ settingImg_ = new UIImageView();\r
+ if (settingImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "settingImg_ is nullptr");\r
+ return;\r
+ }\r
+ settingImg_->SetPosition(SLEEPMAIN_SETTING_X, SLEEPMAIN_SETTING_Y);\r
+ LOADIMG::LoadImageViewImg(settingImg_, SLEEP_IMAGE, IMAGE_SLEEP_SETTING);\r
+ group_->Add(settingImg_);\r
+}\r
+\r
+void SleepMainPage::LoadActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ InitSleepTimeLabel();\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+ targetSleepTimeHoursLabel_->SetText(std::to_string(hours).c_str());\r
+ targetSleepTimeMinutesLabel_->SetText(std::to_string(minutes).c_str());\r
+}\r
+\r
+void SleepMainPage::InitCircleProgress()\r
+{\r
+ circleProgress_ = new UICircleProgress();\r
+ if (circleProgress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "circleProgress_ is nullptr");\r
+ return;\r
+ }\r
+ circleProgress_->SetPosition(0, 0);\r
+ circleProgress_->Resize(SLEEPMAIN_CIR_HIGHT, SLEEPMAIN_CIR_HIGHT);\r
+ circleProgress_->SetCenterPosition(SLEEPMAIN_CIR_X, SLEEPMAIN_CIR_Y);\r
+ circleProgress_->SetRadius(SLEEPMAIN_CIR_RADIUS);\r
+ circleProgress_->SetStartAngle(0);\r
+ circleProgress_->SetEndAngle(SLEEPMAIN_CIR_ANGLE);\r
+ circleProgress_->SetRange(0, SLEEPMAIN_CIR_RANGE);\r
+ circleProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFF6f29a0);\r
+ circleProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xFFB566FF);\r
+ circleProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, SLEEPMAIN_CIR_LINE_WIDTH);\r
+ circleProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, SLEEPMAIN_CIR_LINE_WIDTH);\r
+ group_->Add(circleProgress_);\r
+ circleProgress_->SetValue(GetSleepingScores());\r
+ circleProgress_->Invalidate();\r
+}\r
+\r
+uint32_t SleepMainPage::GetSleepingScores()\r
+{\r
+ uint32_t hours = SleepModel::GetInstance().GetSleepTimeHours();\r
+ uint32_t minutes = SleepModel::GetInstance().GetSleepTimeMinutes();\r
+ std::tuple<uint32_t, uint32_t> timeTuple = SleepModel::GetInstance().GetTargetTime();\r
+ uint32_t timeHours = std::get<0>(timeTuple);\r
+ uint32_t timeMinutes = std::get<1>(timeTuple);\r
+ if (((hours * MINUTE_HOUR) + minutes) > ((timeHours * MINUTE_HOUR) + timeMinutes)) {\r
+ return SLEEPMAIN_SCORE;\r
+ } else {\r
+ float score = ((hours * MINUTE_HOUR) + minutes) / ((timeHours * MINUTE_HOUR) + timeMinutes);\r
+ return uint32_t(score * SLEEPMAIN_RATE);\r
+ }\r
+}\r
+\r
+bool SleepMainPage::GetRecord()\r
+{\r
+ if (SleepModel::GetInstance().GetRecord()) {\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+bool SleepMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if (strcmp(view.GetViewId(), TARGET_TIME) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_TARGET_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SleepMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_DEATIL_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include <ctime>\r
+#include <string>\r
+#include <cstring>\r
+#include "main/HealthModel.h"\r
+#include "uiservice/ui_service.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "ui_test_group.h"\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
+#include "sleep/SleepModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint64_t SLEEPMODEL_MINUTE_HOUR = 60;\r
+static constexpr uint64_t SLEEPMODEL_HOUR = 23;\r
+static constexpr uint64_t SLEEPMODEL_MINUTE = 59;\r
+static constexpr uint64_t SLEEPMODEL_ERROR = 100;\r
+\r
+SleepModel::SleepModel() {}\r
+\r
+SleepModel::~SleepModel() {}\r
+\r
+void SleepModel::LoadData()\r
+{\r
+ if (GetRecord() == false) {\r
+ SetSleepDataVec();\r
+ SetSoberingTime();\r
+ SetRapidEyeMovementTime();\r
+ SetLightSleepTime();\r
+ SetDeepSleepTime();\r
+ }\r
+}\r
+\r
+bool SleepModel::GetRecord()\r
+{\r
+ if (sleepDataVector_.empty() == true) {\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+std::string SleepModel::GetTodayDate()\r
+{\r
+ time_t now = time(nullptr);\r
+ struct tm *timeinfo = localtime(&now);\r
+ char buffer[80];\r
+ strftime(buffer, sizeof(buffer), "%Y-%m-%d", timeinfo);\r
+ return std::string(buffer);\r
+}\r
+\r
+uint8_t *SleepModel::SerializeSleepData(const SleepData *sleepData, size_t *outSize)\r
+{\r
+ if (sleepData == nullptr) {\r
+ return nullptr;\r
+ }\r
+ size_t dataSize = sizeof(SleepData);\r
+ *outSize = dataSize;\r
+ uint8_t *buffer = new uint8_t[dataSize];\r
+ uint8_t isSendValue = sleepData->isSended ? 1 : 0;\r
+ memcpy_s(buffer, sizeof(isSendValue), &isSendValue, sizeof(isSendValue));\r
+ memcpy_s(buffer + offsetof(SleepData, date), sizeof(sleepData->date), sleepData->date, sizeof(sleepData->date));\r
+ memcpy_s(buffer + offsetof(SleepData, type), sizeof(sleepData->type), &sleepData->type, sizeof(sleepData->type));\r
+ memcpy_s(buffer + offsetof(SleepData, typeSleepStart), sizeof(sleepData->typeSleepStart), sleepData->typeSleepStart,\r
+ sizeof(sleepData->typeSleepStart));\r
+ memcpy_s(buffer + offsetof(SleepData, typeSleepEnd), sizeof(sleepData->typeSleepEnd), sleepData->typeSleepEnd,\r
+ sizeof(sleepData->typeSleepEnd));\r
+ memcpy_s(buffer + offsetof(SleepData, sleepStart), sizeof(sleepData->sleepStart), sleepData->sleepStart,\r
+ sizeof(sleepData->sleepStart));\r
+ memcpy_s(buffer + offsetof(SleepData, sleepEnd), sizeof(sleepData->sleepEnd), sleepData->sleepEnd,\r
+ sizeof(sleepData->sleepEnd));\r
+ return buffer;\r
+}\r
+\r
+void SleepModel::SendData()\r
+{\r
+ // 发送数据\r
+ size_t dataSize;\r
+ for (int i = 0; i < sleepDataVector_.size(); i++) {\r
+ if (sleepDataVector_[i].isSended == true) {\r
+ continue;\r
+ }\r
+ uint8_t *serializedData = SerializeSleepData(&sleepDataVector_[i], &dataSize);\r
+ errcode_t ret;\r
+#ifdef _WIN32\r
+ ret = 0;\r
+#else\r
+ ret = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SLEEP_DATA, serializedData, dataSize);\r
+ delete[] serializedData;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "send sleep data ret = %d", ret);\r
+ if (ret == 0) {\r
+ sleepDataVector_[i].isSended = true;\r
+ }\r
+#endif\r
+ }\r
+}\r
+\r
+// sleepDataVector打桩数据,后续需要客户适配传感器自实现\r
+void SleepModel::SetSleepDataVec()\r
+{\r
+#ifndef _WIN32\r
+ std::string today = GetTodayDate();\r
+\r
+ sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_DEEP, (today + " 00:00:00").c_str(),\r
+ (today + " 00:30:00").c_str(), (today + " 00:00:00").c_str(),\r
+ (today + " 07:50:00").c_str()});\r
+\r
+ sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_EYEMOVE, (today + " 00:30:00").c_str(),\r
+ (today + " 03:00:00").c_str(), (today + " 00:00:00").c_str(),\r
+ (today + " 07:50:00").c_str()});\r
+\r
+ sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_LIGHT, (today + " 03:00:00").c_str(),\r
+ (today + " 03:30:00").c_str(), (today + " 00:00:00").c_str(),\r
+ (today + " 07:50:00").c_str()});\r
+\r
+ sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_SOBER, (today + " 03:30:00").c_str(),\r
+ (today + " 05:30:00").c_str(), (today + " 00:00:00").c_str(),\r
+ (today + " 07:50:00").c_str()});\r
+\r
+ sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_LIGHT, (today + " 05:30:00").c_str(),\r
+ (today + " 06:00:00").c_str(), (today + " 00:00:00").c_str(),\r
+ (today + " 07:50:00").c_str()});\r
+\r
+ sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_EYEMOVE, (today + " 06:00:00").c_str(),\r
+ (today + " 07:30:00").c_str(), (today + " 00:00:00").c_str(),\r
+ (today + " 07:50:00").c_str()});\r
+\r
+ sleepDataVector_.push_back({false, today.c_str(), SLEEP_TYPE_DEEP, (today + " 07:30:00").c_str(),\r
+ (today + " 07:50:00").c_str(), (today + " 00:00:00").c_str(),\r
+ (today + " 07:50:00").c_str()});\r
+#endif\r
+}\r
+\r
+SleepModel &SleepModel::GetInstance()\r
+{\r
+ static SleepModel instance;\r
+ return instance;\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetSoberingTime()\r
+{\r
+ return MinutesToHours(soberingTime_);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetRapidEyeMovementTime()\r
+{\r
+ return MinutesToHours(eyeMoveTime_);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetLightSleepTime()\r
+{\r
+ return MinutesToHours(lightTime_);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetDeepSleepTime()\r
+{\r
+ return MinutesToHours(deepTime_);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetSleepTime()\r
+{\r
+ return MinutesToHours(GetTotalSleepTime());\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::MinutesToHours(uint32_t minutes)\r
+{\r
+ if (minutes == 0) {\r
+ return std::make_tuple(0, 0);\r
+ }\r
+ int hours = minutes / SLEEPMODEL_MINUTE_HOUR;\r
+ int remainingMinutes = minutes % SLEEPMODEL_MINUTE_HOUR;\r
+\r
+ if (hours > SLEEPMODEL_HOUR || remainingMinutes > SLEEPMODEL_MINUTE) {\r
+ return std::make_tuple(SLEEPMODEL_ERROR, 0);\r
+ }\r
+\r
+ return std::make_tuple(hours, remainingMinutes);\r
+}\r
+\r
+uint32_t SleepModel::GetSleepTimeHours()\r
+{\r
+ std::tuple<uint32_t, uint32_t> timeTuple = GetSleepTime();\r
+ return std::get<0>(timeTuple);\r
+}\r
+\r
+uint32_t SleepModel::GetSleepTimeMinutes()\r
+{\r
+ std::tuple<uint32_t, uint32_t> timeTuple = GetSleepTime();\r
+ return std::get<1>(timeTuple);\r
+}\r
+\r
+void SleepModel::SetTargetTime(uint32_t minute)\r
+{\r
+ sleepTarget_ = minute;\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepModel::GetTargetTime()\r
+{\r
+ return MinutesToHours(sleepTarget_);\r
+}\r
+\r
+uint32_t SleepModel::TimeDiffInMinutes(const std::string &timeStr1, const std::string &timeStr2)\r
+{\r
+ std::tm tm1 = {};\r
+ std::tm tm2 = {};\r
+\r
+ std::istringstream iss1(timeStr1);\r
+ std::istringstream iss2(timeStr2);\r
+\r
+ iss1 >> std::get_time(&tm1, "%Y-%m-%d %H:%M:%S");\r
+ if (iss1.fail()) {\r
+ return -1;\r
+ }\r
+\r
+ iss2 >> std::get_time(&tm2, "%Y-%m-%d %H:%M:%S");\r
+ if (iss2.fail()) {\r
+ return -1;\r
+ }\r
+\r
+ std::time_t t1 = std::mktime(&tm1);\r
+ std::time_t t2 = std::mktime(&tm2);\r
+ if (t1 == -1 || t2 == -1) {\r
+ return -1;\r
+ }\r
+\r
+ double diff_seconds = std::difftime(t2, t1);\r
+ return static_cast<uint32_t>(diff_seconds / SLEEPMODEL_MINUTE_HOUR);\r
+}\r
+\r
+// 遍历vector中的结构体 获取对应类型的时间差\r
+uint32_t SleepModel::GetDetailData(int type)\r
+{\r
+ uint32_t min = 0;\r
+ for (size_t i = 0; i < sleepDataVector_.size(); ++i) {\r
+ if (sleepDataVector_[i].type == type) {\r
+ min += TimeDiffInMinutes(sleepDataVector_[i].typeSleepStart, sleepDataVector_[i].typeSleepEnd);\r
+ }\r
+ }\r
+ return min;\r
+}\r
+\r
+// 获取总睡觉时间的时间差\r
+uint32_t SleepModel::GetTotalSleepTime()\r
+{\r
+ uint32_t time = TimeDiffInMinutes(sleepDataVector_[0].sleepStart, sleepDataVector_[0].sleepEnd);\r
+ return time;\r
+}\r
+\r
+void SleepModel::SetSoberingTime()\r
+{\r
+ soberingTime_ = GetDetailData(SLEEP_TYPE_SOBER);\r
+}\r
+void SleepModel::SetRapidEyeMovementTime()\r
+{\r
+ eyeMoveTime_ = GetDetailData(SLEEP_TYPE_EYEMOVE);\r
+}\r
+void SleepModel::SetLightSleepTime()\r
+{\r
+ lightTime_ = GetDetailData(SLEEP_TYPE_LIGHT);\r
+}\r
+void SleepModel::SetDeepSleepTime()\r
+{\r
+ deepTime_ = GetDetailData(SLEEP_TYPE_DEEP);\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_SLEEPING, SleepView, SleepPresenter, SLEEP_ICON, SLEEP_ICON, "睡眠");\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepSleepingPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "common/image_cache_manager.h"\r
+#include "diag_service.h"\r
+#include "msg_center_device.h"\r
+#include "diag_common.h"\r
+#include "sleep/SleepTargetTime.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepSleepingPage.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_SLEEP_PAGE, SleepSleepingPage, false);\r
+\r
+static constexpr int16_t SLEEPING_SLEEP_X = 97;\r
+static constexpr int16_t SLEEPING_SLEEP_Y = 31;\r
+static constexpr int16_t SLEEPING_SLEEP_WIDTH = 260;\r
+static constexpr int16_t SLEEPING_SLEEP_HEIGHT = 53;\r
+static constexpr int16_t SLEEPING_SLEEP_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPING_NORECORD_X = 135;\r
+static constexpr int16_t SLEEPING_NORECORD_Y = 220;\r
+static constexpr int16_t SLEEPING_NORECORD_WIDTH = 200;\r
+static constexpr int16_t SLEEPING_NORECORD_HEIGHT = 48;\r
+static constexpr int16_t SLEEPING_NORECORD_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPING_TIPS_FONT_SIZE = 24;\r
+static constexpr int16_t SLEEPING_FONT_SIZE_LARGE = 40;\r
+static constexpr int16_t SLEEPING_LABEL_WIDTH = 48;\r
+static constexpr int16_t SLEEPING_LABEL_HEIGHT = 29;\r
+static constexpr int16_t SLEEPING_TIME_LABEL_WIDTH = 95;\r
+static constexpr int16_t SLEEPING_TIME_LABEL_HEIGHT = 50;\r
+static constexpr int16_t SLEEPING_ACTUALMINUTE_X = 230;\r
+static constexpr int16_t SLEEPING_ACTUALMINUTE_Y = 314;\r
+static constexpr int16_t ACTUALMINUTES_X = 180;\r
+static constexpr int16_t ACTUALMINUTES_Y = 298;\r
+static constexpr int16_t SLEEPING_HEIGHT = 50;\r
+static constexpr int16_t SLEEPING_CIR_HIGHT = 444;\r
+static constexpr int16_t SLEEPING_CIR_X = 228;\r
+static constexpr int16_t SLEEPING_CIR_Y = 228;\r
+static constexpr int16_t SLEEPING_CIR_RADIUS = 215;\r
+static constexpr int16_t SLEEPING_CIR_ANGLE = 360;\r
+static constexpr int16_t SLEEPING_CIR_LINE_WIDTH = 10;\r
+static constexpr int16_t SLEEPING_TIMETEXT_HIGHT = 95;\r
+static constexpr int16_t SLEEPING_MOON_POSX = 178;\r
+static constexpr int16_t SLEEPING_TIME_ELAPSED = 5;\r
+static constexpr int16_t SLEEPING_BG_X = 120;\r
+static constexpr int16_t SLEEPING_BG_Y = 295;\r
+static constexpr int16_t SLEEPING_TIME_MINUTE_X = 157;\r
+static constexpr int16_t SLEEPING_TIME_HOUR_X = 128;\r
+static constexpr int16_t SLEEPING_TIME_HOUR_TEXT_X = 178;\r
+static constexpr int16_t SLEEPING_TIME_MINUTE1_X = 238;\r
+static constexpr int16_t SLEEPING_TIME_MINUTE1_TEXT_X = 288;\r
+\r
+SleepSleepingPage::SleepSleepingPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepSleepingPage::SleepSleepingPage");\r
+}\r
+\r
+SleepSleepingPage::~SleepSleepingPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+\r
+ if (sleepTitleLabel_ != nullptr) {\r
+ delete sleepTitleLabel_;\r
+ sleepTitleLabel_ = nullptr;\r
+ }\r
+\r
+ if (moonImg_ != nullptr) {\r
+ delete moonImg_;\r
+ moonImg_ = nullptr;\r
+ }\r
+\r
+ if (sleepingLabel_ != nullptr) {\r
+ delete sleepingLabel_;\r
+ sleepingLabel_ = nullptr;\r
+ }\r
+\r
+ if (sleepTimeBgImg_ != nullptr) {\r
+ delete sleepTimeBgImg_;\r
+ sleepTimeBgImg_ = nullptr;\r
+ }\r
+\r
+ if (targetSleepTimeHoursLabel_ != nullptr) {\r
+ delete targetSleepTimeHoursLabel_;\r
+ targetSleepTimeHoursLabel_ = nullptr;\r
+ }\r
+\r
+ if (targetSleepTimeHoursUnitLabel_ != nullptr) {\r
+ delete targetSleepTimeHoursUnitLabel_;\r
+ targetSleepTimeHoursUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (targetSleepTimeMinutesLabel_ != nullptr) {\r
+ delete targetSleepTimeMinutesLabel_;\r
+ targetSleepTimeMinutesLabel_ = nullptr;\r
+ }\r
+\r
+ if (targetSleepTimeMinutesUnitLabel_ != nullptr) {\r
+ delete targetSleepTimeMinutesUnitLabel_;\r
+ targetSleepTimeMinutesUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (circleProgress_ != nullptr) {\r
+ delete circleProgress_;\r
+ circleProgress_ = nullptr;\r
+ }\r
+\r
+ if (callBack_ != nullptr) {\r
+ delete callBack_;\r
+ callBack_ = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(SLEEP_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepSleepingPage::~SleepSleepingPage");\r
+}\r
+\r
+void SleepSleepingPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ is nullptr");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ is nullptr");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(bgImg_, SLEEP_IMAGE, IMAGE_SLEEP_BACKGROUND);\r
+ bgImg_->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group_->Add(bgImg_);\r
+ sleepTitleLabel_ = new UILabel();\r
+ if (sleepTitleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepTitleLabel_ is nullptr");\r
+ return;\r
+ }\r
+ sleepTitleLabel_->SetPosition(SLEEPING_SLEEP_X, SLEEPING_SLEEP_Y);\r
+ sleepTitleLabel_->Resize(SLEEPING_SLEEP_WIDTH, SLEEPING_SLEEP_HEIGHT);\r
+ sleepTitleLabel_->SetText("睡眠");\r
+ sleepTitleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sleepTitleLabel_->SetTextColor(Color::White());\r
+ sleepTitleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPING_SLEEP_FONT_SIZE);\r
+ sleepTitleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(sleepTitleLabel_);\r
+\r
+ moonImg_ = new UIImageView();\r
+ if (moonImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moonImg_ is nullptr");\r
+ return;\r
+ }\r
+ moonImg_->SetPosition(SLEEPING_MOON_POSX, SLEEPING_TIMETEXT_HIGHT);\r
+ LOADIMG::LoadImageViewImg(moonImg_, SLEEP_IMAGE, IMAGE_SLEEP_SLEEPING_MOON);\r
+ group_->Add(moonImg_);\r
+\r
+ sleepingLabel_ = new UILabel();\r
+ if (sleepingLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepingLabel_ is nullptr");\r
+ return;\r
+ }\r
+ sleepingLabel_->SetPosition(SLEEPING_NORECORD_X, SLEEPING_NORECORD_Y);\r
+ sleepingLabel_->Resize(SLEEPING_NORECORD_WIDTH, SLEEPING_NORECORD_HEIGHT);\r
+ sleepingLabel_->SetText("正在睡眠");\r
+ sleepingLabel_->SetTextColor(Color::White());\r
+ sleepingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPING_NORECORD_FONT_SIZE);\r
+ sleepingLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(sleepingLabel_);\r
+\r
+ InitCircleProgress();\r
+ InitSleepTimeLabel();\r
+ LoadTargetTimeForHourAndMin(SleepModel::GetInstance().GetTargetTime());\r
+ SleepModel::GetInstance().LoadData();\r
+\r
+ callBack_ = new SleepAnimatorCallback(this);\r
+ if (callBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack_ is nullptr");\r
+ return;\r
+ }\r
+ animator_ = new Animator(callBack_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "animator_ is nullptr");\r
+ return;\r
+ }\r
+\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ animator_->Start();\r
+ gettimeofday(&startTime_, nullptr);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void SleepSleepingPage::OnPause()\r
+{\r
+ animator_->Stop();\r
+}\r
+\r
+void SleepSleepingPage::SleepAnimatorCallback::Callback(UIView *view)\r
+{\r
+ (void)view;\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ uint32_t elapsed_seconds = current_time.tv_sec - page_->startTime_.tv_sec;\r
+ if (elapsed_seconds == SLEEPING_TIME_ELAPSED) {\r
+ page_->StopAnimator();\r
+ }\r
+}\r
+\r
+void SleepSleepingPage::StopAnimator()\r
+{\r
+ animator_->Stop();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+}\r
+\r
+void SleepSleepingPage::InitSleepTimeLabel()\r
+{\r
+ sleepTimeBgImg_ = new UIImageView();\r
+ if (sleepTimeBgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepTimeBgImg_ is nullptr");\r
+ return;\r
+ }\r
+ sleepTimeBgImg_->SetPosition(SLEEPING_BG_X, SLEEPING_BG_Y);\r
+ LOADIMG::LoadImageViewImg(sleepTimeBgImg_, SLEEP_IMAGE, IMAGE_SLEEP_SLEEPING_TIME);\r
+ group_->Add(sleepTimeBgImg_);\r
+\r
+ targetSleepTimeHoursLabel_ = new UILabel();\r
+ if (targetSleepTimeHoursLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeHoursLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetSleepTimeHoursLabel_->SetTextColor(Color::White());\r
+ targetSleepTimeHoursLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPING_FONT_SIZE_LARGE);\r
+ targetSleepTimeHoursLabel_->SetVisible(false);\r
+\r
+ targetSleepTimeHoursUnitLabel_ = new UILabel();\r
+ if (targetSleepTimeHoursUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeHoursUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetSleepTimeHoursUnitLabel_->SetText("小时");\r
+ targetSleepTimeHoursUnitLabel_->Resize(SLEEPING_LABEL_WIDTH, SLEEPING_LABEL_HEIGHT);\r
+ targetSleepTimeHoursUnitLabel_->SetTextColor(Color::White());\r
+ targetSleepTimeHoursUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPING_TIPS_FONT_SIZE);\r
+ targetSleepTimeHoursUnitLabel_->SetVisible(false);\r
+\r
+ targetSleepTimeMinutesLabel_ = new UILabel();\r
+ if (targetSleepTimeMinutesLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeMinutesLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetSleepTimeMinutesLabel_->Resize(SLEEPING_TIME_LABEL_WIDTH, SLEEPING_TIME_LABEL_HEIGHT);\r
+ targetSleepTimeMinutesLabel_->SetTextColor(Color::White());\r
+ targetSleepTimeMinutesLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, SLEEPING_FONT_SIZE_LARGE);\r
+ targetSleepTimeMinutesLabel_->SetVisible(false);\r
+\r
+ targetSleepTimeMinutesUnitLabel_ = new UILabel();\r
+ if (targetSleepTimeMinutesUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetSleepTimeMinutesUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetSleepTimeMinutesUnitLabel_->SetText("分钟");\r
+ targetSleepTimeMinutesUnitLabel_->Resize(SLEEPING_LABEL_WIDTH, SLEEPING_LABEL_HEIGHT);\r
+ targetSleepTimeMinutesUnitLabel_->SetTextColor(Color::White());\r
+ targetSleepTimeMinutesUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPING_TIPS_FONT_SIZE);\r
+ targetSleepTimeMinutesUnitLabel_->SetVisible(false);\r
+}\r
+\r
+void SleepSleepingPage::LoadTargetTimeForHourAndMin(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+ if ((hours == 0) && (minutes != 0)) {\r
+ targetSleepTimeMinutesLabel_->SetPosition(SLEEPING_TIME_MINUTE_X, ACTUALMINUTES_Y);\r
+ targetSleepTimeMinutesLabel_->SetVisible(true);\r
+ targetSleepTimeMinutesLabel_->SetText(std::to_string(minutes).c_str());\r
+ targetSleepTimeMinutesLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(targetSleepTimeMinutesLabel_);\r
+\r
+ targetSleepTimeMinutesUnitLabel_->SetPosition(SLEEPING_ACTUALMINUTE_X, SLEEPING_ACTUALMINUTE_Y);\r
+ targetSleepTimeMinutesUnitLabel_->SetVisible(true);\r
+ group_->Add(targetSleepTimeMinutesUnitLabel_);\r
+ } else if ((hours != 0) && (minutes == 0)) {\r
+ targetSleepTimeHoursLabel_->SetPosition(ACTUALMINUTES_X, ACTUALMINUTES_Y);\r
+ targetSleepTimeHoursLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_HEIGHT);\r
+ targetSleepTimeHoursLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ targetSleepTimeHoursLabel_->SetVisible(true);\r
+ targetSleepTimeHoursLabel_->SetText(std::to_string(hours).c_str());\r
+ group_->Add(targetSleepTimeHoursLabel_);\r
+\r
+ targetSleepTimeHoursUnitLabel_->SetPosition(SLEEPING_ACTUALMINUTE_X, SLEEPING_ACTUALMINUTE_Y);\r
+ targetSleepTimeHoursUnitLabel_->SetVisible(true);\r
+ group_->Add(targetSleepTimeHoursUnitLabel_);\r
+ } else if ((hours != 0) && (minutes != 0)) {\r
+ targetSleepTimeHoursLabel_->SetPosition(SLEEPING_TIME_HOUR_X, ACTUALMINUTES_Y);\r
+ targetSleepTimeHoursLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_HEIGHT);\r
+ targetSleepTimeHoursLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ targetSleepTimeHoursLabel_->SetVisible(true);\r
+ targetSleepTimeHoursLabel_->SetText(std::to_string(hours).c_str());\r
+ group_->Add(targetSleepTimeHoursLabel_);\r
+\r
+ targetSleepTimeHoursUnitLabel_->SetPosition(SLEEPING_TIME_HOUR_TEXT_X, SLEEPING_ACTUALMINUTE_Y);\r
+ targetSleepTimeHoursUnitLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_LABEL_HEIGHT);\r
+ targetSleepTimeHoursUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ targetSleepTimeHoursUnitLabel_->SetVisible(true);\r
+ group_->Add(targetSleepTimeHoursUnitLabel_);\r
+\r
+ targetSleepTimeMinutesLabel_->SetPosition(SLEEPING_TIME_MINUTE1_X, ACTUALMINUTES_Y);\r
+ targetSleepTimeMinutesLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_HEIGHT);\r
+ targetSleepTimeMinutesLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ targetSleepTimeMinutesLabel_->SetVisible(true);\r
+ targetSleepTimeMinutesLabel_->SetText(std::to_string(minutes).c_str());\r
+ group_->Add(targetSleepTimeMinutesLabel_);\r
+\r
+ targetSleepTimeMinutesUnitLabel_->SetPosition(SLEEPING_TIME_MINUTE1_TEXT_X, SLEEPING_ACTUALMINUTE_Y);\r
+ targetSleepTimeMinutesUnitLabel_->Resize(SLEEPING_HEIGHT, SLEEPING_LABEL_HEIGHT);\r
+ targetSleepTimeMinutesUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ targetSleepTimeMinutesUnitLabel_->SetVisible(true);\r
+ group_->Add(targetSleepTimeMinutesUnitLabel_);\r
+ }\r
+}\r
+\r
+void SleepSleepingPage::InitCircleProgress()\r
+{\r
+ circleProgress_ = new UICircleProgress();\r
+ if (circleProgress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "circleProgress_ is nullptr");\r
+ return;\r
+ }\r
+ circleProgress_->SetPosition(0, 0);\r
+ circleProgress_->Resize(SLEEPING_CIR_HIGHT, SLEEPING_CIR_HIGHT);\r
+ circleProgress_->SetCenterPosition(SLEEPING_CIR_X, SLEEPING_CIR_Y);\r
+ circleProgress_->SetRadius(SLEEPING_CIR_RADIUS);\r
+ circleProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFF6f29a0);\r
+ circleProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xFFB566FF);\r
+ circleProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, SLEEPING_CIR_LINE_WIDTH);\r
+ circleProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, SLEEPING_CIR_LINE_WIDTH);\r
+ circleProgress_->SetStartAngle(0);\r
+ circleProgress_->SetEndAngle(SLEEPING_CIR_ANGLE);\r
+ circleProgress_->SetRange(SLEEPING_TIME_ELAPSED, 0);\r
+ circleProgress_->SetValue(SLEEPING_TIME_ELAPSED);\r
+ group_->Add(circleProgress_);\r
+ circleProgress_->Invalidate();\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepTargetTime\r
+ * Created: 2025-06-05\r
+ */\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "common/image_cache_manager.h"\r
+#include "sleep/SleepMainPage.h"\r
+#include "sleep/SleepPresenter.h"\r
+#include "sleep/SleepView.h"\r
+#include "sleep/SleepTargetTime.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t BACKGROUND_FONT = 40;\r
+static constexpr uint8_t HIGHTLIGHT_FONT = 55;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_X = 120;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_Y = 40;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_WIDTH = 200;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_HIGHT = 38;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_FONT_SIZE = 32;\r
+static constexpr int16_t TARGET_SLEEP_START_X = 112;\r
+static constexpr int16_t TARGET_SLEEP_START_Y = 347;\r
+static constexpr int16_t TARGET_SLEEP_START_WIDTH = 232;\r
+static constexpr int16_t TARGET_SLEEP_START_HIGHT = 76;\r
+static constexpr int16_t TARGET_SLEEP_PICKER2_X = 270;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_Y = 132;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_WIDTH = 80;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_HIGHT = 185;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_BORDER = 3;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_RADIUS = 11;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_ITEM = 70;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_HOUR = 24;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_MINUTE = 60;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_X = 131;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL2_X = 273;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_Y = 99;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL2_Y = 90;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_WIDTH = 55;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_HEIGHT = 30;\r
+static constexpr uint8_t TIMERLABEL_FONT = 24;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_R = 181;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_G = 402;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_B = 255;\r
+static constexpr int16_t TARGET_SLEEP_PICKER1_X = 115;\r
+static constexpr int16_t TARGET_SLEEP_PICKER2_Y = 255;\r
+static constexpr char *START_BUTTON = "start";\r
+static constexpr char *HOUR_PICKER = "hourPicker";\r
+static constexpr char *MIN_PICKER = "minPicker";\r
+\r
+// 时间选择器分钟列\r
+static const char *g_uiPickerMinute[] = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09",\r
+ "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", \r
+ "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",\r
+ "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",\r
+ "40", "41", "42", "43", "44", "45", "46", "47", "48", "49",\r
+ "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"};\r
+\r
+// 时间选择器小时列\r
+static const char *g_uiPickerHour[] = {"00", "01", "02", "03", "04", "05", "06", "07",\r
+ "08", "09", "10", "11", "12", "13", "14", "15",\r
+ "16", "17", "18", "19", "20", "21", "22", "23"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_TARGET_PAGE, SleepTargetTime, false);\r
+\r
+SleepTargetTime::SleepTargetTime()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepTargetTime::SleepTargetTime");\r
+}\r
+\r
+SleepTargetTime::~SleepTargetTime()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (targetTitleLabel_ != nullptr) {\r
+ delete targetTitleLabel_;\r
+ targetTitleLabel_ = nullptr;\r
+ }\r
+\r
+ if (timerUnitLabel_ != nullptr) {\r
+ delete timerUnitLabel_;\r
+ timerUnitLabel_ = nullptr;\r
+ }\r
+\r
+ if (startButton_ != nullptr) {\r
+ delete startButton_;\r
+ startButton_ = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < PICKER_COUNT; i++) {\r
+ if (timerPicker_[i] != nullptr) {\r
+ delete timerPicker_[i];\r
+ timerPicker_[i] = nullptr;\r
+ }\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(SLEEP_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepTargetTime::~SleepTargetTime");\r
+}\r
+\r
+void SleepTargetTime::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ is nullptr");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+ targetTitleLabel_ = new UILabel();\r
+ if (targetTitleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTitleLabel_ is nullptr");\r
+ return;\r
+ }\r
+ targetTitleLabel_->SetPosition(TARGET_SLEEP_SETTARGET_X, TARGET_SLEEP_SETTARGET_Y);\r
+ targetTitleLabel_->Resize(TARGET_SLEEP_SETTARGET_WIDTH, TARGET_SLEEP_SETTARGET_HIGHT);\r
+ targetTitleLabel_->SetText("设置目标");\r
+ targetTitleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ targetTitleLabel_->SetTextColor(Color::White());\r
+ targetTitleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, TARGET_SLEEP_SETTARGET_FONT_SIZE);\r
+ targetTitleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(targetTitleLabel_);\r
+\r
+ InitStartButton();\r
+ CreateLabel();\r
+ CreatePicker();\r
+\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void SleepTargetTime::InitStartButton()\r
+{\r
+ startButton_ = new UILabelButton();\r
+ if (startButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startButton_ is nullptr");\r
+ return;\r
+ }\r
+ startButton_->SetPosition(TARGET_SLEEP_START_X, TARGET_SLEEP_START_Y);\r
+ startButton_->Resize(TARGET_SLEEP_START_WIDTH, TARGET_SLEEP_START_HIGHT);\r
+ startButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ startButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ startButton_->SetViewId(START_BUTTON);\r
+ startButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TARGET_SLEEP_SETTARGET_FONT_SIZE);\r
+ startButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Purple().full);\r
+ startButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::White().full, UIButton::PRESSED);\r
+ startButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::White().full, UIButton::RELEASED);\r
+ startButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+ startButton_->SetText("开始");\r
+ LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_START_GRAY, IMAGE_SLEEP_START_GRAY);\r
+ startButton_->SetOnClickListener(this);\r
+ startButton_->Disable();\r
+ group_->Add(startButton_);\r
+}\r
+\r
+void SleepTargetTime::SetPickerTime()\r
+{\r
+ std::tuple<uint32_t, uint32_t> time = SleepModel::GetInstance().GetTargetTime();\r
+ uint32_t timeHours = std::get<0>(time);\r
+ uint32_t timeMinutes = std::get<1>(time);\r
+ timerPicker_[0]->SetSelected(timeHours);\r
+ timerPicker_[1]->SetSelected(timeMinutes);\r
+}\r
+\r
+void SleepTargetTime::CreatePicker()\r
+{\r
+ int posX[PICKER_COUNT] = {TARGET_SLEEP_PICKER1_X, TARGET_SLEEP_PICKER2_Y};\r
+ int posY = TARGET_SLEEP_PICKER_Y;\r
+ for (int i = 0; i < PICKER_COUNT; i++) {\r
+ if (timerPicker_[i] == nullptr) {\r
+ timerPicker_[i] = new UIPicker();\r
+ }\r
+ timerPicker_[i]->SetPosition(posX[i], posY);\r
+ timerPicker_[i]->Resize(TARGET_SLEEP_PICKER_WIDTH, TARGET_SLEEP_PICKER_HIGHT);\r
+ timerPicker_[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ timerPicker_[i]->SetStyle(STYLE_BORDER_WIDTH, TARGET_SLEEP_PICKER_BORDER);\r
+ timerPicker_[i]->SetStyle(STYLE_BORDER_RADIUS, TARGET_SLEEP_PICKER_RADIUS);\r
+ timerPicker_[i]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[i]->SetItemHeight(TARGET_SLEEP_PICKER_ITEM);\r
+ timerPicker_[i]->SetLoopState(true);\r
+ timerPicker_[i]->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+ timerPicker_[i]->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+ timerPicker_[i]->SetTextColor(Color::Gray(), Color::White());\r
+ if (i == 0) {\r
+ timerPicker_[i]->SetValues(g_uiPickerHour, TARGET_SLEEP_PICKER_HOUR);\r
+ } else {\r
+ timerPicker_[i]->SetValues(g_uiPickerMinute, TARGET_SLEEP_PICKER_MINUTE);\r
+ }\r
+ timerPicker_[i]->SetOnClickListener(this);\r
+ timerPicker_[i]->SetOnDragListener(this);\r
+ timerPicker_[i]->RegisterSelectedListener(this);\r
+ timerPicker_[i]->SetDraggable(true);\r
+ group_->Add(timerPicker_[i]);\r
+ }\r
+\r
+ timerPicker_[0]->SetViewId(HOUR_PICKER);\r
+ timerPicker_[1]->SetViewId(MIN_PICKER);\r
+ if (SleepModel::GetInstance().GetRecord() == true) {\r
+ startButton_->SetTextColor(Color::White());\r
+ startButton_->Enable();\r
+ LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_SETTIMEBTN, IMAGE_SLEEP_SETTIMEBTN);\r
+ SetPickerTime();\r
+ } else {\r
+ timerPicker_[0]->SetSelected(0);\r
+ timerPicker_[1]->SetSelected(0);\r
+ }\r
+}\r
+\r
+bool SleepTargetTime::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), START_BUTTON) == 0) {\r
+ uint8_t hour = std::stoi(g_uiPickerHour[timerPicker_[0]->GetSelected()]);\r
+ uint8_t minute = std::stoi(g_uiPickerMinute[timerPicker_[1]->GetSelected()]);\r
+ SleepModel::GetInstance().SetTargetTime((hour * TARGET_SLEEP_PICKER_MINUTE) + minute);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_SLEEP_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+void SleepTargetTime::CreateLabel()\r
+{\r
+ timerUnitLabel_ = new UILabel();\r
+ if (timerUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timerUnitLabel_ is nullptr");\r
+ return;\r
+ }\r
+ timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL_Y);\r
+ timerUnitLabel_->Resize(TARGET_SLEEP_TIMERLABEL_WIDTH, TARGET_SLEEP_TIMERLABEL_HEIGHT);\r
+ timerUnitLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ timerUnitLabel_->SetText("小时");\r
+ timerUnitLabel_->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFB566FF);\r
+ timerUnitLabel_->SetTextColor(Color::Black());\r
+ timerUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ timerUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMERLABEL_FONT);\r
+ timerUnitLabel_->SetVisible(false);\r
+ group_->Add(timerUnitLabel_);\r
+}\r
+\r
+bool SleepTargetTime::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SLEEPING_PAGES::SLEEPING_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ if (strcmp(view.GetViewId(), HOUR_PICKER) == 0) {\r
+ timerPicker_[0]->SetStyle(\r
+ STYLE_BORDER_COLOR,\r
+ Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+ timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[0]->Invalidate();\r
+ timerPicker_[1]->Invalidate();\r
+ timerUnitLabel_->SetVisible(true);\r
+ timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+ timerUnitLabel_->SetText("小时");\r
+ timerUnitLabel_->Invalidate();\r
+ } else if (strcmp(view.GetViewId(), MIN_PICKER) == 0) {\r
+ timerPicker_[1]->SetStyle(\r
+ STYLE_BORDER_COLOR,\r
+ Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+ timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[0]->Invalidate();\r
+ timerPicker_[1]->Invalidate();\r
+ timerUnitLabel_->SetVisible(true);\r
+ timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL2_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+ timerUnitLabel_->SetText("分钟");\r
+ timerUnitLabel_->Invalidate();\r
+ }\r
+ return true;\r
+}\r
+\r
+void SleepTargetTime::OnPickerStoped(UIPicker &picker)\r
+{\r
+ if (strcmp(picker.GetViewId(), HOUR_PICKER) == 0) {\r
+ uint16_t hour = picker.GetSelected();\r
+ picker.SetStyle(STYLE_BORDER_COLOR,\r
+ Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+ picker.Invalidate();\r
+ if ((hour == 0) && (timerPicker_[1]->GetSelected() == 0)) {\r
+ startButton_->Disable();\r
+ LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_START_GRAY, IMAGE_SLEEP_START_GRAY);\r
+ } else {\r
+ startButton_->SetTextColor(Color::White());\r
+ startButton_->Enable();\r
+ LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_SETTIMEBTN, IMAGE_SLEEP_SETTIMEBTN);\r
+ }\r
+ timerUnitLabel_->SetVisible(true);\r
+ timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+ timerUnitLabel_->SetText("小时");\r
+ timerUnitLabel_->Invalidate();\r
+ } else if (strcmp(picker.GetViewId(), MIN_PICKER) == 0) {\r
+ uint16_t minute = picker.GetSelected();\r
+ picker.SetStyle(STYLE_BORDER_COLOR,\r
+ Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+ picker.Invalidate();\r
+ if ((minute == 0) && (timerPicker_[0]->GetSelected() == 0)) {\r
+ startButton_->Disable();\r
+ LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_START_GRAY, IMAGE_SLEEP_START_GRAY);\r
+ } else {\r
+ startButton_->SetTextColor(Color::White());\r
+ startButton_->Enable();\r
+ LOADIMG::LoadBtnImage(startButton_, SLEEP_IMAGE, IMAGE_SLEEP_SETTIMEBTN, IMAGE_SLEEP_SETTIMEBTN);\r
+ }\r
+ timerUnitLabel_->SetVisible(true);\r
+ timerUnitLabel_->SetPosition(TARGET_SLEEP_TIMERLABEL2_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+ timerUnitLabel_->SetText("分钟");\r
+ timerUnitLabel_->Invalidate();\r
+ }\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportCountdownPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportCountdownPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TEXT_X = 164;\r
+static constexpr uint16_t TEXT_Y = 154;\r
+static constexpr uint16_t TEXT_W = 132;\r
+static constexpr uint16_t TEXT_H = 132;\r
+static constexpr uint16_t TEXT_FONT = 120;\r
+static constexpr uint16_t PROCESS_X = 90;\r
+static constexpr uint16_t PROCESS_Y = 90;\r
+static constexpr uint16_t PROCESS_W = 273;\r
+static constexpr uint16_t PROCESS_H = 273;\r
+static constexpr uint16_t PROCESS_CENTER_X = 135;\r
+static constexpr uint16_t PROCESS_CENTER_Y = 135;\r
+static constexpr uint16_t PROCESS_MAX_RANGE = 100;\r
+static constexpr uint16_t PROCESS_RADIUS = 120;\r
+static constexpr uint16_t PROCESS_START_ANGLE = 360;\r
+static constexpr uint16_t PROCESS_LINE_WIDTH = 20;\r
+static constexpr uint16_t COUNTDOWN_TIME = 3;\r
+static constexpr uint32_t MICRO_SECONDS_PER_SECOND = 1000000;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_COUNTDOWN, SportCountdownPage, false);\r
+\r
+void SportCountdownPage::UpdateCountdownView(uint64_t time)\r
+{\r
+ uint8_t reminTime = COUNTDOWN_TIME - (time / MICRO_SECONDS_PER_SECOND);\r
+ if (reminTime != 0) {\r
+ countdownText_->SetText(std::to_string(reminTime).c_str());\r
+ }\r
+ double precent = static_cast<double>(time) / (COUNTDOWN_TIME * MICRO_SECONDS_PER_SECOND);\r
+ countdownProgress_->SetValue(precent * PROCESS_MAX_RANGE);\r
+}\r
+\r
+void SportCountdownPage::SportCountdownAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+ struct timeval currTime = {0};\r
+ gettimeofday(&currTime, nullptr);\r
+ uint64_t time = ((uint64_t)currTime.tv_sec * MICRO_SECONDS_PER_SECOND + currTime.tv_usec) -\r
+ ((uint64_t)page_->startTime_.tv_sec * MICRO_SECONDS_PER_SECOND + page_->startTime_.tv_usec);\r
+ page_->UpdateCountdownView(time);\r
+ if (time / MICRO_SECONDS_PER_SECOND >= COUNTDOWN_TIME) {\r
+ page_->animator_->Stop();\r
+ SportModel::GetInstance().StartSport(true);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+}\r
+\r
+SportCountdownPage::~SportCountdownPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (countdownText_ != nullptr) {\r
+ delete countdownText_;\r
+ countdownText_ = nullptr;\r
+ }\r
+ if (countdownProgress_ != nullptr) {\r
+ delete countdownProgress_;\r
+ countdownProgress_ = nullptr;\r
+ }\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ if (callback_ != nullptr) {\r
+ delete callback_;\r
+ callback_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportCountdownPage::~SportCountdownPage");\r
+}\r
+\r
+void SportCountdownPage::OnStart(void *data)\r
+{\r
+ gettimeofday(&startTime_, nullptr);\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+ countdownText_ = new UILabel();\r
+ if (countdownText_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage countdownText_ new fail");\r
+ return;\r
+ }\r
+ countdownText_->SetPosition(TEXT_X, TEXT_Y, TEXT_W, TEXT_H);\r
+ countdownText_->SetFont(BOLD_VECTOR_FONT_FILENAME, TEXT_FONT);\r
+ countdownText_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(countdownText_);\r
+\r
+ countdownProgress_ = new UICircleProgress();\r
+ if (countdownProgress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage new countdownProgress_ fail");\r
+ return;\r
+ }\r
+ countdownProgress_->SetPosition(PROCESS_X, PROCESS_Y, PROCESS_W, PROCESS_H);\r
+ countdownProgress_->SetCenterPosition(PROCESS_CENTER_X, PROCESS_CENTER_Y);\r
+ countdownProgress_->SetRange(PROCESS_MAX_RANGE, 0);\r
+ countdownProgress_->SetRadius(PROCESS_RADIUS);\r
+ countdownProgress_->SetStartAngle(PROCESS_START_ANGLE);\r
+ countdownProgress_->SetEndAngle(0);\r
+ countdownProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0xff14d3dd);\r
+ countdownProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, PROCESS_LINE_WIDTH);\r
+ countdownProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0xff549490);\r
+ countdownProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, PROCESS_LINE_WIDTH);\r
+ group_->Add(countdownProgress_);\r
+ AddViewToPageContainer(group_);\r
+\r
+ callback_ = new SportCountdownAnimatorCallback(this);\r
+ if (callback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage::OnStart callback_ new fail");\r
+ return;\r
+ }\r
+\r
+ animator_ = new Animator(callback_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportCountdownPage::OnStart new Animator animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+void SportCountdownPage::OnPause()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() != Animator::STOP) {\r
+ animator_->Stop();\r
+ }\r
+ }\r
+}\r
+\r
+void SportCountdownPage::OnResume()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() == Animator::STOP) {\r
+ animator_->Start();\r
+ }\r
+ }\r
+}\r
+\r
+bool SportCountdownPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ return false;\r
+}\r
+\r
+bool SportCountdownPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportDataPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "settings/model/SettingPowerModel.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportDataPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TARGET_HALF = 2;\r
+static constexpr uint16_t NUM_ONE = 1;\r
+static constexpr uint16_t NUM_THOUSAND = 1000;\r
+static constexpr uint16_t BATTERY_LEVEL1 = 10;\r
+static constexpr uint16_t BATTERY_LEVEL2 = 20;\r
+static constexpr uint16_t BATTERY_LEVEL3 = 40;\r
+static constexpr uint16_t BATTERY_LEVEL4 = 70;\r
+static constexpr uint16_t BATTERY_LEVEL5 = 100;\r
+static constexpr uint16_t UNIT_SECS_PER_MIN = 60;\r
+static constexpr uint16_t HAND_POSITION_XPOS = 224;\r
+static constexpr uint16_t HAND_POSITION_YPOS = 4;\r
+static constexpr uint16_t HAND_CENTER_XPOS = 3;\r
+static constexpr uint16_t HAND_CENTER_YPOS = 223;\r
+static constexpr uint16_t HAND_WIDTH = 2;\r
+static constexpr uint16_t HAND_HEIGHT = 5;\r
+static constexpr uint16_t HEARTBEAT_MIN = 116;\r
+static constexpr uint16_t HEARTBEAT_MID = 156;\r
+static constexpr uint16_t HEARTBEAT_MAX = 195;\r
+static constexpr uint16_t HEARTBEAT_CONVERT_UNIT = 600;\r
+static constexpr uint16_t HEARTBEAT_BASE1 = 24000;\r
+static constexpr uint16_t HEARTBEAT_BASE2 = 36000;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_X = 132;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_Y = 174;\r
+static constexpr uint16_t BATTERY_ICON_X = 160;\r
+static constexpr uint16_t BATTERY_ICON_Y = 405;\r
+static constexpr uint16_t BATTERY_LABEL_FONT = 20;\r
+static constexpr uint16_t BATTERY_LABEL_X = 164;\r
+static constexpr uint16_t BATTERY_LABEL_Y = 405;\r
+static constexpr uint16_t BATTERY_LABEL_W = 35;\r
+static constexpr uint16_t BATTERY_LABEL_H = 20;\r
+static constexpr uint16_t TIME_LABEL_FONT = 32;\r
+static constexpr uint16_t TIME_LABEL_X = 219;\r
+static constexpr uint16_t TIME_LABEL_Y = 395;\r
+static constexpr uint16_t TIME_LABEL_W = 84;\r
+static constexpr uint16_t TIME_LABEL_H = 47;\r
+static constexpr uint16_t TOP_VALUE_LABEL_FONT = 100;\r
+static constexpr uint16_t VALUE_LABEL_FONT = 56;\r
+static constexpr uint16_t UNIT_LABEL_FONT = 24;\r
+static constexpr uint16_t TOP_VALUE_LABEL_X = 142;\r
+static constexpr uint16_t TOP_VALUE_LABEL_Y = 73;\r
+static constexpr uint16_t TOP_VALUE_LABEL_W = 172;\r
+static constexpr uint16_t TOP_VALUE_LABEL_H = 100;\r
+static constexpr uint16_t TOP_UNIT_LABEL_X = 160;\r
+static constexpr uint16_t TOP_UNIT_LABEL_Y = 173;\r
+static constexpr uint16_t TOP_UNIT_LABEL_W = 166;\r
+static constexpr uint16_t TOP_UNIT_LABEL_H = 25;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_X = 44;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_Y = 212;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_W = 175;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_H = 56;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_X = 44;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_Y = 272;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_W = 175;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_H = 25;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_X = 227;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_Y = 212;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_W = 175;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_H = 56;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_X = 227;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_Y = 272;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_W = 175;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_H = 25;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_X = 120;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_Y = 309;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_W = 221;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_H = 56;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_X = 205;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_Y = 369;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_W = 50;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_H = 25;\r
+static constexpr uint16_t SEP_LINE_X = 225;\r
+static constexpr uint16_t SEP_LINE_Y = 220;\r
+static constexpr uint16_t SEP_LINE_W = 2;\r
+static constexpr uint16_t SEP_LINE_H = 80;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_DATA, SportDataPage, false);\r
+\r
+void SportDataPage::SportDataAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+\r
+ uint16_t heartRate = SportModel::GetInstance().GetHeartRate();\r
+ if (heartRate < HEARTBEAT_MIN) {\r
+ heartRate = HEARTBEAT_BASE2;\r
+ } else if (heartRate < HEARTBEAT_MID) {\r
+ heartRate = (heartRate - HEARTBEAT_MIN) * HEARTBEAT_CONVERT_UNIT + HEARTBEAT_BASE2;\r
+ } else if (heartRate < HEARTBEAT_MAX) {\r
+ heartRate = (heartRate - HEARTBEAT_MID) * HEARTBEAT_CONVERT_UNIT;\r
+ } else {\r
+ heartRate = HEARTBEAT_BASE1;\r
+ }\r
+ page_->sweepClock_->SetSweepTime24Hour(0, 0, heartRate);\r
+ page_->sweepClock_->Invalidate();\r
+\r
+ std::string currTime = GetCurrentTimeStr();\r
+ page_->timeLabel_->SetText(currTime.c_str());\r
+ page_->timeLabel_->Invalidate();\r
+\r
+ uint8_t battery = SettingPowerModel::GetInstance().GetBatteryPowerLevel();\r
+ page_->batteryLabel_->SetText(std::to_string(battery).c_str());\r
+ page_->batteryLabel_->Invalidate();\r
+\r
+ if (battery < BATTERY_LEVEL1) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY1);\r
+ } else if (battery < BATTERY_LEVEL2) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY2);\r
+ } else if (battery < BATTERY_LEVEL3) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY3);\r
+ } else if (battery < BATTERY_LEVEL4) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY4);\r
+ } else if (battery <= BATTERY_LEVEL5) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY5);\r
+ }\r
+\r
+ page_->UpdateDataViewByType();\r
+ page_->CheckTarget();\r
+ page_->CheckRemind();\r
+}\r
+\r
+SportDataPage::~SportDataPage()\r
+{\r
+ if (sweepClock_ != nullptr) {\r
+ sweepClock_->RemoveAll();\r
+ delete sweepClock_;\r
+ sweepClock_ = nullptr;\r
+ }\r
+ if (timeLabel_ != nullptr) {\r
+ delete timeLabel_;\r
+ timeLabel_ = nullptr;\r
+ }\r
+ if (batteryIcon_ != nullptr) {\r
+ delete batteryIcon_;\r
+ batteryIcon_ = nullptr;\r
+ }\r
+ if (batteryLabel_ != nullptr) {\r
+ delete batteryLabel_;\r
+ batteryLabel_ = nullptr;\r
+ }\r
+ if (heartRateScale_ != nullptr) {\r
+ delete heartRateScale_;\r
+ heartRateScale_ = nullptr;\r
+ }\r
+ if (heartRatePointer_ != nullptr) {\r
+ delete heartRatePointer_;\r
+ heartRatePointer_ = nullptr;\r
+ }\r
+ if (separateLine_ != nullptr) {\r
+ delete separateLine_;\r
+ separateLine_ = nullptr;\r
+ }\r
+ if (topValueLabel_ != nullptr) {\r
+ delete topValueLabel_;\r
+ topValueLabel_ = nullptr;\r
+ }\r
+ if (topUnitLabel_ != nullptr) {\r
+ delete topUnitLabel_;\r
+ topUnitLabel_ = nullptr;\r
+ }\r
+ if (leftValueLabel_ != nullptr) {\r
+ delete leftValueLabel_;\r
+ leftValueLabel_ = nullptr;\r
+ }\r
+ if (leftUnitLabel_ != nullptr) {\r
+ delete leftUnitLabel_;\r
+ leftUnitLabel_ = nullptr;\r
+ }\r
+ if (rightValueLabel_ != nullptr) {\r
+ delete rightValueLabel_;\r
+ rightValueLabel_ = nullptr;\r
+ }\r
+ if (rightUnitLabel_ != nullptr) {\r
+ delete rightUnitLabel_;\r
+ rightUnitLabel_ = nullptr;\r
+ }\r
+ if (bottomValueLabel_ != nullptr) {\r
+ delete bottomValueLabel_;\r
+ bottomValueLabel_ = nullptr;\r
+ }\r
+ if (bottomUnitLabel_ != nullptr) {\r
+ delete bottomUnitLabel_;\r
+ bottomUnitLabel_ = nullptr;\r
+ }\r
+ if (secondHand_ != nullptr) {\r
+ delete secondHand_;\r
+ secondHand_ = nullptr;\r
+ }\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ if (callback_ != nullptr) {\r
+ delete callback_;\r
+ callback_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportDataPage::~SportDataPage");\r
+}\r
+\r
+void SportDataPage::InitTimeLableVIew()\r
+{\r
+ timeLabel_ = new UILabel();\r
+ if (timeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage timeLabel_ new fail");\r
+ return;\r
+ }\r
+ timeLabel_->SetPosition(TIME_LABEL_X, TIME_LABEL_Y, TIME_LABEL_W, TIME_LABEL_H);\r
+ timeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+ timeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ sweepClock_->Add(timeLabel_);\r
+}\r
+\r
+void SportDataPage::InitBatteryView()\r
+{\r
+ batteryIcon_ = new UIImageView();\r
+ if (batteryIcon_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage batteryIcon_ new fail");\r
+ return;\r
+ }\r
+ batteryIcon_->SetPosition(BATTERY_ICON_X, BATTERY_ICON_Y);\r
+ batteryIcon_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sweepClock_->Add(batteryIcon_);\r
+\r
+ batteryLabel_ = new UILabel();\r
+ if (batteryLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage batteryLabel_ new fail");\r
+ return;\r
+ }\r
+ batteryLabel_->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, BATTERY_LABEL_W, BATTERY_LABEL_H);\r
+ batteryLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BATTERY_LABEL_FONT);\r
+ batteryLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ sweepClock_->Add(batteryLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpHeartRate()\r
+{\r
+ heartRateScale_ = new UIImageView();\r
+ if (heartRateScale_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage heartRateScale_ new fail");\r
+ return;\r
+ }\r
+ heartRateScale_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(heartRateScale_, SPORT_IMAGE, IMAGE_SPORT_SCALE);\r
+ sweepClock_->Add(heartRateScale_);\r
+\r
+ heartRatePointer_ = new UIImageView();\r
+ if (heartRatePointer_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage heartRatePointer_ new fail");\r
+ return;\r
+ }\r
+ heartRatePointer_->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y);\r
+ LOADIMG::LoadImageViewImg(heartRatePointer_, SPORT_IMAGE, IMAGE_SPORT_HEART2);\r
+ sweepClock_->Add(heartRatePointer_);\r
+\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_CLIMBING) {\r
+ heartRatePointer_->SetVisible(false);\r
+ } else {\r
+ heartRatePointer_->SetVisible(true);\r
+ }\r
+}\r
+\r
+void SportDataPage::ShowUpTopView()\r
+{\r
+ topValueLabel_ = new UILabel();\r
+ if (topValueLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage topValueLabel_ new fail");\r
+ return;\r
+ }\r
+ topValueLabel_->SetPosition(TOP_VALUE_LABEL_X, TOP_VALUE_LABEL_Y, TOP_VALUE_LABEL_W, TOP_VALUE_LABEL_H);\r
+ topValueLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ topValueLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TOP_VALUE_LABEL_FONT);\r
+ sweepClock_->Add(topValueLabel_);\r
+\r
+ topUnitLabel_ = new UILabel();\r
+ if (topUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage topUnitLabel_ new fail");\r
+ return;\r
+ }\r
+ topUnitLabel_->SetPosition(TOP_UNIT_LABEL_X, TOP_UNIT_LABEL_Y, TOP_UNIT_LABEL_W, TOP_UNIT_LABEL_H);\r
+ topUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ topUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+ sweepClock_->Add(topUnitLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpLeftView()\r
+{\r
+ leftValueLabel_ = new UILabel();\r
+ if (leftValueLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage leftValueLabel_ new fail");\r
+ return;\r
+ }\r
+ leftValueLabel_->SetPosition(LEFT_VALUE_LABEL_X, LEFT_VALUE_LABEL_Y, LEFT_VALUE_LABEL_W, LEFT_VALUE_LABEL_H);\r
+ leftValueLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ leftValueLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+ sweepClock_->Add(leftValueLabel_);\r
+\r
+ leftUnitLabel_ = new UILabel();\r
+ if (leftUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage leftUnitLabel_ new fail");\r
+ return;\r
+ }\r
+ leftUnitLabel_->SetPosition(LEFT_UNIT_LABEL_X, LEFT_UNIT_LABEL_Y, LEFT_UNIT_LABEL_W, LEFT_UNIT_LABEL_H);\r
+ leftUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ leftUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+ sweepClock_->Add(leftUnitLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpRightView()\r
+{\r
+ rightValueLabel_ = new UILabel();\r
+ if (rightValueLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage rightValueLabel_ new fail");\r
+ return;\r
+ }\r
+ rightValueLabel_->SetPosition(RIGHT_VALUE_LABEL_X, RIGHT_VALUE_LABEL_Y, RIGHT_VALUE_LABEL_W, RIGHT_VALUE_LABEL_H);\r
+ rightValueLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ rightValueLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+ sweepClock_->Add(rightValueLabel_);\r
+\r
+ rightUnitLabel_ = new UILabel();\r
+ if (rightUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage rightUnitLabel_ new fail");\r
+ return;\r
+ }\r
+ rightUnitLabel_->SetPosition(RIGHT_UNIT_LABEL_X, RIGHT_UNIT_LABEL_Y, RIGHT_UNIT_LABEL_W, RIGHT_UNIT_LABEL_H);\r
+ rightUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ rightUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+ sweepClock_->Add(rightUnitLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpBottomView()\r
+{\r
+ bottomValueLabel_ = new UILabel();\r
+ if (bottomValueLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage bottomValueLabel_ new fail");\r
+ return;\r
+ }\r
+ bottomValueLabel_->SetPosition(BOTTOM_VALUE_LABEL_X, BOTTOM_VALUE_LABEL_Y, BOTTOM_VALUE_LABEL_W,\r
+ BOTTOM_VALUE_LABEL_H);\r
+ bottomValueLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ bottomValueLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+ sweepClock_->Add(bottomValueLabel_);\r
+\r
+ bottomUnitLabel_ = new UILabel();\r
+ if (bottomUnitLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage bottomUnitLabel_ new fail");\r
+ return;\r
+ }\r
+ bottomUnitLabel_->SetPosition(BOTTOM_UNIT_LABEL_X, BOTTOM_UNIT_LABEL_Y, BOTTOM_UNIT_LABEL_W, BOTTOM_UNIT_LABEL_H);\r
+ bottomUnitLabel_->SetText("时间");\r
+ bottomUnitLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ bottomUnitLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+ sweepClock_->Add(bottomUnitLabel_);\r
+}\r
+\r
+void SportDataPage::ShowUpSeparateLine()\r
+{\r
+ separateLine_ = new UICanvas();\r
+ if (separateLine_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage ShowUpSeparateLine new fail");\r
+ return;\r
+ }\r
+ separateLine_->SetPosition(SEP_LINE_X, SEP_LINE_Y, SEP_LINE_W, SEP_LINE_H);\r
+ separateLine_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ sweepClock_->Add(separateLine_);\r
+}\r
+\r
+void SportDataPage::OnStart(void *data)\r
+{\r
+ sweepClock_ = new UISweepClock();\r
+ if (sweepClock_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage sweepClock_ new fail");\r
+ return;\r
+ }\r
+ sweepClock_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ sweepClock_->SetOnDragListener(this);\r
+ sweepClock_->SetDraggable(true);\r
+ sweepClock_->SetTouchable(true);\r
+\r
+ secondHand_ = new Image();\r
+ if (secondHand_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "secondHand new fail");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageImg(secondHand_, SPORT_IMAGE, IMAGE_SPORT_TRIANGLE);\r
+ sweepClock_->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand_,\r
+ {HAND_POSITION_XPOS, HAND_POSITION_YPOS}, {HAND_CENTER_XPOS, HAND_CENTER_YPOS});\r
+ sweepClock_->SetHandLine(UISweepClock::HandType::HOUR_HAND, {HAND_POSITION_XPOS, HAND_POSITION_YPOS},\r
+ {HAND_CENTER_XPOS, HAND_CENTER_YPOS}, Color::White(), HAND_WIDTH, HAND_HEIGHT,\r
+ OPA_TRANSPARENT);\r
+ sweepClock_->SetHandLine(UISweepClock::HandType::MINUTE_HAND, {HAND_POSITION_XPOS, HAND_POSITION_YPOS},\r
+ {HAND_CENTER_XPOS, HAND_CENTER_YPOS}, Color::White(), HAND_WIDTH, HAND_HEIGHT,\r
+ OPA_TRANSPARENT);\r
+ sweepClock_->SetWorkMode(UISweepClock::WorkMode::NORMAL);\r
+\r
+ ShowUpHeartRate();\r
+ InitTimeLableVIew();\r
+ InitBatteryView();\r
+ ShowUpTopView();\r
+ ShowUpLeftView();\r
+ ShowUpRightView();\r
+ ShowUpBottomView();\r
+ ShowUpSeparateLine();\r
+ AddViewToPageContainer(sweepClock_);\r
+\r
+ callback_ = new SportDataAnimatorCallback(this);\r
+ if (callback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage::OnStart callback_ new fail");\r
+ return;\r
+ }\r
+\r
+ animator_ = new Animator(callback_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportDataPage::OnStart new Animator animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+void SportDataPage::OnPause()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() != Animator::STOP) {\r
+ animator_->Stop();\r
+ }\r
+ }\r
+}\r
+\r
+void SportDataPage::OnResume()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() == Animator::STOP) {\r
+ animator_->Start();\r
+ }\r
+ }\r
+}\r
+\r
+bool SportDataPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ SportModel::GetInstance().PauseAndReport(true);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_PAUSE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportDataPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ return false;\r
+}\r
+\r
+void SportDataPage::UpdateDataViewByType()\r
+{\r
+ uint32_t elapsedTime = SportModel::GetInstance().GetElapsedTime();\r
+ std::string sportTimeStr = FormatSportTime(elapsedTime);\r
+ bottomValueLabel_->SetText(sportTimeStr.c_str());\r
+\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetSportInfo(sportType);\r
+ if (sportType == SPORT_TYPE_OUTDOOR_RUNNING) {\r
+ topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+ topUnitLabel_->SetText("心率(次/分钟)");\r
+ leftValueLabel_->SetText(CalculateSpeed(sportInfo->data.distance, elapsedTime).c_str());\r
+ leftUnitLabel_->SetText("配速(/km)");\r
+ rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+ rightUnitLabel_->SetText("距离(km)");\r
+ } else if (sportType == SPORT_TYPE_INDOOR_RUNNING) {\r
+ topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+ topUnitLabel_->SetText("心率(次/分钟)");\r
+ leftValueLabel_->SetText(CalculateSpeed(sportInfo->data.distance, elapsedTime).c_str());\r
+ leftUnitLabel_->SetText("配速(/km)");\r
+ rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+ rightUnitLabel_->SetText("距离(km)");\r
+ } else if (sportType == SPORT_TYPE_CYCLING) {\r
+ topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+ topUnitLabel_->SetText("心率(次/分钟)");\r
+ leftValueLabel_->SetText(CalculateSpeed(sportInfo->data.distance, elapsedTime).c_str());\r
+ leftUnitLabel_->SetText("配速(/km)");\r
+ rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+ rightUnitLabel_->SetText("距离(km)");\r
+ } else if (sportType == SPORT_TYPE_CLIMBING) {\r
+ topValueLabel_->SetText(std::to_string(sportInfo->data.altitude).c_str());\r
+ topUnitLabel_->SetText("海拔(m)");\r
+ leftValueLabel_->SetText(std::to_string(sportInfo->data.ascent).c_str());\r
+ leftUnitLabel_->SetText("累计上升(m)");\r
+ rightValueLabel_->SetText(std::to_string(sportInfo->data.descent).c_str());\r
+ rightUnitLabel_->SetText("累计下降(m)");\r
+ } else if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+ topUnitLabel_->SetText("心率(次/分钟)");\r
+ leftValueLabel_->SetText(std::to_string(sportInfo->data.calorie).c_str());\r
+ leftUnitLabel_->SetText("热量(kcal)");\r
+ rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+ rightUnitLabel_->SetText("距离(km)");\r
+ } else if (sportType == SPORT_TYPE_OUTDOOR_SWIMMING) {\r
+ topValueLabel_->SetText(std::to_string(sportInfo->data.heartRate).c_str());\r
+ topUnitLabel_->SetText("心率(次/分钟)");\r
+ leftValueLabel_->SetText(std::to_string(sportInfo->data.calorie).c_str());\r
+ leftUnitLabel_->SetText("热量(kcal)");\r
+ rightValueLabel_->SetText(ConvertDistance(sportInfo->data.distance).c_str());\r
+ rightUnitLabel_->SetText("距离(km)");\r
+ }\r
+}\r
+\r
+void SportDataPage::CheckTarget()\r
+{\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (!sportInfo->isTargetSetted) {\r
+ return;\r
+ }\r
+ if (sportInfo->targetType == SPORT_TARGET_DISTANCE) {\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ if (!sportInfo->targetComplete && sportInfo->data.lap >= sportInfo->targetValue) {\r
+ sportInfo->targetComplete = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (!sportInfo->targetHalf && sportInfo->data.lap >= sportInfo->targetValue / TARGET_HALF) {\r
+ sportInfo->targetHalf = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ } else {\r
+ if (!sportInfo->targetComplete && sportInfo->data.distance >= sportInfo->targetValue * NUM_THOUSAND) {\r
+ sportInfo->targetComplete = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (!sportInfo->targetHalf &&\r
+ sportInfo->data.distance >= sportInfo->targetValue * NUM_THOUSAND / TARGET_HALF) {\r
+ sportInfo->targetHalf = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ }\r
+ } else if (sportInfo->targetType == SPORT_TARGET_TIME) {\r
+ uint32_t elapsedTime = SportModel::GetInstance().GetElapsedTime();\r
+ if (!sportInfo->targetComplete && elapsedTime >= sportInfo->targetValue * UNIT_SECS_PER_MIN) {\r
+ sportInfo->targetComplete = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (!sportInfo->targetHalf && elapsedTime >= sportInfo->targetValue * UNIT_SECS_PER_MIN / TARGET_HALF) {\r
+ sportInfo->targetHalf = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ } else if (sportInfo->targetType == SPORT_TARGET_CALORIE) {\r
+ if (!sportInfo->targetComplete && sportInfo->data.calorie >= sportInfo->targetValue) {\r
+ sportInfo->targetComplete = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (!sportInfo->targetHalf && sportInfo->data.calorie >= sportInfo->targetValue / TARGET_HALF) {\r
+ sportInfo->targetHalf = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_TARGET;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ }\r
+}\r
+\r
+void SportDataPage::CheckRemind()\r
+{\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->enableHeartRemind) {\r
+ if (sportInfo->data.heartRate >= GetHeartRateRangeBounder(sportInfo->heartRange) &&\r
+ sportInfo->data.heartRate < GetHeartRateRangeBounder(sportInfo->heartRange + NUM_ONE)) {\r
+ if (!sportInfo->isHeartReminded) {\r
+ sportInfo->isHeartReminded = true;\r
+ sportInfo->promptType = SPORT_SET_TYPE_HEARTRATE;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ } else {\r
+ sportInfo->isHeartReminded = false;\r
+ }\r
+ }\r
+\r
+ if (sportInfo->remindType == SPORT_REMIND_INTERVAL_NONE || !sportInfo->isRemindSetted) {\r
+ return;\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ if (sportInfo->data.lap >= (sportInfo->remindTimes + NUM_ONE) * sportInfo->remindValue) {\r
+ sportInfo->remindTimes++;\r
+ sportInfo->promptType = SPORT_SET_TYPE_REMIND;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ } else {\r
+ if (sportInfo->data.distance >=\r
+ (sportInfo->remindTimes + NUM_ONE) * sportInfo->remindValue * NUM_THOUSAND) {\r
+ sportInfo->remindTimes++;\r
+ sportInfo->promptType = SPORT_SET_TYPE_REMIND;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ }\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+ uint32_t elapsedTime = SportModel::GetInstance().GetElapsedTime();\r
+ if (elapsedTime >= (sportInfo->remindTimes + NUM_ONE) * sportInfo->remindValue * UNIT_SECS_PER_MIN) {\r
+ sportInfo->remindTimes++;\r
+ sportInfo->promptType = SPORT_SET_TYPE_REMIND;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportHeartRateRangeItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportHeartRateRangeItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t TITLE_X = 39;\r
+static constexpr uint16_t TITLE_Y = 17;\r
+static constexpr uint16_t TITLE_W = 200;\r
+static constexpr uint16_t TITLE_H = 29;\r
+static constexpr uint16_t TITLE_FONT = 24;\r
+static constexpr uint16_t RANGE_X = 39;\r
+static constexpr uint16_t RANGE_Y = 50;\r
+static constexpr uint16_t RANGE_W = 264;\r
+static constexpr uint16_t RANGE_H = 39;\r
+static constexpr uint16_t RANGE_FONT = 32;\r
+static constexpr uint16_t BUTTON_X = 350;\r
+static constexpr uint16_t BUTTON_Y = 32;\r
+static constexpr uint16_t BUTTON_W = 44;\r
+static constexpr uint16_t BUTTON_H = 44;\r
+\r
+SportHeartRateRangeItemView::SportHeartRateRangeItemView()\r
+{\r
+ bgImage_.SetPosition(BG_X, BG_Y);\r
+ LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+ title_.SetPosition(TITLE_X, TITLE_Y, TITLE_W, TITLE_H);\r
+ title_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT);\r
+ title_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ title_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ title_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ range_.SetPosition(RANGE_X, RANGE_Y, RANGE_W, RANGE_H);\r
+ range_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, RANGE_FONT);\r
+ range_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ range_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ button_.SetPosition(BUTTON_X, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ button_.SetImages(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_RADIO1, SPORT_IMAGE),\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_RADIO0, SPORT_IMAGE));\r
+\r
+ Add(&bgImage_);\r
+ Add(&title_);\r
+ Add(&range_);\r
+ Add(&button_);\r
+}\r
+\r
+SportHeartRateRangeItemView::~SportHeartRateRangeItemView()\r
+{\r
+ Remove(&bgImage_);\r
+ Remove(&title_);\r
+ Remove(&range_);\r
+ Remove(&button_);\r
+}\r
+\r
+void SportHeartRateRangeItemView::SetItemInfo(const SportHeartRateRangeItem &itemInfo)\r
+{\r
+ title_.SetText(itemInfo.title);\r
+ range_.SetText(GetHeartRateRangeDescription(itemInfo.itemId));\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->heartRange == itemInfo.itemId) {\r
+ button_.SetState(UICheckBox::UICheckBoxState::SELECTED);\r
+ } else {\r
+ button_.SetState(UICheckBox::UICheckBoxState::UNSELECTED);\r
+ }\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportHeartRateRangePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportPresenter.h"\r
+#include "sport/SportHeartRateRangePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 485;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t TOP_BLANK_SIZE = 38;\r
+static constexpr uint16_t BOTTOM_BLANK_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_HEARTRATE_RANGE, SportHeartRateRangePage, false);\r
+\r
+static SportHeartRateRangePage *g_SportHeartRateRangePageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ SportHeartRateRangeItemView *item = new SportHeartRateRangeItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_SportHeartRateRangePageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SportHeartRateRangeItemView *item = dynamic_cast<SportHeartRateRangeItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ SportHeartRateRangeItem *itemInfo = static_cast<SportHeartRateRangeItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportHeartRateRangePage::SportHeartRateRangePage()\r
+{\r
+ g_SportHeartRateRangePageInstance = this;\r
+}\r
+\r
+SportHeartRateRangePage::~SportHeartRateRangePage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (heartRateRangeList_ != nullptr) {\r
+ delete heartRateRangeList_;\r
+ heartRateRangeList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportHeartRateRangePage::~SportHeartRateRangePage");\r
+}\r
+\r
+void SportHeartRateRangePage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportHeartRateRangePage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+ titleLabel_->SetText("心率范围");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void SportHeartRateRangePage::CreateUIList()\r
+{\r
+ heartRateRangeList_ = new UISimpleList();\r
+ if (heartRateRangeList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportHeartRateRangePage heartRateRangeList_ new fail");\r
+ return;\r
+ }\r
+ heartRateRangeList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ heartRateRangeList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ heartRateRangeList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ heartRateRangeList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+ for (uint8_t i = 0; i < SPORT_HEARTRATE_RANGE_MAX; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&heartRateRanges_[i]);\r
+ heartRateRangeList_->AddContent(content);\r
+ }\r
+ heartRateRangeList_->RefreshList();\r
+ group_->Add(heartRateRangeList_);\r
+}\r
+\r
+void SportHeartRateRangePage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportHeartRateRangePage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ group_->SetScrollBlankSize(TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+ group_->SetScrollBlankSize(BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportHeartRateRangePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND_HEARTRATE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportHeartRateRangePage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (strcmp(view.GetViewId(), SPORT_HEARTRATE_RANGE_ITEM_1) == 0) {\r
+ sportInfo->heartRange = SPORT_HEARTRATE_RANGE_ITEM1;\r
+ } else if (strcmp(view.GetViewId(), SPORT_HEARTRATE_RANGE_ITEM_2) == 0) {\r
+ sportInfo->heartRange = SPORT_HEARTRATE_RANGE_ITEM2;\r
+ } else if (strcmp(view.GetViewId(), SPORT_HEARTRATE_RANGE_ITEM_3) == 0) {\r
+ sportInfo->heartRange = SPORT_HEARTRATE_RANGE_ITEM3;\r
+ } else if (strcmp(view.GetViewId(), SPORT_HEARTRATE_RANGE_ITEM_4) == 0) {\r
+ sportInfo->heartRange = SPORT_HEARTRATE_RANGE_ITEM4;\r
+ }\r
+ heartRateRangeList_->RefreshList();\r
+ SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND_HEARTRATE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMenuItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_sport.h"\r
+#include "main/LoadImg.h"\r
+#include "sport/SportMenuItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 10;\r
+static constexpr uint16_t ICON_X = 16;\r
+static constexpr uint16_t ICON_Y = 25;\r
+static constexpr uint16_t LABEL_X = 124;\r
+static constexpr uint16_t LABEL_Y = 47;\r
+static constexpr uint16_t LABEL_W = 166;\r
+static constexpr uint16_t LABEL_H = 40;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t IMAGE_X = 344;\r
+static constexpr uint16_t IMAGE_Y = 44;\r
+\r
+SportMenuItemView::SportMenuItemView()\r
+{\r
+ bgImage_.SetPosition(BG_X, BG_Y);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+ label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+\r
+ LOADIMG::LoadImageViewImg(&settingImage_, SPORT_IMAGE, IMAGE_SPORT_SETTING);\r
+ settingImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+\r
+ Add(&bgImage_);\r
+ Add(&icon_);\r
+ Add(&label_);\r
+ Add(&settingImage_);\r
+}\r
+\r
+SportMenuItemView::~SportMenuItemView()\r
+{\r
+ Remove(&bgImage_);\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+ Remove(&settingImage_);\r
+}\r
+\r
+void SportMenuItemView::SetItemInfo(const SportMenuItem &itemInfo)\r
+{\r
+ LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, itemInfo.bgId);\r
+ LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+ label_.SetText(itemInfo.label);\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMenuPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportMenuPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TITLI_LABEL_FONT = 38;\r
+static constexpr uint16_t TITLI_LABEL_X = 100;\r
+static constexpr uint16_t TITLI_LABEL_Y = 38;\r
+static constexpr uint16_t TITLI_LABEL_W = 253;\r
+static constexpr uint16_t TITLI_LABEL_H = 53;\r
+static constexpr uint16_t LIST_X = 19;\r
+static constexpr uint16_t LIST_Y = 108;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 780;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 129;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t BLANK_SIZE = 100;\r
+static constexpr uint16_t SETTINGS_START_XPOS = 364;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_MENU, SportMenuPage, true);\r
+\r
+static SportMenuPage *g_SportMenuPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ SportMenuItemView *item = new SportMenuItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_SportMenuPageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SportMenuItemView *item = dynamic_cast<SportMenuItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ SportMenuItem *itemInfo = static_cast<SportMenuItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportMenuPage::SportMenuPage()\r
+{\r
+ g_SportMenuPageInstance = this;\r
+}\r
+\r
+SportMenuPage::~SportMenuPage()\r
+{\r
+ bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(SPORT_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadSportImage fail");\r
+ }\r
+\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (background_ != nullptr) {\r
+ delete background_;\r
+ background_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (sportList_ != nullptr) {\r
+ delete sportList_;\r
+ sportList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportMenuPage::~SportMenuPage");\r
+}\r
+\r
+void SportMenuPage::InitBackgroundView()\r
+{\r
+ background_ = new UIImageView();\r
+ if (background_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMenuPage background_ new fail");\r
+ return;\r
+ }\r
+ background_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+ group_->Add(background_);\r
+}\r
+\r
+void SportMenuPage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMenuPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+\r
+ titleLabel_->SetPosition(TITLI_LABEL_X, TITLI_LABEL_Y, TITLI_LABEL_W, TITLI_LABEL_H);\r
+ titleLabel_->SetText("运动");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, TITLI_LABEL_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void SportMenuPage::CreateUIList()\r
+{\r
+ sportList_ = new UISimpleList();\r
+ if (sportList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMenuPage sportList_ new fail");\r
+ return;\r
+ }\r
+\r
+ sportList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ sportList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sportList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ sportList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+ for (uint8_t i = 0; i < SPORT_TYPE_MAX; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&sportMenu_[i]);\r
+ sportList_->AddContent(content);\r
+ }\r
+ sportList_->RefreshList();\r
+ group_->Add(sportList_);\r
+}\r
+\r
+void SportMenuPage::OnStart(void *data)\r
+{\r
+ bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(SPORT_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadSportImage fail");\r
+ return;\r
+ }\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMenuPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetYScrollBarVisible(true);\r
+ group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ group_->SetScrollBlankSize(BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+ InitBackgroundView();\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportMenuPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportMenuPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SPORT_ITEM_OUTDOOR_RUNNING) == 0) {\r
+ SportModel::GetInstance().SetSportType(SPORT_TYPE_OUTDOOR_RUNNING);\r
+ } else if (strcmp(view.GetViewId(), SPORT_ITEM_INDOOR_RUNNING) == 0) {\r
+ SportModel::GetInstance().SetSportType(SPORT_TYPE_INDOOR_RUNNING);\r
+ } else if (strcmp(view.GetViewId(), SPORT_ITEM_CYCLING) == 0) {\r
+ SportModel::GetInstance().SetSportType(SPORT_TYPE_CYCLING);\r
+ } else if (strcmp(view.GetViewId(), SPORT_ITEM_CLIMBING) == 0) {\r
+ SportModel::GetInstance().SetSportType(SPORT_TYPE_CLIMBING);\r
+ } else if (strcmp(view.GetViewId(), SPORT_ITEM_INDOOR_SWIMMING) == 0) {\r
+ SportModel::GetInstance().SetSportType(SPORT_TYPE_INDOOR_SWIMMING);\r
+ } else if (strcmp(view.GetViewId(), SPORT_ITEM_OUTDOOR_SWIMMING) == 0) {\r
+ SportModel::GetInstance().SetSportType(SPORT_TYPE_OUTDOOR_SWIMMING);\r
+ }\r
+\r
+ bool isSettingClicked = event.GetCurrentPos().x > SETTINGS_START_XPOS ? true : false;\r
+ if (isSettingClicked) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_SETTINGS,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_PREPARE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportMistouchPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "ui_resource_sport.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportMistouchPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TITLE_X = 100;\r
+static constexpr uint16_t TITLE_Y = 39;\r
+static constexpr uint16_t TITLE_W = 253;\r
+static constexpr uint16_t TITLE_H = 53;\r
+static constexpr uint16_t TITLE_FONT = 38;\r
+static constexpr uint16_t SCREEN_BG_X = 19;\r
+static constexpr uint16_t SCREEN_BG_Y = 107;\r
+static constexpr uint16_t SCREEN_ICON_X = 27;\r
+static constexpr uint16_t SCREEN_ICON_Y = 115;\r
+static constexpr uint16_t SCREEN_TITLE_X = 100;\r
+static constexpr uint16_t SCREEN_TITLE_Y = 134;\r
+static constexpr uint16_t SCREEN_TITLE_W = 222;\r
+static constexpr uint16_t SCREEN_TITLE_H = 39;\r
+static constexpr uint16_t SCREEN_TITLE_FONT = 32;\r
+static constexpr uint16_t SCREEN_BUTTON_X = 323;\r
+static constexpr uint16_t SCREEN_BUTTON_Y = 131;\r
+static constexpr uint16_t SCREEN_BUTTON_W = 82;\r
+static constexpr uint16_t SCREEN_BUTTON_H = 47;\r
+static constexpr uint16_t SCREEN_TEXT_X = 19;\r
+static constexpr uint16_t SCREEN_TEXT_Y = 224;\r
+static constexpr uint16_t SCREEN_TEXT_W = 415;\r
+static constexpr uint16_t SCREEN_TEXT_H = 146;\r
+static constexpr uint16_t SCREEN_TEXT_FONT = 36;\r
+static constexpr uint16_t CROWN_BG_X = 19;\r
+static constexpr uint16_t CROWN_BG_Y = 394;\r
+static constexpr uint16_t CROWN_ICON_X = 27;\r
+static constexpr uint16_t CROWN_ICON_Y = 402;\r
+static constexpr uint16_t CROWN_TITLE_X = 100;\r
+static constexpr uint16_t CROWN_TITLE_Y = 421;\r
+static constexpr uint16_t CROWN_TITLE_W = 222;\r
+static constexpr uint16_t CROWN_TITLE_H = 39;\r
+static constexpr uint16_t CROWN_TITLE_FONT = 32;\r
+static constexpr uint16_t CROWN_BUTTON_X = 323;\r
+static constexpr uint16_t CROWN_BUTTON_Y = 417;\r
+static constexpr uint16_t CROWN_BUTTON_W = 82;\r
+static constexpr uint16_t CROWN_BUTTON_H = 47;\r
+static constexpr uint16_t CROWN_TEXT_X = 19;\r
+static constexpr uint16_t CROWN_TEXT_Y = 510;\r
+static constexpr uint16_t CROWN_TEXT_W = 415;\r
+static constexpr uint16_t CROWN_TEXT_H = 146;\r
+static constexpr uint16_t CROWN_TEXT_FONT = 36;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t TOP_BLANK_SIZE = 36;\r
+static constexpr uint16_t BOTTOM_BLANK_SIZE = 100;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_MISTOUCH, SportMistouchPage, false);\r
+\r
+SportMistouchPage::~SportMistouchPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+ if (bgScreen_ != nullptr) {\r
+ delete bgScreen_;\r
+ bgScreen_ = nullptr;\r
+ }\r
+ if (imageScreen_ != nullptr) {\r
+ delete imageScreen_;\r
+ imageScreen_ = nullptr;\r
+ }\r
+ if (titleScreen_ != nullptr) {\r
+ delete titleScreen_;\r
+ titleScreen_ = nullptr;\r
+ }\r
+ if (buttonScreen_ != nullptr) {\r
+ delete buttonScreen_;\r
+ buttonScreen_ = nullptr;\r
+ }\r
+ if (textScreen_ != nullptr) {\r
+ delete textScreen_;\r
+ textScreen_ = nullptr;\r
+ }\r
+ if (bgCrown_ != nullptr) {\r
+ delete bgCrown_;\r
+ bgCrown_ = nullptr;\r
+ }\r
+ if (imageCrown_ != nullptr) {\r
+ delete imageCrown_;\r
+ imageCrown_ = nullptr;\r
+ }\r
+ if (titleCrown_ != nullptr) {\r
+ delete titleCrown_;\r
+ titleCrown_ = nullptr;\r
+ }\r
+ if (buttonCrown_ != nullptr) {\r
+ delete buttonCrown_;\r
+ buttonCrown_ = nullptr;\r
+ }\r
+ if (textCrown_ != nullptr) {\r
+ delete textCrown_;\r
+ textCrown_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportMistouchPage::~SportMistouchPage");\r
+}\r
+\r
+void SportMistouchPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetElastic(true);\r
+ group_->SetYScrollBarVisible(true);\r
+ group_->SetReboundSize(REBOUND_SIZE);\r
+ group_->SetScrollBlankSize(TOP_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+ group_->SetScrollBlankSize(BOTTOM_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage title_ new fail");\r
+ return;\r
+ }\r
+ title_->SetPosition(TITLE_X, TITLE_Y, TITLE_W, TITLE_H);\r
+ title_->SetText("运动防误触");\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, TITLE_FONT);\r
+ group_->Add(title_);\r
+\r
+ bgScreen_ = new UIImageView();\r
+ if (bgScreen_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage bgScreen_ new fail");\r
+ return;\r
+ }\r
+ bgScreen_->SetPosition(SCREEN_BG_X, SCREEN_BG_Y);\r
+ LOADIMG::LoadImageViewImg(bgScreen_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+ group_->Add(bgScreen_);\r
+\r
+ buttonScreen_ = new UIToggleButton();\r
+ if (buttonScreen_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage buttonScreen_ new fail");\r
+ return;\r
+ }\r
+ buttonScreen_->SetPosition(SCREEN_BUTTON_X, SCREEN_BUTTON_Y, SCREEN_BUTTON_W, SCREEN_BUTTON_H);\r
+ buttonScreen_->SetViewId(SPORT_MISTOUCH_SCREEN_BUTTON);\r
+ buttonScreen_->SetImages(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE1, SPORT_IMAGE),\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE0, SPORT_IMAGE));\r
+ buttonScreen_->SetState(false);\r
+ buttonScreen_->SetOnClickListener(this);\r
+ group_->Add(buttonScreen_);\r
+\r
+ titleScreen_ = new UILabel();\r
+ if (titleScreen_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage titleScreen_ new fail");\r
+ return;\r
+ }\r
+ titleScreen_->SetPosition(SCREEN_TITLE_X, SCREEN_TITLE_Y, SCREEN_TITLE_W, SCREEN_TITLE_H);\r
+ titleScreen_->SetText("自动锁定屏幕");\r
+ titleScreen_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleScreen_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SCREEN_TITLE_FONT);\r
+ group_->Add(titleScreen_);\r
+\r
+ imageScreen_ = new UIImageView();\r
+ if (imageScreen_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage imageScreen_ new fail");\r
+ return;\r
+ }\r
+ imageScreen_->SetPosition(SCREEN_ICON_X, SCREEN_ICON_Y);\r
+ LOADIMG::LoadImageViewImg(imageScreen_, SPORT_IMAGE, IMAGE_SPORT_SCREEN);\r
+ group_->Add(imageScreen_);\r
+\r
+ textScreen_ = new UILabel();\r
+ if (textScreen_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage textScreen_ new fail");\r
+ return;\r
+ }\r
+ textScreen_->SetPosition(SCREEN_TEXT_X, SCREEN_TEXT_Y, SCREEN_TEXT_W, SCREEN_TEXT_H);\r
+ textScreen_->SetText("开启后,运动中熄屏将自动锁定屏幕触摸功能,长按表冠可解锁。");\r
+ textScreen_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ textScreen_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ textScreen_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SCREEN_TEXT_FONT);\r
+ group_->Add(textScreen_);\r
+\r
+ bgCrown_ = new UIImageView();\r
+ if (bgCrown_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage bgCrown_ new fail");\r
+ return;\r
+ }\r
+ bgCrown_->SetPosition(CROWN_BG_X, CROWN_BG_Y);\r
+ LOADIMG::LoadImageViewImg(bgCrown_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+ group_->Add(bgCrown_);\r
+\r
+ buttonCrown_ = new UIToggleButton();\r
+ if (buttonCrown_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage buttonCrown_ new fail");\r
+ return;\r
+ }\r
+ buttonCrown_->SetPosition(CROWN_BUTTON_X, CROWN_BUTTON_Y, CROWN_BUTTON_W, CROWN_BUTTON_H);\r
+ buttonCrown_->SetViewId(SPORT_MISTOUCH_CROWN_BUTTON);\r
+ buttonCrown_->SetImages(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE1, SPORT_IMAGE),\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE0, SPORT_IMAGE));\r
+ buttonCrown_->SetState(false);\r
+ buttonCrown_->SetOnClickListener(this);\r
+ group_->Add(buttonCrown_);\r
+\r
+ titleCrown_ = new UILabel();\r
+ if (titleCrown_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage titleCrown_ new fail");\r
+ return;\r
+ }\r
+ titleCrown_->SetPosition(CROWN_TITLE_X, CROWN_TITLE_Y, CROWN_TITLE_W, CROWN_TITLE_H);\r
+ titleCrown_->SetText("自动锁定表冠");\r
+ titleCrown_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleCrown_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CROWN_TITLE_FONT);\r
+ group_->Add(titleCrown_);\r
+\r
+ imageCrown_ = new UIImageView();\r
+ if (imageCrown_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage imageCrown_ new fail");\r
+ return;\r
+ }\r
+ imageCrown_->SetPosition(CROWN_ICON_X, CROWN_ICON_Y);\r
+ LOADIMG::LoadImageViewImg(imageCrown_, SPORT_IMAGE, IMAGE_SPORT_CROWN);\r
+ group_->Add(imageCrown_);\r
+\r
+ textCrown_ = new UILabel();\r
+ if (textCrown_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportMistouchPage textCrown_ new fail");\r
+ return;\r
+ }\r
+ textCrown_->SetPosition(CROWN_TEXT_X, CROWN_TEXT_Y, CROWN_TEXT_W, CROWN_TEXT_H);\r
+ textCrown_->SetText("开启后,运动中熄屏将自动锁定表冠点按、旋钮功能,长按表冠可解锁。");\r
+ textCrown_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ textCrown_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ textCrown_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CROWN_TEXT_FONT);\r
+ group_->Add(textCrown_);\r
+\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportMistouchPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_SETTINGS,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportMistouchPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SPORT_MISTOUCH_SCREEN_BUTTON) == 0) {\r
+ // 暂不支持\r
+ } else if (strcmp(view.GetViewId(), SPORT_MISTOUCH_CROWN_BUTTON) == 0) {\r
+ // 暂不支持\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportModel\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <fstream>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "wearable_log.h"\r
+#include "msg_center_device.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "sport/SportModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_HUNDRED = 100;\r
+static constexpr uint16_t NUM_THOUSAND = 1000;\r
+static constexpr uint16_t UNIT_SECS_PER_MIN = 60;\r
+static constexpr uint16_t UNIT_SECS_PER_HOUR = 3600;\r
+static const uint16_t COUNT_TIMES = 100;\r
+static const uint16_t DISTANCE_RANGE = 200;\r
+static const uint16_t HEARTRATE_MIN_VALUE = 116;\r
+static const uint16_t HEARTRATE_MAX_VALUE = 195;\r
+static const uint16_t CALORIE_RANGE = 8;\r
+static const uint16_t ALTITUDE_RANGE = 4;\r
+static const uint16_t ASCENT_RANGE = 7;\r
+static const uint16_t DESCENT_RANGE = 6;\r
+static const uint16_t g_targetDistanceValues[] = {1, 3, 5, 7, 10, 15, 20, 25, 30, 40}; // 距离Picker值集,单位为km\r
+static const uint16_t g_targetTimeValues[] = {10, 20, 30, 60, 120, 180, 200}; // 时间Picker值集,单位为分钟\r
+static const uint16_t g_targetCalorieValues[] = {100, 200, 300, 500, 600, 800, 1000}; // 热量Picker值集,单位为千卡\r
+static const uint16_t g_targetLapValues[] = {1, 2, 4, 6, 8, 10, 12, 16, 20, 30}; // 室内游泳趟数Picker值集,单位为趟\r
+static const char *g_remindHeartRateRange[] = {"116-136次/分", "136-156次/分", "156-176次/分", "176-195次/分"};\r
+static const uint16_t g_heartRateRangeBounder[] = {116, 136, 156, 176, 195};\r
+static const char *SPORT_INFO_FILE = SPORT_CONFIG_PATH "sport_info.dat";\r
+static const char *SPORT_RECORD_FILE = SPORT_CONFIG_PATH "sport_record.dat";\r
+\r
+std::string GetCurrentTimeStr()\r
+{\r
+ struct tm localTime;\r
+ time_t seconds = time(nullptr);\r
+ localtime_r(&seconds, &localTime);\r
+ std::string currTime;\r
+ if (localTime.tm_hour < NUM_TEN) {\r
+ currTime += "0";\r
+ }\r
+ currTime += std::to_string(localTime.tm_hour) + ":";\r
+ if (localTime.tm_min < NUM_TEN) {\r
+ currTime += "0";\r
+ }\r
+ currTime += std::to_string(localTime.tm_min);\r
+ return currTime;\r
+}\r
+\r
+std::string ConvertDistance(uint32_t distance)\r
+{\r
+ std::string distanceStr;\r
+ uint32_t distanceIntPart = distance / NUM_THOUSAND;\r
+ uint32_t distanceFractionalPart = (distance % NUM_THOUSAND) / NUM_TEN;\r
+ if (distanceIntPart > NUM_HUNDRED) {\r
+ distanceStr = std::to_string(distanceIntPart);\r
+ } else if (distanceIntPart > NUM_TEN) {\r
+ distanceStr = std::to_string(distanceIntPart) + "." + std::to_string(distanceFractionalPart / NUM_TEN);\r
+ } else {\r
+ if (distanceFractionalPart < NUM_TEN) {\r
+ distanceStr = std::to_string(distanceIntPart) + ".0" + std::to_string(distanceFractionalPart);\r
+ } else {\r
+ distanceStr = std::to_string(distanceIntPart) + "." + std::to_string(distanceFractionalPart);\r
+ }\r
+ }\r
+ return distanceStr;\r
+}\r
+\r
+std::string FormatSportTime(uint32_t uiSportTime)\r
+{\r
+ std::string strSportTime;\r
+ std::string hours;\r
+ std::string minute;\r
+ std::string seconds;\r
+ uint32_t hour = uiSportTime / UNIT_SECS_PER_HOUR;\r
+ uiSportTime %= UNIT_SECS_PER_HOUR;\r
+ uint32_t min = uiSportTime / UNIT_SECS_PER_MIN;\r
+ uiSportTime %= UNIT_SECS_PER_MIN;\r
+ uint32_t sec = uiSportTime;\r
+ if (hour >= 0 && hour < NUM_TEN) {\r
+ hours = "0" + std::to_string(hour);\r
+ } else {\r
+ hours = std::to_string(hour);\r
+ }\r
+ if (min >= 0 && min < NUM_TEN) {\r
+ minute = "0" + std::to_string(min);\r
+ } else {\r
+ minute = std::to_string(min);\r
+ }\r
+ if (sec >= 0 && sec < NUM_TEN) {\r
+ seconds = "0" + std::to_string(sec);\r
+ } else {\r
+ seconds = std::to_string(sec);\r
+ }\r
+ strSportTime = hours + ":" + minute + ":" + seconds;\r
+ return strSportTime;\r
+}\r
+\r
+std::string CalculateSpeed(uint32_t distance, uint32_t time)\r
+{\r
+ if (distance == 0) {\r
+ return "00'00\"";\r
+ }\r
+ std::string speedStr;\r
+ uint64_t speed = time * NUM_THOUSAND / distance;\r
+ uint64_t min = speed / UNIT_SECS_PER_MIN;\r
+ uint64_t sec = speed % UNIT_SECS_PER_MIN;\r
+ speedStr = std::to_string(min) + "'";\r
+ if (sec >= 0 && sec < NUM_TEN) {\r
+ speedStr += "0";\r
+ }\r
+ speedStr += std::to_string(sec) + "\"";\r
+ return speedStr;\r
+}\r
+\r
+const char *GetHeartRateRangeDescription(uint8_t range)\r
+{\r
+ return g_remindHeartRateRange[range];\r
+}\r
+\r
+uint16_t GetHeartRateRangeBounder(uint8_t index)\r
+{\r
+ return g_heartRateRangeBounder[index];\r
+}\r
+\r
+#if defined(_WIN32)\r
+void SportModel::SportAnimatorCallback::Callback(UIView *view)\r
+{\r
+ static uint64_t count = 0;\r
+ static bool increase = true;\r
+ if (count++ % COUNT_TIMES == 0) {\r
+ uint32_t randNum = rand();\r
+ uint32_t distance = randNum % DISTANCE_RANGE;\r
+ uint16_t calorie = randNum % CALORIE_RANGE;\r
+ uint16_t altitude = randNum % ALTITUDE_RANGE;\r
+ uint16_t ascent = randNum % ASCENT_RANGE;\r
+ uint16_t descent = randNum % DESCENT_RANGE;\r
+\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ sportInfo->data.distance += distance;\r
+ if (sportInfo->data.heartRate < HEARTRATE_MIN_VALUE) {\r
+ sportInfo->data.heartRate = HEARTRATE_MIN_VALUE;\r
+ increase = true;\r
+ }\r
+ if (sportInfo->data.heartRate > HEARTRATE_MAX_VALUE) {\r
+ sportInfo->data.heartRate = HEARTRATE_MAX_VALUE;\r
+ increase = false;\r
+ }\r
+ if (increase) {\r
+ sportInfo->data.heartRate++;\r
+ } else {\r
+ sportInfo->data.heartRate--;\r
+ }\r
+ sportInfo->data.calorie += calorie;\r
+ sportInfo->data.altitude += altitude;\r
+ sportInfo->data.ascent += ascent;\r
+ sportInfo->data.descent += descent;\r
+ sportInfo->data.lap++;\r
+ }\r
+}\r
+#else\r
+static void GenerateDataCallback(void *data)\r
+{\r
+ static bool increase = true;\r
+ uint32_t randNum = rand();\r
+ uint32_t distance = randNum % DISTANCE_RANGE;\r
+ uint16_t calorie = randNum % CALORIE_RANGE;\r
+ uint16_t altitude = randNum % ALTITUDE_RANGE;\r
+ uint16_t ascent = randNum % ASCENT_RANGE;\r
+ uint16_t descent = randNum % DESCENT_RANGE;\r
+\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ sportInfo->data.distance += distance;\r
+ if (sportInfo->data.heartRate < HEARTRATE_MIN_VALUE) {\r
+ sportInfo->data.heartRate = HEARTRATE_MIN_VALUE;\r
+ increase = true;\r
+ }\r
+ if (sportInfo->data.heartRate > HEARTRATE_MAX_VALUE) {\r
+ sportInfo->data.heartRate = HEARTRATE_MAX_VALUE;\r
+ increase = false;\r
+ }\r
+ if (increase) {\r
+ sportInfo->data.heartRate++;\r
+ } else {\r
+ sportInfo->data.heartRate--;\r
+ }\r
+ sportInfo->data.calorie += calorie;\r
+ sportInfo->data.altitude += altitude;\r
+ sportInfo->data.ascent += ascent;\r
+ sportInfo->data.descent += descent;\r
+ sportInfo->data.lap++;\r
+\r
+ if (!SportModel::GetInstance().IsStartByWatch()) {\r
+ msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_DATA, &sportInfo->data,\r
+ sizeof(sport_data_t));\r
+ }\r
+}\r
+\r
+void SportModel::InitGenerateSportData()\r
+{\r
+ uint32_t tick = GetOSTick(2000);\r
+ generateDataHandle_ = new GraphicTimer(tick, GenerateDataCallback, nullptr, true);\r
+ if (generateDataHandle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportModel::InitGenerateSportData new GraphicTimer failed!!");\r
+ return;\r
+ }\r
+}\r
+\r
+void SportModel::StartGenerateSportData()\r
+{\r
+ if (generateDataHandle_ != nullptr) {\r
+ bool retTimer = generateDataHandle_->Start();\r
+ if (!retTimer) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartGenerateSportData failed!!");\r
+ if (generateDataHandle_ != nullptr) {\r
+ delete generateDataHandle_;\r
+ generateDataHandle_ = nullptr;\r
+ }\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void SportModel::StopGenerateSportData()\r
+{\r
+ if (generateDataHandle_ != nullptr) {\r
+ generateDataHandle_->Stop();\r
+ }\r
+}\r
+#endif\r
+\r
+SportModel::SportModel()\r
+{\r
+ LoadConfig();\r
+#if defined(_WIN32)\r
+ callback_ = new SportAnimatorCallback();\r
+ if (callback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportModel::SportModel callback_ new fail");\r
+ return;\r
+ }\r
+\r
+ animator_ = new Animator(callback_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportModel::SportModel new Animator animator_ fail");\r
+ return;\r
+ }\r
+#else\r
+ InitGenerateSportData();\r
+#endif\r
+}\r
+\r
+SportModel::~SportModel() {}\r
+\r
+SportModel &SportModel::GetInstance()\r
+{\r
+ static SportModel instance;\r
+ return instance;\r
+}\r
+\r
+void SportModel::SetSportType(SportType sportType)\r
+{\r
+ curSport_ = sportType;\r
+}\r
+\r
+SportType SportModel::GetSportType(void)\r
+{\r
+ return curSport_;\r
+}\r
+\r
+void SportModel::SetTargetValue(uint16_t index)\r
+{\r
+ SportTarget target = info_[curSport_].targetType;\r
+ if (target == SPORT_TARGET_DISTANCE) {\r
+ if (curSport_ == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ info_[curSport_].targetValue = g_targetLapValues[index];\r
+ } else {\r
+ info_[curSport_].targetValue = g_targetDistanceValues[index];\r
+ }\r
+ } else if (target == SPORT_TARGET_TIME) {\r
+ info_[curSport_].targetValue = g_targetTimeValues[index];\r
+ } else if (target == SPORT_TARGET_CALORIE) {\r
+ info_[curSport_].targetValue = g_targetCalorieValues[index];\r
+ }\r
+}\r
+\r
+void SportModel::SetRemindValue(uint16_t index)\r
+{\r
+ SportRemindInterval remind = info_[curSport_].remindType;\r
+ if (remind == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+ if (curSport_ == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ info_[curSport_].remindValue = g_targetLapValues[index];\r
+ } else {\r
+ info_[curSport_].remindValue = g_targetDistanceValues[index];\r
+ }\r
+ } else if (remind == SPORT_REMIND_INTERVAL_TIME) {\r
+ info_[curSport_].remindValue = g_targetTimeValues[index];\r
+ }\r
+ info_[curSport_].remindIndex = index;\r
+}\r
+\r
+uint32_t SportModel::GetElapsedTime()\r
+{\r
+ if (state_ == SportState::RUNNING) {\r
+ uint32_t now = time(nullptr);\r
+ return info_[curSport_].data.elapsedTime + (now - info_[curSport_].startTimeTemp);\r
+ }\r
+ return info_[curSport_].data.elapsedTime;\r
+}\r
+\r
+void SportModel::SetGpsSignal(GpsSignal gpsSignal)\r
+{\r
+ gpsSignal_ = gpsSignal;\r
+}\r
+\r
+GpsSignal SportModel::GetGpsSignal(void)\r
+{\r
+ return gpsSignal_;\r
+}\r
+\r
+uint16_t SportModel::GetHeartRate(void)\r
+{\r
+ return info_[curSport_].data.heartRate;\r
+}\r
+\r
+sport_info_t *SportModel::GetSportInfo(SportType type)\r
+{\r
+ return &info_[type];\r
+}\r
+\r
+sport_info_t *SportModel::GetCurrSportInfo()\r
+{\r
+ return GetSportInfo(curSport_);\r
+}\r
+\r
+void SportModel::StartSport(bool startedByWatch)\r
+{\r
+ if (state_ == SportState::STOPPED) {\r
+ state_ = SportState::RUNNING;\r
+ isStartByWatch_ = startedByWatch;\r
+ info_[curSport_].targetHalf = false;\r
+ info_[curSport_].targetComplete = false;\r
+ info_[curSport_].isHeartReminded = false;\r
+ info_[curSport_].remindTimes = 0;\r
+ (void)memset_s(&(info_[curSport_].data), sizeof(info_[curSport_].data), 0, sizeof(sport_data_t));\r
+ info_[curSport_].data.startTime = time(nullptr);\r
+ info_[curSport_].startTimeTemp = info_[curSport_].data.startTime;\r
+#if defined(_WIN32)\r
+ animator_->Start();\r
+#else\r
+ StartGenerateSportData();\r
+#endif\r
+ }\r
+}\r
+\r
+void SportModel::PauseAndReport(bool isReport)\r
+{\r
+ if (state_ == SportState::RUNNING) {\r
+ state_ = SportState::PAUSED;\r
+ info_[curSport_].data.elapsedTime += time(nullptr) - info_[curSport_].startTimeTemp;\r
+#if defined(_WIN32)\r
+ animator_->Stop();\r
+#else\r
+ StopGenerateSportData();\r
+ if (isReport) {\r
+ sport_control_t control = {0};\r
+ control.action = static_cast<uint8_t>(SPORT_ACTION_PAUSE);\r
+ control.type = static_cast<uint8_t>(curSport_);\r
+ msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_ACTION, &control,\r
+ sizeof(sport_control_t));\r
+ }\r
+#endif\r
+ }\r
+}\r
+\r
+void SportModel::ResumeAndReport(bool isReport)\r
+{\r
+ if (state_ == SportState::PAUSED) {\r
+ state_ = SportState::RUNNING;\r
+ info_[curSport_].startTimeTemp = time(nullptr);\r
+#if defined(_WIN32)\r
+ animator_->Start();\r
+#else\r
+ StartGenerateSportData();\r
+ if (isReport) {\r
+ sport_control_t control = {0};\r
+ control.action = static_cast<uint8_t>(SPORT_ACTION_RESUME);\r
+ control.type = static_cast<uint8_t>(curSport_);\r
+ msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_ACTION, &control,\r
+ sizeof(sport_control_t));\r
+ }\r
+#endif\r
+ }\r
+}\r
+\r
+void SportModel::StopAndReport(bool isReport)\r
+{\r
+ if (state_ != SportState::STOPPED) {\r
+ state_ = SportState::STOPPED;\r
+ info_[curSport_].data.type = static_cast<uint8_t>(curSport_);\r
+ info_[curSport_].data.endTime = time(nullptr);\r
+#if defined(_WIN32)\r
+ animator_->Stop();\r
+#else\r
+ StopGenerateSportData();\r
+ if (isReport) {\r
+ sport_control_t control = {0};\r
+ control.action = static_cast<uint8_t>(SPORT_ACTION_STOP);\r
+ control.type = static_cast<uint8_t>(curSport_);\r
+ msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_ACTION, &control,\r
+ sizeof(sport_control_t));\r
+ }\r
+#endif\r
+ }\r
+}\r
+\r
+bool SportModel::IsStartByWatch()\r
+{\r
+ return isStartByWatch_;\r
+}\r
+\r
+void SportModel::AddRecord()\r
+{\r
+ if (isStartByWatch_) {\r
+ records_.push_back(info_[curSport_].data);\r
+ }\r
+ SaveConfig(SPORT_CONFIG_RECORD);\r
+}\r
+\r
+std::vector<sport_data_t> &SportModel::GetRecord()\r
+{\r
+ return records_;\r
+}\r
+\r
+void SportModel::ClearRecord()\r
+{\r
+ records_.clear();\r
+ std::remove(SPORT_RECORD_FILE);\r
+}\r
+\r
+void SportModel::LoadConfig()\r
+{\r
+ std::ifstream infoFile(SPORT_INFO_FILE, std::ios::binary);\r
+ if (infoFile) {\r
+ for (uint8_t i = 0; i < SPORT_TYPE_MAX; i++) {\r
+ infoFile.read(reinterpret_cast<char *>(&info_[i]), sizeof(sport_info_t));\r
+ }\r
+ infoFile.close();\r
+ }\r
+ std::ifstream recordFile(SPORT_RECORD_FILE, std::ios::binary);\r
+ if (recordFile) {\r
+ uint16_t num = 0;\r
+ recordFile.read(reinterpret_cast<char *>(&num), sizeof(uint16_t));\r
+ for (uint8_t i = 0; i < num; i++) {\r
+ sport_data_t data;\r
+ recordFile.read(reinterpret_cast<char *>(&data), sizeof(sport_data_t));\r
+ records_.push_back(data);\r
+ }\r
+ recordFile.close();\r
+ }\r
+}\r
+\r
+void SportModel::SaveConfig(uint8_t config)\r
+{\r
+ if (config == SPORT_CONFIG_INFO) {\r
+ std::ofstream infoFile(SPORT_INFO_FILE, std::ios::binary);\r
+ if (infoFile) {\r
+ infoFile.write(reinterpret_cast<char *>(&info_), SPORT_TYPE_MAX * sizeof(sport_info_t));\r
+ infoFile.close();\r
+ }\r
+ } else if (config == SPORT_CONFIG_RECORD) {\r
+ std::ofstream recordFile(SPORT_RECORD_FILE, std::ios::binary);\r
+ if (recordFile) {\r
+ uint16_t num = records_.size();\r
+ recordFile.write(reinterpret_cast<char *>(&num), sizeof(uint16_t));\r
+ for (uint8_t i = 0; i < num; i++) {\r
+ recordFile.write(reinterpret_cast<char *>(&records_[i]), sizeof(sport_data_t));\r
+ }\r
+ recordFile.close();\r
+ }\r
+ }\r
+}\r
+\r
+void SportModel::ClearData()\r
+{\r
+ std::remove(SPORT_INFO_FILE);\r
+ std::remove(SPORT_RECORD_FILE);\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPausePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportPausePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t NUM_THOUSAND = 1000;\r
+static constexpr uint16_t TIME_LABEL_FONT = 48;\r
+static constexpr uint16_t TIME_LABEL_X = 166;\r
+static constexpr uint16_t TIME_LABEL_Y = 35;\r
+static constexpr uint16_t TIME_LABEL_W = 122;\r
+static constexpr uint16_t TIME_LABEL_H = 48;\r
+static constexpr uint16_t TEXT_LABEL_FONT = 64;\r
+static constexpr uint16_t TEXT_LABEL_X = 130;\r
+static constexpr uint16_t TEXT_LABEL_Y = 151;\r
+static constexpr uint16_t TEXT_LABEL_W = 194;\r
+static constexpr uint16_t TEXT_LABEL_H = 80;\r
+static constexpr uint16_t BUTTON_X1 = 54;\r
+static constexpr uint16_t BUTTON_X2 = 217;\r
+static constexpr uint16_t BUTTON_Y = 250;\r
+static constexpr uint16_t BUTTON_W = 184;\r
+static constexpr uint16_t BUTTON_H = 184;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_PAUSE, SportPausePage, false);\r
+\r
+void SportPausePage::SportPauseAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UILabel *timeLabel = dynamic_cast<UILabel *>(view);\r
+ if (timeLabel == nullptr) {\r
+ return;\r
+ }\r
+ std::string currTime = GetCurrentTimeStr();\r
+ timeLabel->SetText(currTime.c_str());\r
+ timeLabel->Invalidate();\r
+}\r
+\r
+SportPausePage::~SportPausePage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (timeLabel_ != nullptr) {\r
+ delete timeLabel_;\r
+ timeLabel_ = nullptr;\r
+ }\r
+ if (textLabel_ != nullptr) {\r
+ delete textLabel_;\r
+ textLabel_ = nullptr;\r
+ }\r
+ if (continueButton_ != nullptr) {\r
+ delete continueButton_;\r
+ continueButton_ = nullptr;\r
+ }\r
+ if (finishButton_ != nullptr) {\r
+ delete finishButton_;\r
+ finishButton_ = nullptr;\r
+ }\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ if (callback_ != nullptr) {\r
+ delete callback_;\r
+ callback_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportPausePage::~SportPausePage");\r
+}\r
+\r
+void SportPausePage::CreateUILabel()\r
+{\r
+ timeLabel_ = new UILabel();\r
+ if (timeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage timeLabel_ new fail");\r
+ return;\r
+ }\r
+ timeLabel_->SetPosition(TIME_LABEL_X, TIME_LABEL_Y, TIME_LABEL_W, TIME_LABEL_H);\r
+ timeLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ timeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+ group_->Add(timeLabel_);\r
+\r
+ textLabel_ = new UILabel();\r
+ if (textLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage textLabel_ new fail");\r
+ return;\r
+ }\r
+ textLabel_->SetPosition(TEXT_LABEL_X, TEXT_LABEL_Y, TEXT_LABEL_W, TEXT_LABEL_H);\r
+ textLabel_->SetText("已暂停");\r
+ textLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ textLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TEXT_LABEL_FONT);\r
+ group_->Add(textLabel_);\r
+\r
+ callback_ = new SportPauseAnimatorCallback();\r
+ if (callback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage::OnStart callback_ new fail");\r
+ return;\r
+ }\r
+\r
+ animator_ = new Animator(callback_, timeLabel_, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage::OnStart new Animator animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+void SportPausePage::OnPause()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() != Animator::STOP) {\r
+ animator_->Stop();\r
+ }\r
+ }\r
+}\r
+\r
+void SportPausePage::OnResume()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() == Animator::STOP) {\r
+ animator_->Start();\r
+ }\r
+ }\r
+}\r
+\r
+void SportPausePage::CreateUIButton()\r
+{\r
+ finishButton_ = new UILabelButton();\r
+ if (finishButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage finishButton_ new fail");\r
+ return;\r
+ }\r
+ finishButton_->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ finishButton_->SetViewId(SPORT_PAUSE_FINISH_BUTTON);\r
+ finishButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ finishButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ finishButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ LOADIMG::LoadBtnImage(finishButton_, SPORT_IMAGE, IMAGE_SPORT_STOP, IMAGE_SPORT_STOP);\r
+ finishButton_->SetOnClickListener(this);\r
+ group_->Add(finishButton_);\r
+\r
+ continueButton_ = new UILabelButton();\r
+ if (continueButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage continueButton_ new fail");\r
+ return;\r
+ }\r
+ continueButton_->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ continueButton_->SetViewId(SPORT_PAUSE_CONTINUE_BUTTON);\r
+ continueButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ continueButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ continueButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ LOADIMG::LoadBtnImage(continueButton_, SPORT_IMAGE, IMAGE_SPORT_START, IMAGE_SPORT_START);\r
+ continueButton_->SetOnClickListener(this);\r
+ group_->Add(continueButton_);\r
+}\r
+\r
+void SportPausePage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPausePage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ CreateUILabel();\r
+ CreateUIButton();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportPausePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ SportModel::GetInstance().ResumeAndReport(true);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportPausePage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SPORT_PAUSE_CONTINUE_BUTTON) == 0) {\r
+ SportModel::GetInstance().ResumeAndReport(true);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), SPORT_PAUSE_FINISH_BUTTON) == 0) {\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->data.distance < NUM_THOUSAND) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_PROMPT,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else {\r
+ SportModel::GetInstance().StopAndReport(true);\r
+ SportModel::GetInstance().AddRecord();\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MENU,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPreparePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "settings/model/SettingPowerModel.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportPreparePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LOCATING_OVERTIME_SECOND = 2;\r
+static constexpr uint16_t BATTERY_LEVEL1 = 10;\r
+static constexpr uint16_t BATTERY_LEVEL2 = 20;\r
+static constexpr uint16_t BATTERY_LEVEL3 = 40;\r
+static constexpr uint16_t BATTERY_LEVEL4 = 70;\r
+static constexpr uint16_t BATTERY_LEVEL5 = 100;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_X = 351;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_Y = 223;\r
+static constexpr uint16_t HEARTBEAT_LABEL_X = 329;\r
+static constexpr uint16_t HEARTBEAT_LABEL_Y = 182;\r
+static constexpr uint16_t HEARTBEAT_LABEL_W = 102;\r
+static constexpr uint16_t HEARTBEAT_LABEL_H = 48;\r
+static constexpr uint16_t HEARTBEAT_LABEL_FONT = 32;\r
+static constexpr uint16_t BATTERY_ICON_X = 159;\r
+static constexpr uint16_t BATTERY_ICON_Y = 31;\r
+static constexpr uint16_t BATTERY_LABEL_FONT = 20;\r
+static constexpr uint16_t BATTERY_LABEL_X = 163;\r
+static constexpr uint16_t BATTERY_LABEL_Y = 31;\r
+static constexpr uint16_t BATTERY_LABEL_W = 35;\r
+static constexpr uint16_t BATTERY_LABEL_H = 22;\r
+static constexpr uint16_t GPS_X = 48;\r
+static constexpr uint16_t GPS_Y = 225;\r
+static constexpr uint16_t SIGNAL_X = 44;\r
+static constexpr uint16_t SIGNAL_Y = 175;\r
+static constexpr uint16_t TIME_LABEL_FONT = 32;\r
+static constexpr uint16_t TIME_LABEL_X = 214;\r
+static constexpr uint16_t TIME_LABEL_Y = 23;\r
+static constexpr uint16_t TIME_LABEL_W = 82;\r
+static constexpr uint16_t TIME_LABEL_H = 47;\r
+static constexpr uint16_t LOCATING_LABEL_FONT = 32;\r
+static constexpr uint16_t LOCATING_LABEL_X = 165;\r
+static constexpr uint16_t LOCATING_LABEL_Y = 80;\r
+static constexpr uint16_t LOCATING_LABEL_W = 164;\r
+static constexpr uint16_t LOCATING_LABEL_H = 34;\r
+static constexpr uint16_t CENTER_IMAGE_X = 132;\r
+static constexpr uint16_t CENTER_IMAGE_Y = 132;\r
+static constexpr uint16_t GO_BUTTON_X = 63;\r
+static constexpr uint16_t GO_BUTTON_Y = 361;\r
+static constexpr uint16_t GO_BUTTON_W = 328;\r
+static constexpr uint16_t GO_BUTTON_H = 93;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_PREPARE, SportPreparePage, false);\r
+\r
+void SportPreparePage::SportPrepareAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+\r
+ std::string currTime = GetCurrentTimeStr();\r
+ page_->timeLabel_->SetText(currTime.c_str());\r
+ page_->timeLabel_->Invalidate();\r
+\r
+ uint8_t battery = SettingPowerModel::GetInstance().GetBatteryPowerLevel();\r
+ page_->batteryLabel_->SetText(std::to_string(battery).c_str());\r
+ page_->batteryLabel_->Invalidate();\r
+\r
+ if (battery < BATTERY_LEVEL1) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY1);\r
+ } else if (battery < BATTERY_LEVEL2) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY2);\r
+ } else if (battery < BATTERY_LEVEL3) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY3);\r
+ } else if (battery < BATTERY_LEVEL4) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY4);\r
+ } else if (battery <= BATTERY_LEVEL5) {\r
+ LOADIMG::LoadImageViewImg(page_->batteryIcon_, SPORT_IMAGE, IMAGE_SPORT_BATTERY5);\r
+ }\r
+\r
+ time_t now = time(nullptr);\r
+ if (!page_->isOverTime_ && (now - page_->startTime_ > LOCATING_OVERTIME_SECOND)) {\r
+ page_->isOverTime_ = true;\r
+ page_->InitGpsSignalImage();\r
+ }\r
+}\r
+\r
+SportPreparePage::~SportPreparePage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (background_ != nullptr) {\r
+ delete background_;\r
+ background_ = nullptr;\r
+ }\r
+ if (timeLabel_ != nullptr) {\r
+ delete timeLabel_;\r
+ timeLabel_ = nullptr;\r
+ }\r
+ if (batteryIcon_ != nullptr) {\r
+ delete batteryIcon_;\r
+ batteryIcon_ = nullptr;\r
+ }\r
+ if (batteryLabel_ != nullptr) {\r
+ delete batteryLabel_;\r
+ batteryLabel_ = nullptr;\r
+ }\r
+ if (gpsImageView_ != nullptr) {\r
+ delete gpsImageView_;\r
+ gpsImageView_ = nullptr;\r
+ }\r
+ if (gpsSignalView_ != nullptr) {\r
+ delete gpsSignalView_;\r
+ gpsSignalView_ = nullptr;\r
+ }\r
+ if (heartRateImageView_ != nullptr) {\r
+ delete heartRateImageView_;\r
+ heartRateImageView_ = nullptr;\r
+ }\r
+ if (heartRateLabel_ != nullptr) {\r
+ delete heartRateLabel_;\r
+ heartRateLabel_ = nullptr;\r
+ }\r
+ if (locatingLabel_ != nullptr) {\r
+ delete locatingLabel_;\r
+ locatingLabel_ = nullptr;\r
+ }\r
+ if (goButton_ != nullptr) {\r
+ delete goButton_;\r
+ goButton_ = nullptr;\r
+ }\r
+ if (iconImageView_ != nullptr) {\r
+ delete iconImageView_;\r
+ iconImageView_ = nullptr;\r
+ }\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ if (callback_ != nullptr) {\r
+ delete callback_;\r
+ callback_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportPreparePage::~SportPreparePage");\r
+}\r
+\r
+void SportPreparePage::InitGpsSignalImage()\r
+{\r
+ locatingLabel_->SetVisible(false);\r
+ LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL2);\r
+}\r
+\r
+void SportPreparePage::InitTimeLableVIew()\r
+{\r
+ timeLabel_ = new UILabel();\r
+ if (timeLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage timeLabel_ new fail");\r
+ return;\r
+ }\r
+ timeLabel_->SetPosition(TIME_LABEL_X, TIME_LABEL_Y, TIME_LABEL_W, TIME_LABEL_H);\r
+ timeLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+ group_->Add(timeLabel_);\r
+}\r
+\r
+void SportPreparePage::InitBatteryView()\r
+{\r
+ batteryIcon_ = new UIImageView();\r
+ if (batteryIcon_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage batteryIcon_ new fail");\r
+ return;\r
+ }\r
+ batteryIcon_->SetPosition(BATTERY_ICON_X, BATTERY_ICON_Y);\r
+ batteryIcon_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group_->Add(batteryIcon_);\r
+\r
+ batteryLabel_ = new UILabel();\r
+ if (batteryLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage batteryLabel_ new fail");\r
+ return;\r
+ }\r
+ batteryLabel_->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, BATTERY_LABEL_W, BATTERY_LABEL_H);\r
+ batteryLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BATTERY_LABEL_FONT);\r
+ batteryLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(batteryLabel_);\r
+}\r
+\r
+void SportPreparePage::InitCenterView()\r
+{\r
+ iconImageView_ = new UIImageView();\r
+ if (iconImageView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage iconImageView_ new fail");\r
+ return;\r
+ }\r
+ iconImageView_->SetPosition(CENTER_IMAGE_X, CENTER_IMAGE_Y);\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_OUTDOOR_RUNNING) {\r
+ LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_OUTDOOR_RUNNING2);\r
+ } else if (sportType == SPORT_TYPE_INDOOR_RUNNING) {\r
+ LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_INDOOR_RUNNING2);\r
+ } else if (sportType == SPORT_TYPE_CYCLING) {\r
+ LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_CYCLING2);\r
+ } else if (sportType == SPORT_TYPE_CLIMBING) {\r
+ LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_CLIMBING2);\r
+ } else if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_INDOOR_SWIMMING2);\r
+ } else if (sportType == SPORT_TYPE_OUTDOOR_SWIMMING) {\r
+ LOADIMG::LoadImageViewImg(iconImageView_, SPORT_IMAGE, IMAGE_SPORT_OUTDOOR_SWIMMING2);\r
+ }\r
+ group_->Add(iconImageView_);\r
+}\r
+\r
+void SportPreparePage::InitGPSView()\r
+{\r
+ locatingLabel_ = new UILabel();\r
+ if (locatingLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage locatingLabel_ new fail");\r
+ return;\r
+ }\r
+ locatingLabel_->SetPosition(LOCATING_LABEL_X, LOCATING_LABEL_Y, LOCATING_LABEL_W, LOCATING_LABEL_H);\r
+ locatingLabel_->SetText("定位中...");\r
+ locatingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LOCATING_LABEL_FONT);\r
+ locatingLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(locatingLabel_);\r
+\r
+ gpsSignalView_ = new UIImageView();\r
+ if (gpsSignalView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage gpsSignalView_ new fail");\r
+ return;\r
+ }\r
+ gpsSignalView_->SetPosition(SIGNAL_X, SIGNAL_Y);\r
+ GpsSignal signal = SportModel::GetInstance().GetGpsSignal();\r
+ if (signal == SPORT_GPS_SIGNAL0) {\r
+ LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL0);\r
+ } else if (signal == SPORT_GPS_SIGNAL1) {\r
+ LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL1);\r
+ } else if (signal == SPORT_GPS_SIGNAL2) {\r
+ LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL2);\r
+ } else if (signal == SPORT_GPS_SIGNAL3) {\r
+ LOADIMG::LoadImageViewImg(gpsSignalView_, SPORT_IMAGE, IMAGE_SPORT_SIGNAL3);\r
+ }\r
+ group_->Add(gpsSignalView_);\r
+\r
+ gpsImageView_ = new UIImageView();\r
+ if (gpsImageView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage gpsImageView_ new fail");\r
+ return;\r
+ }\r
+ gpsImageView_->SetPosition(GPS_X, GPS_Y);\r
+ LOADIMG::LoadImageViewImg(gpsImageView_, SPORT_IMAGE, IMAGE_SPORT_GPS);\r
+ group_->Add(gpsImageView_);\r
+\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_RUNNING || sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ locatingLabel_->SetVisible(false);\r
+ gpsSignalView_->SetVisible(false);\r
+ gpsImageView_->SetVisible(false);\r
+ } else {\r
+ locatingLabel_->SetVisible(true);\r
+ gpsSignalView_->SetVisible(true);\r
+ gpsImageView_->SetVisible(true);\r
+ }\r
+}\r
+\r
+void SportPreparePage::InitHeartRateView()\r
+{\r
+ heartRateLabel_ = new UILabel();\r
+ if (heartRateLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage heartRateLabel_ new fail");\r
+ return;\r
+ }\r
+ heartRateLabel_->SetPosition(HEARTBEAT_LABEL_X, HEARTBEAT_LABEL_Y, HEARTBEAT_LABEL_W, HEARTBEAT_LABEL_H);\r
+ heartRateLabel_->SetText("95"); // 桩数据\r
+ heartRateLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTBEAT_LABEL_FONT);\r
+ heartRateLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(heartRateLabel_);\r
+\r
+ heartRateImageView_ = new UIImageView();\r
+ if (heartRateImageView_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage heartRateImageView_ new fail");\r
+ return;\r
+ }\r
+ heartRateImageView_->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y);\r
+ LOADIMG::LoadImageViewImg(heartRateImageView_, SPORT_IMAGE, IMAGE_SPORT_HEART1);\r
+ group_->Add(heartRateImageView_);\r
+}\r
+\r
+void SportPreparePage::InitGoButtonView()\r
+{\r
+ goButton_ = new UILabelButton();\r
+ if (goButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage goButton_ new fail");\r
+ return;\r
+ }\r
+ goButton_->SetPosition(GO_BUTTON_X, GO_BUTTON_Y, GO_BUTTON_W, GO_BUTTON_H);\r
+ goButton_->SetViewId(SPORT_PREPARE_GO_BUTTON);\r
+ goButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ goButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ goButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_OUTDOOR_RUNNING) {\r
+ LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO1, IMAGE_SPORT_GO1);\r
+ } else if (sportType == SPORT_TYPE_INDOOR_RUNNING) {\r
+ LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO2, IMAGE_SPORT_GO2);\r
+ } else if (sportType == SPORT_TYPE_CYCLING) {\r
+ LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO3, IMAGE_SPORT_GO3);\r
+ } else if (sportType == SPORT_TYPE_CLIMBING) {\r
+ LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO4, IMAGE_SPORT_GO4);\r
+ } else if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO6, IMAGE_SPORT_GO6);\r
+ } else if (sportType == SPORT_TYPE_OUTDOOR_SWIMMING) {\r
+ LOADIMG::LoadBtnImage(goButton_, SPORT_IMAGE, IMAGE_SPORT_GO5, IMAGE_SPORT_GO5);\r
+ }\r
+ goButton_->SetOnClickListener(this);\r
+ group_->Add(goButton_);\r
+}\r
+\r
+void SportPreparePage::InitBackgroundView()\r
+{\r
+ background_ = new UIImageView();\r
+ if (background_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage background_ new fail");\r
+ return;\r
+ }\r
+ background_->SetPosition(0, 0);\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_OUTDOOR_RUNNING) {\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG6);\r
+ } else if (sportType == SPORT_TYPE_INDOOR_RUNNING) {\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG1);\r
+ } else if (sportType == SPORT_TYPE_CYCLING) {\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG4);\r
+ } else if (sportType == SPORT_TYPE_CLIMBING) {\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG3);\r
+ } else if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG2);\r
+ } else if (sportType == SPORT_TYPE_OUTDOOR_SWIMMING) {\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG5);\r
+ }\r
+ group_->Add(background_);\r
+}\r
+\r
+void SportPreparePage::OnStart(void *data)\r
+{\r
+ startTime_ = time(nullptr); // 用于在 animator 回调中, 模拟显示 '定位中'\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ InitBackgroundView();\r
+ InitTimeLableVIew();\r
+ InitBatteryView();\r
+ InitCenterView();\r
+ InitGPSView();\r
+ InitHeartRateView();\r
+ InitGoButtonView();\r
+ AddViewToPageContainer(group_);\r
+\r
+ callback_ = new SportPrepareAnimatorCallback(this);\r
+ if (callback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage::OnStart callback_ new fail");\r
+ return;\r
+ }\r
+\r
+ animator_ = new Animator(callback_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPreparePage::OnStart new Animator animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+void SportPreparePage::OnPause()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() != Animator::STOP) {\r
+ animator_->Stop();\r
+ }\r
+ }\r
+}\r
+\r
+void SportPreparePage::OnResume()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() == Animator::STOP) {\r
+ animator_->Start();\r
+ }\r
+ }\r
+}\r
+\r
+bool SportPreparePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MENU,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportPreparePage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SPORT_PREPARE_GO_BUTTON) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_COUNTDOWN,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPresenter\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_SPORT, SportView, SportPresenter, SPORT_ICON, SPORT_ICON, "运动");\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportPromptPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportPromptPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ICON_X = 173;\r
+static constexpr uint16_t ICON_Y = 48;\r
+static constexpr uint16_t LABEL_X = 24;\r
+static constexpr uint16_t LABEL_Y = 177;\r
+static constexpr uint16_t LABEL_W = 405;\r
+static constexpr uint16_t LABEL_H = 100;\r
+static constexpr uint16_t LABEL_FONT = 36;\r
+static constexpr uint16_t BUTTON_X1 = 104;\r
+static constexpr uint16_t BUTTON_X2 = 240;\r
+static constexpr uint16_t BUTTON_Y = 296;\r
+static constexpr uint16_t BUTTON_W = 109;\r
+static constexpr uint16_t BUTTON_H = 109;\r
+static const char *PROMPT_CONTENT = "本次运动距离过短,不会记录数据。是否结束?";\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_PROMPT, SportPromptPage, false);\r
+\r
+SportPromptPage::~SportPromptPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (promptLabel_ != nullptr) {\r
+ delete promptLabel_;\r
+ promptLabel_ = nullptr;\r
+ }\r
+ if (promptIcon_ != nullptr) {\r
+ delete promptIcon_;\r
+ promptIcon_ = nullptr;\r
+ }\r
+ if (cancelButton_ != nullptr) {\r
+ delete cancelButton_;\r
+ cancelButton_ = nullptr;\r
+ }\r
+ if (confirmButton_ != nullptr) {\r
+ delete confirmButton_;\r
+ confirmButton_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportPromptPage::~SportPromptPage");\r
+}\r
+\r
+void SportPromptPage::CreateUILabel()\r
+{\r
+ promptIcon_ = new UIImageView();\r
+ if (promptIcon_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage promptIcon_ new fail");\r
+ return;\r
+ }\r
+ promptIcon_->SetPosition(ICON_X, ICON_Y);\r
+ LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE, IMAGE_SPORT_FACE);\r
+ group_->Add(promptIcon_);\r
+\r
+ promptLabel_ = new UILabel();\r
+ if (promptLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage promptLabel_ new fail");\r
+ return;\r
+ }\r
+ promptLabel_->SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ promptLabel_->SetText(PROMPT_CONTENT);\r
+ promptLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ promptLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(promptLabel_);\r
+}\r
+\r
+void SportPromptPage::CreateUIButton()\r
+{\r
+ cancelButton_ = new UIButton();\r
+ if (cancelButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage cancelButton_ new fail");\r
+ return;\r
+ }\r
+ cancelButton_->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ cancelButton_->SetViewId(SPORT_PROMPT_CANCEL_BUTTON);\r
+ cancelButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ cancelButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ cancelButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ LOADIMG::LoadBtnImage(cancelButton_, SPORT_IMAGE, IMAGE_SPORT_CANCEL, IMAGE_SPORT_CANCEL);\r
+ cancelButton_->SetOnClickListener(this);\r
+ group_->Add(cancelButton_);\r
+\r
+ confirmButton_ = new UIButton();\r
+ if (confirmButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage confirmButton_ new fail");\r
+ return;\r
+ }\r
+ confirmButton_->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ confirmButton_->SetViewId(SPORT_PROMPT_CONFIRM_BUTTON);\r
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_CONFIRM, IMAGE_SPORT_CONFIRM);\r
+ confirmButton_->SetOnClickListener(this);\r
+ group_->Add(confirmButton_);\r
+}\r
+\r
+void SportPromptPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportPromptPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ CreateUILabel();\r
+ CreateUIButton();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportPromptPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ return true;\r
+}\r
+\r
+bool SportPromptPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SPORT_PROMPT_CANCEL_BUTTON) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_PAUSE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), SPORT_PROMPT_CONFIRM_BUTTON) == 0) {\r
+ SportModel::GetInstance().StopAndReport(true);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MENU,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindHeartRateItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportRemindHeartRateItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 17;\r
+static constexpr uint16_t LABEL_W = 207;\r
+static constexpr uint16_t LABEL_H = 39;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t HITS_X = 100;\r
+static constexpr uint16_t HITS_Y = 60;\r
+static constexpr uint16_t HITS_W = 176;\r
+static constexpr uint16_t HITS_H = 29;\r
+static constexpr uint16_t HITS_FONT = 24;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+static constexpr uint16_t BUTTON_X = 304;\r
+static constexpr uint16_t BUTTON_Y = 33;\r
+static constexpr uint16_t BUTTON_W = 81;\r
+static constexpr uint16_t BUTTON_H = 46;\r
+\r
+SportRemindHeartRateItemView::SportRemindHeartRateItemView()\r
+{\r
+ bgImage_.SetPosition(BG_X, BG_Y);\r
+ LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+ label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ hits_.SetPosition(HITS_X, HITS_Y, HITS_W, HITS_H);\r
+ hits_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, HITS_FONT);\r
+ hits_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ hits_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ hits_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+ LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+ button_.SetPosition(BUTTON_X, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ button_.SetImages(ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE1, SPORT_IMAGE),\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_SPORT_TOGGLE0, SPORT_IMAGE));\r
+\r
+ Add(&bgImage_);\r
+ Add(&icon_);\r
+ Add(&label_);\r
+ Add(&hits_);\r
+ Add(&button_);\r
+ Add(&nextImage_);\r
+}\r
+\r
+SportRemindHeartRateItemView::~SportRemindHeartRateItemView()\r
+{\r
+ Remove(&bgImage_);\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+ Remove(&hits_);\r
+ Remove(&button_);\r
+ Remove(&nextImage_);\r
+}\r
+\r
+void SportRemindHeartRateItemView::SetItemInfo(const SportRemindHeartRateItem &itemInfo)\r
+{\r
+ LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+ label_.SetText(itemInfo.label);\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (itemInfo.itemId == SPORT_REMIND_HEARTRATE_ENABLE) {\r
+ button_.SetVisible(true);\r
+ button_.SetState(sportInfo->enableHeartRemind);\r
+ if (sportInfo->enableHeartRemind) {\r
+ hits_.SetText("开启");\r
+ } else {\r
+ hits_.SetText("关闭");\r
+ }\r
+ nextImage_.SetVisible(false);\r
+ } else if (itemInfo.itemId == SPORT_REMIND_HEARTRATE_RANGE) {\r
+ button_.SetVisible(false);\r
+ nextImage_.SetVisible(true);\r
+ hits_.SetText(GetHeartRateRangeDescription(sportInfo->heartRange));\r
+ }\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindHeartRatePage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportRemindHeartRatePage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t LIST_REBOUND_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_REMIND_HEARTRATE, SportRemindHeartRatePage, false);\r
+\r
+static SportRemindHeartRatePage *g_SportRemindHeartRatePageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ SportRemindHeartRateItemView *item = new SportRemindHeartRateItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_SportRemindHeartRatePageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SportRemindHeartRateItemView *item = dynamic_cast<SportRemindHeartRateItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ SportRemindHeartRateItem *itemInfo = static_cast<SportRemindHeartRateItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportRemindHeartRatePage::SportRemindHeartRatePage()\r
+{\r
+ g_SportRemindHeartRatePageInstance = this;\r
+}\r
+\r
+SportRemindHeartRatePage::~SportRemindHeartRatePage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (remindHeartRateList_ != nullptr) {\r
+ delete remindHeartRateList_;\r
+ remindHeartRateList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportRemindHeartRatePage::~SportRemindHeartRatePage");\r
+}\r
+\r
+void SportRemindHeartRatePage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindHeartRatePage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+ titleLabel_->SetText("心率提醒");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void SportRemindHeartRatePage::CreateUIList()\r
+{\r
+ remindHeartRateList_ = new UISimpleList();\r
+ if (remindHeartRateList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindHeartRatePage remindHeartRateList_ new fail");\r
+ return;\r
+ }\r
+ remindHeartRateList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ remindHeartRateList_->SetThrowDrag(true);\r
+ remindHeartRateList_->SetDraggable(true);\r
+ remindHeartRateList_->SetReboundSize(LIST_REBOUND_SIZE);\r
+ remindHeartRateList_->EnableAutoAlign(true);\r
+ remindHeartRateList_->SetElastic(true);\r
+ remindHeartRateList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ for (uint8_t i = 0; i < SPORT_REMIND_HEARTRATE_MAX; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&remindHeartRates_[i]);\r
+ remindHeartRateList_->AddContent(content);\r
+ }\r
+ remindHeartRateList_->RefreshList();\r
+ group_->Add(remindHeartRateList_);\r
+}\r
+\r
+void SportRemindHeartRatePage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindHeartRatePage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportRemindHeartRatePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportRemindHeartRatePage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SPORT_REMIND_HEARTRATE_ITEM_ENABLE) == 0) {\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ sportInfo->enableHeartRemind = !sportInfo->enableHeartRemind;\r
+ remindHeartRateList_->RefreshList();\r
+ SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+ } else if (strcmp(view.GetViewId(), SPORT_REMIND_HEARTRATE_ITEM_RANGE) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_HEARTRATE_RANGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindIntervalItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportRemindIntervalItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 31;\r
+static constexpr uint16_t LABEL_W = 179;\r
+static constexpr uint16_t LABEL_H = 37;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+\r
+SportRemindIntervalItemView::SportRemindIntervalItemView()\r
+{\r
+ bgImage_.SetPosition(BG_X, BG_Y);\r
+ LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+ label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+ LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+ Add(&bgImage_);\r
+ Add(&icon_);\r
+ Add(&label_);\r
+ Add(&nextImage_);\r
+}\r
+\r
+SportRemindIntervalItemView::~SportRemindIntervalItemView()\r
+{\r
+ Remove(&bgImage_);\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+ Remove(&nextImage_);\r
+}\r
+\r
+void SportRemindIntervalItemView::SetItemInfo(const SportRemindIntervalItem &itemInfo)\r
+{\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (itemInfo.itemId == SPORT_REMIND_INTERVAL_DISTANCE && sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, IMAGE_SPORT_LAP);\r
+ label_.SetText("趟数");\r
+ nextImage_.SetVisible(true);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+ label_.SetText(itemInfo.label);\r
+ nextImage_.SetVisible(true);\r
+ }\r
+ if (itemInfo.itemId == SPORT_REMIND_INTERVAL_NONE) {\r
+ nextImage_.SetVisible(false);\r
+ }\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindIntervalPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportRemindIntervalPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t BLANK_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_REMIND_INTERVAL, SportRemindIntervalPage, false);\r
+\r
+static SportRemindIntervalPage *g_SportRemindIntervalPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ SportRemindIntervalItemView *item = new SportRemindIntervalItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_SportRemindIntervalPageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SportRemindIntervalItemView *item = dynamic_cast<SportRemindIntervalItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ SportRemindIntervalItem *itemInfo = static_cast<SportRemindIntervalItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportRemindIntervalPage::SportRemindIntervalPage()\r
+{\r
+ g_SportRemindIntervalPageInstance = this;\r
+}\r
+\r
+SportRemindIntervalPage::~SportRemindIntervalPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (background_ != nullptr) {\r
+ delete background_;\r
+ background_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (remindIntervalList_ != nullptr) {\r
+ delete remindIntervalList_;\r
+ remindIntervalList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage::~SportRemindIntervalPage");\r
+}\r
+\r
+void SportRemindIntervalPage::InitBackgroundView()\r
+{\r
+ background_ = new UIImageView();\r
+ if (background_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage background_ new fail");\r
+ return;\r
+ }\r
+ background_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+ group_->Add(background_);\r
+}\r
+\r
+void SportRemindIntervalPage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+ titleLabel_->SetText("间隔提醒");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void SportRemindIntervalPage::CreateUIList()\r
+{\r
+ remindIntervalList_ = new UISimpleList();\r
+ if (remindIntervalList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage remindIntervalList_ new fail");\r
+ return;\r
+ }\r
+ remindIntervalList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ remindIntervalList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ remindIntervalList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ remindIntervalList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+ for (uint8_t i = 0; i < SPORT_REMIND_INTERVAL_MAX; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&remindIntervals_[i]);\r
+ remindIntervalList_->AddContent(content);\r
+ }\r
+ remindIntervalList_->RefreshList();\r
+ group_->Add(remindIntervalList_);\r
+}\r
+\r
+void SportRemindIntervalPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindIntervalPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ group_->SetScrollBlankSize(BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+ InitBackgroundView();\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportRemindIntervalPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportRemindIntervalPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (strcmp(view.GetViewId(), SPORT_REMIND_INTERVAL_ITEM_DISTANCE) == 0) {\r
+ sportInfo->setType = SPORT_SET_TYPE_REMIND;\r
+ sportInfo->remindTypeTemp = sportInfo->remindType;\r
+ sportInfo->remindType = SPORT_REMIND_INTERVAL_DISTANCE;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_SETTING,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), SPORT_REMIND_INTERVAL_ITEM_TIME) == 0) {\r
+ sportInfo->setType = SPORT_SET_TYPE_REMIND;\r
+ sportInfo->remindTypeTemp = sportInfo->remindType;\r
+ sportInfo->remindType = SPORT_REMIND_INTERVAL_TIME;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_SETTING,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), SPORT_REMIND_INTERVAL_ITEM_NONE) == 0) {\r
+ sportInfo->remindTypeTemp = sportInfo->remindType;\r
+ sportInfo->remindType = SPORT_REMIND_INTERVAL_NONE;\r
+ SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportRemindItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 17;\r
+static constexpr uint16_t LABEL_W = 207;\r
+static constexpr uint16_t LABEL_H = 39;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t HITS_X = 100;\r
+static constexpr uint16_t HITS_Y = 60;\r
+static constexpr uint16_t HITS_W = 176;\r
+static constexpr uint16_t HITS_H = 29;\r
+static constexpr uint16_t HITS_FONT = 24;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+\r
+SportRemindItemView::SportRemindItemView()\r
+{\r
+ bgImage_.SetPosition(BG_X, BG_Y);\r
+ LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+ label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ hits_.SetPosition(HITS_X, HITS_Y, HITS_W, HITS_H);\r
+ hits_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, HITS_FONT);\r
+ hits_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ hits_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ hits_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+ LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+ Add(&bgImage_);\r
+ Add(&icon_);\r
+ Add(&label_);\r
+ Add(&hits_);\r
+ Add(&nextImage_);\r
+}\r
+\r
+SportRemindItemView::~SportRemindItemView()\r
+{\r
+ Remove(&bgImage_);\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+ Remove(&hits_);\r
+ Remove(&nextImage_);\r
+}\r
+\r
+void SportRemindItemView::SetItemInfo(const SportRemindItem &itemInfo)\r
+{\r
+ LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+ label_.SetText(itemInfo.label);\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (itemInfo.itemId == SPORT_REMIND_INTERVAL) {\r
+ if (sportInfo->remindType == SPORT_REMIND_INTERVAL_NONE || !sportInfo->isRemindSetted) {\r
+ hits_.SetText("无提醒");\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ hits_.SetText((std::to_string(sportInfo->remindValue) + "趟").c_str());\r
+ } else {\r
+ hits_.SetText((std::to_string(sportInfo->remindValue) + "km").c_str());\r
+ }\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+ hits_.SetText((std::to_string(sportInfo->remindValue) + "分钟").c_str());\r
+ }\r
+ } else if (itemInfo.itemId == SPORT_REMIND_HEARTRATE) {\r
+ if (!sportInfo->enableHeartRemind) {\r
+ hits_.SetText("关闭");\r
+ } else {\r
+ hits_.SetText("开启");\r
+ }\r
+ }\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportRemindPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportRemindPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t LIST_REBOUND_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_REMIND, SportRemindPage, false);\r
+\r
+static SportRemindPage *g_SportRemindPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ SportRemindItemView *item = new SportRemindItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_SportRemindPageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SportRemindItemView *item = dynamic_cast<SportRemindItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ SportRemindItem *itemInfo = static_cast<SportRemindItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportRemindPage::SportRemindPage()\r
+{\r
+ g_SportRemindPageInstance = this;\r
+}\r
+\r
+SportRemindPage::~SportRemindPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (background_ != nullptr) {\r
+ delete background_;\r
+ background_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (remindList_ != nullptr) {\r
+ delete remindList_;\r
+ remindList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportRemindPage::~SportRemindPage");\r
+}\r
+\r
+void SportRemindPage::InitBackgroundView()\r
+{\r
+ background_ = new UIImageView();\r
+ if (background_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindPage background_ new fail");\r
+ return;\r
+ }\r
+ background_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+ group_->Add(background_);\r
+}\r
+\r
+void SportRemindPage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+ titleLabel_->SetText("提醒");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void SportRemindPage::CreateUIList()\r
+{\r
+ remindList_ = new UISimpleList();\r
+ if (remindList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindPage remindList_ new fail");\r
+ return;\r
+ }\r
+ remindList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ remindList_->SetThrowDrag(true);\r
+ remindList_->SetDraggable(true);\r
+ remindList_->SetReboundSize(LIST_REBOUND_SIZE);\r
+ remindList_->EnableAutoAlign(true);\r
+ remindList_->SetElastic(true);\r
+ remindList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ for (uint8_t i = 0; i < SPORT_REMIND_MAX; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&reminds_[i]);\r
+ remindList_->AddContent(content);\r
+ }\r
+ remindList_->RefreshList();\r
+ group_->Add(remindList_);\r
+}\r
+\r
+void SportRemindPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportRemindPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ InitBackgroundView();\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportRemindPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_SETTINGS,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportRemindPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SPORT_REMIND_ITEM_INTERVAL) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND_INTERVAL,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), SPORT_REMIND_ITEM_HEARTRATE) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND_HEARTRATE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportSettingsItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportSettingsItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y1 = 17;\r
+static constexpr uint16_t LABEL_Y2 = 31;\r
+static constexpr uint16_t LABEL_W = 207;\r
+static constexpr uint16_t LABEL_H = 39;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t HITS_X = 100;\r
+static constexpr uint16_t HITS_Y = 60;\r
+static constexpr uint16_t HITS_W = 176;\r
+static constexpr uint16_t HITS_H = 29;\r
+static constexpr uint16_t HITS_FONT = 24;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+\r
+SportSettingsItemView::SportSettingsItemView()\r
+{\r
+ bgImage_.SetPosition(BG_X, BG_Y);\r
+ LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ hits_.SetPosition(HITS_X, HITS_Y, HITS_W, HITS_H);\r
+ hits_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, HITS_FONT);\r
+ hits_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ hits_.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ hits_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+ LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+ Add(&bgImage_);\r
+ Add(&icon_);\r
+ Add(&label_);\r
+ Add(&hits_);\r
+ Add(&nextImage_);\r
+}\r
+\r
+SportSettingsItemView::~SportSettingsItemView()\r
+{\r
+ Remove(&bgImage_);\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+ Remove(&hits_);\r
+ Remove(&nextImage_);\r
+}\r
+\r
+void SportSettingsItemView::SetItemInfo(const SportSettingsItem &itemInfo)\r
+{\r
+ LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+ label_.SetText(itemInfo.label);\r
+ SetViewId(itemInfo.viewId);\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (itemInfo.itemId == SPORT_SET_TYPE_TARGET) {\r
+ label_.SetPosition(LABEL_X, LABEL_Y1, LABEL_W, LABEL_H);\r
+ hits_.SetVisible(true);\r
+ if (!sportInfo->isTargetSetted) {\r
+ hits_.SetText("无目标");\r
+ } else if (sportInfo->targetType == SPORT_TARGET_DISTANCE) {\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ hits_.SetText((std::to_string(sportInfo->targetValue) + "趟").c_str());\r
+ } else {\r
+ hits_.SetText((std::to_string(sportInfo->targetValue) + "km").c_str());\r
+ }\r
+ } else if (sportInfo->targetType == SPORT_TARGET_TIME) {\r
+ hits_.SetText((std::to_string(sportInfo->targetValue) + "分钟").c_str());\r
+ } else if (sportInfo->targetType == SPORT_TARGET_CALORIE) {\r
+ hits_.SetText((std::to_string(sportInfo->targetValue) + "千卡").c_str());\r
+ }\r
+ } else if (itemInfo.itemId == SPORT_SET_TYPE_REMIND) {\r
+ label_.SetPosition(LABEL_X, LABEL_Y1, LABEL_W, LABEL_H);\r
+ hits_.SetVisible(true);\r
+ if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ hits_.SetText((std::to_string(sportInfo->remindValue) + "趟").c_str());\r
+ } else {\r
+ hits_.SetText((std::to_string(sportInfo->remindValue) + "km").c_str());\r
+ }\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+ hits_.SetText((std::to_string(sportInfo->remindValue) + "分钟").c_str());\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_NONE || !sportInfo->isRemindSetted) {\r
+ if (sportInfo->enableHeartRemind) {\r
+ hits_.SetText(GetHeartRateRangeDescription(sportInfo->heartRange));\r
+ } else {\r
+ hits_.SetText("无提醒");\r
+ }\r
+ }\r
+ } else if (itemInfo.itemId == SPORT_SET_TYPE_MISTOUCH) {\r
+ label_.SetPosition(LABEL_X, LABEL_Y2, LABEL_W, LABEL_H);\r
+ hits_.SetVisible(false);\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportSettingsPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportSettingsPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t BLANK_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_SETTINGS, SportSettingsPage, false);\r
+\r
+static SportSettingsPage *g_SportSettingsPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ SportSettingsItemView *item = new SportSettingsItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_SportSettingsPageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SportSettingsItemView *item = dynamic_cast<SportSettingsItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ SportSettingsItem *itemInfo = static_cast<SportSettingsItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportSettingsPage::SportSettingsPage()\r
+{\r
+ g_SportSettingsPageInstance = this;\r
+}\r
+\r
+SportSettingsPage::~SportSettingsPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (background_ != nullptr) {\r
+ delete background_;\r
+ background_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (settingList_ != nullptr) {\r
+ delete settingList_;\r
+ settingList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportSettingsPage::~SportSettingsPage");\r
+}\r
+\r
+void SportSettingsPage::InitBackgroundView()\r
+{\r
+ background_ = new UIImageView();\r
+ if (background_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportSettingsPage background_ new fail");\r
+ return;\r
+ }\r
+ background_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+ group_->Add(background_);\r
+}\r
+\r
+void SportSettingsPage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportSettingsPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+ titleLabel_->SetText("设置");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void SportSettingsPage::CreateUIList()\r
+{\r
+ settingList_ = new UISimpleList();\r
+ if (settingList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportSettingsPage settingList_ new fail");\r
+ return;\r
+ }\r
+ settingList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ settingList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ settingList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ settingList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+ for (uint8_t i = 0; i < SPORT_SET_TYPE_MAX; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&settings_[i]);\r
+ settingList_->AddContent(content);\r
+ }\r
+ settingList_->RefreshList();\r
+ group_->Add(settingList_);\r
+}\r
+\r
+void SportSettingsPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportSettingsPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ group_->SetScrollBlankSize(BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+ InitBackgroundView();\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportSettingsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MENU,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportSettingsPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), SETTINGS_ITEM_TARGET) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), SETTINGS_ITEM_REMIND) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (strcmp(view.GetViewId(), SETTINGS_ITEM_MISTOUCH) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_MISTOUCH,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "sport/SportModel.h"\r
+#include "sport/SportTargetItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t BG_X = 0;\r
+static constexpr uint16_t BG_Y = 6;\r
+static constexpr uint16_t ICON_X = 8;\r
+static constexpr uint16_t ICON_Y = 13;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 31;\r
+static constexpr uint16_t LABEL_W = 179;\r
+static constexpr uint16_t LABEL_H = 37;\r
+static constexpr uint16_t LABEL_FONT = 32;\r
+static constexpr uint16_t IMAGE_X = 370;\r
+static constexpr uint16_t IMAGE_Y = 38;\r
+\r
+SportTargetItemView::SportTargetItemView()\r
+{\r
+ bgImage_.SetPosition(BG_X, BG_Y);\r
+ LOADIMG::LoadImageViewImg(&bgImage_, SPORT_IMAGE, IMAGE_SPORT_ITEMBG);\r
+\r
+ icon_.SetPosition(ICON_X, ICON_Y);\r
+\r
+ label_.SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ label_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ label_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ label_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ nextImage_.SetPosition(IMAGE_X, IMAGE_Y);\r
+ LOADIMG::LoadImageViewImg(&nextImage_, SPORT_IMAGE, IMAGE_SPORT_NEXT);\r
+\r
+ Add(&bgImage_);\r
+ Add(&icon_);\r
+ Add(&label_);\r
+ Add(&nextImage_);\r
+}\r
+\r
+SportTargetItemView::~SportTargetItemView()\r
+{\r
+ Remove(&bgImage_);\r
+ Remove(&icon_);\r
+ Remove(&label_);\r
+ Remove(&nextImage_);\r
+}\r
+\r
+void SportTargetItemView::SetItemInfo(const SportTargetItem &itemInfo)\r
+{\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (itemInfo.itemId == SPORT_TARGET_DISTANCE && sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, IMAGE_SPORT_LAP);\r
+ label_.SetText("趟数");\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(&icon_, SPORT_IMAGE, itemInfo.iconId);\r
+ label_.SetText(itemInfo.label);\r
+ }\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportTargetPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 38;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t LIST_X = 20;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 415;\r
+static constexpr uint16_t LIST_H = 324;\r
+static constexpr uint16_t LIST_ITEM_W = 415;\r
+static constexpr uint16_t LIST_ITEM_H = 108;\r
+static constexpr uint16_t REBOUND_SIZE = 60;\r
+static constexpr uint16_t BLANK_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_TARGET, SportTargetPage, false);\r
+\r
+static SportTargetPage *g_SportTargetPageInstance = nullptr;\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ SportTargetItemView *item = new SportTargetItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_W, LIST_ITEM_H);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(g_SportTargetPageInstance);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ SportTargetItemView *item = dynamic_cast<SportTargetItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ SportTargetItem *itemInfo = static_cast<SportTargetItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+SportTargetPage::SportTargetPage()\r
+{\r
+ g_SportTargetPageInstance = this;\r
+}\r
+\r
+SportTargetPage::~SportTargetPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (background_ != nullptr) {\r
+ delete background_;\r
+ background_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (targetList_ != nullptr) {\r
+ delete targetList_;\r
+ targetList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportTargetPage::~SportTargetPage");\r
+}\r
+\r
+void SportTargetPage::InitBackgroundView()\r
+{\r
+ background_ = new UIImageView();\r
+ if (background_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPage background_ new fail");\r
+ return;\r
+ }\r
+ background_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(background_, SPORT_IMAGE, IMAGE_SPORT_BG);\r
+ group_->Add(background_);\r
+}\r
+\r
+void SportTargetPage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+ titleLabel_->SetText("目标");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void SportTargetPage::CreateUIList()\r
+{\r
+ targetList_ = new UISimpleList();\r
+ if (targetList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPage targetList_ new fail");\r
+ return;\r
+ }\r
+ targetList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ targetList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ targetList_->SetBoundaryIntercept(DragEvent::DIRECTION_TOP_TO_BOTTOM, false);\r
+ targetList_->SetBoundaryIntercept(DragEvent::DIRECTION_BOTTOM_TO_TOP, false);\r
+\r
+ for (uint8_t i = 0; i < SPORT_TARGET_MAX; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ content.data = reinterpret_cast<void *>(&targets_[i]);\r
+ targetList_->AddContent(content);\r
+ }\r
+ targetList_->RefreshList();\r
+ group_->Add(targetList_);\r
+}\r
+\r
+void SportTargetPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ group_->SetReboundSize(REBOUND_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ group_->SetScrollBlankSize(BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+\r
+ InitBackgroundView();\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool SportTargetPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_SETTINGS,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportTargetPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ sportInfo->setType = SPORT_SET_TYPE_TARGET;\r
+ if (strcmp(view.GetViewId(), SPORT_TARGET_ITEM_DISTANCE) == 0) {\r
+ sportInfo->targetTypeTemp = sportInfo->targetType;\r
+ sportInfo->targetType = SPORT_TARGET_DISTANCE;\r
+ } else if (strcmp(view.GetViewId(), SPORT_TARGET_ITEM_TIME) == 0) {\r
+ sportInfo->targetTypeTemp = sportInfo->targetType;\r
+ sportInfo->targetType = SPORT_TARGET_TIME;\r
+ } else if (strcmp(view.GetViewId(), SPORT_TARGET_ITEM_CALORIE) == 0) {\r
+ sportInfo->targetTypeTemp = sportInfo->targetType;\r
+ sportInfo->targetType = SPORT_TARGET_CALORIE;\r
+ }\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET_SETTING,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetPromptPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportTargetPromptPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t PAGE_VISIBLE_SECOND = 3;\r
+static constexpr uint16_t PROMPT_DISTANCE_INDEX = 0;\r
+static constexpr uint16_t PROMPT_TIME_INDEX = 1;\r
+static constexpr uint16_t PROMPT_LAP_INDEX = 2;\r
+static constexpr uint16_t IMAGE_X = 46;\r
+static constexpr uint16_t IMAGE_Y = 72;\r
+static constexpr uint16_t IMAGE_COMPLETE_X = 85;\r
+static constexpr uint16_t IMAGE_COMPLETE_Y = 32;\r
+static constexpr uint16_t IMAGE_HEART_X = 167;\r
+static constexpr uint16_t IMAGE_HEART_Y = 118;\r
+static constexpr uint16_t LABEL_X = 25;\r
+static constexpr uint16_t LABEL_Y = 250;\r
+static constexpr uint16_t LABEL_W = 404;\r
+static constexpr uint16_t LABEL_H = 49;\r
+static constexpr uint16_t LABEL_FONT = 36;\r
+static const char *PROMPT_HALF_CONTENT = "本次运动目标已完成50%";\r
+static const char *PROMPT_FINISH_CONTENT = "本次运动目标已完成";\r
+static const int PROPMT_IMAGES[][10] = {\r
+ {IMAGE_SPORT_1KM, IMAGE_SPORT_3KM, IMAGE_SPORT_5KM, IMAGE_SPORT_7KM, IMAGE_SPORT_10KM, IMAGE_SPORT_15KM,\r
+ IMAGE_SPORT_20KM, IMAGE_SPORT_25KM, IMAGE_SPORT_30KM, IMAGE_SPORT_40KM},\r
+ {IMAGE_SPORT_10MIN, IMAGE_SPORT_20MIN, IMAGE_SPORT_30MIN, IMAGE_SPORT_60MIN, IMAGE_SPORT_120MIN, IMAGE_SPORT_180MIN,\r
+ IMAGE_SPORT_200MIN},\r
+ {IMAGE_SPORT_LAP1, IMAGE_SPORT_LAP2, IMAGE_SPORT_LAP4, IMAGE_SPORT_LAP6, IMAGE_SPORT_LAP8, IMAGE_SPORT_LAP10,\r
+ IMAGE_SPORT_LAP12, IMAGE_SPORT_LAP16, IMAGE_SPORT_LAP20, IMAGE_SPORT_LAP30},\r
+};\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_TARGET_PROMPT, SportTargetPromptPage, false);\r
+\r
+void SportTargetPromptPage::SportPromptAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+\r
+ time_t now = time(nullptr);\r
+ if (now - page_->startTime_ > PAGE_VISIBLE_SECOND) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+}\r
+\r
+SportTargetPromptPage::~SportTargetPromptPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (promptIcon_ != nullptr) {\r
+ delete promptIcon_;\r
+ promptIcon_ = nullptr;\r
+ }\r
+ if (promptLabel_ != nullptr) {\r
+ delete promptLabel_;\r
+ promptLabel_ = nullptr;\r
+ }\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ if (callback_ != nullptr) {\r
+ delete callback_;\r
+ callback_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage::~SportTargetPromptPage");\r
+}\r
+\r
+void SportTargetPromptPage::CreatePromptView()\r
+{\r
+ promptIcon_ = new UIImageView();\r
+ if (promptIcon_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage promptIcon_ new fail");\r
+ return;\r
+ }\r
+ promptIcon_->SetPosition(IMAGE_X, IMAGE_Y);\r
+ group_->Add(promptIcon_);\r
+\r
+ promptLabel_ = new UILabel();\r
+ if (promptLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage promptLabel_ new fail");\r
+ return;\r
+ }\r
+ promptLabel_->SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ promptLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ promptLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(promptLabel_);\r
+\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->promptType == SPORT_SET_TYPE_TARGET) {\r
+ if (sportInfo->targetComplete) {\r
+ promptLabel_->SetText(PROMPT_FINISH_CONTENT);\r
+ promptIcon_->SetPosition(IMAGE_COMPLETE_X, IMAGE_COMPLETE_Y);\r
+ LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE, IMAGE_SPORT_FINISH);\r
+ } else if (sportInfo->targetHalf) {\r
+ promptLabel_->SetText(PROMPT_HALF_CONTENT);\r
+ LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE, IMAGE_SPORT_HALF);\r
+ }\r
+ } else if (sportInfo->promptType == SPORT_SET_TYPE_REMIND) {\r
+ std::string promptStr;\r
+ if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ promptStr = "第" + std::to_string(sportInfo->remindTimes) + "个" +\r
+ std::to_string(sportInfo->remindValue) + "趟已完成!";\r
+ promptLabel_->SetText(promptStr.c_str());\r
+ LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE,\r
+ PROPMT_IMAGES[PROMPT_LAP_INDEX][sportInfo->remindIndex]);\r
+ } else {\r
+ promptStr = "第" + std::to_string(sportInfo->remindTimes) + "个" +\r
+ std::to_string(sportInfo->remindValue) + "公里已完成!";\r
+ promptLabel_->SetText(promptStr.c_str());\r
+ LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE,\r
+ PROPMT_IMAGES[PROMPT_DISTANCE_INDEX][sportInfo->remindIndex]);\r
+ }\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+ promptStr = "第" + std::to_string(sportInfo->remindTimes) + "个" + std::to_string(sportInfo->remindValue) +\r
+ "分钟已完成!";\r
+ promptLabel_->SetText(promptStr.c_str());\r
+ LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE,\r
+ PROPMT_IMAGES[PROMPT_TIME_INDEX][sportInfo->remindIndex]);\r
+ }\r
+ } else if (sportInfo->promptType == SPORT_SET_TYPE_HEARTRATE) {\r
+ std::string promptStr = "当前心率" + std::to_string(sportInfo->data.heartRate) + "次/分!";\r
+ promptLabel_->SetText(promptStr.c_str());\r
+ promptIcon_->SetPosition(IMAGE_HEART_X, IMAGE_HEART_Y);\r
+ LOADIMG::LoadImageViewImg(promptIcon_, SPORT_IMAGE, IMAGE_SPORT_HEART3);\r
+ }\r
+}\r
+\r
+void SportTargetPromptPage::OnStart(void *data)\r
+{\r
+ startTime_ = time(nullptr);\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ CreatePromptView();\r
+ AddViewToPageContainer(group_);\r
+\r
+ callback_ = new SportPromptAnimatorCallback(this);\r
+ if (callback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage::OnStart callback_ new fail");\r
+ return;\r
+ }\r
+\r
+ animator_ = new Animator(callback_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetPromptPage::OnStart new Animator animator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+void SportTargetPromptPage::OnPause()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() != Animator::STOP) {\r
+ animator_->Stop();\r
+ }\r
+ }\r
+}\r
+\r
+void SportTargetPromptPage::OnResume()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() == Animator::STOP) {\r
+ animator_->Start();\r
+ }\r
+ }\r
+}\r
+\r
+bool SportTargetPromptPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_DATA,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportTargetPromptPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SportTargetSettingPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sport.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportTargetSettingPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 100;\r
+static constexpr uint16_t LABELS_Y = 39;\r
+static constexpr uint16_t LABELS_W = 253;\r
+static constexpr uint16_t LABELS_H = 53;\r
+static constexpr uint16_t LABELS_FONT = 38;\r
+static constexpr uint16_t PICKER_X = 103;\r
+static constexpr uint16_t PICKER_Y = 122;\r
+static constexpr uint16_t PICKER_W = 247;\r
+static constexpr uint16_t PICKER_H = 212;\r
+static constexpr uint16_t BACKGROUND_FONT = 38;\r
+static constexpr uint16_t HIGHTLIGHT_FONT = 44;\r
+static constexpr uint16_t PICKER_ITEM_H = 65;\r
+static constexpr uint16_t BUTTON_X = 63;\r
+static constexpr uint16_t BUTTON_Y = 361;\r
+static constexpr uint16_t BUTTON_W = 328;\r
+static constexpr uint16_t BUTTON_H = 93;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SPORT, SportPages::SPORT_PAGE_TARGET_SETTING, SportTargetSettingPage, false);\r
+\r
+SportTargetSettingPage::~SportTargetSettingPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (picker_ != nullptr) {\r
+ delete picker_;\r
+ picker_ = nullptr;\r
+ }\r
+ if (confirmButton_ != nullptr) {\r
+ delete confirmButton_;\r
+ confirmButton_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage::~SportTargetSettingPage");\r
+}\r
+\r
+void SportTargetSettingPage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void SportTargetSettingPage::CreateUIPicker()\r
+{\r
+ picker_ = new UIPicker();\r
+ if (picker_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage picker_ new fail");\r
+ return;\r
+ }\r
+ picker_->SetPosition(PICKER_X, PICKER_Y, PICKER_W, PICKER_H);\r
+ picker_->SetItemHeight(PICKER_ITEM_H);\r
+ picker_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+ picker_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+ group_->Add(picker_);\r
+}\r
+\r
+void SportTargetSettingPage::CreateUIButton()\r
+{\r
+ confirmButton_ = new UILabelButton();\r
+ if (confirmButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage confirmButton_ new fail");\r
+ return;\r
+ }\r
+ confirmButton_->SetPosition(BUTTON_X, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ confirmButton_->SetViewId(TARGET_SETTING_CONFIRM_BUTTON);\r
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->setType == SPORT_SET_TYPE_TARGET) {\r
+ if (sportInfo->targetType == SPORT_TARGET_DISTANCE) {\r
+ LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK1, IMAGE_SPORT_OK1);\r
+ } else if (sportInfo->targetType == SPORT_TARGET_TIME) {\r
+ LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK3, IMAGE_SPORT_OK3);\r
+ } else if (sportInfo->targetType == SPORT_TARGET_CALORIE) {\r
+ LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK2, IMAGE_SPORT_OK2);\r
+ }\r
+ } else if (sportInfo->setType == SPORT_SET_TYPE_REMIND) {\r
+ if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+ LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK1, IMAGE_SPORT_OK1);\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+ LOADIMG::LoadBtnImage(confirmButton_, SPORT_IMAGE, IMAGE_SPORT_OK3, IMAGE_SPORT_OK3);\r
+ }\r
+ }\r
+\r
+ confirmButton_->SetOnClickListener(this);\r
+ group_->Add(confirmButton_);\r
+}\r
+\r
+void SportTargetSettingPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportTargetSettingPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ CreateUILabel();\r
+ CreateUIPicker();\r
+ CreateUIButton();\r
+ AddViewToPageContainer(group_);\r
+\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->setType == SPORT_SET_TYPE_TARGET) {\r
+ UpdateViewByTargetType();\r
+ } else if (sportInfo->setType == SPORT_SET_TYPE_REMIND) {\r
+ UpdateViewByRemindType();\r
+ }\r
+}\r
+\r
+bool SportTargetSettingPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->setType == SPORT_SET_TYPE_TARGET) {\r
+ sportInfo->targetType = sportInfo->targetTypeTemp;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (sportInfo->setType == SPORT_SET_TYPE_REMIND) {\r
+ sportInfo->remindType = sportInfo->remindTypeTemp;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SportTargetSettingPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), TARGET_SETTING_CONFIRM_BUTTON) == 0) {\r
+ uint16_t index = picker_->GetSelected();\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->setType == SPORT_SET_TYPE_TARGET) {\r
+ SportModel::GetInstance().SetTargetValue(index);\r
+ sportInfo->isTargetSetted = true;\r
+ SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_TARGET,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (sportInfo->setType == SPORT_SET_TYPE_REMIND) {\r
+ SportModel::GetInstance().SetRemindValue(index);\r
+ sportInfo->isRemindSetted = true;\r
+ SportModel::GetInstance().SaveConfig(SPORT_CONFIG_INFO);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SportPages::SPORT_PAGE_REMIND,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+void SportTargetSettingPage::UpdateViewByTargetType()\r
+{\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->targetType == SPORT_TARGET_DISTANCE) {\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ titleLabel_->SetText("趟数");\r
+ const char *uiLapData[] = {"1趟", "2趟", "4趟", "6趟", "8趟", "10趟", "12趟", "16趟", "20趟", "30趟"};\r
+ picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0x52, 0xe4, 0xeb));\r
+ picker_->SetValues(uiLapData, sizeof(uiLapData) / sizeof(uiLapData[0]));\r
+ } else {\r
+ titleLabel_->SetText("距离");\r
+ const char *uiDistanceData[] = {"1km", "3km", "5km", "7km", "10km", "15km", "20km", "25km", "30km", "40km"};\r
+ picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0x52, 0xe4, 0xeb));\r
+ picker_->SetValues(uiDistanceData, sizeof(uiDistanceData) / sizeof(uiDistanceData[0]));\r
+ }\r
+ } else if (sportInfo->targetType == SPORT_TARGET_TIME) {\r
+ titleLabel_->SetText("时间");\r
+ const char *uiTimeData[] = {"10分钟", "20分钟", "30分钟", "60分钟", "120分钟", "180分钟", "200分钟"};\r
+ picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0xff, 0x75, 0x00));\r
+ picker_->SetValues(uiTimeData, sizeof(uiTimeData) / sizeof(uiTimeData[0]));\r
+ } else if (sportInfo->targetType == SPORT_TARGET_CALORIE) {\r
+ titleLabel_->SetText("热量");\r
+ const char *uiCalorieData[] = {"100千卡", "200千卡", "300千卡", "500千卡", "600千卡", "800千卡", "1000千卡"};\r
+ picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0xff, 0x4d, 0x4f));\r
+ picker_->SetValues(uiCalorieData, sizeof(uiCalorieData) / sizeof(uiCalorieData[0]));\r
+ }\r
+ titleLabel_->Invalidate();\r
+ picker_->Invalidate();\r
+ confirmButton_->Invalidate();\r
+}\r
+\r
+void SportTargetSettingPage::UpdateViewByRemindType()\r
+{\r
+ sport_info_t *sportInfo = SportModel::GetInstance().GetCurrSportInfo();\r
+ if (sportInfo->remindType == SPORT_REMIND_INTERVAL_DISTANCE) {\r
+ SportType sportType = SportModel::GetInstance().GetSportType();\r
+ if (sportType == SPORT_TYPE_INDOOR_SWIMMING) {\r
+ titleLabel_->SetText("趟数");\r
+ const char *uiLapData[] = {"1趟", "2趟", "4趟", "6趟", "8趟", "10趟", "12趟", "16趟", "20趟", "30趟"};\r
+ picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0x52, 0xe4, 0xeb));\r
+ picker_->SetValues(uiLapData, sizeof(uiLapData) / sizeof(uiLapData[0]));\r
+ } else {\r
+ titleLabel_->SetText("距离");\r
+ const char *uiDistanceData[] = {"1km", "3km", "5km", "7km", "10km", "15km", "20km", "25km", "30km", "40km"};\r
+ picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0x52, 0xe4, 0xeb));\r
+ picker_->SetValues(uiDistanceData, sizeof(uiDistanceData) / sizeof(uiDistanceData[0]));\r
+ }\r
+ } else if (sportInfo->remindType == SPORT_REMIND_INTERVAL_TIME) {\r
+ titleLabel_->SetText("时间");\r
+ const char *uiTimeData[] = {"10分钟", "20分钟", "30分钟", "60分钟", "120分钟", "180分钟", "200分钟"};\r
+ picker_->SetTextColor(Color::Gray(), Color::GetColorFromRGB(0xff, 0x75, 0x00));\r
+ picker_->SetValues(uiTimeData, sizeof(uiTimeData) / sizeof(uiTimeData[0]));\r
+ }\r
+ titleLabel_->Invalidate();\r
+ picker_->Invalidate();\r
+ confirmButton_->Invalidate();\r
+}\r
+}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: StopwatchItemView\r
* Create: 2025-06-06\r
*/\r
\r
-#include "UiConfig.h"\r
#include "stopwatch/StopwatchItemView.h"\r
-#include "common/image_cache_manager.h"\r
-#include "ui_stopwatch_resource.h"\r
-#include "wearable_log.h"\r
\r
namespace OHOS {\r
-static constexpr uint16_t STOPWATCH_ITEM_WIDTH = 312;\r
-static constexpr uint16_t STOPWATCH_ITEM_HEIGHT = 60;\r
static constexpr uint16_t STOPWATCH_ITEM_BG_XPOS = 6;\r
static constexpr uint16_t STOPWATCH_ITEM_BG_YPOS = 8;\r
static constexpr uint16_t STOPWATCH_ITEM_BG_WIDTH = 300;\r
\r
StopwatchItemView::StopwatchItemView()\r
{\r
- SetPosition(0, 0, STOPWATCH_ITEM_WIDTH, STOPWATCH_ITEM_HEIGHT);\r
- SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- SetTouchable(true);\r
-\r
itemBg_.SetPosition(STOPWATCH_ITEM_BG_XPOS, STOPWATCH_ITEM_BG_YPOS);\r
itemBg_.Resize(STOPWATCH_ITEM_BG_WIDTH, STOPWATCH_ITEM_BG_HEIGHT);\r
itemBg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
Remove(&itemBg_);\r
}\r
\r
-void StopwatchItemView::SetItemInfo(int16_t index, const StopwatchItem &itemInfo)\r
+void StopwatchItemView::SetItemInfo(const StopwatchItem &itemInfo)\r
{\r
- nameLabel_.SetText(("分段" + std::to_string(index)).c_str());\r
+ nameLabel_.SetText(("分段" + std::to_string(itemInfo.index)).c_str());\r
recordLabel_.SetText(itemInfo.record.c_str());\r
if (itemInfo.isLatest) {\r
nameLabel_.SetStyle(STYLE_TEXT_COLOR, STOPWATCH_ITEM_FONT_COLOR);\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: StopwatchModel\r
* Create: 2025-06-06\r
*/\r
+\r
#include <sys/time.h>\r
-#include "stopwatch/StopwatchModel.h"\r
#include "wearable_log.h"\r
+#include "stopwatch/StopwatchModel.h"\r
\r
namespace OHOS {\r
static constexpr uint16_t UNIT_SEC_TO_MSEC = 1000;\r
\r
void StopwatchModel::SaveElapsedTime()\r
{\r
- uiSavedElapsedTime_ += uiElapsedTime_;\r
- uiElapsedTime_ = 0;\r
+ savedElapsedTime_ += elapsedTime_;\r
+ elapsedTime_ = 0;\r
}\r
\r
uint64_t StopwatchModel::GetElapsedTime()\r
{\r
- return uiSavedElapsedTime_ + uiElapsedTime_;\r
+ return savedElapsedTime_ + elapsedTime_;\r
}\r
\r
uint64_t StopwatchModel::UpdateElapsedTime()\r
struct timeval64 currTime = {0};\r
gettimeofday64(&currTime, NULL);\r
#endif\r
- uiElapsedTime_ = (currTime.tv_sec * UNIT_SEC_TO_MSEC + currTime.tv_usec / UNIT_SEC_TO_MSEC) -\r
- (startTime_.tv_sec * UNIT_SEC_TO_MSEC + startTime_.tv_usec / UNIT_SEC_TO_MSEC);\r
- return uiSavedElapsedTime_ + uiElapsedTime_;\r
+ elapsedTime_ = (currTime.tv_sec * UNIT_SEC_TO_MSEC + currTime.tv_usec / UNIT_SEC_TO_MSEC) -\r
+ (startTime_.tv_sec * UNIT_SEC_TO_MSEC + startTime_.tv_usec / UNIT_SEC_TO_MSEC);\r
+ return savedElapsedTime_ + elapsedTime_;\r
}\r
\r
void StopwatchModel::ResetCounter()\r
{\r
- uiElapsedTime_ = 0;\r
- uiSavedElapsedTime_ = 0;\r
+ elapsedTime_ = 0;\r
+ savedElapsedTime_ = 0;\r
records_.Clear();\r
}\r
\r
-bool StopwatchModel::GetActiveState()\r
-{\r
- return bIsActive_;\r
-}\r
-\r
-void StopwatchModel::SetActiveState()\r
+bool StopwatchModel::GetRunningState()\r
{\r
- bIsActive_ = true;\r
+ return isRunning_;\r
}\r
\r
-void StopwatchModel::SetInactiveState()\r
+void StopwatchModel::SetRunningState(bool isRunning)\r
{\r
- bIsActive_ = false;\r
+ isRunning_ = isRunning;\r
}\r
\r
List<StopwatchItem> &StopwatchModel::GetRecordsList()\r
records_.PushFront(record);\r
}\r
\r
-bool StopwatchModel::IsInRecordView()\r
+bool StopwatchModel::GetRecordListVisible()\r
{\r
- return bIsRecordView_;\r
+ return isRecordListVisible_;\r
}\r
\r
-void StopwatchModel::SetRecordViewState(bool state)\r
+void StopwatchModel::SetRecordListVisible(bool isVisible)\r
{\r
- bIsRecordView_ = state;\r
+ isRecordListVisible_ = isVisible;\r
}\r
\r
-void StopwatchModel::ClearData()\r
+bool StopwatchModel::GetTimeOverRangeState()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchModel::ClearData start");\r
- uiElapsedTime_ = 0;\r
- uiSavedElapsedTime_ = 0;\r
- bIsActive_ = false;\r
- bIsRecordView_ = false;\r
- startTime_ = {0};\r
- records_.Clear();\r
+ return isTimeOverRange_;\r
+}\r
+\r
+void StopwatchModel::SetTimeOverRangeState(bool isTimeOverRange)\r
+{\r
+ isTimeOverRange_ = isTimeOverRange;\r
}\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: StopwatchPage\r
* Create: 2025-06-06\r
*/\r
\r
#include <string>\r
#include <sys/time.h>\r
-#include "stopwatch/StopwatchPage.h"\r
-#include "stopwatch/StopwatchView.h"\r
-#include "stopwatch/StopwatchPresenter.h"\r
-#include "stopwatch/StopwatchModel.h"\r
#include "NativeAbility.h"\r
#include "SlicePageFactory.h"\r
#include "NativeRegisterManager.h"\r
#include "UiConfig.h"\r
#include "common/image_cache_manager.h"\r
-#include "ui_stopwatch_resource.h"\r
+#include "ui_resource_stopwatch.h"\r
#include "main/LoadImg.h"\r
#ifdef BUILD_IN_LINUX\r
#include "localtime.h"\r
#endif\r
+#include "stopwatch/StopwatchView.h"\r
+#include "stopwatch/StopwatchPresenter.h"\r
+#include "stopwatch/StopwatchModel.h"\r
+#include "stopwatch/StopwatchPage.h"\r
\r
namespace OHOS {\r
-static constexpr char *STOPWATCH_START = "stopwatch_start";\r
-static constexpr char *STOPWATCH_RESET = "stopwatch_reset";\r
-static constexpr uint16_t OFFSET = 4;\r
+static const char *STOPWATCH_APP_NAME = "秒表";\r
+static const char *STOPWATCH_START_PAUSE = "stopwatch_start_pause"; // 开始/暂停按钮\r
+static const char *STOPWATCH_RESET_RECORD = "stopwatch_reset_record"; // 重置/分段按钮\r
+static const char *STOPWATCH_RECORD_LIST = "stopwatch_record_list";\r
static constexpr uint16_t NUM_TEN = 10;\r
static constexpr uint16_t UNIT_SEC_TO_MSEC = 1000;\r
static constexpr uint16_t UNIT_SECS_PER_MIN = 60;\r
static constexpr uint16_t UNIT_SECS_PER_HOUR = 3600;\r
static constexpr uint16_t MAX_RECORD_SIZE = 20;\r
-static constexpr uint16_t STOPWATCH_CONTAINER_XPOS = 0;\r
-static constexpr uint16_t STOPWATCH_CONTAINER_YPOS = 0;\r
static constexpr uint16_t STOPWATCH_HAND_POSITION_XPOS = 224;\r
static constexpr uint16_t STOPWATCH_HAND_POSITION_YPOS = 4;\r
static constexpr uint16_t STOPWATCH_HAND_CENTER_XPOS = 3;\r
static constexpr uint16_t STOPWATCH_HAND_CENTER_YPOS = 223;\r
static constexpr uint16_t STOPWATCH_HAND_WIDTH = 2;\r
static constexpr uint16_t STOPWATCH_HAND_HEIGHT = 5;\r
+static constexpr uint16_t STOPWATCH_IMAGE_SCALE_XPOS = 4;\r
+static constexpr uint16_t STOPWATCH_IMAGE_SCALE_YPOS = 4;\r
static constexpr uint16_t STOPWATCH_LABEL_CURTIME_XPOS = 199;\r
static constexpr uint16_t STOPWATCH_LABEL_CURTIME_YPOS = 54;\r
static constexpr uint16_t STOPWATCH_LABEL_CURTIME_WIDTH = 67;\r
static constexpr uint16_t STOPWATCH_LABEL_APPNAME_WIDTH = 64;\r
static constexpr uint16_t STOPWATCH_LABEL_APPNAME_HEIGHT = 38;\r
static constexpr uint16_t STOPWATCH_LABEL_APPNAME_FONT_SIZE = 32;\r
-static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_XPOS = 87;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_XPOS = 78;\r
static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_YPOS1 = 176;\r
static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_YPOS2 = 82;\r
static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_WIDTH = 302;\r
static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_HEIGHT = 90;\r
static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_FONT_SIZE = 72;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_FONT_OPA = 76;\r
static constexpr uint16_t STOPWATCH_BUTTON_SRART_XPOS = 250;\r
static constexpr uint16_t STOPWATCH_BUTTON_SRART_YPOS = 302;\r
static constexpr uint16_t STOPWATCH_BUTTON_PAUSE_XPOS = 110;\r
static constexpr uint16_t STOPWATCH_LIST_RECORD_YPOS = 170;\r
static constexpr uint16_t STOPWATCH_LIST_RECORD_WIDTH = 312;\r
static constexpr uint16_t STOPWATCH_LIST_RECORD_HEIGHT = 122;\r
-static constexpr uint16_t STOPWATCH_LABEL_REBOUND_SIZE = 60;\r
+static constexpr uint16_t STOPWATCH_LIST_REBOUND_SIZE = 60;\r
+static constexpr uint16_t STOPWATCH_LIST_ITEM_WIDTH = 312;\r
+static constexpr uint16_t STOPWATCH_LIST_ITEM_HEIGHT = 60;\r
\r
REGIST_SLICE_PAGE(VIEW_STOPWATCH, STOPWATCH_PAGES::STOPWATCH_MAIN_PAGE, StopwatchPage, true);\r
\r
return strElapsedTime;\r
}\r
\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ StopwatchItemView *item = new StopwatchItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, STOPWATCH_LIST_ITEM_WIDTH, STOPWATCH_LIST_ITEM_HEIGHT);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ StopwatchItemView *item = dynamic_cast<StopwatchItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ StopwatchItem *itemInfo = static_cast<StopwatchItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
void StopwatchPage::StopwatchAnimatorCallback::Callback(UIView *view)\r
{\r
UNUSED(view);\r
uint64_t uiElapsedTime = StopwatchModel::GetInstance().UpdateElapsedTime();\r
uint64_t millisecs = GetMilliSeconds(uiElapsedTime);\r
- stopwatchPage->GetSweepClock()->SetSweepTime24Hour(0, 0, millisecs);\r
- stopwatchPage->GetSweepClock()->Invalidate();\r
+ page_->sweepClock_->SetSweepTime24Hour(0, 0, millisecs);\r
+ page_->sweepClock_->Invalidate();\r
std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
- stopwatchPage->GetElapsedTimeLabel()->SetText(strElapsedTime.c_str());\r
+ page_->elapsedTime_->SetText(strElapsedTime.c_str());\r
if (uiElapsedTime >= UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC) {\r
- stopwatchPage->Overflowing();\r
+ page_->TimeOverRange();\r
}\r
}\r
\r
\r
StopwatchPage::~StopwatchPage()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::~StopwatchPage");\r
- bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(PNG_APPLIST_STOPWATCH_IMAGE);\r
+ bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(STOPWATCH_IMAGE);\r
if (ret == false) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadStopwatchImage fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage UnloadStopwatchImage fail");\r
}\r
if (sweepClock_ != nullptr) {\r
sweepClock_->RemoveAll();\r
delete recordsList_;\r
recordsList_ = nullptr;\r
}\r
- if (listAdapter_ != nullptr) {\r
- delete listAdapter_;\r
- listAdapter_ = nullptr;\r
- }\r
if (backGround_ != nullptr) {\r
delete backGround_;\r
backGround_ = nullptr;\r
delete secondHand_;\r
secondHand_ = nullptr;\r
}\r
- if (animator_ != nullptr) {\r
- delete animator_;\r
- animator_ = nullptr;\r
+ if (stopwatchAnimator_ != nullptr) {\r
+ delete stopwatchAnimator_;\r
+ stopwatchAnimator_ = nullptr;\r
}\r
- if (animatorCallback_ != nullptr) {\r
- delete animatorCallback_;\r
- animatorCallback_ = nullptr;\r
+ if (stopwatchAnimatorCallback_ != nullptr) {\r
+ delete stopwatchAnimatorCallback_;\r
+ stopwatchAnimatorCallback_ = nullptr;\r
}\r
if (timeAnimator_ != nullptr) {\r
delete timeAnimator_;\r
delete timeCallback_;\r
timeCallback_ = nullptr;\r
}\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::~StopwatchPage");\r
}\r
\r
void StopwatchPage::OnStart(void *data)\r
{\r
- bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(PNG_APPLIST_STOPWATCH_IMAGE);\r
+ bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(STOPWATCH_IMAGE);\r
if (ret == false) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadStopwatchImage fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage LoadStopwatchImage fail");\r
return;\r
}\r
\r
sweepClock_ = new UISweepClock();\r
if (sweepClock_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UISweepClock new fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage sweepClock_ new fail");\r
return;\r
}\r
- sweepClock_->SetPosition(STOPWATCH_CONTAINER_XPOS, STOPWATCH_CONTAINER_YPOS);\r
+ sweepClock_->SetPosition(0, 0);\r
sweepClock_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
sweepClock_->SetDraggable(true);\r
sweepClock_->SetTouchable(true);\r
+ sweepClock_->SetOnDragListener(this);\r
\r
secondHand_ = new Image();\r
if (secondHand_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "secondHand new fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage secondHand_ new fail");\r
return;\r
}\r
- ImageInfo *second =\r
- ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_STOPWATCH_STOPWATCH02, PNG_APPLIST_STOPWATCH_IMAGE);\r
-\r
- if (second == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::OnStart source fail");\r
- return;\r
- }\r
- secondHand_->SetSrc(second);\r
+ LOADIMG::LoadImageImg(secondHand_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_HAND);\r
sweepClock_->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand_,\r
{STOPWATCH_HAND_POSITION_XPOS, STOPWATCH_HAND_POSITION_YPOS},\r
{STOPWATCH_HAND_CENTER_XPOS, STOPWATCH_HAND_CENTER_YPOS});\r
{STOPWATCH_HAND_POSITION_XPOS, STOPWATCH_HAND_POSITION_YPOS},\r
{STOPWATCH_HAND_CENTER_XPOS, STOPWATCH_HAND_CENTER_YPOS}, Color::White(),\r
STOPWATCH_HAND_WIDTH, STOPWATCH_HAND_HEIGHT, OPA_TRANSPARENT);\r
-\r
sweepClock_->SetWorkMode(UISweepClock::WorkMode::NORMAL);\r
uint64_t uiElapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
uint64_t millisecs = GetMilliSeconds(uiElapsedTime);\r
\r
backGround_ = new UIImageView();\r
if (backGround_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage backGround_ new fail");\r
return;\r
}\r
backGround_->SetPosition(0, 0);\r
- LOADIMG::LoadImageViewImg(backGround_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH06);\r
+ LOADIMG::LoadImageViewImg(backGround_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_BG);\r
sweepClock_->Add(backGround_);\r
\r
imgScale_ = new UIImageView();\r
if (imgScale_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage imgScale_ new fail");\r
return;\r
}\r
- imgScale_->SetPosition(OFFSET, OFFSET);\r
- LOADIMG::LoadImageViewImg(imgScale_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH04);\r
+ imgScale_->SetPosition(STOPWATCH_IMAGE_SCALE_XPOS, STOPWATCH_IMAGE_SCALE_YPOS);\r
+ LOADIMG::LoadImageViewImg(imgScale_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_SCALE);\r
sweepClock_->Add(imgScale_);\r
\r
currentTime_ = new UILabel();\r
if (currentTime_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupCurrentTime new Label currentTime_ fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage currentTime_ new fail");\r
return;\r
}\r
currentTime_->SetPosition(STOPWATCH_LABEL_CURTIME_XPOS, STOPWATCH_LABEL_CURTIME_YPOS);\r
currentTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_CURTIME_FONT_SIZE);\r
currentTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
currentTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
- currentTime_->SetVisible(true);\r
sweepClock_->Add(currentTime_);\r
\r
appName_ = new UILabel();\r
if (appName_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupAppName new Label appName_ fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage appName_ new fail");\r
return;\r
}\r
appName_->SetPosition(STOPWATCH_LABEL_APPNAME_XPOS, STOPWATCH_LABEL_APPNAME_YPOS);\r
appName_->SetText(STOPWATCH_APP_NAME);\r
appName_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
appName_->SetTextColor(Color::White());\r
- appName_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_APPNAME_FONT_SIZE);\r
+ appName_->SetFont(BOLD_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_APPNAME_FONT_SIZE);\r
appName_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
appName_->SetVisible(true);\r
sweepClock_->Add(appName_);\r
\r
elapsedTime_ = new UILabel();\r
if (elapsedTime_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupElapsedTime new Label elapsedTime_ fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage elapsedTime_ new fail");\r
return;\r
}\r
elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS1);\r
elapsedTime_->Resize(STOPWATCH_LABEL_ELSTIME_WIDTH, STOPWATCH_LABEL_ELSTIME_HEIGHT);\r
elapsedTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
- elapsedTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_ELSTIME_FONT_SIZE);\r
+ elapsedTime_->SetFont(BOLD_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_ELSTIME_FONT_SIZE);\r
elapsedTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- elapsedTime_->SetVisible(true);\r
std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
elapsedTime_->SetText(strElapsedTime.c_str());\r
sweepClock_->Add(elapsedTime_);\r
\r
startButton_ = new UILabelButton();\r
if (startButton_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupButton new UILabelButton startButton_ fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage startButton_ new fail");\r
return;\r
}\r
startButton_->SetPosition(STOPWATCH_BUTTON_SRART_XPOS, STOPWATCH_BUTTON_SRART_YPOS);\r
startButton_->Resize(STOPWATCH_BUTTON_WIDTH, STOPWATCH_BUTTON_HEIGHT);\r
- startButton_->SetViewId(STOPWATCH_START);\r
+ startButton_->SetViewId(STOPWATCH_START_PAUSE);\r
startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
\r
resetButton_ = new UILabelButton();\r
if (resetButton_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupButton new UILabelButton resetButton_ fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage resetButton_ new fail");\r
return;\r
}\r
resetButton_->SetPosition(STOPWATCH_BUTTON_PAUSE_XPOS, STOPWATCH_BUTTON_PAUSE_YPOS);\r
resetButton_->Resize(STOPWATCH_BUTTON_WIDTH, STOPWATCH_BUTTON_HEIGHT);\r
- resetButton_->SetViewId(STOPWATCH_RESET);\r
+ resetButton_->SetViewId(STOPWATCH_RESET_RECORD);\r
resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
resetButton_->SetOnClickListener(this);\r
sweepClock_->Add(resetButton_);\r
\r
- listAdapter_ = new StopwatchAdapter();\r
- if (listAdapter_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
- "StopwatchPage::SetupRecordsList new StopwatchAdapter listAdapter_ fail");\r
- return;\r
- }\r
- recordsList_ = new UIList();\r
+ recordsList_ = new UISimpleList();\r
if (recordsList_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupRecordsList new UIList recordsList_ fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage recordsList_ new fail");\r
return;\r
}\r
recordsList_->SetPosition(STOPWATCH_LIST_RECORD_XPOS, STOPWATCH_LIST_RECORD_YPOS);\r
recordsList_->Resize(STOPWATCH_LIST_RECORD_WIDTH, STOPWATCH_LIST_RECORD_HEIGHT);\r
+ recordsList_->SetViewId(STOPWATCH_RECORD_LIST);\r
recordsList_->SetThrowDrag(true);\r
recordsList_->SetDraggable(true);\r
- recordsList_->SetReboundSize(STOPWATCH_LABEL_REBOUND_SIZE);\r
+ recordsList_->SetReboundSize(STOPWATCH_LIST_REBOUND_SIZE);\r
recordsList_->EnableAutoAlign(true);\r
recordsList_->SetElastic(true);\r
recordsList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- recordsList_->SetAdapter(listAdapter_);\r
+ recordsList_->SetOnClickListener(this);\r
recordsList_->SetVisible(false);\r
sweepClock_->Add(recordsList_);\r
\r
- animatorCallback_ = new StopwatchAnimatorCallback(this);\r
- if (animatorCallback_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack new fail\n");\r
+ AddViewToPageContainer(sweepClock_);\r
+\r
+ stopwatchAnimatorCallback_ = new StopwatchAnimatorCallback(this);\r
+ if (stopwatchAnimatorCallback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage stopwatchAnimatorCallback_ new fail");\r
return;\r
}\r
\r
- animator_ = new Animator(animatorCallback_, nullptr, 0, true);\r
- if (animator_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::InitView new Animator animator_ fail");\r
+ stopwatchAnimator_ = new Animator(stopwatchAnimatorCallback_, nullptr, 0, true);\r
+ if (stopwatchAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage stopwatchAnimator_ new fail");\r
return;\r
}\r
\r
timeCallback_ = new TimeAnimatorCallback();\r
if (timeCallback_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack new fail\n");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage timeCallback_ new fail");\r
return;\r
}\r
\r
timeAnimator_ = new Animator(timeCallback_, currentTime_, 0, true);\r
if (timeAnimator_ == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::InitView new Animator timeAnimator_ fail");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage timeAnimator_ new fail");\r
return;\r
}\r
- timeAnimator_->Start();\r
\r
- sweepClock_->SetOnDragListener(this);\r
- AddViewToPageContainer(sweepClock_);\r
-\r
- bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
- DrawButtonStatusView(isActive);\r
- bool state = StopwatchModel::GetInstance().IsInRecordView();\r
- if (StopwatchModel::GetInstance().GetOverflowState()) {\r
- state = false;\r
+ bool isRunning = StopwatchModel::GetInstance().GetRunningState();\r
+ DrawButtonStatusView(isRunning);\r
+ bool isVisible = StopwatchModel::GetInstance().GetRecordListVisible();\r
+ if (StopwatchModel::GetInstance().GetTimeOverRangeState()) {\r
+ isVisible = false;\r
}\r
- DrawContainRecordListView(state);\r
+ DrawRecordListVisibleView(isVisible);\r
}\r
\r
void StopwatchPage::OnStop() {}\r
\r
void StopwatchPage::OnPause()\r
{\r
- if (animator_ != nullptr) {\r
- if (animator_->GetState() != Animator::STOP) {\r
- animator_->Stop();\r
+ if (stopwatchAnimator_ != nullptr) {\r
+ if (stopwatchAnimator_->GetState() != Animator::STOP) {\r
+ stopwatchAnimator_->Stop();\r
}\r
}\r
if (timeAnimator_ != nullptr) {\r
\r
void StopwatchPage::OnResume()\r
{\r
- if (animator_ != nullptr) {\r
- bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
- if (isActive && animator_->GetState() == Animator::STOP) {\r
- animator_->Start();\r
+ if (stopwatchAnimator_ != nullptr) {\r
+ bool isRunning = StopwatchModel::GetInstance().GetRunningState();\r
+ if (isRunning && stopwatchAnimator_->GetState() == Animator::STOP) {\r
+ stopwatchAnimator_->Start();\r
}\r
}\r
if (timeAnimator_ != nullptr) {\r
}\r
}\r
\r
-void StopwatchPage::DrawButtonStatusView(bool isActive)\r
+void StopwatchPage::DrawButtonStatusView(bool isRunning)\r
{\r
- if (isActive) {\r
- LOADIMG::LoadBtnImage(startButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH08,\r
- IMAGE_STOPWATCH_STOPWATCH08);\r
+ elapsedTime_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ if (isRunning) {\r
+ LOADIMG::LoadBtnImage(startButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_PAUSE, IMAGE_STOPWATCH_PAUSE);\r
startButton_->Invalidate();\r
\r
resetButton_->Enable();\r
- LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH14,\r
- IMAGE_STOPWATCH_STOPWATCH14);\r
+ LOADIMG::LoadBtnImage(resetButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_RECORD, IMAGE_STOPWATCH_RECORD);\r
auto &recordList = StopwatchModel::GetInstance().GetRecordsList();\r
if (recordList.Size() >= MAX_RECORD_SIZE) {\r
resetButton_->Disable();\r
- LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH20,\r
- IMAGE_STOPWATCH_STOPWATCH20);\r
+ LOADIMG::LoadBtnImage(resetButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_RECORD_DISABLE,\r
+ IMAGE_STOPWATCH_RECORD_DISABLE);\r
}\r
resetButton_->Invalidate();\r
} else {\r
- LOADIMG::LoadBtnImage(startButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH12,\r
- IMAGE_STOPWATCH_STOPWATCH12);\r
+ LOADIMG::LoadBtnImage(startButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_START, IMAGE_STOPWATCH_START);\r
startButton_->Invalidate();\r
\r
resetButton_->Enable();\r
- // 复位\r
- LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH19,\r
- IMAGE_STOPWATCH_STOPWATCH19);\r
+ LOADIMG::LoadBtnImage(resetButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_RESET, IMAGE_STOPWATCH_RESET);\r
uint64_t elapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
if (elapsedTime == 0) {\r
resetButton_->Disable();\r
- LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH10,\r
- IMAGE_STOPWATCH_STOPWATCH10);\r
+ LOADIMG::LoadBtnImage(resetButton_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_RESET_DISABLE,\r
+ IMAGE_STOPWATCH_RESET_DISABLE);\r
+ elapsedTime_->SetStyle(STYLE_TEXT_OPA, STOPWATCH_LABEL_ELSTIME_FONT_OPA);\r
}\r
resetButton_->Invalidate();\r
}\r
}\r
\r
-void StopwatchPage::DrawContainRecordListView(bool isContainRecordList)\r
+void StopwatchPage::DrawRecordListVisibleView(bool isRecordListVisible)\r
{\r
- if (isContainRecordList) {\r
+ if (isRecordListVisible) {\r
appName_->SetVisible(false);\r
recordsList_->SetVisible(true);\r
elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS2);\r
void StopwatchPage::RefreshRecordsList()\r
{\r
auto &records = StopwatchModel::GetInstance().GetRecordsList();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::RefreshRecordsList");\r
- listAdapter_->SetData(records);\r
+ recordsList_->ClearAll();\r
+ ListNode<StopwatchItem> *node = records.Head();\r
+ while (node != records.End()) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ StopwatchItem &itemData = node->data_;\r
+ content.data = reinterpret_cast<void *>(&itemData);\r
+ recordsList_->AddContent(content);\r
+ node = node->next_;\r
+ }\r
recordsList_->RefreshList();\r
}\r
\r
bool StopwatchPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
UNUSED(event);\r
- bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
- if (strcmp(view.GetViewId(), STOPWATCH_START) == 0) {\r
- if (isActive) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick activeState = %d, pause counting click",\r
- isActive);\r
- StopwatchModel::GetInstance().SetInactiveState();\r
+ bool isRunning = StopwatchModel::GetInstance().GetRunningState();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::OnClick RunningState = %d", isRunning);\r
+ if (strcmp(view.GetViewId(), STOPWATCH_START_PAUSE) == 0) {\r
+ if (isRunning) {\r
+ StopwatchModel::GetInstance().SetRunningState(false);\r
DrawButtonStatusView(false);\r
- animator_->Stop();\r
+ stopwatchAnimator_->Stop();\r
StopwatchModel::GetInstance().SaveElapsedTime();\r
} else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick activeState = %d, start counting click",\r
- isActive);\r
- StopwatchModel::GetInstance().SetActiveState();\r
- if (StopwatchModel::GetInstance().GetOverflowState()) {\r
- DrawContainRecordListView(false);\r
- StopwatchModel::GetInstance().SetOverflowState(false);\r
+ StopwatchModel::GetInstance().SetRunningState(true);\r
+ if (StopwatchModel::GetInstance().GetTimeOverRangeState()) {\r
+ DrawRecordListVisibleView(false);\r
+ StopwatchModel::GetInstance().SetTimeOverRangeState(false);\r
}\r
DrawButtonStatusView(true);\r
StopwatchModel::GetInstance().SetStartTime();\r
- animator_->Start();\r
+ stopwatchAnimator_->Start();\r
}\r
- } else if (strcmp(view.GetViewId(), STOPWATCH_RESET) == 0) {\r
- if (isActive) {\r
- StopwatchModel::GetInstance().SetRecordViewState(true);\r
+ } else if (strcmp(view.GetViewId(), STOPWATCH_RESET_RECORD) == 0) {\r
+ if (isRunning) {\r
+ StopwatchModel::GetInstance().SetRecordListVisible(true);\r
uint64_t uiElapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
- StopwatchItem item = {strElapsedTime, true};\r
+ auto &recordList = StopwatchModel::GetInstance().GetRecordsList();\r
+ StopwatchItem item = {recordList.Size() + 1, strElapsedTime, true};\r
StopwatchModel::GetInstance().AddRecordToList(item);\r
- DrawContainRecordListView(true);\r
+ DrawRecordListVisibleView(true);\r
DrawButtonStatusView(true);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick save a record");\r
} else {\r
- StopwatchModel::GetInstance().SetRecordViewState(false);\r
+ StopwatchModel::GetInstance().SetRecordListVisible(false);\r
StopwatchModel::GetInstance().ResetCounter();\r
elapsedTime_->SetText("00:00.00");\r
sweepClock_->SetInitTime24Hour(0, 0, 0);\r
sweepClock_->Invalidate();\r
- DrawContainRecordListView(false);\r
+ DrawRecordListVisibleView(false);\r
DrawButtonStatusView(false);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick reset a record");\r
}\r
+ } else if (strcmp(view.GetViewId(), STOPWATCH_RECORD_LIST) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(STOPWATCH_PAGES::STOPWATCH_RECORD_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
return true;\r
}\r
\r
bool StopwatchPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchOnDragListener::OnDrag");\r
UNUSED(view);\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
}\r
return true;\r
}\r
\r
-void StopwatchPage::Overflowing()\r
+void StopwatchPage::TimeOverRange()\r
{\r
- animator_->Stop();\r
+ stopwatchAnimator_->Stop();\r
elapsedTime_->SetText("59:59.99");\r
sweepClock_->SetSweepTime24Hour(0, 0, 0);\r
sweepClock_->Invalidate();\r
- StopwatchModel::GetInstance().SetInactiveState();\r
+ StopwatchModel::GetInstance().SetRunningState(false);\r
DrawButtonStatusView(false);\r
StopwatchModel::GetInstance().ResetCounter();\r
- StopwatchModel::GetInstance().SetOverflowState(true);\r
+ StopwatchModel::GetInstance().SetTimeOverRangeState(true);\r
}\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: StopwatchPresenter\r
* Create: 2025-06-06\r
*/\r
+\r
+#include "NativeRegisterManager.h"\r
#include "stopwatch/StopwatchView.h"\r
#include "stopwatch/StopwatchPresenter.h"\r
-#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
\r
-REGIST_MENU(VIEW_STOPWATCH, StopwatchView, StopwatchPresenter, PNG_APPLIST_STOPWATCH_LOGO, PNG_APPLIST_DEFAULT_IMG,\r
- "秒表");\r
+REGIST_MENU(VIEW_STOPWATCH, StopwatchView, StopwatchPresenter, STOPWATCH_ICON, STOPWATCH_ICON, "秒表");\r
}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchRecordPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "stopwatch/StopwatchView.h"\r
+#include "stopwatch/StopwatchRecordPage.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 38;\r
+static constexpr uint16_t LABEL_W = 253;\r
+static constexpr uint16_t LABEL_H = 53;\r
+static constexpr uint16_t LABEL_FONT = 38;\r
+static constexpr uint16_t LIST_X = 73;\r
+static constexpr uint16_t LIST_Y = 100;\r
+static constexpr uint16_t LIST_W = 312;\r
+static constexpr uint16_t LIST_H = 364;\r
+static constexpr uint16_t LIST_ITEM_WIDTH = 312;\r
+static constexpr uint16_t LIST_ITEM_HEIGHT = 60;\r
+static constexpr uint16_t LIST_REBOUND_SIZE = 60;\r
+static constexpr uint16_t LIST_BLANK_SIZE = 80;\r
+\r
+REGIST_SLICE_PAGE(VIEW_STOPWATCH, STOPWATCH_PAGES::STOPWATCH_RECORD_PAGE, StopwatchRecordPage, false);\r
+\r
+static UIView *CreateViewCb(uint8_t type)\r
+{\r
+ StopwatchItemView *item = new StopwatchItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ item->SetPosition(0, 0, LIST_ITEM_WIDTH, LIST_ITEM_HEIGHT);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView *view, void *data, uint8_t type)\r
+{\r
+ if (view == nullptr || data == nullptr) {\r
+ return;\r
+ }\r
+ StopwatchItemView *item = dynamic_cast<StopwatchItemView *>(view);\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ StopwatchItem *itemInfo = static_cast<StopwatchItem *>(data);\r
+ item->SetItemInfo(*itemInfo);\r
+}\r
+\r
+StopwatchRecordPage::~StopwatchRecordPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (background_ != nullptr) {\r
+ delete background_;\r
+ background_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ }\r
+ if (recordList_ != nullptr) {\r
+ delete recordList_;\r
+ recordList_ = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage::~StopwatchRecordPage");\r
+}\r
+\r
+void StopwatchRecordPage::InitBackgroundView()\r
+{\r
+ background_ = new UIImageView();\r
+ if (background_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage background_ new fail");\r
+ return;\r
+ }\r
+ background_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(background_, STOPWATCH_IMAGE, IMAGE_STOPWATCH_BG);\r
+ group_->Add(background_);\r
+}\r
+\r
+void StopwatchRecordPage::CreateUILabel()\r
+{\r
+ titleLabel_ = new UILabel();\r
+ if (titleLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage titleLabel_ new fail");\r
+ return;\r
+ }\r
+ titleLabel_->SetPosition(LABEL_X, LABEL_Y, LABEL_W, LABEL_H);\r
+ titleLabel_->SetText("分段详情");\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ group_->Add(titleLabel_);\r
+}\r
+\r
+void StopwatchRecordPage::CreateUIList()\r
+{\r
+ recordList_ = new UISimpleList();\r
+ if (recordList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage recordList_ new fail");\r
+ return;\r
+ }\r
+ recordList_->SetPosition(LIST_X, LIST_Y, LIST_W, LIST_H);\r
+ recordList_->SetThrowDrag(true);\r
+ recordList_->SetDraggable(true);\r
+ recordList_->SetReboundSize(LIST_REBOUND_SIZE);\r
+ recordList_->EnableAutoAlign(true);\r
+ recordList_->SetElastic(true);\r
+ recordList_->SetScrollBlankSize(LIST_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ recordList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ auto &records = StopwatchModel::GetInstance().GetRecordsList();\r
+ ListNode<StopwatchItem> *node = records.Head();\r
+ while (node != records.End()) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 0;\r
+ StopwatchItem &itemData = node->data_;\r
+ content.data = reinterpret_cast<void *>(&itemData);\r
+ recordList_->AddContent(content);\r
+ node = node->next_;\r
+ }\r
+ recordList_->RefreshList();\r
+ group_->Add(recordList_);\r
+}\r
+\r
+void StopwatchRecordPage::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchRecordPage group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+\r
+ InitBackgroundView();\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+bool StopwatchRecordPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(STOPWATCH_PAGES::STOPWATCH_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool StopwatchRecordPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerCountDown\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#include <cmath>\r
+#include <string>\r
+#include "wearable_log.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "pwm.h"\r
+#include "main/LoadImg.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+#include "timers/TimerView.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "timers/TimerMainPage.h"\r
+#include "timers/TimerCountDown.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t TIMING_TITLE_POSITION_X = 170;\r
+static constexpr uint16_t TIMING_TITLE_POSITION_Y = 110;\r
+static constexpr uint16_t TIMING_TITLE_SIZE_WIDTH = 114;\r
+static constexpr uint16_t TIMING_TITLE_SIZE_HEIGHT = 38;\r
+static constexpr uint16_t TIMING_TITLE_FONT = 38;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_XPOS = 177;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_YPOS = 54;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_WIDTH = 100;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_HEIGHT = 30;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_FONT_SIZE = 28;\r
+static constexpr uint16_t TIMING_START_IMAGE_XPOS = 251;\r
+static constexpr uint16_t TIMING_START_IMAGE_YPOS = 306;\r
+static constexpr uint16_t TIMING_START_IMAGE_SIZE = 96;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_XPOS = 107;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_YPOS = 306;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_SIZE = 96;\r
+static constexpr uint16_t TIMING_TIMER_TIME_XPOS = 85;\r
+static constexpr uint16_t TIMING_TIMER_TIME_YPOS = 182;\r
+static constexpr uint16_t TIMING_TIMER_TIME_WIDTH = 322;\r
+static constexpr uint16_t TIMING_TIMER_TIME_HEIGHT = 90;\r
+static constexpr uint16_t TIMING_TIMER_TIME_FONT_SIZE = 72;\r
+static constexpr uint16_t HOUR_TIME = 3600;\r
+static constexpr uint16_t MIN_TIME = 60;\r
+static constexpr uint16_t TIMING_CIRCLE_LINE_WIDTH = 10;\r
+static constexpr uint16_t TIMING_CIRCLE = 227;\r
+static constexpr uint16_t CIRCLE_RADIUS = 222;\r
+static constexpr uint16_t TIMING_CIRCLE_END = 360;\r
+static constexpr uint32_t TIMING_CIRCLE_RANGE = 100000;\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
+static constexpr uint16_t REMIND_MIN_MS = 16;\r
+static constexpr char *RESET_OR_EXIT_BUTTON = "resetOrExitButton";\r
+static constexpr char *START_OR_PAUSE_BUTTON = "startOrPauseButton";\r
+\r
+static std::string GetCurrentTimeStr()\r
+{\r
+ struct tm localTime;\r
+ time_t seconds = time(nullptr);\r
+ localtime_r(&seconds, &localTime);\r
+ std::string currTime;\r
+ if (localTime.tm_hour < NUM_TEN) {\r
+ currTime += "0";\r
+ }\r
+ currTime += std::to_string(localTime.tm_hour) + ":";\r
+ if (localTime.tm_min < NUM_TEN) {\r
+ currTime += "0";\r
+ }\r
+ currTime += std::to_string(localTime.tm_min);\r
+ return currTime;\r
+}\r
+\r
+void TimerCountDown::OnCreateView(void *data)\r
+{\r
+ fragmentView_.SetTouchable(true);\r
+ fragmentView_.SetDraggable(true);\r
+ fragmentView_.SetOnDragListener(this);\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ fail");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(bgImg_, TIMER_IMAGE, IMAGE_TIMER_BG);\r
+ bgImg_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+ // 标题\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(TIMING_TITLE_POSITION_X, TIMING_TITLE_POSITION_Y);\r
+ labelTitle_->Resize(TIMING_TITLE_SIZE_WIDTH, TIMING_TITLE_SIZE_HEIGHT);\r
+ labelTitle_->SetText("计时器");\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, TIMING_TITLE_FONT);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ currentTime_ = new UILabel();\r
+ if (currentTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentTime_ fail");\r
+ return;\r
+ }\r
+ currentTime_->SetPosition(TIMING_LABEL_CURTIME_XPOS, TIMING_LABEL_CURTIME_YPOS);\r
+ currentTime_->Resize(TIMING_LABEL_CURTIME_WIDTH, TIMING_LABEL_CURTIME_HEIGHT);\r
+ currentTime_->SetFont(BOLD_VECTOR_FONT_FILENAME, TIMING_LABEL_CURTIME_FONT_SIZE);\r
+ currentTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ currentTime_->SetVisible(true);\r
+ \r
+ fragmentView_.Add(bgImg_);\r
+ fragmentView_.Add(labelTitle_);\r
+ fragmentView_.Add(currentTime_);\r
+\r
+ CircleProgress();\r
+ CreateButton();\r
+ CreateTimerTime();\r
+ InitAnimator();\r
+\r
+ currentTimeCallback_ = new TimeAnimatorCallback();\r
+ if (currentTimeCallback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentTimeCallback_ fail");\r
+ return;\r
+ }\r
+ currentTimeAnimator_ = new Animator(currentTimeCallback_, currentTime_, 0, true);\r
+ if (currentTimeAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentTimeAnimator_ fail");\r
+ return;\r
+ }\r
+ currentTimeAnimator_->Start();\r
+}\r
+\r
+void TimerCountDown::OnDestroyView()\r
+{\r
+ fragmentView_.RemoveAll();\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (timerClock_ != nullptr) {\r
+ delete timerClock_;\r
+ timerClock_ = nullptr;\r
+ }\r
+\r
+ if (resetOrExitImg_ != nullptr) {\r
+ delete resetOrExitImg_;\r
+ resetOrExitImg_ = nullptr;\r
+ }\r
+\r
+ if (startOrPauseImg_ != nullptr) {\r
+ delete startOrPauseImg_;\r
+ startOrPauseImg_ = nullptr;\r
+ }\r
+\r
+ if (circleProgress_ != nullptr) {\r
+ delete circleProgress_;\r
+ circleProgress_ = nullptr;\r
+ }\r
+\r
+ if (currentTime_ != nullptr) {\r
+ delete currentTime_;\r
+ currentTime_ = nullptr;\r
+ }\r
+\r
+ if (currentTimeCallback_ != nullptr) {\r
+ delete currentTimeCallback_;\r
+ currentTimeCallback_ = nullptr;\r
+ }\r
+\r
+ if (currentTimeAnimator_ != nullptr) {\r
+ delete currentTimeAnimator_;\r
+ currentTimeAnimator_ = nullptr;\r
+ }\r
+\r
+ if (countDownTimecallBack_ != nullptr) {\r
+ delete countDownTimecallBack_;\r
+ countDownTimecallBack_ = nullptr;\r
+ }\r
+\r
+ if (countDownTimeanimator_ != nullptr) {\r
+ delete countDownTimeanimator_;\r
+ countDownTimeanimator_ = nullptr;\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
+}\r
+\r
+void TimerCountDown::OnResume()\r
+{\r
+ if (TimerModel::GetInstance().GetExistTimer()) {\r
+ SetAnimatorStatus(true);\r
+ TimerModel::GetInstance().SetExistTimer(false);\r
+ }\r
+ if (currentTimeAnimator_ != nullptr) {\r
+ if (currentTimeAnimator_->GetState() == Animator::STOP) {\r
+ currentTimeAnimator_->Start();\r
+ }\r
+ }\r
+ if (!startOrPauseImg_->IsTouchable()) {\r
+ LOADIMG::LoadImageViewImg(startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PAUSE);\r
+ }\r
+}\r
+\r
+void TimerCountDown::OnPause()\r
+{\r
+ if (TimerModel::GetInstance().GetIsCountDown()) {\r
+ TimerModel::GetInstance().SetExistTimer(true);\r
+ }\r
+ if (currentTimeAnimator_ != nullptr) {\r
+ if (currentTimeAnimator_->GetState() != Animator::STOP) {\r
+ currentTimeAnimator_->Stop();\r
+ }\r
+ }\r
+ SetAnimatorStatus(false);\r
+}\r
+\r
+void TimerCountDown::CreateButton()\r
+{\r
+ // 开始/暂停按钮\r
+ startOrPauseImg_ = new UIImageView();\r
+ if (startOrPauseImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startOrPauseImg_ fail");\r
+ return;\r
+ }\r
+ startOrPauseImg_->SetPosition(TIMING_START_IMAGE_XPOS, TIMING_START_IMAGE_YPOS);\r
+ startOrPauseImg_->Resize(TIMING_START_IMAGE_SIZE, TIMING_START_IMAGE_SIZE);\r
+ startOrPauseImg_->SetViewId(START_OR_PAUSE_BUTTON);\r
+ startOrPauseImg_->SetTouchable(true);\r
+ startOrPauseImg_->SetOnClickListener(this);\r
+ LOADIMG::LoadImageViewImg(startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PLAY);\r
+\r
+ fragmentView_.Add(startOrPauseImg_);\r
+\r
+ // 复位/退出按钮\r
+ ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_TIMER_EXIT, TIMER_IMAGE);\r
+ resetOrExitImg_ = new UIImageView();\r
+ if (resetOrExitImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "resetOrExitImg_ fail");\r
+ return;\r
+ }\r
+ resetOrExitImg_->SetPosition(TIMING_RESET_IMAGE_XPOS, TIMING_RESET_IMAGE_YPOS);\r
+ resetOrExitImg_->Resize(TIMING_RESET_IMAGE_SIZE, TIMING_RESET_IMAGE_SIZE);\r
+ resetOrExitImg_->SetViewId(RESET_OR_EXIT_BUTTON);\r
+ resetOrExitImg_->SetTouchable(true);\r
+ resetOrExitImg_->SetOnClickListener(this);\r
+ resetOrExitImg_->SetSrc(image2);\r
+ fragmentView_.Add(resetOrExitImg_);\r
+}\r
+\r
+void TimerCountDown::CreateTimerTime()\r
+{\r
+ timerClock_ = new UIDigitalClock();\r
+ if (timerClock_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timerClock_ fail");\r
+ return;\r
+ }\r
+ timerClock_->SetPosition(TIMING_TIMER_TIME_XPOS, TIMING_TIMER_TIME_YPOS);\r
+ timerClock_->Resize(TIMING_TIMER_TIME_WIDTH, TIMING_TIMER_TIME_HEIGHT);\r
+ timerClock_->SetFont(BOLD_VECTOR_FONT_FILENAME, TIMING_TIMER_TIME_FONT_SIZE);\r
+ timerClock_->SetDisplayMode(UIDigitalClock::DISPLAY_24_HOUR);\r
+ timerClock_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+\r
+ fragmentView_.Add(timerClock_);\r
+}\r
+\r
+void TimerCountDown::RefreshFragment()\r
+{\r
+ uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+ uint8_t hour = totalTime / HOUR_TIME;\r
+ uint8_t minute = totalTime % HOUR_TIME / MIN_TIME;\r
+ uint8_t second = totalTime % MIN_TIME;\r
+ timerClock_->SetTime24Hour(hour, minute, second);\r
+ TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+ LOADIMG::LoadImageViewImg(resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_EXIT);\r
+ circleProgress_->SetValue(TIMING_CIRCLE_RANGE);\r
+\r
+}\r
+\r
+void TimerCountDown::CircleProgress()\r
+{\r
+ circleProgress_ = new UICircleProgress();\r
+ if (circleProgress_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "circleProgress_ fail");\r
+ return;\r
+ }\r
+ circleProgress_->SetPosition(0, 0);\r
+ circleProgress_->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ circleProgress_->EnableBackground(true);\r
+ circleProgress_->SetForegroundStyle(STYLE_LINE_COLOR, 0XFFFFBF00);\r
+ circleProgress_->SetBackgroundStyle(STYLE_LINE_COLOR, 0XFF473D20);\r
+ circleProgress_->SetForegroundStyle(STYLE_LINE_WIDTH, TIMING_CIRCLE_LINE_WIDTH);\r
+ circleProgress_->SetBackgroundStyle(STYLE_LINE_WIDTH, TIMING_CIRCLE_LINE_WIDTH);\r
+ circleProgress_->EnableBackground(true);\r
+ circleProgress_->SetCenterPosition(TIMING_CIRCLE, TIMING_CIRCLE);\r
+ circleProgress_->SetRadius(CIRCLE_RADIUS);\r
+ circleProgress_->SetStartAngle(0);\r
+ circleProgress_->SetEndAngle(TIMING_CIRCLE_END);\r
+ circleProgress_->SetRange(TIMING_CIRCLE_RANGE, 0);\r
+ circleProgress_->SetValue(TIMING_CIRCLE_RANGE);\r
+ fragmentView_.Add(circleProgress_);\r
+}\r
+\r
+// 单位为毫秒计算\r
+void TimerCountDown::SetTimerTime(int64_t onTime)\r
+{\r
+ uint64_t time = onTime / MS_ONE_SECONDS;\r
+ uint16_t reminMs = onTime % MS_ONE_SECONDS;\r
+ if (reminMs > REMIND_MIN_MS) {\r
+ time++;\r
+ }\r
+ uint8_t hour = time / HOUR_TIME;\r
+ uint8_t minute = time % HOUR_TIME / MIN_TIME;\r
+ uint8_t second = time % MIN_TIME;\r
+ timerClock_->SetTime24Hour(hour, minute, second);\r
+ uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+ double percentage = static_cast<double>(onTime) / ((uint64_t)totalTime * MS_ONE_SECONDS);\r
+ double value = round(percentage * TIMING_CIRCLE_RANGE);\r
+ circleProgress_->SetValue(static_cast<int32_t>(value));\r
+ circleProgress_->Invalidate();\r
+ timerClock_->Invalidate();\r
+}\r
+\r
+void TimerCountDown::InitAnimator()\r
+{\r
+ countDownTimecallBack_ = new TimerCountDownCallback(this);\r
+ if (countDownTimecallBack_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "countDownTimecallBack_ fail");\r
+ return;\r
+ }\r
+ countDownTimeanimator_ = new Animator(countDownTimecallBack_, nullptr, 0, true);\r
+ if (countDownTimeanimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "countDownTimeanimator_ fail");\r
+ return;\r
+ }\r
+}\r
+\r
+void TimerCountDown::TimerCountDownCallback::Callback(UIView *view)\r
+{\r
+ (void)view;\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+\r
+ uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+ uint64_t eclipseTime = TimerModel::GetInstance().GetEclipseTime();\r
+ uint64_t s_time = TimerModel::GetInstance().GetStartTime();\r
+ uint64_t c_time = (uint64_t)current_time.tv_sec * MS_ONE_SECONDS + current_time.tv_usec / MS_ONE_SECONDS;\r
+ int64_t remainTime = (uint64_t)totalTime * MS_ONE_SECONDS - eclipseTime - (c_time - s_time);\r
+ if (remainTime < 0) {\r
+ // 计时到设定时间,复位图标修改为退出图标,暂停图标修改为播放图标,并设置成不可点击态\r
+ page_->startOrPauseImg_->SetTouchable(false);\r
+ LOADIMG::LoadImageViewImg(page_->startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PAUSE);\r
+ LOADIMG::LoadImageViewImg(page_->resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_EXIT);\r
+ TimerModel::GetInstance().SetIsPause(false);\r
+ TimerModel::GetInstance().SetIsCountDown(false);\r
+ page_->startOrPauseImg_->Invalidate();\r
+ page_->resetOrExitImg_->Invalidate();\r
+ page_->countDownTimeanimator_->Stop();\r
+ page_->SetTimerTime(0);\r
+ // 调用pwm接口实现马达震动,客户自实现\r
+ } else {\r
+ page_->SetTimerTime(remainTime);\r
+ }\r
+}\r
+\r
+void TimerCountDown::SetAnimatorStatus(bool status)\r
+{\r
+ if (status) {\r
+ LOADIMG::LoadImageViewImg(startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PAUSE_ORANGE);\r
+ LOADIMG::LoadImageViewImg(resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_RESTART);\r
+ countDownTimeanimator_->Start();\r
+ TimerModel::GetInstance().InitTimer();\r
+ } else {\r
+ countDownTimeanimator_->Stop();\r
+ LOADIMG::LoadImageViewImg(startOrPauseImg_, TIMER_IMAGE, IMAGE_TIMER_PLAY);\r
+ TimerModel::GetInstance().DisableTimer();\r
+ }\r
+}\r
+\r
+bool TimerCountDown::OnDragStart(UIView& view, const DragEvent& event)\r
+{\r
+ return true;\r
+}\r
+\r
+bool TimerCountDown::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ if (TimerModel::GetInstance().GetIsCountDown()) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ } else {\r
+ fragmentView_.SetVisible(false);\r
+ TimerMainPage::GetInstance()->ShowMainPage();\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TimerCountDown::OnDragEnd(UIView& view, const DragEvent& event)\r
+{\r
+ return true;\r
+}\r
+\r
+bool TimerCountDown::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), RESET_OR_EXIT_BUTTON) == 0) {\r
+ if (TimerModel::GetInstance().GetIsCountDown()) {\r
+ // 此时计时器处于计时状态,点击按钮,重置timerClock_时间为倒计时初始选择时间,修改复位图标为退出图标,暂停图标变为开始图标,\r
+ SetAnimatorStatus(false);\r
+ TimerModel::GetInstance().SetIsCountDown(false);\r
+ uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+ uint8_t hour = totalTime / HOUR_TIME;\r
+ uint8_t minute = totalTime % HOUR_TIME / MIN_TIME;\r
+ uint8_t second = totalTime % MIN_TIME;\r
+ timerClock_->SetTime24Hour(hour, minute, second);\r
+ TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+ LOADIMG::LoadImageViewImg(resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_EXIT);\r
+ circleProgress_->SetValue(TIMING_CIRCLE_RANGE);\r
+ } else if (!TimerModel::GetInstance().GetIsCountDown() && TimerModel::GetInstance().GetIsPause()) {\r
+ // 此时计时器处于暂停状态,点击复位按钮,重置timerClock_时间为倒计时初始选择时间,将复位图标变为退出图标,\r
+ TimerModel::GetInstance().SetIsCountDown(false);\r
+ uint64_t totalTime = TimerModel::GetInstance().GetTotalTime();\r
+ uint8_t hour = totalTime / HOUR_TIME;\r
+ uint8_t minute = totalTime % HOUR_TIME / MIN_TIME;\r
+ uint8_t second = totalTime % MIN_TIME;\r
+ timerClock_->SetTime24Hour(hour, minute, second);\r
+ TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+ LOADIMG::LoadImageViewImg(resetOrExitImg_, TIMER_IMAGE, IMAGE_TIMER_EXIT);\r
+ circleProgress_->SetValue(TIMING_CIRCLE_RANGE);\r
+ TimerModel::GetInstance().SetIsPause(false);\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(TIMER_PAGES::TIMER_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ } else if (strcmp(view.GetViewId(), START_OR_PAUSE_BUTTON) == 0) {\r
+ if (TimerModel::GetInstance().GetIsCountDown()) {\r
+ // 计时器此时处于运行状态,点击暂停按钮,暂停图标变为开始图标\r
+ SetAnimatorStatus(false);\r
+ TimerModel::GetInstance().SetIsCountDown(false);\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ uint64_t time = ((uint64_t)current_time.tv_sec * MS_ONE_SECONDS + current_time.tv_usec / MS_ONE_SECONDS) -\r
+ TimerModel::GetInstance().GetStartTime();\r
+ TimerModel::GetInstance().SetEclipseTime(false, time);\r
+ TimerModel::GetInstance().SetIsPause(true);\r
+ } else {\r
+ // 计时器此时处于停止/暂停状态,点击开始按钮,开始图标变为暂停图标,并获取点击时的时间,用作开始时间\r
+ SetAnimatorStatus(true);\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ uint64_t s_time =\r
+ (uint64_t)current_time.tv_sec * MS_ONE_SECONDS + current_time.tv_usec / MS_ONE_SECONDS; // 转换成ms\r
+ TimerModel::GetInstance().SetStartTime(s_time);\r
+ TimerModel::GetInstance().SetIsCountDown(true);\r
+ TimerModel::GetInstance().SetIsPause(false);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+void TimerCountDown::TimeAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UILabel *timeLabel = dynamic_cast<UILabel *>(view);\r
+ if (timeLabel == nullptr) {\r
+ return;\r
+ }\r
+ std::string currTime = GetCurrentTimeStr();\r
+ timeLabel->SetText(currTime.c_str());\r
+ timeLabel->Invalidate();\r
+}\r
+}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: TimerMainPage\r
* Create: 2025-06-09\r
*/\r
\r
#include <string>\r
-#include "timers/TimerMainPage.h"\r
-#include "timers/TimerSettingPage.h"\r
-#include "timers/TimerTimingPage.h"\r
-#include "timers/TimerPresenter.h"\r
#include "SlicePageFactory.h"\r
-#include "timers/TimerView.h"\r
#include "components/ui_scroll_view_nested.h"\r
#include "components/ui_arc_label.h"\r
#include "graphic_timer.h"\r
#include "ohos_timer.h"\r
#include "wearable_log.h"\r
#include "main/LoadImg.h"\r
+#include "timers/TimerView.h"\r
+#include "timers/TimerSettingPage.h"\r
+#include "timers/TimerCountDown.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "timers/TimerMainPage.h"\r
\r
namespace OHOS {\r
-static constexpr int16_t ADDBUTTON_MAX = 4;\r
static constexpr uint8_t MAIN_TITLE_FONT_SIZE = 40;\r
static constexpr int16_t MAIN_TITLE_SIZE_WIDTH = 160;\r
static constexpr int16_t MAIN_TITLE_SIZE_HEIGHT = 50;\r
static constexpr int16_t SELECTMIN_POY = 89;\r
static constexpr int16_t SELECTMIN_POYS = 220;\r
static constexpr int16_t SELECTMIN_SIZE = 100;\r
-static constexpr int16_t MAX_SCR_DIS = 1000;\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
static constexpr uint8_t MIN = 60;\r
+static constexpr char *SET_TIME_BUTTON = "setTimeButton";\r
+static constexpr char *ONE_MINUTE = "1";\r
+static constexpr char *THREE_MINUTE = "3";\r
+static constexpr char *FIFTEEN_MINUTE = "15";\r
+static constexpr char *THIRTY_MINUTE = "30";\r
+static TimerMainPage *g_pTimerMainPage{nullptr};\r
\r
REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE, TimerMainPage, true);\r
\r
+TimerMainPage::TimerMainPage()\r
+{\r
+ g_pTimerMainPage = this;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::TimerMainPage()");\r
+}\r
+\r
TimerMainPage::~TimerMainPage()\r
{\r
- bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
- if (ret == false) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadTimerImage fail");\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
}\r
\r
- if (group != nullptr) {\r
- group->RemoveAll();\r
- delete group;\r
- group = nullptr;\r
+ if (countDownFragment_ != nullptr) {\r
+ countDownFragment_->DestroyView();\r
+ delete countDownFragment_;\r
+ countDownFragment_ = nullptr;\r
}\r
\r
- if (title != nullptr) {\r
- delete title;\r
- title = nullptr;\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
}\r
\r
- if (addButton != nullptr) {\r
- delete addButton;\r
- addButton = nullptr;\r
+ if (addButton_ != nullptr) {\r
+ delete addButton_;\r
+ addButton_ = nullptr;\r
}\r
\r
- for (int i = 0; i < ADDBUTTON_MAX; i++) {\r
- if (selectMin[i] != nullptr) {\r
- delete selectMin[i];\r
- selectMin[i] = nullptr;\r
+ for (int i = 0; i < SELECT_IMAGE_COUNT; i++) {\r
+ if (selectMin_[i] != nullptr) {\r
+ delete selectMin_[i];\r
+ selectMin_[i] = nullptr;\r
}\r
}\r
\r
- if (backround != nullptr) {\r
- delete backround;\r
- backround = nullptr;\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
}\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
+ TimerModel::GetInstance().SetIsShowFragment(false);\r
+ g_pTimerMainPage = nullptr;\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::~TimerMainPage()");\r
}\r
\r
-void TimerMainPage::OnStart(void* data)\r
+void TimerMainPage::OnResume()\r
+{\r
+ if (countDownFragment_->GetFragmentView()->IsVisible()) {\r
+ countDownFragment_->OnResume();\r
+ }\r
+}\r
+\r
+void TimerMainPage::OnPause()\r
+{\r
+ if (countDownFragment_->GetFragmentView()->IsVisible()) {\r
+ countDownFragment_->OnPause();\r
+ }\r
+}\r
+\r
+TimerMainPage* TimerMainPage::GetInstance()\r
{\r
- bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
- if (ret == false) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage fail");\r
+ return g_pTimerMainPage;\r
+}\r
+\r
+void TimerMainPage::OnStart(void *data)\r
+{\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ fail");\r
return;\r
}\r
- // 主界面\r
- if (group == nullptr) {\r
- group = new UIScrollView();\r
- group->SetPosition(0, 0, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
- group->SetViewId("mainview");\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetVisible(false);\r
+\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ fail");\r
+ return;\r
}\r
- if (backround == nullptr) {\r
- backround = new UIImageView();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnStart new backround");\r
+ LOADIMG::LoadImageViewImg(bgImg_, TIMER_IMAGE, IMAGE_TIMER_BG);\r
+ bgImg_->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_WIDTH);\r
+ group_->Add(bgImg_);\r
+\r
+ countDownFragment_ = new TimerCountDown();\r
+ if (countDownFragment_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "countDownFragment_ fail");\r
+ return;\r
}\r
- LOADIMG::LoadImageViewImg(backround, TIMER_IMAGE, IMAGE_CONVERTER_TOOL_TIMER_BG);\r
- backround->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_WIDTH);\r
- group->Add(backround);\r
+ countDownFragment_->GetFragmentView()->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ countDownFragment_->CreateView();\r
+ countDownFragment_->GetFragmentView()->SetVisible(false);\r
+\r
InitView();\r
LabelTitle();\r
- group->SetOnDragListener(this);\r
- group->SetVisible(false);\r
- AddViewToPageContainer(group);\r
+\r
+ AddViewToPageContainer(group_);\r
+ AddViewToPageContainer(countDownFragment_->GetFragmentView());\r
+ // 定时器存在,不展示主页面,直接进入计时页面\r
if (TimerModel::GetInstance().GetExistTimer()) {\r
- // 定时器存在,进入计时页面\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+ countDownFragment_->GetFragmentView()->SetVisible(true);\r
+ } else if (TimerModel::GetInstance().GetIsShowFragment()) {\r
+ TimerModel::GetInstance().SetIsShowFragment(false);\r
+ countDownFragment_->RefreshFragment();\r
+ countDownFragment_->GetFragmentView()->SetVisible(true);\r
} else {\r
- group->SetVisible(true);\r
+ group_->SetVisible(true);\r
}\r
}\r
\r
void TimerMainPage::LabelTitle()\r
{\r
- // 标题\r
- if (title == nullptr) {\r
- title = new UILabel();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::LabelTitle new title");\r
- }\r
- title->SetPosition(MAIN_TITLE_POSITION_X, MAIN_TITLE_POSITION_Y);\r
- title->SetText("计时器");\r
- title->Resize(MAIN_TITLE_SIZE_WIDTH, MAIN_TITLE_SIZE_HEIGHT);\r
- title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MAIN_TITLE_FONT_SIZE);\r
- title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- title->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- title->SetVisible(true);\r
- group->Add(title);\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ fail");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(MAIN_TITLE_POSITION_X, MAIN_TITLE_POSITION_Y);\r
+ labelTitle_->SetText("计时器");\r
+ labelTitle_->Resize(MAIN_TITLE_SIZE_WIDTH, MAIN_TITLE_SIZE_HEIGHT);\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, MAIN_TITLE_FONT_SIZE);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelTitle_->SetVisible(true);\r
+ group_->Add(labelTitle_);\r
}\r
\r
void TimerMainPage::InitView()\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::InitView() Start!");\r
- if (addButton == nullptr) {\r
- addButton = new UIImageView();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::InitView new addButton");\r
- }\r
- LOADIMG::LoadImageViewImg(addButton, TIMER_IMAGE, IMAGE_CONVERTER_TOOL_TIMER_USER);\r
- addButton->SetPosition(MAIN_ADDBUTTON_POSITION_X, MAIN_ADDBUTTON_POSITION_Y);\r
- addButton->Resize(MAIN_ADDBUTTON_SIZE_WIDTH, MAIN_ADDBUTTON_SIZE_HEIGHT);\r
- addButton->SetViewId(SETTING_TIMER);\r
- addButton->SetTouchable(true);\r
- addButton->SetOnClickListener(this);\r
- group->Add(addButton);\r
-\r
- int posX[ADDBUTTON_MAX] = {SELECTMIN_POX, SELECTMIN_POXS, SELECTMIN_POX, SELECTMIN_POXS};\r
- int posY[ADDBUTTON_MAX] = {SELECTMIN_POY, SELECTMIN_POY, SELECTMIN_POYS, SELECTMIN_POYS};\r
- const char* buttonViewId[ADDBUTTON_MAX] = {"1", "3", "15", "30"};\r
- ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_1, TIMER_IMAGE);\r
- ImageInfo *image3 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_3, TIMER_IMAGE);\r
- ImageInfo *image15 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_15, TIMER_IMAGE);\r
- ImageInfo *image30 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_30, TIMER_IMAGE);\r
- ImageInfo* buttonSrc[ADDBUTTON_MAX] = {image1, image3, image15, image30};\r
- // 一分钟按钮\r
- for (int i = 0;i < ADDBUTTON_MAX;i++) {\r
- if (selectMin[i] == nullptr) {\r
- selectMin[i] = new UIImageView();\r
+ addButton_ = new UIImageView();\r
+ if (addButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addButton_ fail");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(addButton_, TIMER_IMAGE, IMAGE_TIMER_USER);\r
+ addButton_->SetPosition(MAIN_ADDBUTTON_POSITION_X, MAIN_ADDBUTTON_POSITION_Y);\r
+ addButton_->Resize(MAIN_ADDBUTTON_SIZE_WIDTH, MAIN_ADDBUTTON_SIZE_HEIGHT);\r
+ addButton_->SetViewId(SET_TIME_BUTTON);\r
+ addButton_->SetTouchable(true);\r
+ addButton_->SetOnClickListener(this);\r
+ group_->Add(addButton_);\r
+\r
+ int posX[SELECT_IMAGE_COUNT] = {SELECTMIN_POX, SELECTMIN_POXS, SELECTMIN_POX, SELECTMIN_POXS};\r
+ int posY[SELECT_IMAGE_COUNT] = {SELECTMIN_POY, SELECTMIN_POY, SELECTMIN_POYS, SELECTMIN_POYS};\r
+ const char *buttonViewId[SELECT_IMAGE_COUNT] = {ONE_MINUTE, THREE_MINUTE, FIFTEEN_MINUTE, THIRTY_MINUTE};\r
+ int buttonImg[SELECT_IMAGE_COUNT] = {IMAGE_TIMER_1, IMAGE_TIMER_3, IMAGE_TIMER_15, IMAGE_TIMER_30};\r
+ // 计时选择时间按钮\r
+ for (int i = 0; i < SELECT_IMAGE_COUNT; i++) {\r
+ selectMin_[i] = new UIImageView();\r
+ if (selectMin_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "selectMin_[%d] fail", i);\r
+ return;\r
}\r
- selectMin[i]->SetPosition(posX[i], posY[i]);\r
- selectMin[i]->Resize(SELECTMIN_SIZE, SELECTMIN_SIZE);\r
- selectMin[i]->SetTouchable(true);\r
- selectMin[i]->SetOnClickListener(this);\r
- selectMin[i]->SetViewId(buttonViewId[i]);\r
- selectMin[i]->SetSrc(buttonSrc[i]);\r
- group->Add(selectMin[i]);\r
+ selectMin_[i]->SetPosition(posX[i], posY[i]);\r
+ selectMin_[i]->Resize(SELECTMIN_SIZE, SELECTMIN_SIZE);\r
+ selectMin_[i]->SetTouchable(true);\r
+ selectMin_[i]->SetOnClickListener(this);\r
+ selectMin_[i]->SetViewId(buttonViewId[i]);\r
+ LOADIMG::LoadImageViewImg(selectMin_[i], TIMER_IMAGE, buttonImg[i]);\r
+ group_->Add(selectMin_[i]);\r
}\r
}\r
\r
+void TimerMainPage::ShowMainPage()\r
+{\r
+ group_->SetVisible(true);\r
+}\r
+\r
bool TimerMainPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
UNUSED(event);\r
- std::string viewId = view.GetViewId();\r
- if (viewId == SETTING_TIMER) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnClick viewId == SETTING_TIMER");\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_SETTING_PAGE);\r
- } else if (viewId == "1"|| viewId == "3" || viewId == "15" || viewId == "30") {\r
- int num = std::stoi(viewId);\r
+ if (strcmp(view.GetViewId(), SET_TIME_BUTTON) == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(TIMER_PAGES::TIMER_SETTING_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if ((strcmp(view.GetViewId(), ONE_MINUTE) == 0) ||\r
+ (strcmp(view.GetViewId(), THREE_MINUTE) == 0) ||\r
+ (strcmp(view.GetViewId(), FIFTEEN_MINUTE) == 0) ||\r
+ (strcmp(view.GetViewId(), THIRTY_MINUTE) == 0)) {\r
+ int num = std::stoi(std::string(view.GetViewId()));\r
struct timeval start_time;\r
gettimeofday(&start_time, nullptr);\r
- uint32_t s_time = start_time.tv_sec * MAX_SCR_DIS + start_time.tv_usec / MAX_SCR_DIS; // 转换成ms\r
+ uint64_t s_time =\r
+ (uint64_t)start_time.tv_sec * MS_ONE_SECONDS + start_time.tv_usec / MS_ONE_SECONDS; // 转换成ms\r
TimerModel::GetInstance().SetStartTime(s_time);\r
- TimerModel::GetInstance().SetSaveTime(true, 0);\r
- TimerModel::GetInstance().SetDurationTime(num * MIN);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+ TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+ TimerModel::GetInstance().SetTotalTime(num * MIN);\r
+ countDownFragment_->RefreshFragment();\r
+ countDownFragment_->GetFragmentView()->SetVisible(true);\r
}\r
return true;\r
}\r
\r
-bool TimerMainPage::OnDrag(UIView& view, const DragEvent& event)\r
+bool TimerMainPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
UNUSED(view);\r
- if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
- (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
}\r
return true;\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: TimerModel\r
* Create: 2025-06-09\r
*/\r
\r
-#include "timers/TimerModel.h"\r
-#include "main/HealthModel.h"\r
-#include "uiservice/ui_service.h"\r
#include "wearable_log.h"\r
+#include "timers/TimerModel.h"\r
\r
namespace OHOS {\r
-static int g_motionTimes{0};\r
-static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
-TimerModel::TimerModel()\r
-{\r
-}\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
+TimerModel::TimerModel() {}\r
\r
-TimerModel::~TimerModel()\r
-{\r
-}\r
+TimerModel::~TimerModel() {}\r
\r
TimerModel &TimerModel::GetInstance()\r
{\r
return instance;\r
}\r
\r
-uint32_t TimerModel::GetSaveTime()\r
+uint64_t TimerModel::GetEclipseTime()\r
{\r
- return save_time;\r
+ return eclipseTime_;\r
}\r
\r
-void TimerModel::SetSaveTime(bool falg, uint32_t value)\r
+void TimerModel::SetEclipseTime(bool flag, uint64_t value)\r
{\r
- if (falg) {\r
- save_time = 0;\r
+ if (flag) {\r
+ eclipseTime_ = 0;\r
} else {\r
- save_time += value;\r
+ eclipseTime_ += value;\r
}\r
}\r
\r
-void TimerModel::SetDurationTime(uint32_t time)\r
+void TimerModel::SetTotalTime(uint64_t time)\r
{\r
- durationTime = time;\r
+ totalTime_ = time;\r
}\r
\r
-uint32_t TimerModel::GetDurationTime()\r
+uint64_t TimerModel::GetTotalTime()\r
{\r
- return durationTime;\r
+ return totalTime_;\r
}\r
\r
/* 定时器回调函数 */\r
void TimerTimerCallback(void *data)\r
{\r
(void)data;\r
- uint32_t dura_time = TimerModel::GetInstance().GetDurationTime();\r
- uint32_t start_time = TimerModel::GetInstance().GetStartTime();\r
- uint32_t save_time = TimerModel::GetInstance().GetSaveTime();\r
+ uint64_t total_time = TimerModel::GetInstance().GetTotalTime();\r
+ uint64_t start_time = TimerModel::GetInstance().GetStartTime();\r
+ uint64_t eclipse_time = TimerModel::GetInstance().GetEclipseTime();\r
struct timeval current_time;\r
gettimeofday(¤t_time, nullptr);\r
- uint32_t remTime = dura_time * 1000 - (current_time.tv_usec - start_time) - save_time;\r
- if (remTime == 0) {\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "TimerTimerCallback: end :%d", time);\r
+ uint64_t curr_time_ms = (uint64_t)current_time.tv_sec * MS_ONE_SECONDS + current_time.tv_usec / MS_ONE_SECONDS;\r
+ int64_t remTime = (uint64_t)total_time * MS_ONE_SECONDS - (curr_time_ms - start_time) - eclipse_time;\r
+ if (remTime <= 0) {\r
TimerModel::GetInstance().SetExistTimer(false);\r
TimerModel::GetInstance().DisableTimer();\r
}\r
/* 开启定时器 */\r
void TimerModel::InitTimer()\r
{\r
- if (g_startCounting != nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer g_startCounting != nullptr!!");\r
+ if (startCounting_ != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer startCounting_ != nullptr!!");\r
return;\r
}\r
uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
- g_startCounting = new GraphicTimer(tick, TimerTimerCallback, nullptr, true);\r
- if (g_startCounting == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer new GraphicTimer failed!!");\r
+ startCounting_ = new GraphicTimer(tick, TimerTimerCallback, nullptr, true);\r
+ if (startCounting_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer new GraphicTimer failed!!");\r
return;\r
}\r
- bool retTimer = g_startCounting->Start();\r
+ bool retTimer = startCounting_->Start();\r
if (!retTimer) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer Start failed!!");\r
- if (g_startCounting != nullptr) {\r
- delete g_startCounting;\r
- g_startCounting = nullptr;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer Start failed!!");\r
+ if (startCounting_ != nullptr) {\r
+ delete startCounting_;\r
+ startCounting_ = nullptr;\r
}\r
return;\r
}\r
/* 关闭定时器 */\r
void TimerModel::DisableTimer()\r
{\r
- if (g_startCounting != nullptr) {\r
- delete g_startCounting;\r
- g_startCounting = nullptr;\r
- g_motionTimes = 0;\r
+ if (startCounting_ != nullptr) {\r
+ startCounting_->Stop();\r
+ delete startCounting_;\r
+ startCounting_ = nullptr;\r
}\r
}\r
}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: TimerPresenter\r
* Create: 2025-06-09\r
*/\r
\r
+#include "ohos_timer.h"\r
+#include "NativeRegisterManager.h"\r
#include "timers/TimerView.h"\r
#include "timers/TimerModel.h"\r
#include "timers/TimerPresenter.h"\r
-#include "NativeRegisterManager.h"\r
-#include "ohos_timer.h"\r
\r
namespace OHOS {\r
- REGIST_MENU(VIEW_TIMER, TimerView, TimerPresenter, TIMER_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG, "计时器");\r
+REGIST_MENU(VIEW_TIMER, TimerView, TimerPresenter, TIMER_ICON, TIMER_ICON, "计时器");\r
}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: TimerSettingPage\r
* Create: 2025-06-09\r
*/\r
\r
#include <unistd.h>\r
#include <string>\r
-#include "timers/TimerSettingPage.h"\r
-#include "timers/TimerPresenter.h"\r
#include "components/ui_arc_label.h"\r
#include "wearable_log.h"\r
-#include "timers/TimerView.h"\r
#include "SlicePageFactory.h"\r
#include "common/image_cache_manager.h"\r
+#include "timers/TimerView.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "timers/TimerSettingPage.h"\r
\r
namespace OHOS {\r
static constexpr uint8_t BACKGROUND_FONT = 40;\r
static constexpr uint8_t HIGHTLIGHT_FONT = 50;\r
-static constexpr uint8_t TIMERPICKER_MAX = 3;\r
static constexpr uint16_t PADDING = 3;\r
static constexpr uint16_t BORDER_RADIUS = 5;\r
static constexpr uint16_t TEXT_FONT = 24;\r
static constexpr uint16_t SETTING_START_POSITION_Y = 347;\r
static constexpr uint16_t SETTING_START_SIZE_WIDTH = 232;\r
static constexpr uint16_t SETTING_START_SIZE_HEIGHT = 76;\r
-static constexpr uint16_t SETTING_START_FONT = 40;\r
static constexpr uint16_t TIMERPICKER_POSX1 = 61;\r
static constexpr uint16_t TIMERPICKER_POSX2 = 183;\r
static constexpr uint16_t TIMERPICKER_POSX3 = 305;\r
static constexpr uint16_t TIMERPICKER_POSY = 119;\r
-static constexpr uint16_t SETTING_TIMERPICKER_SIZE_WIDTH = 88;\r
-static constexpr uint16_t SETTING_TIMERPICKER_SIZE_HEIGHT = 189;\r
+static constexpr uint16_t SETTING_TIMERPICKER_WIDTH = 88;\r
+static constexpr uint16_t SETTING_TIMERPICKER_HEIGHT = 189;\r
static constexpr uint16_t TIMERPICKER_RADIUS = 11;\r
static constexpr uint16_t SETTING_TIMERPICKER_ITEM_HEIGHT = 70;\r
static constexpr uint16_t SETTING_TIMERPICKER_HOUR = 24;\r
-static constexpr uint16_t SETTING_TIMERPICKER_HOURS = 23;\r
+static constexpr uint16_t SETTING_TIMERPICKER_HOUR_END = 23;\r
static constexpr uint16_t SETTING_TIMERPICKER_MIN = 60;\r
-static constexpr uint16_t SETTING_TIMERPICKER_MINS = 59;\r
-static constexpr uint16_t SETTING_PICKERGROUP_POSX = 70;\r
-static constexpr uint16_t SETTING_PICKERGROUP_POSY = 132;\r
-static constexpr uint16_t SETTING_PICKERGROUP_SIZE_WIDTH = 80;\r
-static constexpr uint16_t SETTING_PICKERGROUP_SIZE_HEIGHT = 208;\r
+static constexpr uint16_t SETTING_TIMERPICKER_MIN_END = 59;\r
static constexpr uint16_t HOUR_TIME = 3600;\r
static constexpr uint16_t MIN_TIME = 60;\r
static constexpr uint16_t POX1_MIN = 86;\r
-static constexpr uint16_t POX1_MAX = 174;\r
static constexpr uint16_t POX2_MIN = 206;\r
-static constexpr uint16_t POX2_MAX = 294;\r
static constexpr uint16_t POX3_MIN = 332;\r
-static constexpr uint16_t POX3_MAX = 420;\r
-static constexpr uint16_t POY_MIN = 119;\r
-static constexpr uint16_t POY_MAX = 308;\r
-static constexpr uint16_t SLEEP = 500;\r
-static constexpr uint16_t SUM_2 = 2;\r
+static constexpr uint16_t INDEX_2 = 2;\r
+static constexpr char *START_TIMING_BUTTON = "startCountDownButton";\r
+static constexpr char *HOUR_PICKER = "hourPicker";\r
+static constexpr char *MIN_PICKER = "minPicker";\r
+static constexpr char *SEC_PICKER = "secPicker";\r
+// 时间选择器分钟与秒钟列\r
+static const char *g_uiPickerMinAndSecData[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10",\r
+ "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",\r
+ "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",\r
+ "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",\r
+ "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",\r
+ "51", "52", "53", "54", "55", "56", "57", "58", "59", "00"};\r
+\r
+// 时间选择器小时列\r
+static const char *g_uiPickerHourData[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12",\r
+ "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "00"};\r
\r
REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_SETTING_PAGE, TimerSettingPage, false);\r
\r
-TimerSettingPage::~TimerSettingPage()\r
+TimerSettingPage::TimerSettingPage()\r
{\r
- bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
- if (ret == false) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadTimerImage fail");\r
- }\r
-\r
- if (group != nullptr) {\r
- group->RemoveAll();\r
- delete group;\r
- group = nullptr;\r
- }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::TimerSettingPage");\r
+}\r
\r
- if (title != nullptr) {\r
- delete title;\r
- title = nullptr;\r
+TimerSettingPage::~TimerSettingPage()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
}\r
\r
- if (back != nullptr) {\r
- delete back;\r
- back = nullptr;\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
}\r
\r
- for (int i = 0; i < TIMERPICKER_MAX; i++) {\r
- if (timerPicker[i] != nullptr) {\r
- delete timerPicker[i];\r
- timerPicker[i] = nullptr;\r
+ for (int i = 0; i < PICKER_COUNT; i++) {\r
+ if (timerPicker_[i] != nullptr) {\r
+ delete timerPicker_[i];\r
+ timerPicker_[i] = nullptr;\r
}\r
}\r
\r
- if (start != nullptr) {\r
- delete start;\r
- start = nullptr;\r
+ if (startImg_ != nullptr) {\r
+ delete startImg_;\r
+ startImg_ = nullptr;\r
}\r
\r
- if (timerLabel != nullptr) {\r
- delete timerLabel;\r
- timerLabel = nullptr;\r
+ if (labelUnit_ != nullptr) {\r
+ delete labelUnit_;\r
+ labelUnit_ = nullptr;\r
}\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::~TimerSettingPage");\r
}\r
\r
void TimerSettingPage::OnStart(void *data)\r
{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnStart() Start");\r
- bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
- if (ret == false) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage fail");\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelTitle_ fail");\r
return;\r
}\r
- image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
- IMAGE_CONVERTER_TOOL_TIMER_BEGIN_GRAY, TIMER_IMAGE);\r
- if (image1 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage image1 fail");\r
- return;\r
+ labelTitle_->SetPosition(SETTING_TITLE_POSITION_X, SETTING_TITLE_POSITION_Y);\r
+ labelTitle_->Resize(SETTING_TITLE_SIZE_WIDTH, SETTING_TITLE_SIZE_HEIGHT);\r
+ labelTitle_->SetText("设置时间");\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, SETTING_TITLE_TEXT_SIZE);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelTitle_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ if (group_ == nullptr) {\r
}\r
- image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
- IMAGE_CONVERTER_TOOL_TIMER_BEGIN_ORANGE, TIMER_IMAGE);\r
- if (image2 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage image2 fail");\r
+ group_ = new UIScrollView();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group_ fail");\r
return;\r
}\r
- // 标题\r
- if (title == nullptr) {\r
- title = new UILabel();\r
- }\r
- title->SetPosition(SETTING_TITLE_POSITION_X, SETTING_TITLE_POSITION_Y);\r
- title->Resize(SETTING_TITLE_SIZE_WIDTH, SETTING_TITLE_SIZE_HEIGHT);\r
- title->SetText("设置时间");\r
- title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_TITLE_TEXT_SIZE);\r
- title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- title->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- title->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
-\r
- if (group == nullptr) {\r
- group = new UIScrollView();\r
- }\r
- group->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
- group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- group->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
- group->SetThrowDrag(true);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ group_->SetThrowDrag(true);\r
CreateLabel();\r
CreateStartButton();\r
CreatePicker();\r
- group->Add(title);\r
- group->SetOnDragListener(this);\r
- AddViewToPageContainer(group);\r
+ group_->Add(labelTitle_);\r
+ group_->SetOnDragListener(this);\r
+ AddViewToPageContainer(group_);\r
}\r
\r
void TimerSettingPage::CreateLabel(void)\r
{\r
- // Add Label to App\r
- if (timerLabel == nullptr) {\r
- timerLabel = new UILabel();\r
+ // 用来显示picker的类型单位:小时、分、秒 同一时间只显示一个picker的类型单位\r
+ labelUnit_ = new UILabel();\r
+ if (labelUnit_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new labelUnit_ fail");\r
+ return;\r
}\r
- timerLabel->SetPosition(SETTING_TIMERLABEL_POSITION_X,\r
- SETTING_TIMERLABEL_POSITION_Y); // widget's left position and top position\r
- timerLabel->Resize(SETTING_TIMERLABEL_SIZE_WIDTH,\r
- SETTING_TIMERLABEL_SIZE_HEIGHT); // widget's width and height\r
- timerLabel->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFFFBF00);\r
- timerLabel->SetStyle(STYLE_BACKGROUND_OPA, 0xef);\r
- timerLabel->SetStyle(STYLE_BORDER_RADIUS, BORDER_RADIUS);\r
- timerLabel->SetStyle(STYLE_PADDING_TOP, PADDING);\r
- timerLabel->SetStyle(STYLE_PADDING_BOTTOM, PADDING);\r
- timerLabel->SetStyle(STYLE_TEXT_FONT, TEXT_FONT);\r
-\r
- // Set additional property\r
- timerLabel->SetText("小时");\r
- timerLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
- timerLabel->SetTextColor(Color::GetColorFromRGBA(0x00, 0x00, 0x00, 0xff));\r
- timerLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- timerLabel->SetDirect(TEXT_DIRECT_MIXED);\r
- timerLabel->SetRollSpeed(0);\r
- timerLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_TIMERLABEL_FONT);\r
- timerLabel->SetVisible(false);\r
- // Add to rootView\r
- group->Add(timerLabel);\r
+ labelUnit_->SetPosition(SETTING_TIMERLABEL_POSITION_X, SETTING_TIMERLABEL_POSITION_Y);\r
+ labelUnit_->Resize(SETTING_TIMERLABEL_SIZE_WIDTH, SETTING_TIMERLABEL_SIZE_HEIGHT);\r
+ labelUnit_->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFFFBF00);\r
+ labelUnit_->SetStyle(STYLE_BACKGROUND_OPA, 0xef);\r
+ labelUnit_->SetStyle(STYLE_BORDER_RADIUS, BORDER_RADIUS);\r
+ labelUnit_->SetStyle(STYLE_PADDING_TOP, PADDING);\r
+ labelUnit_->SetStyle(STYLE_PADDING_BOTTOM, PADDING);\r
+ labelUnit_->SetStyle(STYLE_TEXT_FONT, TEXT_FONT);\r
+ labelUnit_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ labelUnit_->SetTextColor(Color::GetColorFromRGBA(0x00, 0x00, 0x00, 0xff));\r
+ labelUnit_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelUnit_->SetDirect(TEXT_DIRECT_MIXED);\r
+ labelUnit_->SetRollSpeed(0);\r
+ labelUnit_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_TIMERLABEL_FONT);\r
+ labelUnit_->SetVisible(false);\r
+ group_->Add(labelUnit_);\r
}\r
\r
void TimerSettingPage::CreateStartButton(void)\r
{\r
// 开始按钮\r
- if (start == nullptr) {\r
- start = new UIImageView();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage:: new start UIImageView");\r
+ startImg_ = new UIImageView();\r
+ if (startImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new startImg_ fail");\r
+ return;\r
}\r
- start->SetPosition(SETTING_START_POSITION_X, SETTING_START_POSITION_Y);\r
- start->Resize(SETTING_START_SIZE_WIDTH, SETTING_START_SIZE_HEIGHT);\r
- start->SetViewId(START_TIMING);\r
- start->SetTouchable(false);\r
- start->SetOnClickListener(this);\r
- start->SetSrc(image1);\r
- group->Add(start);\r
+ startImg_->SetPosition(SETTING_START_POSITION_X, SETTING_START_POSITION_Y);\r
+ startImg_->Resize(SETTING_START_SIZE_WIDTH, SETTING_START_SIZE_HEIGHT);\r
+ startImg_->SetViewId(START_TIMING_BUTTON);\r
+ startImg_->SetTouchable(false);\r
+ startImg_->SetOnClickListener(this);\r
+ LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_GRAY);\r
+ group_->Add(startImg_);\r
}\r
\r
-// 时间选择器分钟与秒钟列\r
-const char *uiPickerData[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10",\r
- "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",\r
- "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",\r
- "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",\r
- "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",\r
- "51", "52", "53", "54", "55", "56", "57", "58", "59", "00"};\r
-\r
-// 时间选择器小时列\r
-const char *uiPicker5Data[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",\r
- "15", "16", "17", "18", "19", "20", "21", "22", "23", "00"};\r
-\r
void TimerSettingPage::CreatePicker()\r
{\r
- // Add Picker to App\r
- int posX[TIMERPICKER_MAX] = {TIMERPICKER_POSX1, TIMERPICKER_POSX2, TIMERPICKER_POSX3};\r
+ int posX[PICKER_COUNT] = {TIMERPICKER_POSX1, TIMERPICKER_POSX2, TIMERPICKER_POSX3};\r
int posY = TIMERPICKER_POSY;\r
- for (int i = 0; i < TIMERPICKER_MAX; i++) {\r
- if (timerPicker[i] == nullptr) {\r
- timerPicker[i] = new UIPicker();\r
+ for (int i = 0; i < PICKER_COUNT; i++) {\r
+ timerPicker_[i] = new UIPicker();\r
+ if (timerPicker_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new timerPicker_[%d] fail", i);\r
+ return;\r
}\r
- timerPicker[i]->SetPosition(posX[i], posY); // widget's left position and top position\r
- timerPicker[i]->Resize(SETTING_TIMERPICKER_SIZE_WIDTH, SETTING_TIMERPICKER_SIZE_HEIGHT);\r
- timerPicker[i]->SetViewId("hourPicker"); // Set style\r
- timerPicker[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- timerPicker[i]->SetStyle(STYLE_BORDER_WIDTH, TIMERPICKER_MAX);\r
- timerPicker[i]->SetStyle(STYLE_BORDER_RADIUS, TIMERPICKER_RADIUS);\r
- timerPicker[i]->SetStyle(STYLE_BORDER_COLOR, 0xffb9b9b9);\r
- timerPicker[i]->SetItemHeight(SETTING_TIMERPICKER_ITEM_HEIGHT);\r
- timerPicker[i]->SetLoopState(true);\r
- timerPicker[i]->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
- timerPicker[i]->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
- timerPicker[i]->SetTextColor(Color::GetColorFromRGBA(0x64, 0x69, 0x6e, 0xff),\r
- Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
+ timerPicker_[i]->SetPosition(posX[i], posY);\r
+ timerPicker_[i]->Resize(SETTING_TIMERPICKER_WIDTH, SETTING_TIMERPICKER_HEIGHT);\r
+ timerPicker_[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ timerPicker_[i]->SetStyle(STYLE_BORDER_WIDTH, PADDING);\r
+ timerPicker_[i]->SetStyle(STYLE_BORDER_RADIUS, TIMERPICKER_RADIUS);\r
+ timerPicker_[i]->SetStyle(STYLE_BORDER_COLOR, 0xffb9b9b9);\r
+ timerPicker_[i]->SetItemHeight(SETTING_TIMERPICKER_ITEM_HEIGHT);\r
+ timerPicker_[i]->SetLoopState(true);\r
+ timerPicker_[i]->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+ timerPicker_[i]->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+ timerPicker_[i]->SetTextColor(Color::GetColorFromRGBA(0x64, 0x69, 0x6e, 0xff),\r
+ Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
if (i == 0) {\r
- timerPicker[i]->SetValues(uiPicker5Data, SETTING_TIMERPICKER_HOUR);\r
- timerPicker[i]->SetSelected(SETTING_TIMERPICKER_HOURS);\r
+ timerPicker_[i]->SetValues(g_uiPickerHourData, SETTING_TIMERPICKER_HOUR);\r
+ timerPicker_[i]->SetSelected(SETTING_TIMERPICKER_HOUR_END);\r
} else {\r
- timerPicker[i]->SetValues(uiPickerData, SETTING_TIMERPICKER_MIN);\r
- timerPicker[i]->SetSelected(SETTING_TIMERPICKER_MINS);\r
+ timerPicker_[i]->SetValues(g_uiPickerMinAndSecData, SETTING_TIMERPICKER_MIN);\r
+ timerPicker_[i]->SetSelected(SETTING_TIMERPICKER_MIN_END);\r
}\r
- timerPicker[i]->SetOnClickListener(this);\r
- timerPicker[i]->SetDraggable(true);\r
- timerPicker[i]->SetOnDragListener(this);\r
- timerPicker[i]->RegisterSelectedListener(this);\r
- group->Add(timerPicker[i]);\r
+ timerPicker_[i]->SetOnClickListener(this);\r
+ timerPicker_[i]->SetDraggable(true);\r
+ timerPicker_[i]->SetOnDragListener(this);\r
+ timerPicker_[i]->RegisterSelectedListener(this);\r
+ group_->Add(timerPicker_[i]);\r
}\r
\r
- timerPicker[0]->SetViewId("hourPicker"); // Set style\r
- timerPicker[1]->SetViewId("minPicker"); // Set style\r
- timerPicker[SUM_2]->SetViewId("secPicker"); // Set style\r
+ timerPicker_[0]->SetViewId(HOUR_PICKER);\r
+ timerPicker_[1]->SetViewId(MIN_PICKER);\r
+ timerPicker_[INDEX_2]->SetViewId(SEC_PICKER);\r
}\r
\r
bool TimerSettingPage::OnClick(UIView &view, const ClickEvent &event)\r
{\r
UNUSED(event);\r
- std::string viewId = view.GetViewId();\r
- if (viewId == START_TIMING) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnClick viewId == START_TIMING");\r
- TimerModel::GetInstance().SetSaveTime(true, 0);\r
- uint8_t hour = std::stoi(uiPicker5Data[timerPicker[0]->GetSelected()]);\r
- uint8_t minute = std::stoi(uiPickerData[timerPicker[1]->GetSelected()]);\r
- uint8_t second = std::stoi(uiPickerData[timerPicker[SUM_2]->GetSelected()]);\r
- uint32_t durationTime = (hour * HOUR_TIME) + (minute * MIN_TIME) + (second);\r
- TimerModel::GetInstance().SetDurationTime(durationTime);\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+ if (strcmp(view.GetViewId(), START_TIMING_BUTTON) == 0) {\r
+ TimerModel::GetInstance().SetEclipseTime(true, 0);\r
+ uint8_t hour = std::stoi(g_uiPickerHourData[timerPicker_[0]->GetSelected()]);\r
+ uint8_t minute = std::stoi(g_uiPickerMinAndSecData[timerPicker_[1]->GetSelected()]);\r
+ uint8_t second = std::stoi(g_uiPickerMinAndSecData[timerPicker_[INDEX_2]->GetSelected()]);\r
+ uint64_t totalTime = (hour * HOUR_TIME) + (minute * MIN_TIME) + (second);\r
+ TimerModel::GetInstance().SetTotalTime(totalTime);\r
+ TimerModel::GetInstance().SetIsShowFragment(true);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(TIMER_PAGES::TIMER_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- timerLabel->Invalidate();\r
+ labelUnit_->Invalidate();\r
return true;\r
}\r
\r
bool TimerSettingPage::OnDrag(UIView &view, const DragEvent &event)\r
{\r
- if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
- (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnDrag SwitchSlice(TIMER_MAIN_PAGE)");\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(TIMER_PAGES::TIMER_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- if (view.GetViewId() == "hourPicker") {\r
- timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
- timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[0]->Invalidate();\r
- timerPicker[1]->Invalidate();\r
- timerPicker[SUM_2]->Invalidate();\r
- timerLabel->SetVisible(true);\r
- timerLabel->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
- timerLabel->SetText("小时");\r
- timerLabel->Invalidate();\r
- } else if (view.GetViewId() == "minPicker") {\r
- timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
- timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[0]->Invalidate();\r
- timerPicker[1]->Invalidate();\r
- timerPicker[SUM_2]->Invalidate();\r
- timerLabel->SetVisible(true);\r
- timerLabel->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
- timerLabel->SetText("分钟");\r
- timerLabel->Invalidate();\r
- } else if (view.GetViewId() == "secPicker") {\r
- timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
- timerPicker[0]->Invalidate();\r
- timerPicker[1]->Invalidate();\r
- timerPicker[SUM_2]->Invalidate();\r
- timerLabel->SetVisible(true);\r
- timerLabel->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
- timerLabel->SetText("秒");\r
- timerLabel->Invalidate();\r
+ if (strcmp(view.GetViewId(), HOUR_PICKER) == 0) {\r
+ timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[0]->Invalidate();\r
+ timerPicker_[1]->Invalidate();\r
+ timerPicker_[INDEX_2]->Invalidate();\r
+ labelUnit_->SetVisible(true);\r
+ labelUnit_->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ labelUnit_->SetText("小时");\r
+ labelUnit_->Invalidate();\r
+ } else if (strcmp(view.GetViewId(), MIN_PICKER) == 0) {\r
+ timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[0]->Invalidate();\r
+ timerPicker_[1]->Invalidate();\r
+ timerPicker_[INDEX_2]->Invalidate();\r
+ labelUnit_->SetVisible(true);\r
+ labelUnit_->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ labelUnit_->SetText("分钟");\r
+ labelUnit_->Invalidate();\r
+ } else if (strcmp(view.GetViewId(), SEC_PICKER) == 0) {\r
+ timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker_[0]->Invalidate();\r
+ timerPicker_[1]->Invalidate();\r
+ timerPicker_[INDEX_2]->Invalidate();\r
+ labelUnit_->SetVisible(true);\r
+ labelUnit_->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ labelUnit_->SetText("秒");\r
+ labelUnit_->Invalidate();\r
}\r
return true;\r
}\r
\r
-void TimerSettingPage::OnPickerStoped(UIPicker& picker)\r
+void TimerSettingPage::OnPickerStoped(UIPicker &picker)\r
{\r
- if (picker.GetViewId() == "hourPicker") {\r
+ if (strcmp(picker.GetViewId(), HOUR_PICKER) == 0) {\r
uint16_t hour = picker.GetSelected();\r
- timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
- timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[0]->Invalidate();\r
- timerPicker[1]->Invalidate();\r
- timerPicker[SUM_2]->Invalidate();\r
- if ((hour == SETTING_TIMERPICKER_HOURS) && (timerPicker[1]->GetSelected() == SETTING_TIMERPICKER_MINS) &&\r
- (timerPicker[SUM_2]->GetSelected() == SETTING_TIMERPICKER_MINS)) {\r
- start->SetTouchable(false);\r
- start->SetSrc(image1);\r
+ timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[0]->Invalidate();\r
+ timerPicker_[1]->Invalidate();\r
+ timerPicker_[INDEX_2]->Invalidate();\r
+ if ((hour == SETTING_TIMERPICKER_HOUR_END) && (timerPicker_[1]->GetSelected() == SETTING_TIMERPICKER_MIN_END) &&\r
+ (timerPicker_[INDEX_2]->GetSelected() == SETTING_TIMERPICKER_MIN_END)) {\r
+ startImg_->SetTouchable(false);\r
+ LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_GRAY);\r
} else {\r
- start->SetTouchable(true);\r
- start->SetSrc(image2);\r
+ startImg_->SetTouchable(true);\r
+ LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_ORANGE);\r
}\r
- timerLabel->SetVisible(true);\r
- timerLabel->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
- timerLabel->SetText("小时");\r
- timerLabel->Invalidate();\r
- } else if (picker.GetViewId() == "minPicker") {\r
+ labelUnit_->SetVisible(true);\r
+ labelUnit_->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ labelUnit_->SetText("小时");\r
+ labelUnit_->Invalidate();\r
+ } else if (strcmp(picker.GetViewId(), MIN_PICKER) == 0) {\r
uint16_t minute = picker.GetSelected();\r
- timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
- timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[0]->Invalidate();\r
- timerPicker[1]->Invalidate();\r
- timerPicker[SUM_2]->Invalidate();\r
- if ((timerPicker[0]->GetSelected() == SETTING_TIMERPICKER_HOURS) && (minute == SETTING_TIMERPICKER_MINS) &&\r
- (timerPicker[SUM_2]->GetSelected() == SETTING_TIMERPICKER_MINS)) {\r
- start->SetTouchable(false);\r
- start->SetSrc(image1);\r
+ timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[0]->Invalidate();\r
+ timerPicker_[1]->Invalidate();\r
+ timerPicker_[INDEX_2]->Invalidate();\r
+ if ((timerPicker_[0]->GetSelected() == SETTING_TIMERPICKER_HOUR_END) && (minute == SETTING_TIMERPICKER_MIN_END) &&\r
+ (timerPicker_[INDEX_2]->GetSelected() == SETTING_TIMERPICKER_MIN_END)) {\r
+ startImg_->SetTouchable(false);\r
+ LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_GRAY);\r
} else {\r
- start->SetTouchable(true);\r
- start->SetSrc(image2);\r
+ startImg_->SetTouchable(true);\r
+ LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_ORANGE);\r
}\r
- timerLabel->SetVisible(true);\r
- timerLabel->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
- timerLabel->SetText("分钟");\r
- timerLabel->Invalidate();\r
- } else {\r
+ labelUnit_->SetVisible(true);\r
+ labelUnit_->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ labelUnit_->SetText("分钟");\r
+ labelUnit_->Invalidate();\r
+ } else if (strcmp(picker.GetViewId(), SEC_PICKER) == 0) {\r
uint16_t sec = picker.GetSelected();\r
- timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
- timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
- timerPicker[0]->Invalidate();\r
- timerPicker[1]->Invalidate();\r
- timerPicker[SUM_2]->Invalidate();\r
- if ((timerPicker[0]->GetSelected() == SETTING_TIMERPICKER_HOURS) &&\r
- (timerPicker[1]->GetSelected() == SETTING_TIMERPICKER_MINS) && (sec == SETTING_TIMERPICKER_MINS)) {\r
- start->SetTouchable(false);\r
- start->SetSrc(image1);\r
+ timerPicker_[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker_[INDEX_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker_[0]->Invalidate();\r
+ timerPicker_[1]->Invalidate();\r
+ timerPicker_[INDEX_2]->Invalidate();\r
+ if ((timerPicker_[0]->GetSelected() == SETTING_TIMERPICKER_HOUR_END) &&\r
+ (timerPicker_[1]->GetSelected() == SETTING_TIMERPICKER_MIN_END) && (sec == SETTING_TIMERPICKER_MIN_END)) {\r
+ startImg_->SetTouchable(false);\r
+ LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_GRAY);\r
} else {\r
- start->SetTouchable(true);\r
- start->SetSrc(image2);\r
+ startImg_->SetTouchable(true);\r
+ LOADIMG::LoadImageViewImg(startImg_, TIMER_IMAGE, IMAGE_TIMER_BEGIN_ORANGE);\r
}\r
- timerLabel->SetVisible(true);\r
- timerLabel->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
- timerLabel->SetText("秒");\r
- timerLabel->Invalidate();\r
+ labelUnit_->SetVisible(true);\r
+ labelUnit_->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ labelUnit_->SetText("秒");\r
+ labelUnit_->Invalidate();\r
}\r
}\r
}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#include "uisample/UISampleMainPage.h"\r
+#include "uisample/UISampleModel.h"\r
+#include "uisample/UISampleView.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "main/LoadImg.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_test.h"\r
+\r
+namespace OHOS {\r
+namespace {\r
+const uint16_t TESTCASE_BUTTON_HEIGHT = 100;\r
+const uint16_t STYLE_BORDER_WIDTH_VALUE = 4;\r
+static int16_t SAMPLE_TITLE_TEXT_SIZE = 38;\r
+} // namespace\r
+REGIST_SLICE_PAGE(VIEW_UISAMPLE, SAMPLE_PAGES::SAMPLE_MAIN_PAGE, UISampleMainPage, true);\r
+static UISampleMainPage* g_instance = nullptr;\r
+\r
+UISampleMainPage::UISampleMainPage()\r
+{\r
+ g_instance = this;\r
+}\r
+\r
+UISampleMainPage* UISampleMainPage::GetInstance()\r
+{\r
+ return g_instance;\r
+}\r
+\r
+UISampleMainPage::~UISampleMainPage()\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+\r
+ if (mainList_ != nullptr) {\r
+ delete mainList_;\r
+ mainList_ = nullptr;\r
+ }\r
+ g_instance = nullptr;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ UILabelButton* item = dynamic_cast<UILabelButton*>(view);\r
+ if (item != nullptr) {\r
+ TestCaseInfo* info = static_cast<TestCaseInfo *>(data);\r
+ if (info != nullptr) {\r
+ item->SetText(info->sliceId);\r
+ item->SetViewId(info->sliceId);\r
+ }\r
+ }\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+ UILabelButton* item = new UILabelButton();\r
+ if (item == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Create item faild!");\r
+ return nullptr;\r
+ }\r
+\r
+ item->SetPosition(0, 0);\r
+ item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::RELEASED);\r
+ item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::PRESSED);\r
+ item->SetStyleForState(STYLE_BORDER_WIDTH, STYLE_BORDER_WIDTH_VALUE, UIButton::INACTIVE);\r
+ item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::RELEASED);\r
+ item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::PRESSED);\r
+ item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::INACTIVE);\r
+ item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::RELEASED);\r
+ item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::PRESSED);\r
+ item->SetStyleForState(STYLE_BORDER_RADIUS, 0, UIButton::INACTIVE);\r
+ item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ item->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ item->Resize(HORIZONTAL_RESOLUTION - TEXT_DISTANCE_TO_LEFT_SIDE, TESTCASE_BUTTON_HEIGHT);\r
+ item->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); // 40: means font size\r
+ item->SetAlign(TEXT_ALIGNMENT_LEFT);\r
+ item->SetLabelPosition(150, 0); // 150: label x-coordinate\r
+ item->SetOnClickListener(UISampleMainPage::GetInstance());\r
+ return item;\r
+}\r
+\r
+void UISampleMainPage::OnStart(void *data)\r
+{\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollViewNested();\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleMainPage::OnStart::container_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+ container_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ container_->SetVisible(true);\r
+\r
+ CreateTitle();\r
+ CreateMainList();\r
+ AddViewToPageContainer(container_);\r
+ container_->Invalidate();\r
+}\r
+\r
+void UISampleMainPage::CreateTitle()\r
+{\r
+ if (title_ == nullptr) {\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleMainPage::OnStart::title_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+\r
+ title_->SetPosition(130, 0, 185, 80); // tile position x:130 size w: 185 h: 80\r
+ title_->SetText("用例");\r
+ title_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SAMPLE_TITLE_TEXT_SIZE);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ title_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ container_->Add(title_);\r
+}\r
+\r
+void UISampleMainPage::CreateMainList()\r
+{\r
+ if (mainList_ == nullptr) {\r
+ mainList_ = new UISimpleList();\r
+ if (mainList_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleMainPage::OnStart::mainList_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+ mainList_->SetPosition(0, 100, 600, 600); // position: y: 100 w: 600 h:600\r
+ mainList_->SetThrowDrag(true);\r
+ mainList_->SetReboundSize(100); // 100: reboind size\r
+ mainList_->SetElastic(true);\r
+ container_->Add(mainList_);\r
+\r
+ if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) {\r
+ mainList_->SetOnDragListener(this);\r
+ }\r
+ UITestGroup::GetInstance()->SetUpTestCase();\r
+ List<TestCaseInfo>* testCaseList = UITestGroup::GetInstance()->GetTestCase();\r
+ Contents content = {};\r
+ for (auto node = testCaseList->Begin(); node != testCaseList->End(); node = node->next_) {\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 1;\r
+ content.data = reinterpret_cast<void *>(&(node->data_));\r
+ mainList_->AddContent(content);\r
+ }\r
+ mainList_->RefreshList();\r
+}\r
+\r
+bool UISampleMainPage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ if (strcmp(view.GetViewId(), "自研用例") == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SAMPLE_PAGES::SAMPLE_PROPRIETARY_TESTCASE_PAGE);\r
+ } else if (strcmp(view.GetViewId(), "开源用例") == 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SAMPLE_PAGES::SAMPLE_NATIVE_TESTCASE_PAGE);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool UISampleMainPage::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ }\r
+ return true;\r
+}\r
+}\r
+\r
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingModel.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include "uisample/UISampleModel.h"
-
-namespace OHOS {
- UISampleModel::UISampleModel() {}
-
- UISampleModel::~UISampleModel() {}
-
- UISampleModel &UISampleModel::GetInstance()
- {
- static UISampleModel instance;
- return instance;
- }
-
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#include "uisample/UISampleModel.h"\r
+\r
+namespace OHOS {\r
+ UISampleModel::UISampleModel() {}\r
+\r
+ UISampleModel::~UISampleModel() {}\r
+\r
+ UISampleModel &UISampleModel::GetInstance()\r
+ {\r
+ static UISampleModel instance;\r
+ return instance;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+#include "uisample/UISampleNativeTestCasePage.h"\r
+#include "uisample/UISampleModel.h"\r
+#include "uisample/UISampleView.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "main/LoadImg.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+\r
+namespace OHOS {\r
+namespace {\r
+const uint16_t TESTCASE_BUTTON_HEIGHT = 100;\r
+static int16_t SAMPLE_TITLE_TEXT_SIZE = 38;\r
+} // namespace\r
+\r
+REGIST_SLICE_PAGE(VIEW_UISAMPLE, SAMPLE_PAGES::SAMPLE_NATIVE_TESTCASE_PAGE, UISampleNativeTestCasePage, false);\r
+static UISampleNativeTestCasePage* g_instance = nullptr;\r
+static RootView::OnKeyActListener *g_keyListener = nullptr;\r
+\r
+UISampleNativeTestCasePage::UISampleNativeTestCasePage()\r
+{\r
+ g_instance = this;\r
+}\r
+\r
+UISampleNativeTestCasePage* UISampleNativeTestCasePage::GetInstance()\r
+{\r
+ return g_instance;\r
+}\r
+\r
+UISampleNativeTestCasePage::~UISampleNativeTestCasePage()\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+\r
+ if (mainList_ != nullptr) {\r
+ delete mainList_;\r
+ mainList_ = nullptr;\r
+ }\r
+\r
+ if (backBtn_ != nullptr) {\r
+ delete backBtn_;\r
+ backBtn_ = nullptr;\r
+ }\r
+ g_instance = nullptr;\r
+ isInTestCase_ = false;\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+ UILabel* item = new UILabel();\r
+ if (item == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Create item faild!");\r
+ return nullptr;\r
+ }\r
+\r
+ item->SetPosition(0, 0, Screen::GetInstance().GetWidth(), TESTCASE_BUTTON_HEIGHT);\r
+ item->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ item->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); // 40: means font size\r
+ item->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(UISampleNativeTestCasePage::GetInstance());\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ UILabel* item = dynamic_cast<UILabel*>(view);\r
+ if (item != nullptr) {\r
+ TestCaseInfo* info = static_cast<TestCaseInfo *>(data);\r
+ if (info != nullptr) {\r
+ item->SetText(info->sliceId);\r
+ item->SetViewId(info->sliceId);\r
+ }\r
+ }\r
+}\r
+\r
+bool UISampleNativeTestCasePage::BackMenuPage(UIView& view)\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+\r
+ UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());\r
+ if (uiTest != nullptr) {\r
+ uiTest->TearDown();\r
+ }\r
+\r
+ RootView::GetInstance()->SetOnKeyActListener(g_keyListener);\r
+ g_keyListener = nullptr;\r
+ isInTestCase_ = false;\r
+\r
+ container_->Add(title_);\r
+ container_->Add(mainList_);\r
+ container_->Invalidate();\r
+ }\r
+ return true;\r
+}\r
+\r
+void UISampleNativeTestCasePage::OnStart(void *data)\r
+{\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollViewNested();\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleNativeTestCasePage::OnStart::container_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+ container_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ container_->SetVisible(true);\r
+\r
+ CreateTitle();\r
+ CreateMainList();\r
+ CreateBackButton();\r
+ AddViewToPageContainer(container_);\r
+ container_->Invalidate();\r
+}\r
+\r
+void UISampleNativeTestCasePage::CreateTitle()\r
+{\r
+ if (title_ == nullptr) {\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleNativeTestCasePage::OnStart::title_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+ title_->SetPosition(130, 0, 185, 80); // tile position x:130 size w: 185 h: 80\r
+ title_->SetText("开源用例");\r
+ title_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SAMPLE_TITLE_TEXT_SIZE);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ title_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ container_->Add(title_);\r
+}\r
+\r
+void UISampleNativeTestCasePage::CreateMainList()\r
+{\r
+ if (mainList_ == nullptr) {\r
+ mainList_ = new UISimpleList();\r
+ }\r
+ if (mainList_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleNativeTestCasePage::OnStart::mainList_ is nullptr");\r
+ return;\r
+ }\r
+ mainList_->SetPosition(0, 100, Screen::GetInstance().GetWidth(), 366); // position: y: 100 w: 600 h:600\r
+ mainList_->SetViewId("sample");\r
+ mainList_->SetThrowDrag(true);\r
+ mainList_->SetReboundSize(100); // 100: reboind size\r
+ mainList_->SetElastic(true);\r
+ container_->Add(mainList_);\r
+ mainList_->SetOnDragListener(this);\r
+\r
+ UITestGroup::GetInstance()->SetUpOHTestCase();\r
+ mainList_->ClearAll();\r
+ List<TestCaseInfo>* testCaseList = UITestGroup::GetInstance()->GetTestCase();\r
+ Contents content = {};\r
+ for (auto node = testCaseList->Begin(); node != testCaseList->End(); node = node->next_) {\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 1;\r
+ content.data = reinterpret_cast<void *>(&(node->data_));\r
+ mainList_->AddContent(content);\r
+ }\r
+ mainList_->RefreshList();\r
+}\r
+\r
+void UISampleNativeTestCasePage::CreateBackButton()\r
+{\r
+ if (backBtn_ == nullptr) {\r
+ backBtn_ = new UIButton();\r
+ }\r
+ if (backBtn_ != nullptr) {\r
+ backBtn_->SetPosition(0, 202, 50, 50); // 0: x position, 202: y position, 50: width and height\r
+ backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ backBtn_->SetOnClickListener(this);\r
+ }\r
+}\r
+\r
+bool UISampleNativeTestCasePage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ if (isInTestCase_) {\r
+ return BackMenuPage(view);\r
+ }\r
+\r
+ if (container_ == nullptr) {\r
+ return false;\r
+ }\r
+\r
+ UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());\r
+ if (uiTest == nullptr) {\r
+ return false;\r
+ }\r
+ uiTest->SetUp();\r
+ container_->RemoveAll();\r
+\r
+ UIView* tempView = const_cast<UIView*>(uiTest->GetTestView());\r
+ if (tempView != nullptr) {\r
+ tempView->SetTouchable(true);\r
+ tempView->SetViewId(view.GetViewId());\r
+ tempView->SetPosition(tempView->GetX(), tempView->GetY());\r
+ container_->Add(tempView);\r
+\r
+ g_keyListener = RootView::GetInstance()->GetOnKeyActListener();\r
+ RootView::GetInstance()->SetOnKeyActListener(nullptr);\r
+ }\r
+\r
+ if (backBtn_ != nullptr) {\r
+ backBtn_->SetViewId(view.GetViewId());\r
+ container_->Add(backBtn_);\r
+ }\r
+\r
+ isInTestCase_ = true;\r
+ container_->Invalidate();\r
+ return true;\r
+}\r
+\r
+bool UISampleNativeTestCasePage::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SAMPLE_MAIN_PAGE);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include "uisample/UISampleView.h"
-#include "uisample/UISampleModel.h"
-#include "uisample/UISamplePresenter.h"
-#include "uiservice/ui_service.h"
-#include "NativeRegisterManager.h"
-
-namespace OHOS {
-
-REGIST_MENU(VIEW_UISAMPLE, UISampleView, UISamplePresenter, PNG_APPLIST_UI_SAMPLE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "示例");
-
- UISamplePresenter::UISamplePresenter()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISamplePresenter::UISamplePresenter");
- uisampleModel = &UISampleModel::GetInstance();
- }
-
- UISamplePresenter::~UISamplePresenter() {}
-
- void UISamplePresenter::OnResume(void)
- {
- SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);
- }
-
- void UISamplePresenter::OnPause(void)
- {
- SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);
- return;
- }
-}
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#include "uisample/UISamplePresenter.h"\r
+#include "uisample/UISampleView.h"\r
+#include "uisample/UISampleModel.h"\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_MENU(VIEW_UISAMPLE, UISampleView, UISamplePresenter, PNG_APPLIST_UI_SAMPLE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "示例");\r
+\r
+ UISamplePresenter::UISamplePresenter()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UISamplePresenter::UISamplePresenter");\r
+ uisampleModel_ = &UISampleModel::GetInstance();\r
+ }\r
+\r
+ UISamplePresenter::~UISamplePresenter() {}\r
+\r
+ void UISamplePresenter::OnResume(void)\r
+ {\r
+ SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);\r
+ }\r
+\r
+ void UISamplePresenter::OnPause(void)\r
+ {\r
+ SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);\r
+ return;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: TestCase\r
+ * Author: Hisi Graphic Team\r
+ * Created: 2025-7\r
+ */\r
+\r
+#include "uisample/UISampleModel.h"\r
+#include "uisample/UISampleProprietaryTestCasePage.h"\r
+#include "uisample/UISampleView.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "main/LoadImg.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "View.h"\r
+#include "ui_test.h"\r
+\r
+namespace OHOS {\r
+namespace {\r
+const uint16_t TESTCASE_BUTTON_HEIGHT = 100;\r
+static int16_t SAMPLE_TITLE_TEXT_SIZE = 38;\r
+} // namespace\r
+\r
+REGIST_SLICE_PAGE(VIEW_UISAMPLE, SAMPLE_PAGES::SAMPLE_PROPRIETARY_TESTCASE_PAGE,\r
+ UISampleProprietaryTestCasePage, false);\r
+static UISampleProprietaryTestCasePage* g_instance = nullptr;\r
+static RootView::OnKeyActListener *g_keyListener = nullptr;\r
+\r
+UISampleProprietaryTestCasePage::UISampleProprietaryTestCasePage()\r
+{\r
+ g_instance = this;\r
+}\r
+\r
+UISampleProprietaryTestCasePage* UISampleProprietaryTestCasePage::GetInstance()\r
+{\r
+ return g_instance;\r
+}\r
+\r
+UISampleProprietaryTestCasePage::~UISampleProprietaryTestCasePage()\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+\r
+ if (mainList_ != nullptr) {\r
+ delete mainList_;\r
+ mainList_ = nullptr;\r
+ }\r
+\r
+ if (backBtn_ != nullptr) {\r
+ delete backBtn_;\r
+ backBtn_ = nullptr;\r
+ }\r
+ g_instance = nullptr;\r
+ isInTestCase_ = false;\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+ UILabel* item = new UILabel();\r
+ if (item == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Create item faild!");\r
+ return nullptr;\r
+ }\r
+\r
+ item->SetPosition(0, 0, Screen::GetInstance().GetWidth(), TESTCASE_BUTTON_HEIGHT);\r
+ item->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ item->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); // 40: means font size\r
+ item->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);\r
+ item->SetTouchable(true);\r
+ item->SetOnClickListener(UISampleProprietaryTestCasePage::GetInstance());\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ UNUSED(type);\r
+ UILabel* item = dynamic_cast<UILabel*>(view);\r
+ if (item != nullptr) {\r
+ TestCaseInfo* info = static_cast<TestCaseInfo *>(data);\r
+ if (info != nullptr) {\r
+ item->SetText(info->sliceId);\r
+ item->SetViewId(info->sliceId);\r
+ }\r
+ }\r
+}\r
+\r
+bool UISampleProprietaryTestCasePage::BackMenuPage(UIView& view)\r
+{\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());\r
+ if (uiTest != nullptr) {\r
+ uiTest->TearDown();\r
+ }\r
+ RootView::GetInstance()->SetOnKeyActListener(g_keyListener);\r
+ g_keyListener = nullptr;\r
+ isInTestCase_ = false;\r
+\r
+ container_->Add(title_);\r
+ container_->Add(mainList_);\r
+ container_->Invalidate();\r
+ }\r
+ return true;\r
+}\r
+\r
+void UISampleProprietaryTestCasePage::OnStart(void *data)\r
+{\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollViewNested();\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleProprietaryTestCasePage::OnStart::container_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+ container_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ container_->SetVisible(true);\r
+\r
+ CreateTitle();\r
+ CreateMainList();\r
+ CreateBackButton();\r
+ AddViewToPageContainer(container_);\r
+ container_->Invalidate();\r
+}\r
+\r
+void UISampleProprietaryTestCasePage::CreateTitle()\r
+{\r
+ if (title_ == nullptr) {\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleProprietaryTestCasePage::OnStart::title_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+\r
+ title_->SetPosition(130, 0, 185, 80); // tile position x:130 size w: 185 h: 80\r
+ title_->SetText("自研用例");\r
+ title_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SAMPLE_TITLE_TEXT_SIZE);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ title_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ container_->Add(title_);\r
+}\r
+\r
+void UISampleProprietaryTestCasePage::CreateMainList()\r
+{\r
+ if (mainList_ == nullptr) {\r
+ mainList_ = new UISimpleList();\r
+ if (mainList_ == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " UISampleProprietaryTestCasePage::OnStart::mainList_ is nullptr");\r
+ return;\r
+ }\r
+ }\r
+ mainList_->SetPosition(0, 100, Screen::GetInstance().GetWidth(), 366); // position: y: 100 w: 600 h:600\r
+ mainList_->SetViewId("sample");\r
+ mainList_->SetThrowDrag(true);\r
+ mainList_->SetReboundSize(100); // 100: reboind size\r
+ mainList_->SetElastic(true);\r
+ mainList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ container_->Add(mainList_);\r
+ mainList_->SetOnDragListener(this);\r
+\r
+ UITestGroup::GetInstance()->SetUpHSTestCase();\r
+ mainList_->ClearAll();\r
+ List<TestCaseInfo>* testCaseList = UITestGroup::GetInstance()->GetTestCase();\r
+ Contents content = {};\r
+ for (auto node = testCaseList->Begin(); node != testCaseList->End(); node = node->next_) {\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.type = 1;\r
+ content.data = reinterpret_cast<void *>(&(node->data_));\r
+ mainList_->AddContent(content);\r
+ }\r
+ mainList_->RefreshList();\r
+}\r
+\r
+void UISampleProprietaryTestCasePage::CreateBackButton()\r
+{\r
+ if (backBtn_ == nullptr) {\r
+ backBtn_ = new UIButton();\r
+ }\r
+ if (backBtn_ != nullptr) {\r
+ backBtn_->SetPosition(0, 202, 50, 50); // 0: x position, 202: y position, 50: width and height\r
+ backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ backBtn_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ backBtn_->SetOnClickListener(this);\r
+ }\r
+}\r
+\r
+bool UISampleProprietaryTestCasePage::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ if (isInTestCase_) {\r
+ return BackMenuPage(view);\r
+ }\r
+\r
+ if (container_ == nullptr) {\r
+ return false;\r
+ }\r
+\r
+ UITest* uiTest = UITestGroup::GetInstance()->GetTestCase(view.GetViewId());\r
+ if (uiTest == nullptr) {\r
+ return false;\r
+ }\r
+ uiTest->SetUp();\r
+ container_->RemoveAll();\r
+\r
+ UIView* tempView = const_cast<UIView*>(uiTest->GetTestView());\r
+ if (tempView != nullptr) {\r
+ tempView->SetTouchable(true);\r
+ tempView->SetViewId(view.GetViewId());\r
+ tempView->SetPosition(tempView->GetX(), tempView->GetY());\r
+ container_->Add(tempView);\r
+\r
+ g_keyListener = RootView::GetInstance()->GetOnKeyActListener();\r
+ RootView::GetInstance()->SetOnKeyActListener(nullptr);\r
+ }\r
+\r
+ if (backBtn_ != nullptr) {\r
+ backBtn_->SetViewId(view.GetViewId());\r
+ container_->Add(backBtn_);\r
+ }\r
+\r
+ isInTestCase_ =true;\r
+ container_->Invalidate();\r
+ return true;\r
+}\r
+\r
+bool UISampleProprietaryTestCasePage::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(SAMPLE_MAIN_PAGE);\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
#ifndef TEST_CASE_LIST_ADAPTER_H
#define TEST_CASE_LIST_ADAPTER_H
-#include "components/abstract_adapter.h"
-#include "components/root_view.h"
-#include "components/ui_label.h"
#include "components/ui_label_button.h"
-namespace OHOS {
-class TestCaseListAdapter : public AbstractAdapter {
-public:
- TestCaseListAdapter() {}
- ~TestCaseListAdapter()
- {
- if (listener_ != nullptr) {
- delete listener_;
- listener_ = nullptr;
- }
- }
- UIView* GetView(UIView* inView, int16_t index) override;
- int16_t GetItemWidthWithMargin(int16_t index) override;
- int16_t GetItemHeightWithMargin(int16_t index) override;
- uint16_t GetCount() override;
-private:
- UIView::OnClickListener* listener_{nullptr};
-};
-} // namespace OHOS
#endif // TEST_CASE_LIST_ADAPTER_H
\ No newline at end of file
UITest* testObj;
};
-class UITestGroup {
+class UITestGroup : public HeapBase {
public:
static UITestGroup* GetInstance()
{
static UITestGroup instance;
return &instance;
}
+
void SetUpTestCase();
- List<TestCaseInfo>& GetTestCase();
- UITest* GetTestCase(const char* id);
- void TearDownTestCase();
- void AddTestCase(TestCaseInfo testCaseInfo);
+ void SetUpHSTestCase();
+ void SetUpOHTestCase();
+ List<TestCaseInfo>*& GetTestCase();
+ UITest* GetTestCase(const char* id);
private:
+ UITestGroup() {}
+ ~UITestGroup();
+ void UpdataContents();
+ void TearDownTestCase();
List<TestCaseInfo> *testCaseList_ = nullptr;
};
} // namespace OHOS
#include "ui_test_group.h"
#include "graphic_config.h"
+#include "ui_test_analog_clock/ui_test_analog_clock.h"
+#include "ui_test_animator/ui_test_animator.h"
#include "ui_test_breath/ui_test_breath.h"
+#include "ui_test_border_margin_padding/ui_test_border_margin_padding.h"
+#include "ui_test_button/ui_test_button.h"
+#include "ui_test_capture/ui_test_capture.h"
+#include "ui_test_canvas/ui_test_canvas.h"
#include "ui_test_card_switch/ui_test_card_switch.h"
+#include "ui_test_clock_dial/ui_test_clock_dial.h"
+#include "ui_test_chart/ui_test_chart_polyline.h"
+#include "ui_test_chart/ui_test_chart_pillar.h"
+#include "ui_test_countdown/ui_test_countdown.h"
+#include "ui_test_coverflow/ui_test_coverflow.h"
+#include "ui_test_coverflow/ui_test_coverflow2.h"
+#include "ui_test_cross/ui_test_cross.h"
#include "ui_test_cube_rotate/ui_test_cube_rotate.h"
+#include "ui_test_digital_clock/ui_test_digital_clock.h"
+#include "ui_test_draw/ui_test_canvas_ext.h"
+#include "ui_test_draw/ui_test_draw.h"
+#include "ui_test_draw_rect/ui_test_draw_rect.h"
+#include "ui_test_draw_line/ui_test_draw_line.h"
+#include "ui_test_emoji/ui_test_emoji.h"
+#include "ui_test_event_injector/ui_test_event_injector.h"
+#include "ui_test_focus_manager/ui_test_focus_manager.h"
+#if ENABLE_VECTOR_FONT
+#include "ui_test_font/ui_test_font.h"
+#endif
+#if (ENABLE_FONT_VECTOR_GLOBAL && ENABLE_FONT_GLOBAL_TEST)
+#include "ui_test_font/ui_test_font_global.h"
+#endif
+#if ENABLE_ICU && ENABLE_MULTI_FONT && ENABLE_SHAPING
+#include "ui_test_font/ui_test_multi_font.h"
+#endif
+#include "ui_test_hexagons_list/ui_test_hexagons_list.h"
+#include "ui_test_icosahedron/ui_test_icosahedron.h"
+#include "ui_test_image/ui_test_image.h"
+#if CAPABILITY_HW_JPEG_DECODE
+#include "ui_test_image/ui_test_jpeg.h"
+#endif
+#if ENABLE_JPEG_AND_PNG
+#include "ui_test_image/ui_test_png.h"
+#endif
+#if (ENABLE_IMAGE_PACKER && ENABLE_IMAGE_PACKER_TEST)
+#include "ui_test_image/ui_test_image_packer.h"
+#endif
+#include "ui_test_image_animator/ui_test_image_animator.h"
+#include "ui_test_image_fps/ui_test_image_fps.h"
+#include "ui_test_input_event/ui_test_input_event.h"
+#include "ui_test_kaleidoscope/ui_test_kaleidoscope.h"
+#include "ui_test_key/ui_test_key.h"
+#if ENABLE_SOFT_KEYBOARD
+#include "ui_test_keyboard/ui_test_keyboard.h"
+#endif
+#include "ui_test_label/ui_test_arc_label.h"
+#include "ui_test_list_fps/ui_test_list_fps.h"
#include "ui_test_list_fps/ui_test_list_fps.h"
+#include "ui_test_list/ui_test_list.h"
+#include "ui_test_list_ext/ui_test_list_ext.h"
+#include "ui_test_lottie/ui_test_lottie.h"
+#include "ui_test_lottie/ui_test_trim_path.h"
+#include "ui_test_map/ui_test_map.h"
+#include "ui_test_message/ui_test_message.h"
#include "ui_test_message/ui_test_message.h"
+#include "ui_test_nested/ui_test_nested.h"
+#include "ui_test_opacity/ui_test_opacity.h"
+#include "ui_test_particle/ui_test_particle.h"
+#include "ui_test_particle/ui_test_particle.h"
+#include "ui_test_picker/ui_test_ui_picker.h"
+#include "ui_test_progress_bar/ui_test_box_progress.h"
+#include "ui_test_progress_bar/ui_test_circle_progress.h"
+#include "ui_test_qrcode/ui_test_qrcode.h"
#if ENABLE_VGU_ENGINE && CAPABILITY_HWDRAW_PATH
-#include "ui_test_countdown/ui_test_countdown.h"
#include "ui_test_running_ball/ui_test_running_ball.h"
#endif
-#if ENABLE_SOFT_KEYBOARD
-#include "ui_test_keyboard/ui_test_keyboard.h"
+#include "ui_test_roller_view/ui_test_roller_view.h"
+#if ENABLE_DEBUG && ENABLE_ROTATE_INPUT
+#include "ui_test_rotate_injector/ui_test_rotate_injector.h"
#endif
-#include "ui_test_icosahedron/ui_test_icosahedron.h"
-#include "ui_test_tiger/ui_test_tiger.h"
-#include "ui_test_hexagons_list/ui_test_hexagons_list.h"
-#include "ui_test_waterfall_list/ui_test_waterfall_list.h"
-#include "ui_test_video_play/ui_test_video_play.h"
-#include "ui_test_coverflow/ui_test_coverflow.h"
+#include "ui_test_render/ui_test_render.h"
+#include "ui_test_rotate_input/ui_test_rotate_input.h"
#include "ui_test_slipflow/ui_test_slipflow.h"
-#include "ui_test_kaleidoscope/ui_test_kaleidoscope.h"
-#include "ui_test_roller_view/ui_test_roller_view.h"
-#include "ui_test_emoji/ui_test_emoji.h"
+#include "ui_test_foldable/ui_test_foldable.h"
#include "ui_test_sphere_view/ui_test_sphere_view.h"
-#include "ui_test_nested/ui_test_nested.h"
-#include "ui_test_particle/ui_test_particle.h"
-#include "ui_test_lottie/ui_test_lottie.h"
+#include "ui_test_scroll_bar/ui_test_scroll_bar.h"
+#include "ui_test_slider/ui_test_slider.h"
+#include "ui_test_simple_list/ui_test_simple_list.h"
+#include "ui_test_simple_list/ui_test_simple_transform_list.h"
+#include "ui_test_svg/ui_test_svg.h"
+#include "ui_test_text_fps/ui_test_text_fps.h"
+#include "ui_test_texture_mapper/ui_test_texture_mapper.h"
+#include "ui_test_tiger/ui_test_tiger.h"
+#include "ui_test_transition/ui_test_transition_view.h"
+#include "ui_test_ui_list/ui_test_ui_list.h"
+#include "ui_test_ui_list_view/ui_test_list_layout.h"
+#include "ui_test_ui_scroll_view/ui_test_ui_scroll_view.h"
+#include "ui_test_ui_swipe_view/ui_test_ui_swipe_view.h"
+#if ENABLE_VECTOR_FONT
+#include "ui_test_vector_font/ui_test_vector_font.h"
+#endif
+#include "ui_test_video_play/ui_test_video_play.h"
+#include "ui_test_view_group/ui_test_view_group.h"
+#include "ui_test_view_bounds/ui_test_view_bounds.h"
+#include "ui_test_view_percent/ui_test_view_percent.h"
+#include "ui_test_view_scale_rotate/ui_test_view_scale_rotate.h"
+#include "ui_test_view_bitmap/ui_test_view_bitmap.h"
+#include "ui_test_view_alignment/ui_test_alignment_external.h"
+#include "ui_test_view_alignment/ui_test_alignment_internal.h"
+#include "ui_test_view_alignment/ui_test_alignment_dynamic.h"
+#include "ui_test_waterfall_list/ui_test_waterfall_list.h"
+#include "ui_test_float_box/ui_test_float_box.h"
+#include "ui_test_chart/ui_test_scatter_plot.h"
+
namespace OHOS {
-void UITestGroup::AddTestCase(TestCaseInfo testCaseInfo)
+UITestGroup::~UITestGroup()
+{
+ TearDownTestCase();
+ if (testCaseList_ != nullptr) {
+ delete testCaseList_;
+ testCaseList_ = nullptr;
+ }
+}
+
+void UITestGroup::SetUpTestCase()
{
+ if (testCaseList_ == nullptr) {
+ testCaseList_ = new List<TestCaseInfo>();
+ }
if (testCaseList_ == nullptr) {
return;
}
- testCaseList_->PushBack(testCaseInfo);
+
+ TearDownTestCase();
+ testCaseList_->PushBack(TestCaseInfo{"自研用例", nullptr});
+ testCaseList_->PushBack(TestCaseInfo{"开源用例", nullptr});
}
-void UITestGroup::SetUpTestCase()
+void UITestGroup::SetUpHSTestCase()
{
- testCaseList_ = new List<TestCaseInfo>();
+ if (testCaseList_ == nullptr) {
+ testCaseList_ = new List<TestCaseInfo>();
+ }
+
if (testCaseList_ == nullptr) {
return;
}
- testCaseList_->Clear();
+ TearDownTestCase();
testCaseList_->PushBack(TestCaseInfo{"老虎头", new UITestTiger()});
testCaseList_->PushBack(TestCaseInfo{"蜂窝表盘", new UITestHexagonsList()});
+ testCaseList_->PushBack(TestCaseInfo{"无变换滑动列表", new UITestListFPS()});
+ testCaseList_->PushBack(TestCaseInfo{"带缩放滑动列表", new UITestListExt()});
+ testCaseList_->PushBack(TestCaseInfo{"简易列表", new UITestSimpleList()});
+ testCaseList_->PushBack(TestCaseInfo{"简易变换列表", new UITestSimpleTransformList()});
+ testCaseList_->PushBack(TestCaseInfo{"全屏文字", new UITestTextFPS()});
testCaseList_->PushBack(TestCaseInfo{"瀑布列表", new UITestWaterfallList()});
testCaseList_->PushBack(TestCaseInfo{"滑动列表", new UITestListFPS()});
testCaseList_->PushBack(TestCaseInfo{"卡片切换", new UITestCardSwitch()});
testCaseList_->PushBack(TestCaseInfo{"立方体旋转", new UITestCubeRotate()});
testCaseList_->PushBack(TestCaseInfo{"消息", new UITestMessage()});
testCaseList_->PushBack(TestCaseInfo{"呼吸效果", new UITestBreath()});
+ testCaseList_->PushBack(TestCaseInfo{"折叠控件", new UITestFoldable()});
testCaseList_->PushBack(TestCaseInfo{"覆盖流", new UITestCoverflow()});
testCaseList_->PushBack(TestCaseInfo{"滑动流", new UITestSlipflow()});
testCaseList_->PushBack(TestCaseInfo{"万花筒", new UITestKaleidoscope()});
testCaseList_->PushBack(TestCaseInfo{"滚筒", new UITestRollerView()});
-
+ testCaseList_->PushBack(TestCaseInfo{"地图", new UITestMap()});
#if ENABLE_VGU_ENGINE && CAPABILITY_HWDRAW_PATH
testCaseList_->PushBack(TestCaseInfo{"倒计时", new UITestCountdown()});
testCaseList_->PushBack(TestCaseInfo{"动画曲线", new UITestRunningBall()});
+ testCaseList_->PushBack(TestCaseInfo{"扩展画布", new UITestCanvasExt()});
#endif
#if ENABLE_SOFT_KEYBOARD
testCaseList_->PushBack(TestCaseInfo{"软键盘", new UITestKeyboard()});
#endif
+ testCaseList_->PushBack(TestCaseInfo{"绘制SVG", new UITestSVG()});
+ testCaseList_->PushBack(TestCaseInfo{"容器覆盖流", new UITestCoverflow2()});
+ testCaseList_->PushBack(TestCaseInfo{"覆盖流", new UITestCoverflow()});
testCaseList_->PushBack(TestCaseInfo{"视频播放", new UITestVideoPlay()});
testCaseList_->PushBack(TestCaseInfo{"球型菜单", new UITestSphereView()});
testCaseList_->PushBack(TestCaseInfo{"足球效果", new UITestIcosahedron()});
+#if CAPABILITY_HW_JPEG_DECODE
+ testCaseList_->PushBack(TestCaseInfo{"JPEG显示", new UITestJPEG()});
+#endif
+#if ENABLE_JPEG_AND_PNG
+ testCaseList_->PushBack(TestCaseInfo{"PNG显示", new UITestPNG()});
+#endif
+ testCaseList_->PushBack(TestCaseInfo{"图片旋转缩放动画", new UITestTextureMapper()});
+#if ENABLE_DEBUG && ENABLE_ROTATE_INPUT
+ testCaseList_->PushBack(TestCaseInfo{"模拟表冠", new UITestRotateInjector()});
+#endif
+ testCaseList_->PushBack(TestCaseInfo{"二维码", new UITestQrcode()});
+ testCaseList_->PushBack(TestCaseInfo{"折线图", new UITestChartPolyline()});
+ testCaseList_->PushBack(TestCaseInfo{"柱状图", new UITestChartPillar()});
+ testCaseList_->PushBack(TestCaseInfo{"弧形文字", new UITestArcLabel()});
+#if ENABLE_ICU && ENABLE_MULTI_FONT && ENABLE_SHAPING
+ testCaseList_->PushBack(TestCaseInfo{"多语言混排", new UITestMultiFont()});
+#endif
+#if ENABLE_VECTOR_FONT
+ testCaseList_->PushBack(TestCaseInfo{"矢量文字", new UITestFont()});
+#endif
+#if (ENABLE_FONT_VECTOR_GLOBAL && ENABLE_FONT_GLOBAL_TEST)
+ testCaseList_->PushBack(TestCaseInfo{"多语言切换", new UITestFontGlobal()});
+#endif
+ testCaseList_->PushBack(TestCaseInfo{"全屏高斯模糊", new UITestKey()});
+ testCaseList_->PushBack(TestCaseInfo{"截图", new UITestCapture()});
testCaseList_->PushBack(TestCaseInfo{"滑动冲突", new UITestNested()});
- testCaseList_->PushBack(TestCaseInfo{"粒子效果", new UITestParticle()});
+ testCaseList_->PushBack(TestCaseInfo{"悬浮框", new UITestFloatBox()});
+ testCaseList_->PushBack(TestCaseInfo{"散点图", new UITestScatterPlot()});
testCaseList_->PushBack(TestCaseInfo{"Lottie", new UITestLottie()});
+ testCaseList_->PushBack(TestCaseInfo{"路径裁剪", new UITestTrimPath()});
+ testCaseList_->PushBack(TestCaseInfo{"粒子效果", new UITestParticle()});
+ testCaseList_->PushBack(TestCaseInfo{"页面动效", new UITestTransitionView()});
+ testCaseList_->PushBack(TestCaseInfo{"画布", new UITestDraw()});
+ testCaseList_->PushBack(TestCaseInfo{"图片显示", new UITestImage()});
+ testCaseList_->PushBack(TestCaseInfo{"矩形绘制", new UITestDrawRect()});
+#if (ENABLE_IMAGE_PACKER && ENABLE_IMAGE_PACKER_TEST)
+ testCaseList_->PushBack(TestCaseInfo{"图片打包", new UITestImageBin()});
+#endif
+}
+
+void UITestGroup::SetUpOHTestCase()
+{
+ if (testCaseList_ == nullptr) {
+ testCaseList_ = new List<TestCaseInfo>();
+ }
+
+ if (testCaseList_ == nullptr) {
+ return;
+ }
+ TearDownTestCase();
+ testCaseList_->PushBack(TestCaseInfo{"滑动条", new UITestSlider()});
+ testCaseList_->PushBack(TestCaseInfo{"图片动画", new UITestImageFPS()});
+ testCaseList_->PushBack(TestCaseInfo{"透明度", new UITestOpacity()});
+ testCaseList_->PushBack(TestCaseInfo{"播放图片动画", new UITestImageAnimator()});
+ testCaseList_->PushBack(TestCaseInfo{"焦点管理", new UITestFocusManager()});
+ testCaseList_->PushBack(TestCaseInfo{"绘制线条", new UITestDrawLine()});
+ testCaseList_->PushBack(TestCaseInfo{"数字时钟", new UITestDigitalClock()});
+ testCaseList_->PushBack(TestCaseInfo{"边界间隔", new UITestBorderMarginPadding()});
+ testCaseList_->PushBack(TestCaseInfo{"动效", new UITestAnimator()});
+ testCaseList_->PushBack(TestCaseInfo{"视图组", new UITestViewGroup()});
+ testCaseList_->PushBack(TestCaseInfo{"事件测试", new UITestInputEvent()});
+ testCaseList_->PushBack(TestCaseInfo{"滚动条", new UITestScrollBar()});
+ testCaseList_->PushBack(TestCaseInfo{"画布", new UITestCanvas()});
+ testCaseList_->PushBack(TestCaseInfo{"Swipe视图", new UITestUISwipeView()});
+ testCaseList_->PushBack(TestCaseInfo{"滑动视图", new UITestUIScrollView()});
+ testCaseList_->PushBack(TestCaseInfo{"列表布局", new UITestListLayout()});
+ testCaseList_->PushBack(TestCaseInfo{"列表", new UITestUIList()});
+ testCaseList_->PushBack(TestCaseInfo{"按钮", new UITestButton()});
+ testCaseList_->PushBack(TestCaseInfo{"选择", new UITestUIPicker()});
+ testCaseList_->PushBack(TestCaseInfo{"圆形进度条", new UITestCircleProgress()});
+ testCaseList_->PushBack(TestCaseInfo{"盒状进度条", new UITestBoxProgress()});
+ testCaseList_->PushBack(TestCaseInfo{"事件模拟", new UITestEventInjector()});
+ testCaseList_->PushBack(TestCaseInfo{"位图", new UITestViewBitmap()});
+ testCaseList_->PushBack(TestCaseInfo{"旋转", new UITestViewScaleRotate()});
+ testCaseList_->PushBack(TestCaseInfo{"视图比例", new UITestViewPercent()});
+ testCaseList_->PushBack(TestCaseInfo{"视图边界", new UITestViewBounds()});
+#if ENABLE_VECTOR_FONT
+ testCaseList_->PushBack(TestCaseInfo{"矢量文字", new UITestVectorFont()});
+#endif
+ testCaseList_->PushBack(TestCaseInfo{"模拟时钟", new UITestAnalogClock()});
+ testCaseList_->PushBack(TestCaseInfo{"旋转输入", new UITestRotateInput()});
+ testCaseList_->PushBack(TestCaseInfo{"渲染", new UITestRender()});
}
-List<TestCaseInfo>& UITestGroup::GetTestCase()
+List<TestCaseInfo>*& UITestGroup::GetTestCase()
{
- return *testCaseList_;
+ return testCaseList_;
}
UITest* UITestGroup::GetTestCase(const char* id)
{
- if (id == nullptr) {
+ if (id == nullptr || testCaseList_ == nullptr) {
return nullptr;
}
+
ListNode<TestCaseInfo>* node = testCaseList_->Begin();
while (node != testCaseList_->End()) {
- if (!strcmp(id, node->data_.sliceId)) {
+ if (strcmp(id, node->data_.sliceId) == 0) {
return node->data_.testObj;
}
node = node->next_;
void UITestGroup::TearDownTestCase()
{
+ if (testCaseList_ == nullptr) {
+ return;
+ }
+
ListNode<TestCaseInfo>* node = testCaseList_->Begin();
while (node != testCaseList_->End()) {
- delete node->data_.testObj;
- node->data_.testObj = nullptr;
- node = node->next_;
+ if (node->data_.testObj != nullptr) {
+ delete node->data_.testObj;
+ node->data_.testObj = nullptr;
+ }
+ node = testCaseList_->Remove(node);
}
testCaseList_->Clear();
}
#include "uiservice/ui_service.h"
#include "wearable_log.h"
#include "samgr_lite.h"
-#include "settings/SettingModel.h"
+#include "settings/model/SettingBluetoothModel.h"
#include "main/UiServersMsg.h"
#include "ohos_init.h"
#include "memory_adapter.h"
#include "NativeAbility.h"
#include "TransitionType.h"
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+#include "lwip_driver_adapter.h"
+#endif
+
extern "C" errcode_t uapi_pm_add_sleep_veto(pm_id_t veto_id);
extern "C" errcode_t uapi_pm_remove_sleep_veto(pm_id_t veto_id);
void ConnectNewPhone(void)
{
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)
+ lwip_close_bt_pan();
+#endif
unsigned int connedDevicesNum = 0;
-
bool ret = gap_get_paired_devices_num(&connedDevicesNum);
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Setup GapGetPariedDevicesNum ret = %d, num = %d", ret, connedDevicesNum);
break;
case BT_CONNECTED_TO_UI:
GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), true));
+ std::bind(&OHOS::SettingBluetoothModel::UpdateAclConnectStatus,
+ OHOS::SettingBluetoothModel::GetInstance(), true));
break;
case BT_DISCONNECTED_TO_UI:
GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), false));
+ std::bind(&OHOS::SettingBluetoothModel::UpdateAclConnectStatus,
+ OHOS::SettingBluetoothModel::GetInstance(), false));
break;
case UI_ADD_SLEEP_VETO:
uapi_pm_add_sleep_veto(PM_ID_SCREEN);
break;
case UI_OTA_UPDATE:
power_display_svr_get_api()->turn_on_screen();
- OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_SET_OTA,
- OHOS::TransitionType::TRANSITION_INVALID, OHOS::gSliceDefaultPriority, true);
+ OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SETTING, OHOS::SettingPageId::SYSTEM_OTA_PAGE,
+ OHOS::TransitionType::TRANSITION_INVALID, true);
break;
}
}
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: WeatherItemView\r
* Create: 2025-03-23\r
*/\r
\r
#include "wearable_log.h"\r
-#include "weather/WeatherItemView.h"\r
#include "weather/WeatherModel.h"\r
+#include "weather/WeatherItemView.h"\r
\r
namespace OHOS {\r
static constexpr int16_t WEATHER_ICON_X = 155;\r
static constexpr int16_t WEATHER_CHARTLINE_Y = 78;\r
static constexpr int16_t WEATHER_CHARTLINE_WIDTH = 450;\r
static constexpr int16_t WEATHER_CHARTLINE_HEIGHT = 2;\r
-static constexpr int16_t WEATHER_ITEM_BUTTON_WIDTH = 390;\r
-static constexpr int16_t WEATHER_ITEM_BUTTON_HEIGHT = 83;\r
static constexpr int16_t WEATHER_ITEM_LABEL_WIDTH = 155;\r
static constexpr int16_t WEATHER_ITEM_LABEL_HEIGHT = 80;\r
static constexpr int16_t WEATHER_ITEM_FONT_SIZE = 35;\r
\r
WeatherItemView::WeatherItemView()\r
{\r
- SetPosition(0, 0, WEATHER_ITEM_BUTTON_WIDTH, WEATHER_ITEM_BUTTON_HEIGHT);\r
- SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- SetTouchable(true);\r
- SetUpChild();\r
+ bgImg_.SetPosition(0, 0);\r
+ bgImg_.Resize(WEATHER_IMAGE_SIZE, WEATHER_IMAGE_SIZE);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(&bgImg_, IMAGE_WEATHER_ITEM1, IMAGE_WEATHER_ITEM2);\r
+ labelDay_.SetPosition(WEATHER_LABEL_X, 0);\r
+ labelDay_.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
+ labelDay_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelDay_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelDay_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelDay_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelDay_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+ icon_.SetPosition(WEATHER_ICON_X, WEATHER_ICON_Y);\r
+ icon_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
\r
- Add(&sNextImage);\r
- Add(&sLabel_1);\r
- Add(&sIcon);\r
- Add(&sLabel_2);\r
- Add(&chartLine);\r
+ labelTmp_.SetPosition(WEATHER_LABEL2_X, 0);\r
+ labelTmp_.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
+ labelTmp_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelTmp_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTmp_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTmp_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelTmp_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ chartLine_.SetPosition(WEATHER_CHARTLINE_X, WEATHER_CHARTLINE_Y, WEATHER_CHARTLINE_WIDTH, WEATHER_CHARTLINE_HEIGHT);\r
+ chartLine_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ Add(&bgImg_);\r
+ Add(&labelDay_);\r
+ Add(&icon_);\r
+ Add(&labelTmp_);\r
+ Add(&chartLine_);\r
}\r
\r
WeatherItemView::~WeatherItemView()\r
{\r
- Remove(&sIcon);\r
- Remove(&sLabel_1);\r
- Remove(&sLabel_2);\r
- Remove(&chartLine);\r
+ Remove(&bgImg_);\r
+ Remove(&icon_);\r
+ Remove(&labelDay_);\r
+ Remove(&labelTmp_);\r
+ Remove(&chartLine_);\r
}\r
\r
void WeatherItemView::SetItemInfo(const WeatherItem itemInfo)\r
{\r
- sItemInfo = itemInfo;\r
- sLabel_1.SetText(itemInfo.label_1);\r
- sIcon.SetSrc(itemInfo.icon);\r
- sLabel_2.SetText(itemInfo.label_2);\r
- chartLine.SetVisible(itemInfo.hasSecondMenu);\r
+ labelDay_.SetText(itemInfo.weatherWeek);\r
+ LOADIMG::LoadImageViewImg(&icon_, WEATHER_IMAGE, itemInfo.image);\r
+ labelTmp_.SetText(itemInfo.weatherTemp);\r
+ chartLine_.SetVisible(itemInfo.hasSecondMenu);\r
}\r
-\r
-void WeatherItemView::SetUpChild()\r
-{\r
- sNextImage.SetPosition(0, 0);\r
- sNextImage.Resize(WEATHER_IMAGE_SIZE, WEATHER_IMAGE_SIZE);\r
- bool index = WeatherModel::GetInstance().GetDayStatus();\r
- ImageInfo *img = nullptr;\r
- if (index) {\r
- img = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER71, WEATHER_IMAGE);\r
- } else {\r
- img = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER72, WEATHER_IMAGE);\r
- }\r
- if (img == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
- }\r
- sNextImage.SetSrc(img);\r
-\r
- sLabel_1.SetPosition(WEATHER_LABEL_X, 0);\r
- sLabel_1.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
- sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
- sLabel_1.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- sLabel_1.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- sLabel_1.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
-\r
- sIcon.SetPosition(WEATHER_ICON_X, WEATHER_ICON_Y);\r
- sIcon.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-\r
- sLabel_2.SetPosition(WEATHER_LABEL2_X, 0);\r
- sLabel_2.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
- sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
- sLabel_2.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- sLabel_2.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
- sLabel_2.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
-\r
- chartLine.SetPosition(WEATHER_CHARTLINE_X, WEATHER_CHARTLINE_Y, WEATHER_CHARTLINE_WIDTH, WEATHER_CHARTLINE_HEIGHT);\r
- chartLine.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
}\r
-\r
-}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: WeatherMainPage\r
* Create: 2025-03-23\r
*/\r
\r
+#include <iomanip>\r
+#include <sstream>\r
#include <string>\r
-#include "weather/WeatherMainPage.h"\r
-#include "components/ui_list_nested.h"\r
-#include "components/ui_scroll_view_nested.h"\r
#include "NativeAbility.h"\r
#include "SlicePageFactory.h"\r
-#include "weather/WeatherPresenter.h"\r
-#include "weather/WeatherModel.h"\r
-#include "ui_resource_weather.h"\r
#include "common/image_cache_manager.h"\r
+#include "bts_br_gap.h"\r
+#include "bts_spp.h"\r
+#include "msg_center_device.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
#include "wearable_log.h"\r
-#include <sstream>\r
-#include <iomanip>\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherMainPage.h"\r
\r
static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_ONE = 250;\r
static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_ONE = 60;\r
static constexpr int16_t WEATHER_LABEL_FRONT_THREE = 36;\r
static constexpr int16_t WEATHER_LABEL_FRONT_FOUR = 120;\r
static constexpr int16_t WEATHER_LABEL_FRONT = 22;\r
-static constexpr int16_t WEATHER_AROUND_X = 74;\r
+static constexpr int16_t WEATHER_AROUND_X = 49;\r
static constexpr int16_t WEATHER_AROUND_Y = 323;\r
static constexpr int16_t WEATHER_AROUND_WIDTH = 198;\r
static constexpr int16_t WEATHER_AROUND_HEIGHT = 40;\r
static constexpr int16_t WEATHER_TEMP_HEIGHT = 120;\r
static constexpr int16_t WEATHER_IMAGE_WIDTH = 78;\r
static constexpr int16_t WEATHER_IMAGE_HEIGHT = 115;\r
-static constexpr int16_t WEATHER_IMAGEAIR_X = 78;\r
-static constexpr int16_t WEATHER_IMAGEAIR_Y = 327;\r
+static constexpr int16_t WEATHER_IMAGEAIR_X = 49;\r
+static constexpr int16_t WEATHER_IMAGEAIR_Y = 323;\r
static constexpr int16_t WEATHER_IMAGEAIR_DATA = 40;\r
-static constexpr int16_t WEATHER_IMAGEHUMIDITY_X = 336;\r
-static constexpr int16_t WEATHER_IMAGEHUMIDITY_Y = 327;\r
+static constexpr int16_t WEATHER_IMAGEHUMIDITY_X = 357;\r
+static constexpr int16_t WEATHER_IMAGEHUMIDITY_Y = 323;\r
static constexpr int16_t WEATHER_LABLEAIR_DATA = 79;\r
static constexpr int16_t WEATHER_LABLEAIR_HEIGHT = 30;\r
static constexpr int16_t WEATHER_IMAGEHUMIDITY_DATA = 120;\r
static constexpr int16_t WEATHER_LABELTITLE_WIDTH = 400;\r
static constexpr int16_t WEATHER_ADDRESS_X = 143;\r
static constexpr int16_t WEATHER_ADDRESS_Y = 49;\r
+static constexpr int16_t WEATHER_TYPE = 32;\r
+static constexpr int16_t BUFFER_SIZE = 6;\r
\r
-const char *weatherNames[] = {"晴", "多云", "阴", "阵雨", "雷阵雨", "雷阵雨伴有冰雹", "雨夹雪",\r
- "小雨", "中雨", "大雨", "暴雨", "大暴雨", "特大暴雨", "阵雪",\r
- "小雪", "中雪", "大雪", "暴雪", "雾", "冻雨", "沙尘暴",\r
- "小到中雨", "中到大雨", "大到暴雨", "小到中雪", "中到大雪", "大到暴雪", "浮尘",\r
- "扬沙", "强沙尘暴", "霾", "无天气数据"};\r
+const char *g_weatherNames[] = {"晴", "多云", "阴", "阵雨", "雷阵雨", "雷阵雨伴有冰雹", "雨夹雪",\r
+ "小雨", "中雨", "大雨", "暴雨", "大暴雨", "特大暴雨", "阵雪",\r
+ "小雪", "中雪", "大雪", "暴雪", "雾", "冻雨", "沙尘暴",\r
+ "小到中雨", "中到大雨", "大到暴雨", "小到中雪", "中到大雪",\r
+ "大到暴雪", "浮尘", "扬沙", "强沙尘暴", "霾", "无天气数据"};\r
\r
namespace OHOS {\r
REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_MAIN_PAGE, WeatherMainPage, true);\r
+static WeatherMainPage *g_pWeatherMainPage = nullptr;\r
\r
WeatherMainPage::WeatherMainPage()\r
{\r
- weatherModel = &WeatherModel::GetInstance();\r
+ g_pWeatherMainPage = this;\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::WeatherMainPage");\r
}\r
\r
WeatherMainPage::~WeatherMainPage()\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::~WeatherMainPage");\r
- if (group != nullptr) {\r
- group->RemoveAll();\r
- delete group;\r
- group = nullptr;\r
+ g_pWeatherMainPage = nullptr;\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ if (title_[i] != nullptr) {\r
+ delete title_[i];\r
+ title_[i] = nullptr;\r
+ }\r
}\r
\r
- if (weatherImg != nullptr) {\r
- delete weatherImg;\r
- weatherImg = nullptr;\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
}\r
\r
- if (mainImg != nullptr) {\r
- delete mainImg;\r
- mainImg = nullptr;\r
+ if (addressImg_ != nullptr) {\r
+ delete addressImg_;\r
+ addressImg_ = nullptr;\r
}\r
\r
- if (aroundImg != nullptr) {\r
- delete aroundImg;\r
- aroundImg = nullptr;\r
+ if (weatherImg_ != nullptr) {\r
+ delete weatherImg_;\r
+ weatherImg_ = nullptr;\r
}\r
\r
- if (ImageAir != nullptr) {\r
- delete ImageAir;\r
- ImageAir = nullptr;\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
}\r
\r
- if (ImageHumidity != nullptr) {\r
- delete ImageHumidity;\r
- ImageHumidity = nullptr;\r
+ if (airQualityAndHumidityBgImg_ != nullptr) {\r
+ delete airQualityAndHumidityBgImg_;\r
+ airQualityAndHumidityBgImg_ = nullptr;\r
}\r
\r
- if (ImagePageKey != nullptr) {\r
- delete ImagePageKey;\r
- ImagePageKey = nullptr;\r
+ if (airQulityImgIcon_ != nullptr) {\r
+ delete airQulityImgIcon_;\r
+ airQulityImgIcon_ = nullptr;\r
+ }\r
+\r
+ if (humidityImgIcon_ != nullptr) {\r
+ delete humidityImgIcon_;\r
+ humidityImgIcon_ = nullptr;\r
+ }\r
+\r
+ if (pageIdxImg_ != nullptr) {\r
+ delete pageIdxImg_;\r
+ pageIdxImg_ = nullptr;\r
}\r
ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
}\r
\r
+WeatherMainPage *WeatherMainPage::GetInstance()\r
+{\r
+ return g_pWeatherMainPage;\r
+}\r
+\r
void WeatherMainPage::OnStart(void *data)\r
{\r
- group = new UIViewGroup();\r
- if (group == nullptr) {\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::group_ fail");\r
return;\r
}\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitPageFirst successful");\r
- group->SetPosition(0, 0);\r
- group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
- group->SetOnDragListener(this);\r
- group->SetViewId("weather");\r
- group->SetDraggable(true);\r
- group->SetTouchable(true);\r
- flag = weatherModel->InitWeatherItem();\r
- cur = weatherModel->GetCurWeather();\r
- mainImg = new UIImageView();\r
- if (mainImg == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::mainImg new image fail");\r
+ group_->SetPosition(0, 0);\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetOnDragListener(this);\r
+ group_->SetViewId("weather");\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ flag_ = WeatherModel::GetInstance().InitWeatherItem();\r
+ cur_ = WeatherModel::GetInstance().GetCurWeather();\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::bgImg_ new image fail");\r
return;\r
}\r
- mainImg->SetPosition(0, 0);\r
- mainImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
- group->Add(mainImg);\r
- InitWeatherImage();\r
- InitImage();\r
- InitLabel();\r
- if (!flag) {\r
- labelTitle = new UILabel();\r
- if (labelTitle == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::labelTitle new label fail");\r
- return;\r
- }\r
- labelTitle->SetText("天气未更新,请连接手机更新数据");\r
- labelTitle->SetPosition(WEATHER_LABELTITLE_POSITION_X, WEATHER_LABELTITLE_POSITION_Y, WEATHER_LABELTITLE_WIDTH,\r
- WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
- labelTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT);\r
- group->Add(labelTitle);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitWeatherItem fail");\r
+ bgImg_->SetPosition(0, 0);\r
+ bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+\r
+ group_->Add(bgImg_);\r
+ InitWeatherImage1();\r
+ InitWeatherImage2();\r
+ InitWeatherLabel1();\r
+ InitWeatherLabel2();\r
+\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::labelTitle_ new label fail");\r
+ return;\r
+ }\r
+ if (!flag_) {\r
+ labelTitle_->SetPosition(WEATHER_LABELTITLE_POSITION_X, WEATHER_LABELTITLE_POSITION_Y, WEATHER_LABELTITLE_WIDTH,\r
+ WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
+ labelTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT);\r
+ labelTitle_->SetText("天气未更新,请连接手机更新数据");\r
+ labelTitle_->SetVisible(true);\r
+ group_->Add(labelTitle_);\r
+ }\r
+ AddViewToPageContainer(group_);\r
+ if (GetConnectStatus()) {\r
+ errcode_t result;\r
+ uint8_t value = 1; // 更新数据实际不需要使用value 手机侧不关心该字段\r
+#ifdef _WIN32\r
+ result = 0;\r
+#else\r
+ result = msg_center_send_data(MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SYNC_WEATHER_REQ, &value, sizeof(value));\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage msg_center_send_data result:%d ", result);\r
+#endif\r
}\r
- AddViewToPageContainer(group);\r
}\r
\r
-void WeatherMainPage::InitImage()\r
+void WeatherMainPage::ReloadPage()\r
{\r
- aroundImg = new UIImageView();\r
- if (aroundImg == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::aroundImage new image fail");\r
- return;\r
- }\r
- aroundImg->SetPosition(WEATHER_AROUND_X, WEATHER_AROUND_Y);\r
- if (weatherModel->GetDayStatus()) {\r
- LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER64);\r
- LOADIMG::LoadImageViewImg(aroundImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER75);\r
+ flag_ = WeatherModel::GetInstance().InitWeatherItem();\r
+ cur_ = WeatherModel::GetInstance().GetCurWeather();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::flag_:%d", flag_);\r
+ if (!flag_) {\r
+ labelTitle_->SetVisible(true);\r
} else {\r
- LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER65);\r
- LOADIMG::LoadImageViewImg(aroundImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER76);\r
+ labelTitle_->SetVisible(false);\r
}\r
- ImageAir = new UIImageView();\r
- if (ImageAir == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImageAir new image fail");\r
- return;\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(airQualityAndHumidityBgImg_,\r
+ IMAGE_WEATHER_ITEM5, IMAGE_WEATHER_ITEM6);\r
+\r
+ curWeatherCode_ = std::atoi(cur_.weather_code);\r
+ LOADIMG::LoadImageViewImg(weatherImg_, WEATHER_IMAGE, bigWeatherImage[curWeatherCode_]);\r
+\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ std::ostringstream oss;\r
+ if (i == LABEL_ADDRESS) {\r
+ title_[i]->SetText(cur_.address);\r
+ int controlOffset = 10;\r
+ int cut = 2;\r
+ int posX = (VERTICAL_RESOLUTION - addressImg_->GetWidth() -\r
+ title_[i]->GetTextWidth() - controlOffset) / cut;\r
+ addressImg_->SetX(posX);\r
+ posX = posX + addressImg_->GetWidth() + controlOffset;\r
+ title_[i]->SetX(posX);\r
+ } else if (i == LABEL_TEMP) {\r
+ oss << cur_.max_temp << "° / " << cur_.min_temp << "° " << g_weatherNames[curWeatherCode_];\r
+ std::string weatherTemp = oss.str();\r
+ title_[i]->SetText(weatherTemp.c_str());\r
+ } else if (i == LABEL_AIR) {\r
+ oss << "空气 --";\r
+ std::string weatherAir = oss.str();\r
+ title_[i]->SetText(weatherAir.c_str());\r
+ } else if (i == LABEL_HUMIDITY) {\r
+ oss << "湿度 " << cur_.humidity << "%";\r
+ std::string weatherHumidity = oss.str();\r
+ title_[i]->SetText(weatherHumidity.c_str());\r
+ } else if (i == LABEL_UPDATETIME) {\r
+ std::string updateTime = FormatTime(cur_.updateTime);\r
+ oss << "上次更新时间 " << updateTime;\r
+ updateTime = oss.str();\r
+ title_[i]->SetText(updateTime.c_str());\r
+ } else if (i == LABEL_CURRENT_TEMP) {\r
+ oss << cur_.temp << "°";\r
+ std::string weatherTemp = oss.str();\r
+ title_[i]->SetText(weatherTemp.c_str());\r
+ }\r
}\r
- ImageAir->SetPosition(WEATHER_IMAGEAIR_X, WEATHER_IMAGEAIR_Y);\r
- ImageAir->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- LOADIMG::LoadImageViewImg(ImageAir, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER69);\r
- ImageHumidity = new UIImageView();\r
- if (ImageHumidity == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImageHumidity new image fail");\r
+}\r
+\r
+void WeatherMainPage::InitWeatherImage1()\r
+{\r
+ addressImg_ = new UIImageView();\r
+ if (addressImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::addressImg_ new image fail");\r
return;\r
}\r
- ImageHumidity->SetPosition(WEATHER_IMAGEHUMIDITY_X, WEATHER_IMAGEHUMIDITY_Y);\r
- ImageHumidity->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- LOADIMG::LoadImageViewImg(ImageHumidity, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER70);\r
- ImagePageKey = new UIImageView();\r
- if (ImagePageKey == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImagePageKey new image fail");\r
+ addressImg_->SetPosition(WEATHER_ADDRESS_X, WEATHER_ADDRESS_Y);\r
+ addressImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ curWeatherCode_ = std::atoi(cur_.weather_code);\r
+ LOADIMG::LoadImageViewImg(addressImg_, WEATHER_IMAGE, IMAGE_WEATHER_LOCATE);\r
+\r
+ weatherImg_ = new UIImageView();\r
+ if (weatherImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::weatherImg_ new image fail");\r
return;\r
}\r
- ImagePageKey->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y);\r
- ImagePageKey->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- LOADIMG::LoadImageViewImg(ImagePageKey, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER66);\r
- group->Add(aroundImg);\r
- group->Add(ImageAir);\r
- group->Add(ImageHumidity);\r
- group->Add(ImagePageKey);\r
+ weatherImg_->SetPosition(WEATHER_IMG_X, WEATHER_TEMP_POSITION_Y);\r
+ weatherImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ curWeatherCode_ = std::atoi(cur_.weather_code);\r
+ if (curWeatherCode_ < 0 || curWeatherCode_ > WEATHER_TYPE) {\r
+ curWeatherCode_ = 0;\r
+ }\r
+ LOADIMG::LoadImageViewImg(weatherImg_, WEATHER_IMAGE, bigWeatherImage[curWeatherCode_]);\r
+ group_->Add(addressImg_);\r
+ group_->Add(weatherImg_);\r
}\r
\r
-void WeatherMainPage::InitWeatherImage()\r
+void WeatherMainPage::InitWeatherImage2()\r
{\r
- addressImg = new UIImageView();\r
- if (addressImg == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::img new image fail");\r
+ airQualityAndHumidityBgImg_ = new UIImageView();\r
+ if (airQualityAndHumidityBgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::aroundImage new image fail");\r
return;\r
}\r
- addressImg->SetPosition(WEATHER_ADDRESS_X, WEATHER_ADDRESS_Y);\r
- addressImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- curWeather_code = std::atoi(cur.weather_code);\r
- LOADIMG::LoadImageViewImg(addressImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER77);\r
-\r
- weatherImg = new UIImageView();\r
- if (weatherImg == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::img new image fail");\r
+ airQualityAndHumidityBgImg_->SetPosition(WEATHER_AROUND_X, WEATHER_AROUND_Y);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(airQualityAndHumidityBgImg_,\r
+ IMAGE_WEATHER_ITEM5, IMAGE_WEATHER_ITEM6);\r
+ airQulityImgIcon_ = new UIImageView();\r
+ if (airQulityImgIcon_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::airQulityImgIcon_ new image fail");\r
+ return;\r
+ }\r
+ airQulityImgIcon_->SetPosition(WEATHER_IMAGEAIR_X, WEATHER_IMAGEAIR_Y);\r
+ airQulityImgIcon_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(airQulityImgIcon_, WEATHER_IMAGE, IMAGE_WEATHER_AIR);\r
+ humidityImgIcon_ = new UIImageView(); // humidityImgIcon_->humidityImgIconIcon\r
+ if (humidityImgIcon_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::humidityImgIcon_ new image fail");\r
return;\r
}\r
- weatherImg->SetPosition(WEATHER_IMG_X, WEATHER_TEMP_POSITION_Y);\r
- weatherImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
- curWeather_code = std::atoi(cur.weather_code);\r
- LOADIMG::LoadImageViewImg(weatherImg, WEATHER_IMAGE, bigWeatherImage[curWeather_code]);\r
- group->Add(addressImg);\r
- group->Add(weatherImg);\r
+ humidityImgIcon_->SetPosition(WEATHER_IMAGEHUMIDITY_X, WEATHER_IMAGEHUMIDITY_Y);\r
+ humidityImgIcon_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(humidityImgIcon_, WEATHER_IMAGE, IMAGE_WEATHER_WET);\r
+ pageIdxImg_ = new UIImageView();\r
+ if (pageIdxImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::pageIdxImg_ new image fail");\r
+ return;\r
+ }\r
+ pageIdxImg_->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y);\r
+ pageIdxImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(pageIdxImg_, WEATHER_IMAGE, IMAGE_WEATHER_PAGE1);\r
+ group_->Add(airQualityAndHumidityBgImg_);\r
+ group_->Add(airQulityImgIcon_);\r
+ group_->Add(humidityImgIcon_);\r
+ group_->Add(pageIdxImg_);\r
}\r
\r
-\r
-void WeatherMainPage::InitLabel()\r
+void WeatherMainPage::InitWeatherLabel1()\r
{\r
- int posX[LABEL_COUNT] = {140, 113, 120, 222, 100, 210};\r
+ int posX[LABEL_COUNT] = {140, 113, 119, 232, 100, 210};\r
int posY[LABEL_COUNT] = {34, 274, 332, 332, 376, 130};\r
- for (int i = 0; i < LABEL_COUNT; i++) {\r
- title[i] = new UILabel();\r
- if (title[i] == nullptr) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitPageFirst new label:%d fail", i);\r
+ for (int i = 0; i < LABEL_HUMIDITY; i++) { // 从adress控件加载到humidity控件\r
+ std::ostringstream oss;\r
+ title_[i] = new UILabel();\r
+ if (title_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage new label:%d fail", i);\r
return;\r
}\r
- if (i == SET_ZERO) {\r
- title[i]->SetText(cur.address);\r
- title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
- title[i]->SetAlign(TEXT_ALIGNMENT_LEFT);\r
- title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_ONE);\r
- } else if (i == SET_ONE) {\r
- std::ostringstream oss;\r
- oss << cur.max_degree << "° / " << cur.min_degree << "° " << weatherNames[curWeather_code];\r
+ if (i == LABEL_ADDRESS) {\r
+ title_[i]->SetText(cur_.address);\r
+ title_[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
+ title_[i]->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ title_[i]->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_ONE);\r
+ int controlOffset = 10;\r
+ int cut = 2;\r
+ int posX = (VERTICAL_RESOLUTION - addressImg_->GetWidth() - title_[i]->GetTextWidth()\r
+ - controlOffset) / cut;\r
+ addressImg_->SetX(posX);\r
+ posX = posX + addressImg_->GetWidth() + controlOffset;\r
+ title_[i]->SetX(posX);\r
+ } else if (i == LABEL_TEMP) {\r
+ oss << cur_.max_temp << "° / " << cur_.min_temp << "° " << g_weatherNames[curWeatherCode_];\r
std::string weatherTemp = oss.str();\r
- title[i]->SetText(weatherTemp.c_str());\r
- title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_FIVE, WEATHER_LABEL_SIZE_HEIGHT_FIVE);\r
- title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_THREE);\r
- } else if (i == SET_TWO) {\r
- std::ostringstream oss;\r
- oss << "空气 -";\r
- std::string weatherHumidity = oss.str();\r
- title[i]->SetText(weatherHumidity.c_str());\r
- title[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- title[i]->SetPosition(posX[i], posY[i], WEATHER_LABLEAIR_DATA, WEATHER_LABLEAIR_HEIGHT);\r
- title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
- } else if (i == SET_THREE) {\r
- std::ostringstream oss;\r
- oss << "湿度" << cur.humidity <<"%";\r
+ title_[i]->SetText(weatherTemp.c_str());\r
+ title_[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_FIVE, WEATHER_LABEL_SIZE_HEIGHT_FIVE);\r
+ title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_THREE);\r
+ } else if (i == LABEL_AIR) {\r
+ oss << "空气 --";\r
+ std::string weatherAir = oss.str();\r
+ title_[i]->SetText(weatherAir.c_str());\r
+ title_[i]->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ title_[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title_[i]->SetPosition(posX[i], posY[i], WEATHER_LABLEAIR_DATA, WEATHER_LABLEAIR_HEIGHT);\r
+ title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+ }\r
+ title_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(title_[i]);\r
+ }\r
+}\r
+\r
+void WeatherMainPage::InitWeatherLabel2()\r
+{\r
+ int posX[LABEL_COUNT] = {140, 113, 119, 232, 100, 210};\r
+ int posY[LABEL_COUNT] = {34, 274, 332, 332, 376, 130};\r
+ for (int i = LABEL_HUMIDITY; i < LABEL_COUNT; i++) { // 从HUMIDITY控件开始到加载剩余label\r
+ std::ostringstream oss;\r
+ title_[i] = new UILabel();\r
+ if (title_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage new label:%d fail", i);\r
+ return;\r
+ }\r
+ if (i == LABEL_HUMIDITY) {\r
+ title_[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title_[i]->SetPosition(posX[i], posY[i], WEATHER_IMAGEHUMIDITY_DATA, WEATHER_LABLEAIR_HEIGHT);\r
+ title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+ oss << "湿度 " << cur_.humidity << "%";\r
std::string weatherHumidity = oss.str();\r
- title[i]->SetText(weatherHumidity.c_str());\r
- title[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
- title[i]->SetPosition(posX[i], posY[i], WEATHER_IMAGEHUMIDITY_DATA, WEATHER_LABLEAIR_HEIGHT);\r
- title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
- } else if (i == SET_FOUR) {\r
- std::ostringstream oss;\r
- std::string updateTime = FormatTime(flag, cur.updateTime);\r
+ title_[i]->SetText(weatherHumidity.c_str());\r
+ } else if (i == LABEL_UPDATETIME) {\r
+ std::string updateTime = FormatTime(cur_.updateTime);\r
oss << "上次更新时间 " << updateTime;\r
updateTime = oss.str();\r
- title[i]->SetText(updateTime.c_str());\r
- title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_FOUR);\r
- title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
- } else if (i == SET_FIVE) {\r
- std::ostringstream oss;\r
- oss << cur.degree << "°";\r
+ title_[i]->SetText(updateTime.c_str());\r
+ title_[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_FOUR);\r
+ title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+ } else if (i == LABEL_CURRENT_TEMP) {\r
+ oss << cur_.temp << "°";\r
std::string weatherTemp = oss.str();\r
- title[i]->SetText(weatherTemp.c_str());\r
- title[i]->SetPosition(posX[i], posY[i], WEATHER_TEMP_WIDTH, WEATHER_TEMP_HEIGHT);\r
- title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_FOUR);\r
+ title_[i]->SetText(weatherTemp.c_str());\r
+ title_[i]->SetPosition(posX[i], posY[i], WEATHER_TEMP_WIDTH, WEATHER_TEMP_HEIGHT);\r
+ title_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_FOUR);\r
}\r
- title[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- group->Add(title[i]);\r
+ title_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group_->Add(title_[i]);\r
}\r
}\r
\r
-std::string WeatherMainPage::FormatTime(bool falg, const std::string &inputStr)\r
+std::string WeatherMainPage::FormatTime(const std::string &inputStr)\r
{\r
- if (!flag) {\r
+ if (!flag_) {\r
return "--";\r
}\r
tm inputTm = {};\r
time_t now = time(nullptr);\r
tm *nowTm = localtime(&now);\r
if (inputTm.tm_year == nowTm->tm_year && inputTm.tm_mon == nowTm->tm_mon && inputTm.tm_mday == nowTm->tm_mday) {\r
- char buffer[6];\r
+ char buffer[BUFFER_SIZE];\r
strftime(buffer, sizeof(buffer), "%H:%M", &inputTm);\r
return std::string(buffer);\r
} else {\r
- char buffer[6];\r
+ char buffer[BUFFER_SIZE];\r
strftime(buffer, sizeof(buffer), "%m/%d", &inputTm);\r
return std::string(buffer);\r
}\r
UNUSED(view);\r
if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
(event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
} else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
- NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_SECOND_PAGE, nullptr,\r
- TransitionType::TRANSITION_INVALID, true);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_HOURS_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_SUNRISE_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
}\r
- return false;\r
+ return true;\r
}\r
\r
bool WeatherMainPage::OnClick(UIView &view, const ClickEvent &event)\r
UNUSED(event);\r
return true;\r
}\r
+\r
+uint8_t WeatherMainPage::GetConnectStatus()\r
+{\r
+ uint8_t conn_status = 0;\r
+#ifdef _WIN32\r
+ conn_status = 1;\r
+#else\r
+ if (msg_center_get_trans_channel() == DIAG_FRAME_FID_PHONE) {\r
+ conn_status = is_spp_connected(0) == true ? 1 : 0;\r
+ } else if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+ conn_status = msg_center_get_ble_conn_state();\r
+ }\r
+#endif\r
+ return conn_status;\r
+}\r
}\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: WeatherModel\r
* Create: 2025-03-23\r
*/\r
\r
-#include "weather/WeatherModel.h"\r
-#include "weather/WeatherPresenter.h"\r
-#include "wearable_log.h"\r
#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
#ifdef BUILD_IN_LINUX\r
#include "localtime.h"\r
#endif\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherModel.h"\r
\r
namespace OHOS {\r
+static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 28;\r
+static const char *WEATHER_FILE = WEATHER_PATH "weather.json";\r
+const int g_imageInfo[IMAGEANIMATOERVIEW_SIZE] = {\r
+ IMAGE_WEATHER_MOON1, IMAGE_WEATHER_MOON2, IMAGE_WEATHER_MOON3, IMAGE_WEATHER_MOON4,\r
+ IMAGE_WEATHER_MOON5, IMAGE_WEATHER_MOON6, IMAGE_WEATHER_MOON7, IMAGE_WEATHER_MOON8,\r
+};\r
\r
WeatherModel::WeatherModel() {}\r
\r
\r
uint8_t WeatherModel::GetWeatherListNum()\r
{\r
- return usedLen;\r
+ return usedLen_;\r
}\r
\r
WeatherItem *WeatherModel::GetWeatherlistItems()\r
{\r
- if (weather[0].label_1 == nullptr) {\r
- ImageInfo *imgSrc =\r
- ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER47, WEATHER_IMAGE);\r
- weather[SET_ZERO] = {"今天", imgSrc, "16°/26°", true};\r
- weather[SET_ONE] = {"明天", imgSrc, "18°/28°", false};\r
- weather[SET_TWO] = {"后天", imgSrc, "17°/27°", false};\r
- weather[SET_THREE] = {"周四", imgSrc, "15°/24°", false};\r
- weather[SET_FOUR] = {"周五", imgSrc, "14°/22°", false};\r
- weather[SET_FIVE] = {"周六", imgSrc, "16°/25°", false};\r
- weather[SET_SIX] = {"周日", imgSrc, "19°/29°", false};\r
- usedLen = SET_SEVEN;\r
- }\r
- return weather;\r
+ if (weather_[0].weatherWeek == nullptr) {\r
+ weather_[INDEX_0] = {"今天", smallWeatherImage[0], "16°/26°", true};\r
+ weather_[INDEX_1] = {"明天", smallWeatherImage[0], "18°/28°", false};\r
+ weather_[INDEX_2] = {"周三", smallWeatherImage[0], "17°/27°", false};\r
+ weather_[INDEX_3] = {"周四", smallWeatherImage[0], "15°/24°", false};\r
+ weather_[INDEX_4] = {"周五", smallWeatherImage[0], "14°/22°", false};\r
+ weather_[INDEX_5] = {"周六", smallWeatherImage[0], "16°/25°", false};\r
+ weather_[INDEX_6] = {"周日", smallWeatherImage[0], "19°/29°", false};\r
+ usedLen_ = ONE_WEEK_DYAS;\r
+ }\r
+ return weather_;\r
}\r
\r
CurWeather WeatherModel::GetCurWeather()\r
{\r
- if (curWeather.min_degree == nullptr) {\r
- curWeather.min_degree = "10";\r
- curWeather.max_degree = "25";\r
- curWeather.address = "北京市";\r
- curWeather.weather_code = "02";\r
- curWeather.degree = "18";\r
- curWeather.updateTime = "2023-11-15 14:30:00 20";\r
- curWeather.humidity = "90";\r
- curWeather.sunSet = "17:30";\r
- curWeather.sunRise = "06:45";\r
- }\r
- return curWeather;\r
+ if (curWeather_.min_temp == nullptr) { // 如果更新天气失败则输出打桩数据\r
+ curWeather_.min_temp = "10";\r
+ curWeather_.max_temp = "25";\r
+ curWeather_.address = "北京市";\r
+ curWeather_.weather_code = "02";\r
+ curWeather_.temp = "18";\r
+ curWeather_.updateTime = "2023-11-15 14:30:00 20";\r
+ curWeather_.humidity = "90";\r
+ curWeather_.sunSet = "17:30";\r
+ curWeather_.sunRise = "06:45";\r
+ }\r
+ return curWeather_;\r
+}\r
+\r
+SunStruct *WeatherModel::GetSunData()\r
+{\r
+ if (sunData_[0].sunRise == nullptr) { // 如果更新天气失败则输出打桩数据\r
+ sunData_[INDEX_0] = {"05:20", "17:43", "今天"};\r
+ sunData_[INDEX_1] = {"06:30", "17:47", "明天"};\r
+ sunData_[INDEX_2] = {"05:20", "17:21", "周三"};\r
+ sunData_[INDEX_3] = {"05:02", "17:24", "周四"};\r
+ sunData_[INDEX_4] = {"06:25", "17:44", "周五"};\r
+ sunData_[INDEX_5] = {"05:21", "17:33", "周六"};\r
+ sunData_[INDEX_6] = {"06:20", "17:12", "周日"};\r
+ }\r
+ return sunData_;\r
+}\r
+\r
+MonthStruct *WeatherModel::GetMonthData()\r
+{\r
+ // 无月出数据 打桩数据输出\r
+ monthData_[INDEX_0] = {"月出 18:42", "月落 06:43", "今天"};\r
+ monthData_[INDEX_1] = {"月出 18:32", "月落 05:47", "明天"};\r
+ monthData_[INDEX_2] = {"月出 19:42", "月落 05:21", "周三"};\r
+ monthData_[INDEX_3] = {"月出 18:42", "月落 06:24", "周四"};\r
+ monthData_[INDEX_4] = {"月出 18:45", "月落 05:44", "周五"};\r
+ monthData_[INDEX_5] = {"月出 18:22", "月落 05:33", "周六"};\r
+ monthData_[INDEX_6] = {"月出 18:52", "月落 05:12", "周日"};\r
+ if (!currentWeek_[0].empty()) {\r
+ for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
+ monthData_[i].weekTime = currentWeek_[i].c_str();\r
+ }\r
+ }\r
+ return monthData_;\r
+}\r
+\r
+LunarPhaseStruct *WeatherModel::GetLunarPhaseData()\r
+{\r
+ // 无月出数据 打桩数据输出\r
+ parseData_[INDEX_0] = {"残月", g_imageInfo[INDEX_0], "月亮照亮66%", "月龄23天", "今天"};\r
+ parseData_[INDEX_1] = {"亏凸月", g_imageInfo[INDEX_1], "月亮照亮23%", "月龄21天", "明天"};\r
+ parseData_[INDEX_2] = {"盈凸月", g_imageInfo[INDEX_2], "月亮照亮51%", "月龄23天", "周三"};\r
+ parseData_[INDEX_3] = {"娥眉月", g_imageInfo[INDEX_3], "月亮照亮11%", "月龄13天", "周四"};\r
+ parseData_[INDEX_4] = {"下弦月", g_imageInfo[INDEX_4], "月亮照亮51%", "月龄25天", "周五"};\r
+ parseData_[INDEX_5] = {"上弦月", g_imageInfo[INDEX_5], "月亮照亮80%", "月龄15天", "周六"};\r
+ parseData_[INDEX_6] = {"新月", g_imageInfo[INDEX_6], "月亮照亮23%", "月龄18天", "周日"};\r
+ if (!currentWeek_[0].empty()) {\r
+ for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
+ parseData_[i].weekTime = currentWeek_[i].c_str();\r
+ }\r
+ }\r
+ return parseData_;\r
}\r
\r
std::vector<HourWeather> WeatherModel::GetHourWeather()\r
{\r
- if (houWeather.size() < WEATHER_COUNT) {\r
+ if (houWeather_.size() < ALL_HOURS_WEATHER_COUNT) { // 无天气文件或手机下发数据异常不够24个 输出打桩数据\r
HourWeather weatherData[] = {\r
{"00:00", "18", "04"}, {"01:00", "17", "06"}, {"02:00", "17", "06"}, {"03:00", "16", "06"},\r
{"04:00", "16", "07"}, {"05:00", "15", "07"}, {"06:00", "16", "08"}, {"07:00", "17", "08"},\r
{"16:00", "24", "06"}, {"17:00", "23", "06"}, {"18:00", "22", "06"}, {"19:00", "21", "07"},\r
{"20:00", "20", "07"}, {"21:00", "19", "10"}, {"22:00", "18", "10"}, {"23:00", "18", "10"}};\r
for (const auto &item : weatherData) {\r
- houWeather.push_back(item);\r
+ houWeather_.push_back(item);\r
}\r
}\r
- return houWeather;\r
+ return houWeather_;\r
}\r
\r
bool WeatherModel::InitWeatherItem()\r
{\r
- std::ifstream file("/user/app/user/ace/data/com.vendor.Weather/weather.json");\r
+ std::ifstream file(WEATHER_FILE);\r
if (!file.is_open()) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "open fail");\r
return false;\r
}\r
std::stringstream buffer;\r
return false;\r
}\r
// 访问JSON数据\r
- bool updateMsg = InitVecObserve(root);\r
- if (updateMsg) {\r
- InitVecForecast(root);\r
- InitVecRise(root);\r
- InitVecWeek(root);\r
- InitVecAddress(root);\r
- InitFirstPageData();\r
- InitSecondPageData();\r
- InitThirdPageData();\r
- } else {\r
- cJSON_Delete(root);\r
+ bool result = false;\r
+ result = InitVecObserve(root);\r
+ if (!result) {\r
+ return false;\r
+ }\r
+ result = InitVecForecast(root);\r
+ if (!result) {\r
+ return false;\r
+ }\r
+ result = InitVecWeek(root);\r
+ if (!result) {\r
+ return false;\r
+ }\r
+ result = InitVecAddress(root);\r
+ if (!result) {\r
return false;\r
}\r
+ InitStringData();\r
+ result = InitVecRise(root);\r
+ if (!result) {\r
+ return false;\r
+ }\r
+ // 暂无月出、月相文件数据,后续增加相关字段后,需要自行加解析\r
cJSON_Delete(root);\r
+\r
+ InitMainPageData();\r
+ InitHoursPageData();\r
+ InitDaysPageData();\r
return true;\r
}\r
\r
-void WeatherModel::InitFirstPageData()\r
+void WeatherModel::InitMainPageData()\r
{\r
- curWeather = {0};\r
+ curWeather_ = {0};\r
static std::string sunset;\r
static std::string sunrise;\r
- if (map_observe.find("min_degree") != map_observe.end()) {\r
- curWeather.min_degree = map_observe["min_degree"].c_str();\r
+ if (map_observe_.find("min_temp") != map_observe_.end()) {\r
+ curWeather_.min_temp = map_observe_["min_temp"].c_str();\r
}\r
- if (map_observe.find("max_degree") != map_observe.end()) {\r
- curWeather.max_degree = map_observe["max_degree"].c_str();\r
+ if (map_observe_.find("max_temp") != map_observe_.end()) {\r
+ curWeather_.max_temp = map_observe_["max_temp"].c_str();\r
}\r
- if (map_observe.find("degree") != map_observe.end()) {\r
- curWeather.degree = map_observe["degree"].c_str();\r
+ if (map_observe_.find("temp") != map_observe_.end()) {\r
+ curWeather_.temp = map_observe_["temp"].c_str();\r
}\r
- if (map_observe.find("weather_code") != map_observe.end()) {\r
- curWeather.weather_code = map_observe["weather_code"].c_str();\r
+ if (map_observe_.find("weather_code") != map_observe_.end()) {\r
+ curWeather_.weather_code = map_observe_["weather_code"].c_str();\r
}\r
- if (map_observe.find("update_time") != map_observe.end()) {\r
- curWeather.updateTime = map_observe["update_time"].c_str();\r
+ if (map_observe_.find("update_time") != map_observe_.end()) {\r
+ curWeather_.updateTime = map_observe_["update_time"].c_str();\r
}\r
- if (map_observe.find("humidity") != map_observe.end()) {\r
- curWeather.humidity = map_observe["humidity"].c_str();\r
+ if (map_observe_.find("humidity") != map_observe_.end()) {\r
+ curWeather_.humidity = map_observe_["humidity"].c_str();\r
}\r
- if (map_address.find("city") != map_address.end()) {\r
- curWeather.address = map_address["city"].c_str();\r
+ if (map_address_.find("city") != map_address_.end()) {\r
+ curWeather_.address = map_address_["city"].c_str();\r
}\r
- if (map_address.find("address") != map_address.end()) {\r
- curWeather.address = map_address["address"].c_str();\r
+ if (map_address_.find("address") != map_address_.end()) {\r
+ curWeather_.address = map_address_["address"].c_str();\r
}\r
}\r
\r
-void WeatherModel::InitSecondPageData()\r
+void WeatherModel::InitHoursPageData()\r
{\r
- houWeather.clear();\r
- static std::string dayTime[WEATHER_COUNT];\r
- static std::string dayTemp[WEATHER_COUNT];\r
- static std::string dayWeather[WEATHER_COUNT];\r
+ houWeather_.clear();\r
+ static std::string dayTime[ALL_HOURS_WEATHER_COUNT];\r
+ static std::string dayTemp[ALL_HOURS_WEATHER_COUNT];\r
+ static std::string dayWeather[ALL_HOURS_WEATHER_COUNT];\r
\r
- for (const auto &item : vec_forecast_1h) {\r
+ for (const auto &item : vec_forecast_1h_) {\r
const std::string name = std::get<0>(item);\r
const std::string category = std::get<1>(item);\r
- const int id = std::get<SET_TWO>(item);\r
+ const int id = std::get<INDEX_2>(item);\r
HourWeather sample = {nullptr};\r
if (name == "update_time") {\r
dayTime[id] = category;\r
- } else if (name == "degree") {\r
+ } else if (name == "temp") {\r
dayTemp[id] = category;\r
} else if (name == "weather_code") {\r
dayWeather[id] = category;\r
}\r
}\r
- for (int i = 0; i < WEATHER_COUNT; i++) {\r
+ for (int i = 0; i < ALL_HOURS_WEATHER_COUNT; i++) {\r
HourWeather sample = {nullptr};\r
sample.hour = dayTime[i].c_str();\r
- sample.degree = dayTemp[i].c_str();\r
+ sample.temp = dayTemp[i].c_str();\r
sample.weather = dayWeather[i].c_str();\r
- houWeather.push_back(sample);\r
+ houWeather_.push_back(sample);\r
+ }\r
+}\r
+\r
+void WeatherModel::InitDaysPageData()\r
+{\r
+ for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
+ strTmp_[i] = maxTemp_[i] + "° / " + minTemp_[i] + "°";\r
+ }\r
+ for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
+ int weatherIndex = weatherValue_[i];\r
+ weather_[i] = {currentWeek_[i].c_str(), smallWeatherImage[weatherIndex], strTmp_[i].c_str(), true};\r
}\r
+ usedLen_ = ONE_WEEK_DYAS;\r
}\r
\r
-void WeatherModel::InitThirdPageData()\r
+void WeatherModel::InitStringData()\r
{\r
- static std::string strTmp[SET_EIGHT];\r
- static std::string minTemp[SET_EIGHT];\r
- static std::string maxTemp[SET_EIGHT];\r
- static std::string currentWeek[SET_EIGHT];\r
- static int weatherValue[SET_EIGHT];\r
- for (const auto &item : vec_forecast_24h) {\r
+ for (const auto &item : vec_forecast_24h_) {\r
const std::string name = std::get<0>(item);\r
- const std::string category = std::get<1>(item);\r
- const int id = std::get<SET_TWO>(item);\r
+ const std::string value = std::get<1>(item);\r
+ const int id = std::get<INDEX_2>(item);\r
if (name == "current_week") {\r
- if (id == SET_ZERO) {\r
- currentWeek[id] = "今天";\r
- } else if (id == SET_ONE) {\r
- currentWeek[id] = "明天";\r
- } else if (id == SET_TWO) {\r
- currentWeek[id] = "后天";\r
+ if (id == INDEX_0) {\r
+ currentWeek_[id] = "今天";\r
+ } else if (id == INDEX_1) {\r
+ currentWeek_[id] = "明天";\r
} else {\r
- currentWeek[id] = category;\r
+ currentWeek_[id] = value;\r
}\r
- } else if (name == "min_degree") {\r
- minTemp[id] = category;\r
- } else if (name == "max_degree") {\r
- maxTemp[id] = category;\r
+ } else if (name == "min_temp") {\r
+ minTemp_[id] = value;\r
+ } else if (name == "max_temp") {\r
+ maxTemp_[id] = value;\r
} else if (name == "day_weather_code") {\r
- weatherValue[id] = std::atoi(category.c_str());\r
+ weatherValue_[id] = std::atoi(value.c_str());\r
}\r
}\r
- for (int i = 0; i < SET_SEVEN; i++) {\r
- strTmp[i] = maxTemp[i] + "°/" + minTemp[i] + "°";\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherModel::InitWeatherItem:%s", strTmp[i].c_str());\r
- }\r
- // 只显示七天的天气\r
- for (int i = 0; i < SET_SEVEN; i++) {\r
- int weatherIndex = weatherValue[i];\r
- ImageInfo *imgSrc =\r
- ImageCacheManager::GetInstance().LoadOneInMultiRes(smallWeatherImage[weatherIndex], WEATHER_IMAGE);\r
- weather[i] = {currentWeek[i].c_str(), imgSrc, strTmp[i].c_str(), true};\r
- }\r
- usedLen = SET_SEVEN;\r
}\r
\r
bool WeatherModel::InitVecForecast(cJSON *root)\r
{\r
- vec_forecast_1h.clear();\r
- // 获取 forecast_1h 对象\r
+ vec_forecast_1h_.clear();\r
cJSON *forecast_1h = cJSON_GetObjectItemCaseSensitive(root, "forecast_1h");\r
if (!cJSON_IsObject(forecast_1h)) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_1h:");\r
cJSON_Delete(root);\r
return false;\r
}\r
- for (int i = 0; i < WEATHER_COUNT; i++) {\r
+ for (int i = 0; i < ALL_HOURS_WEATHER_COUNT; i++) {\r
cJSON *forecast_1h_num = cJSON_GetObjectItemCaseSensitive(forecast_1h, std::to_string(i).c_str());\r
if (!cJSON_IsObject(forecast_1h_num)) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_1h_num:%d", i);\r
- continue; // 跳过当前循环,继续处理下一个\r
+ continue;\r
}\r
std::string str = cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "update_time")->valuestring;\r
- std::string hour = str.substr(SET_TWELVE, SET_TWO);\r
- // 确保字符串长度至少为12\r
+ std::string hour = str.substr(INDEX_12, INDEX_2);\r
if (str.length() >= WEATHER_HOUR) {\r
- // 提取小时部分\r
- hour = str.substr(SET_EIGHT, SET_TWO) + ":00";\r
+ hour = str.substr(INDEX_8, INDEX_2) + ":00";\r
} else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_1h:");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_1h hour size error");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_1h hour size error");\r
hour = "00:00";\r
}\r
- vec_forecast_1h.push_back(std::make_tuple("update_time", hour, i));\r
- vec_forecast_1h.push_back(\r
- std::make_tuple("degree", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "degree")->valuestring, i));\r
- vec_forecast_1h.push_back(std::make_tuple(\r
+ vec_forecast_1h_.push_back(std::make_tuple("update_time", hour, i));\r
+ vec_forecast_1h_.push_back(\r
+ std::make_tuple("temp", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "degree")->valuestring, i));\r
+ vec_forecast_1h_.push_back(std::make_tuple(\r
"weather_code", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "weather_code")->valuestring, i));\r
}\r
+ // 由外层函数释放cjson嵌套结构体内存\r
return true;\r
}\r
\r
bool WeatherModel::InitVecObserve(cJSON *root)\r
{\r
- map_observe.clear();\r
+ map_observe_.clear();\r
// 获取 observe 对象\r
cJSON *observe = cJSON_GetObjectItemCaseSensitive(root, "observe");\r
if (!cJSON_IsObject(observe)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error observe:");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error observe:");\r
cJSON_Delete(root);\r
return false;\r
}\r
- map_observe.insert(std::make_pair("weather", cJSON_GetObjectItemCaseSensitive(observe, "weather")->valuestring));\r
- map_observe.insert(std::make_pair("degree", cJSON_GetObjectItemCaseSensitive(observe, "degree")->valuestring));\r
- map_observe.insert(std::make_pair("humidity", cJSON_GetObjectItemCaseSensitive(observe, "humidity")->valuestring));\r
- map_observe.insert(\r
- std::make_pair("min_degree", cJSON_GetObjectItemCaseSensitive(observe, "min_degree")->valuestring));\r
- map_observe.insert(\r
- std::make_pair("max_degree", cJSON_GetObjectItemCaseSensitive(observe, "max_degree")->valuestring));\r
- map_observe.insert(\r
+ map_observe_.insert(std::make_pair("weather", cJSON_GetObjectItemCaseSensitive(observe, "weather")->valuestring));\r
+ map_observe_.insert(std::make_pair("temp", cJSON_GetObjectItemCaseSensitive(observe, "degree")->valuestring));\r
+ map_observe_.insert(std::make_pair("humidity", cJSON_GetObjectItemCaseSensitive(observe, "humidity")->valuestring));\r
+ map_observe_.insert(\r
+ std::make_pair("min_temp", cJSON_GetObjectItemCaseSensitive(observe, "min_degree")->valuestring));\r
+ map_observe_.insert(\r
+ std::make_pair("max_temp", cJSON_GetObjectItemCaseSensitive(observe, "max_degree")->valuestring));\r
+ map_observe_.insert(\r
std::make_pair("update_time", cJSON_GetObjectItemCaseSensitive(observe, "update_time")->valuestring));\r
- map_observe.insert(\r
+ map_observe_.insert(\r
std::make_pair("weather_code", cJSON_GetObjectItemCaseSensitive(observe, "weather_code")->valuestring));\r
+ // 由外层函数释放cjson嵌套结构体内存\r
return true;\r
}\r
\r
bool WeatherModel::InitVecRise(cJSON *root)\r
{\r
// 获取 rise 对象\r
- vec_rise.clear();\r
cJSON *rise = cJSON_GetObjectItemCaseSensitive(root, "rise");\r
if (!cJSON_IsObject(rise)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error rise:");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error rise:");\r
cJSON_Delete(root);\r
return false;\r
}\r
- for (int i = 0; i < SET_FOURTEEN; i++) {\r
+ for (int i = 0; i < ONE_WEEK_DYAS; i++) {\r
cJSON *rise_num = cJSON_GetObjectItemCaseSensitive(rise, std::to_string(i).c_str());\r
if (!cJSON_IsObject(rise_num)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error rise:%d", i);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error rise:%d", i);\r
continue; // 跳过当前循环,继续处理下一个\r
}\r
- std::string sunSet = cJSON_GetObjectItemCaseSensitive(rise_num, "sunset")->valuestring;\r
- std::string sunRise = cJSON_GetObjectItemCaseSensitive(rise_num, "sunrise")->valuestring;\r
- SetDayStatus(sunRise, sunSet);\r
+ strRise_[i] = cJSON_GetObjectItemCaseSensitive(rise_num, "sunrise")->valuestring;\r
+ strSet_[i] = cJSON_GetObjectItemCaseSensitive(rise_num, "sunset")->valuestring;\r
+ sunData_[i].sunRise = strRise_[i].c_str();\r
+ sunData_[i].sunSet = strSet_[i].c_str();\r
+ sunData_[i].weekTime = currentWeek_[i].c_str();\r
}\r
+ if (sunData_[0].sunRise != nullptr) {\r
+ SetDayStatus(sunData_[0].sunRise, sunData_[0].sunSet);\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sunData_ is empty");\r
+ cJSON_Delete(root);\r
+ return false;\r
+ }\r
+ // 由外层函数释放cjson嵌套结构体内存\r
return true;\r
}\r
\r
bool WeatherModel::InitVecWeek(cJSON *root)\r
{\r
- vec_forecast_24h.clear();\r
+ vec_forecast_24h_.clear();\r
cJSON *forecast_24h = cJSON_GetObjectItemCaseSensitive(root, "forecast_24h");\r
if (!cJSON_IsObject(forecast_24h)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_24h:");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_24h:");\r
cJSON_Delete(root);\r
return false;\r
}\r
- for (int i = 0; i < SET_TEN; i++) {\r
+ // app写的数据包含了昨天,跳过第一个数据\r
+ for (int i = 1; i <= ONE_WEEK_DYAS; i++) {\r
cJSON *forecast_24h_num = cJSON_GetObjectItemCaseSensitive(forecast_24h, std::to_string(i).c_str());\r
if (!cJSON_IsObject(forecast_24h_num)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_24h_num:%d", i);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_24h_num:%d", i);\r
continue;\r
}\r
std::istringstream iss(cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "time")->valuestring);\r
timeinfo.tm_isdst = -1;\r
std::time_t timestamp = mktime(&timeinfo);\r
if (timestamp == -1) {\r
+ cJSON_Delete(root);\r
return false;\r
}\r
std::tm localTimeInfo;\r
-#ifdef _WIN32\r
- if (localtime_s(&localTimeInfo, ×tamp) != 0) {\r
-#else\r
if (localtime_r(×tamp, &localTimeInfo) == nullptr) {\r
-#endif\r
+ cJSON_Delete(root);\r
return false;\r
}\r
const char *current_weeks[] = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};\r
- vec_forecast_24h.push_back(std::make_tuple("current_week", current_weeks[localTimeInfo.tm_wday], i));\r
- vec_forecast_24h.push_back(std::make_tuple(\r
- "min_degree", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "min_degree")->valuestring, i));\r
- vec_forecast_24h.push_back(std::make_tuple(\r
- "max_degree", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "max_degree")->valuestring, i));\r
- vec_forecast_24h.push_back(std::make_tuple(\r
+ vec_forecast_24h_.push_back(std::make_tuple("current_week", current_weeks[localTimeInfo.tm_wday], i - 1));\r
+ vec_forecast_24h_.push_back(std::make_tuple(\r
+ "min_temp", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "min_degree")->valuestring, i - 1));\r
+ vec_forecast_24h_.push_back(std::make_tuple(\r
+ "max_temp", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "max_degree")->valuestring, i - 1));\r
+ vec_forecast_24h_.push_back(std::make_tuple(\r
"day_weather_code", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "day_weather_code")->valuestring,\r
- i));\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "day_weather_code:%s ",\r
- cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "day_weather_code")->valuestring);\r
+ i - 1));\r
} else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error Date");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error Date");\r
}\r
}\r
+ // 由外层函数释放cjson嵌套结构体内存\r
return true;\r
}\r
\r
bool WeatherModel::InitVecAddress(cJSON *root)\r
{\r
- map_address.clear();\r
+ map_address_.clear();\r
cJSON *address = cJSON_GetObjectItemCaseSensitive(root, "address");\r
if (!cJSON_IsObject(address)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error address:");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error address:");\r
cJSON_Delete(root);\r
return false;\r
}\r
- map_address.insert(std::make_pair("province", cJSON_GetObjectItemCaseSensitive(address, "province")->valuestring));\r
- map_address.insert(std::make_pair("city", cJSON_GetObjectItemCaseSensitive(address, "city")->valuestring));\r
- map_address.insert(std::make_pair("county", cJSON_GetObjectItemCaseSensitive(address, "county")->valuestring));\r
+ map_address_.insert(std::make_pair("province", cJSON_GetObjectItemCaseSensitive(address, "province")->valuestring));\r
+ map_address_.insert(std::make_pair("city", cJSON_GetObjectItemCaseSensitive(address, "city")->valuestring));\r
+ map_address_.insert(std::make_pair("county", cJSON_GetObjectItemCaseSensitive(address, "county")->valuestring));\r
+ // 由外层函数释放cjson嵌套结构体内存\r
return true;\r
}\r
\r
void WeatherModel::SetDayStatus(const std::string &timeRise, const std::string &timeSet)\r
{\r
-#ifdef _WIN32\r
- struct timeval tv;\r
- gettimeofday(&tv, NULL);\r
-#else\r
- struct timeval64 tv;\r
- gettimeofday64(&tv, NULL);\r
-#endif\r
- uint64_t second = tv.tv_sec;\r
- uint64_t minute = second / MIN_TO_HOUR;\r
- uint64_t hour = minute / MIN_TO_HOUR;\r
- uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);\r
- uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
+ std::time_t now = std::time(nullptr);\r
+ std::tm *local = std::localtime(&now);\r
+ uint8_t realHour = static_cast<uint8_t>(local->tm_hour);\r
+ uint8_t realMinute = static_cast<uint8_t>(local->tm_min);\r
int currentTime = realHour * MIN_TO_HOUR + realMinute;\r
- int hours = (timeRise[SET_ZERO] - '0') * SET_TEN + (timeRise[SET_ONE] - '0');\r
- int minutes = (timeRise[SET_THREE] - '0') * SET_TEN + (timeRise[SET_FOUR] - '0');\r
+ int hours = (timeRise[INDEX_0] - '0') * NUMBER_10 + (timeRise[INDEX_1] - '0');\r
+ int minutes = (timeRise[INDEX_3] - '0') * NUMBER_10 + (timeRise[INDEX_4] - '0');\r
int rise = hours * MIN_TO_HOUR + minutes;\r
- hours = (timeSet[SET_ZERO] - '0') * SET_TEN + (timeSet[SET_ONE] - '0');\r
- minutes = (timeSet[SET_THREE] - '0') * SET_TEN + (timeSet[SET_FOUR] - '0');\r
+ hours = (timeSet[INDEX_0] - '0') * NUMBER_10 + (timeSet[INDEX_1] - '0');\r
+ minutes = (timeSet[INDEX_3] - '0') * NUMBER_10 + (timeSet[INDEX_4] - '0');\r
int set = hours * MIN_TO_HOUR + minutes;\r
- isDay = (currentTime >= rise && currentTime < set) ? true : false;\r
+ isDay_ = (currentTime >= rise && currentTime < set) ? true : false;\r
+}\r
+\r
+void WeatherModel::LoadImageOfDayNight(UIImageView *view, uint32_t resDayId, uint32_t resNightId)\r
+{\r
+ if (isDay_) {\r
+ LOADIMG::LoadImageViewImg(view, WEATHER_IMAGE, resDayId);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(view, WEATHER_IMAGE, resNightId);\r
+ }\r
+}\r
+\r
+void WeatherModel::LoadTextColorOfDayNight(UILabel *view, uint32_t colorDay, uint32_t colorNight)\r
+{\r
+ if (isDay_) {\r
+ view->SetStyle(STYLE_TEXT_COLOR, colorDay);\r
+ } else {\r
+ view->SetStyle(STYLE_TEXT_COLOR, colorNight);\r
+ }\r
}\r
\r
-bool WeatherModel::GetDayStatus()\r
+void WeatherModel::ClearData()\r
{\r
- return isDay;\r
+ std::remove(WEATHER_FILE);\r
}\r
}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageDays\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageDays.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 25;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_WIDTH = 200;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_HEIGHT = 50;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 130;\r
+static constexpr int16_t WEATHER_LIST_POSITION_X = 32;\r
+static constexpr int16_t WEATHER_LIST_POSITION_Y = 70;\r
+static constexpr int16_t WEATHER_LIST_WIDTH = 390;\r
+static constexpr int16_t WEATHER_LIST_HEIGHT = 318;\r
+static constexpr int16_t WEATHER_LIST_SELECT_POSITION = 80;\r
+static constexpr int16_t LIST_POS = 20;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_ONE = 20;\r
+static constexpr int16_t WEATHER_LABEL_FRONT = 40;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_X = 199;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_Y = 429;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_WIDTH = 56;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_HEIGHT = 10;\r
+static constexpr int16_t WEATHER_ITEM_BUTTON_WIDTH = 390;\r
+static constexpr int16_t WEATHER_ITEM_BUTTON_HEIGHT = 83;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_DAYS_PAGE, WeatherPageDays, false);\r
+\r
+WeatherPageDays::WeatherPageDays()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::WeatherPageDays");\r
+}\r
+\r
+WeatherPageDays::~WeatherPageDays()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (contentList_ != nullptr) {\r
+ contentList_->ClearAll();\r
+ delete contentList_;\r
+ contentList_ = nullptr;\r
+ }\r
+\r
+ if (title_ != nullptr) {\r
+ delete title_;\r
+ title_ = nullptr;\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+\r
+ if (pageIdxImg_ != nullptr) {\r
+ delete pageIdxImg_;\r
+ pageIdxImg_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::~WeatherPageDays");\r
+}\r
+\r
+void WeatherPageDays::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::group_ is nullptr");\r
+ return;\r
+ }\r
+ group_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ group_->SetOnDragListener(this);\r
+\r
+ title_ = new UILabel();\r
+ if (title_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::title_ is nullptr");\r
+ return;\r
+ }\r
+ title_->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_LABEL_FRONT_ONE);\r
+ title_->SetText("7日天气预报");\r
+ title_->Resize(WEATHER_RESIZE_SIZE_WIDTH, WEATHER_RESIZE_SIZE_HEIGHT);\r
+ title_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ title_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ title_->SetWidth(title_->GetTextWidth());\r
+ int pageWidth = 454;\r
+ int half = 2;\r
+ title_->SetX((pageWidth - title_->GetTextWidth()) / half);\r
+\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnStart bgImg_ new fail");\r
+ return;\r
+ }\r
+ bgImg_->SetPosition(0, 0);\r
+ bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+ InitScrollView();\r
+ InitScrollData();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void WeatherPageDays::InitScrollView()\r
+{\r
+ contentList_ = new UISimpleList();\r
+ if (contentList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::contentList_ is nullptr");\r
+ return;\r
+ }\r
+\r
+ contentList_->SetPosition(WEATHER_LIST_POSITION_X, WEATHER_LIST_POSITION_Y);\r
+ contentList_->Resize(WEATHER_LIST_WIDTH, WEATHER_LIST_HEIGHT);\r
+ contentList_->SetSelectPosition(WEATHER_LIST_SELECT_POSITION);\r
+ contentList_->SetDraggable(true);\r
+ contentList_->SetThrowDrag(true);\r
+ contentList_->EnableAutoAlign(true);\r
+ contentList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ contentList_->SetElastic(true);\r
+ pageIdxImg_ = new UIImageView();\r
+ if (pageIdxImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::pageIdxImg_ new image fail");\r
+ return;\r
+ }\r
+ pageIdxImg_->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y, WEATHER_IMAGEPAGEKEY_WIDTH,\r
+ WEATHER_IMAGEPAGEKEY_HEIGHT);\r
+ pageIdxImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(pageIdxImg_, WEATHER_IMAGE, IMAGE_WEATHER_PAGE3);\r
+ group_->Add(bgImg_);\r
+ group_->Add(title_);\r
+ group_->Add(contentList_);\r
+ group_->Add(pageIdxImg_);\r
+}\r
+\r
+bool WeatherPageDays::InitScrollData()\r
+{\r
+ WeatherItem *itemInfo = WeatherModel::GetInstance().GetWeatherlistItems();\r
+ RefreshWeathersList(itemInfo, WeatherModel::GetInstance().GetWeatherListNum());\r
+ return true;\r
+}\r
+\r
+static UIView* CreateViewCb(uint8_t type)\r
+{\r
+ WeatherItemView* item = new WeatherItemView();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+\r
+ item->SetPosition(0, 0, WEATHER_ITEM_BUTTON_WIDTH, WEATHER_ITEM_BUTTON_HEIGHT);\r
+ item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ item->SetTouchable(true);\r
+ return item;\r
+}\r
+\r
+static void UpdateViewCb(UIView* view, void* data, uint8_t type)\r
+{\r
+ WeatherItemView* item = dynamic_cast<WeatherItemView*>(view);\r
+ if (view == nullptr || data == nullptr || item == nullptr) {\r
+ return;\r
+ }\r
+ WeatherItem* content = static_cast<WeatherItem *>(data);\r
+ item->SetItemInfo(*content);\r
+}\r
+\r
+\r
+void WeatherPageDays::RefreshWeathersList(WeatherItem *item, uint8_t count)\r
+{\r
+ if (item == nullptr) {\r
+ return;\r
+ }\r
+ if (contentList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherPageDays::contentList_ fail");\r
+ return;\r
+ }\r
+ contentList_->ScrollTo(0);\r
+ for (uint8_t i = 0; i < count; ++i) {\r
+ Contents content;\r
+ content.createFunc = CreateViewCb;\r
+ content.updateFunc = UpdateViewCb;\r
+ content.data = reinterpret_cast<void *>(&item[i]);\r
+ contentList_->AddContent(content);\r
+ }\r
+ contentList_->RefreshList();\r
+}\r
+\r
+bool WeatherPageDays::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_HOURS_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+void WeatherPageDays::OnSwipe(UISwipeView &view)\r
+{\r
+ UNUSED(view);\r
+ return;\r
+}\r
+\r
+bool WeatherPageDays::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageHours\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageHours.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ANIMATOR_TIME = 50;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_HOURS_PAGE, WeatherPageHours, false);\r
+\r
+WeatherPageHours::WeatherPageHours()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageHours::WeatherPageHours");\r
+}\r
+\r
+WeatherPageHours::~WeatherPageHours()\r
+{\r
+ if (weatherSwipeGroup_ != nullptr) {\r
+ weatherSwipeGroup_->RemoveAll();\r
+ delete weatherSwipeGroup_;\r
+ weatherSwipeGroup_ = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < GROUP_24H_COUNT; ++i) {\r
+ if (hoursGroup_[i] != nullptr) {\r
+ hoursGroup_[i]->RemoveAll();\r
+ delete hoursGroup_[i];\r
+ hoursGroup_[i] = nullptr;\r
+ }\r
+ }\r
+ WeatherModel::GetInstance().index_ = 0;\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageHours::~WeatherPageHours");\r
+}\r
+\r
+void WeatherPageHours::OnStart(void *data)\r
+{\r
+ weatherSwipeGroup_ = new UISwipeView(UISwipeView::VERTICAL);\r
+ if (weatherSwipeGroup_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "weatherSwipeGroup_ new fail");\r
+ return;\r
+ }\r
+ weatherSwipeGroup_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ weatherSwipeGroup_->SetViewId("weatherSwipeGroup_");\r
+ weatherSwipeGroup_->SetOnDragListener(this);\r
+ weatherSwipeGroup_->SetOnSwipeListener(this);\r
+ weatherSwipeGroup_->SetDraggable(true);\r
+ weatherSwipeGroup_->SetTouchable(true);\r
+ weatherSwipeGroup_->SetAnimatorTime(ANIMATOR_TIME);\r
+ \r
+ for (int i = 0; i < GROUP_24H_COUNT; i++) {\r
+ hoursGroup_[i] = new WeatherPageHoursGroup();\r
+ if (hoursGroup_[i] == nullptr) {\r
+ return;\r
+ }\r
+ WeatherModel::GetInstance().index_++;\r
+ weatherSwipeGroup_->Add(hoursGroup_[i]);\r
+ }\r
+\r
+ AddViewToPageContainer(weatherSwipeGroup_);\r
+}\r
+\r
+bool WeatherPageHours::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_DAYS_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+void WeatherPageHours::OnSwipe(UISwipeView &view)\r
+{\r
+ UNUSED(view);\r
+ return;\r
+}\r
+\r
+bool WeatherPageHours::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageHoursGroup\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageHoursGroup.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t WEATHER_TITLE_WIDTH = 51;\r
+static constexpr uint16_t WEATHER_TITLE_HEIGHT = 26;\r
+static constexpr uint16_t WEATHER_TOPLABEL_X = 156;\r
+static constexpr uint16_t WEATHER_TOPLABEL_Y = 22;\r
+static constexpr uint16_t WEATHER_TOPLABEL_WIDTH = 150;\r
+static constexpr uint16_t WEATHER_TOPLABEL_HEIGHT = 60;\r
+static constexpr uint16_t WEATHER_TOPLABEL_FRONT = 26;\r
+static constexpr uint16_t WEATHER_LABELTIME_FRONT = 20;\r
+static constexpr uint16_t WEATHER_LABELTIME_FRONT_TWO = 24;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_X = 199;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_Y = 429;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_WIDTH = 56;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_HEIGHT = 10;\r
+\r
+WeatherPageHoursGroup::WeatherPageHoursGroup()\r
+{\r
+ WeatherInit(WeatherModel::GetInstance().index_);\r
+}\r
+\r
+WeatherPageHoursGroup::~WeatherPageHoursGroup()\r
+{\r
+ for (int i = 0; i < WEATHER_24H_PER_8H; ++i) {\r
+ if (imgBack_[i] != nullptr) {\r
+ delete imgBack_[i];\r
+ imgBack_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < WEATHER_24H_PER_8H; ++i) {\r
+ if (labelTime_[i] != nullptr) {\r
+ delete labelTime_[i];\r
+ labelTime_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < WEATHER_24H_PER_8H; ++i) {\r
+ if (labelTemp_[i] != nullptr) {\r
+ delete labelTemp_[i];\r
+ labelTemp_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < WEATHER_24H_PER_8H; ++i) {\r
+ if (imgWeather_[i] != nullptr) {\r
+ delete imgWeather_[i];\r
+ imgWeather_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+\r
+ if (pageIdxImg_ != nullptr) {\r
+ delete pageIdxImg_;\r
+ pageIdxImg_ = nullptr;\r
+ }\r
+\r
+ if (topLabel_ != nullptr) {\r
+ delete topLabel_;\r
+ topLabel_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~WeatherPageHoursGroup");\r
+}\r
+\r
+void WeatherPageHoursGroup::WeatherInit(int index)\r
+{\r
+ SetPosition(0, 0);\r
+ Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ SetViewId("weather");\r
+ SetDraggable(true);\r
+ SetTouchable(true);\r
+ houWeather_ = WeatherModel::GetInstance().GetHourWeather();\r
+\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherInit bgImg_ new fail");\r
+ return;\r
+ }\r
+ bgImg_->SetPosition(0, 0);\r
+ bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+ Add(bgImg_);\r
+\r
+ pageIdxImg_ = new UIImageView();\r
+ if (pageIdxImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "pageIdxImg_ new fail");\r
+ return;\r
+ }\r
+ pageIdxImg_->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y, WEATHER_IMAGEPAGEKEY_WIDTH,\r
+ WEATHER_IMAGEPAGEKEY_HEIGHT);\r
+ pageIdxImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(pageIdxImg_, WEATHER_IMAGE, IMAGE_WEATHER_PAGE2);\r
+ Add(pageIdxImg_);\r
+\r
+ topLabel_ = new UILabel();\r
+ if (topLabel_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherInit new topLabel_ fail");\r
+ return;\r
+ }\r
+ topLabel_->SetText("24小时预报");\r
+ topLabel_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_TOPLABEL_FRONT);\r
+ topLabel_->SetPosition(WEATHER_TOPLABEL_X, WEATHER_TOPLABEL_Y, WEATHER_TOPLABEL_WIDTH, WEATHER_TOPLABEL_HEIGHT);\r
+ Add(topLabel_);\r
+\r
+ InitImage(index * WEATHER_24H_PER_8H);\r
+ InitLabel(index * WEATHER_24H_PER_8H);\r
+ return;\r
+}\r
+\r
+void WeatherPageHoursGroup::InitImage(int index)\r
+{\r
+ int weatherPosX[WEATHER_24H_PER_8H] = {67, 161, 257, 351, 67, 161, 257, 351};\r
+ int weatherPosY[WEATHER_24H_PER_8H] = {125, 125, 125, 125, 289, 289, 289, 289};\r
+ int backPosX[WEATHER_24H_PER_8H] = {47, 141, 235, 329, 47, 141, 235, 329};\r
+ int backPosY[WEATHER_24H_PER_8H] = {71, 71, 71, 71, 235, 235, 235, 235};\r
+ for (int i = 0; i < WEATHER_24H_PER_8H; i++) {\r
+ imgBack_[i] = new UIImageView();\r
+ if (imgBack_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImage new imgBack_ fail");\r
+ return;\r
+ }\r
+ imgBack_[i]->SetPosition(backPosX[i], backPosY[i]);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(imgBack_[i], IMAGE_WEATHER_ITEM3, IMAGE_WEATHER_ITEM4);\r
+\r
+ imgWeather_[i] = new UIImageView();\r
+ if (imgWeather_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImage new labelTime_ fail");\r
+ return;\r
+ }\r
+ imgWeather_[i]->SetPosition(weatherPosX[i], weatherPosY[i]);\r
+ int curWeatherCode_ = std::atoi(houWeather_[index + i].weather);\r
+ LOADIMG::LoadImageViewImg(imgWeather_[i], WEATHER_IMAGE, smallWeatherImage[curWeatherCode_]);\r
+ Add(imgBack_[i]);\r
+ Add(imgWeather_[i]);\r
+ }\r
+}\r
+\r
+void WeatherPageHoursGroup::InitLabel(int index)\r
+{\r
+ int timePosX[WEATHER_24H_PER_8H] = {67, 161, 255, 349, 67, 161, 255, 349};\r
+ int timePosY[WEATHER_24H_PER_8H] = {91, 91, 91, 91, 255, 255, 255, 255};\r
+ int tempPosX[WEATHER_24H_PER_8H] = {75, 169, 263, 356, 75, 169, 263, 356};\r
+ int tempPosY[WEATHER_24H_PER_8H] = {175, 175, 175, 175, 339, 339, 339, 339};\r
+\r
+ for (int i = 0; i < WEATHER_24H_PER_8H; i++) {\r
+ labelTime_[i] = new UILabel();\r
+ if (labelTime_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel new labelTime_ fail");\r
+ return;\r
+ }\r
+ std::string strHour = houWeather_[index + i].hour;\r
+ labelTime_[i]->SetText(strHour.c_str());\r
+ labelTime_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABELTIME_FRONT);\r
+ labelTime_[i]->SetPosition(timePosX[i], timePosY[i], WEATHER_TITLE_WIDTH, WEATHER_TITLE_HEIGHT);\r
+ Add(labelTime_[i]);\r
+\r
+ labelTemp_[i] = new UILabel();\r
+ if (labelTemp_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel new labelTemp_ fail");\r
+ return;\r
+ }\r
+ std::ostringstream oss;\r
+ oss << houWeather_[index + i].temp << "°";\r
+ std::string temp = oss.str();\r
+ labelTemp_[i]->SetText(temp.c_str());\r
+ labelTemp_[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABELTIME_FRONT_TWO);\r
+ labelTemp_[i]->SetPosition(tempPosX[i], tempPosY[i], WEATHER_TITLE_WIDTH, WEATHER_TITLE_HEIGHT);\r
+ Add(labelTemp_[i]);\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageLunarPhase\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageLunarPhase.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 24;\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE_TWO = 30;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 198;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_Y = 41;\r
+static constexpr int16_t WEATHER_TITLE_SIZE_WIDTH = 454;\r
+static constexpr int16_t WEATHER_TITLE_SIZE_HEIGHT = 49;\r
+static constexpr int16_t WEATHER_LUNAR_POSITION_X = 169;\r
+static constexpr int16_t WEATHER_LUNAR_POSITION_Y = 290;\r
+static constexpr int16_t WEATHER_BUTTON_LEFT_POSITION_X = 76;\r
+static constexpr int16_t WEATHER_BUTTON_RIGHT_POSITION_X = 306;\r
+static constexpr int16_t WEATHER_BUTTON_POSITION_Y = 50;\r
+static constexpr int16_t WEATHER_BUTTON_SIZE = 69;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_X = 166;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_Y = 160;\r
+static constexpr int16_t WEATHER_LABEL_DAY_POSITION_X = 184;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_WIDTH = 89;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_HEIGHT = 30;\r
+static constexpr int16_t WEATHER_PHASE_SIZE_WIDTH = 117;\r
+static constexpr int16_t WEATHER_PHASE_SIZE_HEIGHT = 49;\r
+static constexpr int16_t WEATHER_LIGHT_SIZE_WIDTH = 173;\r
+static constexpr int16_t WEATHER_LIGHT_SIZE_HEIGHT = 39;\r
+static constexpr int16_t WEATHER_LIGHT_POSITION_X = 141;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_LUNARPHASE_PAGE, WeatherPageLunarPhase, false);\r
+\r
+WeatherPageLunarPhase::WeatherPageLunarPhase()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageLunarPhase::WeatherPageLunarPhase");\r
+}\r
+\r
+WeatherPageLunarPhase::~WeatherPageLunarPhase()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+\r
+ if (drawImg_ != nullptr) {\r
+ delete drawImg_;\r
+ drawImg_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelDay_ != nullptr) {\r
+ delete labelDay_;\r
+ labelDay_ = nullptr;\r
+ }\r
+\r
+ if (labelLunarPhase_ != nullptr) {\r
+ delete labelLunarPhase_;\r
+ labelLunarPhase_ = nullptr;\r
+ }\r
+\r
+ if (labelMonthLight_ != nullptr) {\r
+ delete labelMonthLight_;\r
+ labelMonthLight_ = nullptr;\r
+ }\r
+\r
+ if (labelMonthDay_ != nullptr) {\r
+ delete labelMonthDay_;\r
+ labelMonthDay_ = nullptr;\r
+ }\r
+\r
+ if (buttonChangeLeft_ != nullptr) {\r
+ delete buttonChangeLeft_;\r
+ buttonChangeLeft_ = nullptr;\r
+ }\r
+\r
+ if (buttonChangeRight_ != nullptr) {\r
+ delete buttonChangeRight_;\r
+ buttonChangeRight_ = nullptr;\r
+ }\r
+\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageLunarPhase::~WeatherPageLunarPhase");\r
+}\r
+\r
+void WeatherPageLunarPhase::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetViewId("phaseGroup");\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ phase_ = WeatherModel::GetInstance().GetLunarPhaseData();\r
+ InitImage();\r
+ InitLabel();\r
+ InitButton();\r
+ InitMonthLabel();\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void WeatherPageLunarPhase::InitImage()\r
+{\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ new image fail");\r
+ return;\r
+ }\r
+ bgImg_->SetPosition(0, 0);\r
+ bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+ drawImg_ = new UIImageView();\r
+ if (drawImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "drawImg_ new image fail");\r
+ return;\r
+ }\r
+ drawImg_->SetPosition(WEATHER_IMAGE_POSITION_X, WEATHER_IMAGE_POSITION_Y);\r
+ drawImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, IMAGE_WEATHER_MOON1);\r
+ group_->Add(bgImg_);\r
+ group_->Add(drawImg_);\r
+}\r
+\r
+void WeatherPageLunarPhase::InitLabel()\r
+{\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ is nullptr");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_TITLE_POSITION_Y);\r
+ labelTitle_->SetText("月相");\r
+ labelTitle_->Resize(WEATHER_TITLE_SIZE_WIDTH, WEATHER_TITLE_SIZE_HEIGHT);\r
+ labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE_TWO);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ labelDay_ = new UILabel();\r
+ if (labelDay_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelDay_ is nullptr");\r
+ return;\r
+ }\r
+ labelDay_->SetPosition(WEATHER_LABEL_DAY_POSITION_X, WEATHER_TITLE_POSITION_Y + labelTitle_->GetTextHeight());\r
+ labelDay_->SetText("今天");\r
+ labelDay_->Resize(WEATHER_LABEL_DAY_SIZE_WIDTH, WEATHER_LABEL_DAY_SIZE_HEIGHT);\r
+ labelDay_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelDay_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ WeatherModel::GetInstance().LoadTextColorOfDayNight(labelDay_, Color::White().full, Color::Gray().full);\r
+ labelDay_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelDay_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ group_->Add(labelTitle_);\r
+ group_->Add(labelDay_);\r
+}\r
+\r
+void WeatherPageLunarPhase::InitMonthLabel()\r
+{\r
+ labelLunarPhase_ = new UILabel();\r
+ if (labelLunarPhase_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelLunarPhase_ is nullptr");\r
+ return;\r
+ }\r
+ labelLunarPhase_->SetPosition(WEATHER_LUNAR_POSITION_X, WEATHER_LUNAR_POSITION_Y);\r
+ labelLunarPhase_->Resize(WEATHER_PHASE_SIZE_WIDTH, WEATHER_PHASE_SIZE_HEIGHT);\r
+ labelLunarPhase_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE_TWO);\r
+ labelLunarPhase_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelLunarPhase_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelLunarPhase_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelLunarPhase_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ labelLunarPhase_->SetText(phase_[0].phase);\r
+\r
+ labelMonthLight_ = new UILabel();\r
+ if (labelMonthLight_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelMonthLight_ is nullptr");\r
+ return;\r
+ }\r
+ labelMonthLight_->SetPosition(WEATHER_LIGHT_POSITION_X, labelLunarPhase_->GetY()\r
+ + labelLunarPhase_->GetTextHeight());\r
+ labelMonthLight_->Resize(WEATHER_LIGHT_SIZE_WIDTH, WEATHER_LIGHT_SIZE_HEIGHT);\r
+ labelMonthLight_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelMonthLight_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelMonthLight_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadTextColorOfDayNight(labelMonthLight_, Color::White().full, Color::Gray().full);\r
+ labelMonthLight_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelMonthLight_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ labelMonthLight_->SetText(phase_[0].lightTime);\r
+\r
+ labelMonthDay_ = new UILabel();\r
+ if (labelMonthDay_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelMonthDay_ is nullptr");\r
+ return;\r
+ }\r
+ labelMonthDay_->SetPosition(WEATHER_LIGHT_POSITION_X, labelMonthLight_->GetY() + labelMonthLight_->GetTextHeight());\r
+ labelMonthDay_->Resize(WEATHER_LIGHT_SIZE_WIDTH, WEATHER_LIGHT_SIZE_HEIGHT);\r
+ labelMonthDay_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelMonthDay_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelMonthDay_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadTextColorOfDayNight(labelMonthDay_, Color::White().full, Color::Gray().full);\r
+ labelMonthDay_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelMonthDay_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ labelMonthDay_->SetText(phase_[0].monthDay);\r
+ group_->Add(labelLunarPhase_);\r
+ group_->Add(labelMonthLight_);\r
+ group_->Add(labelMonthDay_);\r
+}\r
+\r
+void WeatherPageLunarPhase::InitButton()\r
+{\r
+ buttonChangeLeft_ = new UIButton();\r
+ if (buttonChangeLeft_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeLeft_ is nullptr");\r
+ return;\r
+ }\r
+ buttonChangeLeft_->SetPosition(WEATHER_BUTTON_LEFT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+ buttonChangeLeft_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+ buttonChangeLeft_->SetViewId("buttonLeft");\r
+ buttonChangeLeft_->SetOnClickListener(this);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ buttonChangeLeft_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY, IMAGE_WEATHER_PREV_GRAY);\r
+ buttonChangeRight_ = new UIButton();\r
+\r
+ if (buttonChangeRight_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeRight_ new fail");\r
+ return;\r
+ }\r
+ buttonChangeRight_->SetPosition(WEATHER_BUTTON_RIGHT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+ buttonChangeRight_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+ buttonChangeRight_->SetViewId("buttonRight");\r
+ buttonChangeRight_->SetOnClickListener(this);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ buttonChangeRight_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Disable();\r
+ group_->Add(buttonChangeLeft_);\r
+ group_->Add(buttonChangeRight_);\r
+}\r
+\r
+bool WeatherPageLunarPhase::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MONTHRISE_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool WeatherPageLunarPhase::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+\r
+ if (strcmp(view.GetViewId(), "buttonLeft") == 0) {\r
+ if (index_ > 0) {\r
+ labelDay_->SetText(phase_[--index_].weekTime);\r
+ labelLunarPhase_->SetText(phase_[index_].phase);\r
+ labelMonthLight_->SetText(phase_[index_].lightTime);\r
+ labelMonthDay_->SetText(phase_[index_].monthDay);\r
+ LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, phase_[index_].image);\r
+ if (index_ == 0) {\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY,\r
+ IMAGE_WEATHER_PREV_GRAY);\r
+ buttonChangeLeft_->Disable();\r
+ } else {\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Enable();\r
+ buttonChangeRight_->Enable();\r
+ }\r
+ }\r
+ } else if (strcmp(view.GetViewId(), "buttonRight") == 0) {\r
+ if (index_ < BUTTON_CHANGE_END) {\r
+ labelDay_->SetText(phase_[++index_].weekTime);\r
+ labelLunarPhase_->SetText(phase_[index_].phase);\r
+ labelMonthLight_->SetText(phase_[index_].lightTime);\r
+ labelMonthDay_->SetText(phase_[index_].monthDay);\r
+ LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, phase_[index_].image);\r
+ if (index_ == BUTTON_CHANGE_END) {\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT_GRAY,\r
+ IMAGE_WEATHER_NEXT_GRAY);\r
+ buttonChangeRight_->Disable();\r
+ } else {\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Enable();\r
+ buttonChangeRight_->Enable();\r
+ }\r
+ }\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageMonthRise\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageMonthRise.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_TITLE_FONT_SIZE = 30;\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 24;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_WIDTH = 117;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_HEIGHT = 38;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 167;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_Y = 41;\r
+static constexpr int16_t WEATHER_TITLE_DAY_POSITION_X = 49;\r
+static constexpr int16_t WEATHER_TITLE_DAY_POSITION_Y = 318;\r
+static constexpr int16_t WEATHER_BUTTON_LEFT_POSITION_X = 76;\r
+static constexpr int16_t WEATHER_BUTTON_RIGHT_POSITION_X = 306;\r
+static constexpr int16_t WEATHER_BUTTON_POSITION_Y = 50;\r
+static constexpr int16_t WEATHER_BUTTON_SIZE = 69;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_X = 0;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_Y = 214;\r
+static constexpr int16_t WEATHER_IMAGE_MONTH_POSITION_X = 280;\r
+static constexpr int16_t WEATHER_IMAGE_MONTH_POSITION_Y = 264;\r
+static constexpr int16_t WEATHER_LABEL_DAY_POSITION_X = 184;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_WIDTH = 89;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_HEIGHT = 30;\r
+static constexpr int16_t WEATHER_LABEL_MOHTH_SIZE_WIDTH = 113;\r
+static constexpr int16_t WEATHER_LABEL_MONTH_SIZE_HEIGHT = 30;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_MONTHRISE_PAGE, WeatherPageMonthRise, false);\r
+\r
+WeatherPageMonthRise::WeatherPageMonthRise()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageMonthRise::WeatherPageMonthRise");\r
+}\r
+\r
+WeatherPageMonthRise::~WeatherPageMonthRise()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+\r
+ if (drawImg_ != nullptr) {\r
+ delete drawImg_;\r
+ drawImg_ = nullptr;\r
+ }\r
+\r
+ if (monthImg_ != nullptr) {\r
+ delete monthImg_;\r
+ monthImg_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelDay_ != nullptr) {\r
+ delete labelDay_;\r
+ labelDay_ = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < MONTHRISE_TIME_LABEL_COUNT; i++) {\r
+ if (labelMonth_[i] != nullptr) {\r
+ delete labelMonth_[i];\r
+ labelMonth_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ if (buttonChangeLeft_ != nullptr) {\r
+ delete buttonChangeLeft_;\r
+ buttonChangeLeft_ = nullptr;\r
+ }\r
+\r
+ if (buttonChangeRight_ != nullptr) {\r
+ delete buttonChangeRight_;\r
+ buttonChangeRight_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageMonthRise::~WeatherPageMonthRise");\r
+}\r
+\r
+void WeatherPageMonthRise::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group_ new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetViewId("monthGroup");\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ month_ = WeatherModel::GetInstance().GetMonthData();\r
+ InitImage();\r
+ InitLabel();\r
+ InitLabelMonth();\r
+ InitButton();\r
+ index_ = 0;\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void WeatherPageMonthRise::InitImage()\r
+{\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ new image fail");\r
+ return;\r
+ }\r
+ bgImg_->SetPosition(0, 0);\r
+ bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+\r
+ drawImg_ = new UIImageView();\r
+ if (drawImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "drawImg_ new image fail");\r
+ return;\r
+ }\r
+ drawImg_->SetPosition(WEATHER_IMAGE_POSITION_X, WEATHER_IMAGE_POSITION_Y);\r
+ drawImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, IMAGE_WEATHER_SUNSET);\r
+\r
+ monthImg_ = new UIImageView();\r
+ if (monthImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "monthImg_ new image fail");\r
+ return;\r
+ }\r
+ monthImg_->SetPosition(WEATHER_IMAGE_MONTH_POSITION_X, WEATHER_IMAGE_MONTH_POSITION_Y);\r
+ monthImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(monthImg_, WEATHER_IMAGE, IMAGE_WEATHER_MOON);\r
+ group_->Add(bgImg_);\r
+ group_->Add(drawImg_);\r
+ group_->Add(monthImg_);\r
+}\r
+\r
+void WeatherPageMonthRise::InitLabel()\r
+{\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ is nullptr");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_TITLE_POSITION_Y);\r
+ labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelTitle_->SetText("月出月落");\r
+ labelTitle_->Resize(WEATHER_RESIZE_SIZE_WIDTH, WEATHER_RESIZE_SIZE_HEIGHT);\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_TITLE_FONT_SIZE);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ labelDay_ = new UILabel();\r
+ if (labelDay_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelDay_ is nullptr");\r
+ return;\r
+ }\r
+ labelDay_->SetPosition(WEATHER_LABEL_DAY_POSITION_X, WEATHER_TITLE_POSITION_Y + labelTitle_->GetTextHeight());\r
+ labelDay_->SetText("今天");\r
+ labelDay_->Resize(WEATHER_LABEL_DAY_SIZE_WIDTH, WEATHER_LABEL_DAY_SIZE_HEIGHT);\r
+ labelDay_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelDay_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelDay_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadTextColorOfDayNight(labelDay_, Color::White().full, Color::Gray().full);\r
+ labelDay_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ std::string monthRise = std::string();\r
+ std::string monthSet = std::string();\r
+ labelDay_->SetText(month_[0].weekTime);\r
+ group_->Add(labelTitle_);\r
+ group_->Add(labelDay_);\r
+}\r
+\r
+void WeatherPageMonthRise::InitLabelMonth()\r
+{\r
+ for (int i = 0; i < MONTHRISE_TIME_LABEL_COUNT; i++) {\r
+ labelMonth_[i] = new UILabel();\r
+ if (labelMonth_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelMonth_:[%d] is nullptr", i);\r
+ return;\r
+ }\r
+ int offsetX = 250;\r
+ labelMonth_[i]->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelMonth_[i]->SetPosition(WEATHER_TITLE_DAY_POSITION_X + i * offsetX, WEATHER_TITLE_DAY_POSITION_Y);\r
+ labelMonth_[i]->Resize(WEATHER_LABEL_MOHTH_SIZE_WIDTH, WEATHER_LABEL_MONTH_SIZE_HEIGHT);\r
+ labelMonth_[i]->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelMonth_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelMonth_[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadTextColorOfDayNight(labelMonth_[i], Color::White().full, Color::Gray().full);\r
+ labelMonth_[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group_->Add(labelMonth_[i]);\r
+ }\r
+ labelMonth_[0]->SetText(month_[0].monthRise);\r
+ labelMonth_[1]->SetText(month_[0].monthSet);\r
+}\r
+\r
+void WeatherPageMonthRise::InitButton()\r
+{\r
+ buttonChangeLeft_ = new UIButton();\r
+ if (buttonChangeLeft_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeLeft_ new button fail");\r
+ return;\r
+ }\r
+ buttonChangeLeft_->SetPosition(WEATHER_BUTTON_LEFT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+ buttonChangeLeft_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+ buttonChangeLeft_->SetViewId("buttonLeft");\r
+ buttonChangeLeft_->SetOnClickListener(this);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ buttonChangeLeft_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY, IMAGE_WEATHER_PREV_GRAY);\r
+ buttonChangeRight_ = new UIButton();\r
+ if (buttonChangeRight_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeRight_ new button fail");\r
+ return;\r
+ }\r
+ buttonChangeRight_->SetPosition(WEATHER_BUTTON_RIGHT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+ buttonChangeRight_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+ buttonChangeRight_->SetViewId("buttonRight");\r
+ buttonChangeRight_->SetOnClickListener(this);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ buttonChangeRight_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Disable();\r
+ group_->Add(buttonChangeLeft_);\r
+ group_->Add(buttonChangeRight_);\r
+}\r
+\r
+bool WeatherPageMonthRise::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_SUNRISE_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_LUNARPHASE_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool WeatherPageMonthRise::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+\r
+ if (strcmp(view.GetViewId(), "buttonLeft") == 0) {\r
+ if (index_ > 0) {\r
+ labelDay_->SetText(month_[--index_].weekTime);\r
+ labelMonth_[0]->SetText(month_[index_].monthRise);\r
+ labelMonth_[1]->SetText(month_[index_].monthSet);\r
+ if (index_ == 0) {\r
+ monthImg_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY,\r
+ IMAGE_WEATHER_PREV_GRAY);\r
+ buttonChangeLeft_->Disable();\r
+ } else {\r
+ monthImg_->SetVisible(false);\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Enable();\r
+ buttonChangeRight_->Enable();\r
+ }\r
+ }\r
+ } else if (strcmp(view.GetViewId(), "buttonRight") == 0) {\r
+ if (index_ < BUTTON_CHANGE_END) {\r
+ monthImg_->SetVisible(false);\r
+ labelDay_->SetText(month_[++index_].weekTime);\r
+ labelMonth_[0]->SetText(month_[index_].monthRise);\r
+ labelMonth_[1]->SetText(month_[index_].monthSet);\r
+ if (index_ == BUTTON_CHANGE_END) {\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT_GRAY,\r
+ IMAGE_WEATHER_NEXT_GRAY);\r
+ buttonChangeRight_->Disable();\r
+ } else {\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Enable();\r
+ buttonChangeRight_->Enable();\r
+ }\r
+ }\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageSunRise\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_weather.h"\r
+#include "wearable_log.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherPageSunRise.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_TITLE_FONT_SIZE = 30;\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 24;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_WIDTH = 117;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_HEIGHT = 38;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 167;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_Y = 41;\r
+static constexpr int16_t WEATHER_TITLE_DAY_POSITION_X = 49;\r
+static constexpr int16_t WEATHER_TITLE_DAY_POSITION_Y = 318;\r
+static constexpr int16_t WEATHER_TITLE_OFFSET = 250;\r
+static constexpr int16_t WEATHER_BUTTON_LEFT_POSITION_X = 76;\r
+static constexpr int16_t WEATHER_BUTTON_RIGHT_POSITION_X = 306;\r
+static constexpr int16_t WEATHER_BUTTON_POSITION_Y = 50;\r
+static constexpr int16_t WEATHER_BUTTON_SIZE = 69;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_X = 0;\r
+static constexpr int16_t WEATHER_IMAGE_POSITION_Y = 168;\r
+static constexpr int16_t WEATHER_IMAGE_SUN_POSITION_X = 135;\r
+static constexpr int16_t WEATHER_LABEL_DAY_POSITION_X = 184;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_WIDTH = 89;\r
+static constexpr int16_t WEATHER_LABEL_DAY_SIZE_HEIGHT = 30;\r
+static constexpr int16_t WEATHER_LABEL_SUN_SIZE_WIDTH = 113;\r
+static constexpr int16_t WEATHER_LABEL_SUN_SIZE_HEIGHT = 30;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_SUNRISE_PAGE, WeatherPageSunRise, false);\r
+\r
+WeatherPageSunRise::WeatherPageSunRise()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSunRise::WeatherPageSunRise");\r
+}\r
+\r
+WeatherPageSunRise::~WeatherPageSunRise()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+\r
+ if (bgImg_ != nullptr) {\r
+ delete bgImg_;\r
+ bgImg_ = nullptr;\r
+ }\r
+\r
+ if (drawImg_ != nullptr) {\r
+ delete drawImg_;\r
+ drawImg_ = nullptr;\r
+ }\r
+\r
+ if (sunImg_ != nullptr) {\r
+ delete sunImg_;\r
+ sunImg_ = nullptr;\r
+ }\r
+\r
+ if (labelTitle_ != nullptr) {\r
+ delete labelTitle_;\r
+ labelTitle_ = nullptr;\r
+ }\r
+\r
+ if (labelDay_ != nullptr) {\r
+ delete labelDay_;\r
+ labelDay_ = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < SUNRISE_TIME_LABEL_COUNT; i++) {\r
+ if (labelSun_[i] != nullptr) {\r
+ delete labelSun_[i];\r
+ labelSun_[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ if (buttonChangeLeft_ != nullptr) {\r
+ delete buttonChangeLeft_;\r
+ buttonChangeLeft_ = nullptr;\r
+ }\r
+\r
+ if (buttonChangeRight_ != nullptr) {\r
+ delete buttonChangeRight_;\r
+ buttonChangeRight_ = nullptr;\r
+ }\r
+\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSunRise::~WeatherPageSunRise");\r
+}\r
+\r
+void WeatherPageSunRise::OnStart(void *data)\r
+{\r
+ group_ = new UIViewGroup();\r
+ if (group_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Group new fail");\r
+ return;\r
+ }\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetViewId("weatherSwipeGroup_");\r
+ group_->SetOnDragListener(this);\r
+ group_->SetDraggable(true);\r
+ group_->SetTouchable(true);\r
+ sun_ = WeatherModel::GetInstance().GetSunData();\r
+ InitImage();\r
+ InitLabel();\r
+ InitLabelSun();\r
+ InitButton();\r
+ index_ = 0;\r
+ AddViewToPageContainer(group_);\r
+}\r
+\r
+void WeatherPageSunRise::InitImage()\r
+{\r
+ bgImg_ = new UIImageView();\r
+ if (bgImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bgImg_ new image fail");\r
+ return;\r
+ }\r
+ bgImg_->SetPosition(0, 0);\r
+ bgImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadImageOfDayNight(bgImg_, IMAGE_WEATHER_BG1, IMAGE_WEATHER_BG2);\r
+\r
+ drawImg_ = new UIImageView();\r
+ if (drawImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "drawImg_ new image fail");\r
+ return;\r
+ }\r
+ drawImg_->SetPosition(WEATHER_IMAGE_POSITION_X, WEATHER_IMAGE_POSITION_Y);\r
+ drawImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(drawImg_, WEATHER_IMAGE, IMAGE_WEATHER_SUNRISE);\r
+\r
+ sunImg_ = new UIImageView();\r
+ if (sunImg_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sunImg_ new image fail");\r
+ return;\r
+ }\r
+ sunImg_->SetPosition(WEATHER_IMAGE_SUN_POSITION_X, WEATHER_IMAGE_POSITION_Y);\r
+ sunImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(sunImg_, WEATHER_IMAGE, IMAGE_WEATHER_SUN);\r
+\r
+ group_->Add(bgImg_);\r
+ group_->Add(drawImg_);\r
+ group_->Add(sunImg_);\r
+}\r
+\r
+void WeatherPageSunRise::InitLabel()\r
+{\r
+ labelTitle_ = new UILabel();\r
+ if (labelTitle_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelTitle_ is nullptr");\r
+ return;\r
+ }\r
+ labelTitle_->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_TITLE_POSITION_Y);\r
+ labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelTitle_->SetText("日出日落");\r
+ labelTitle_->Resize(WEATHER_RESIZE_SIZE_WIDTH, WEATHER_RESIZE_SIZE_HEIGHT);\r
+ labelTitle_->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_TITLE_FONT_SIZE);\r
+ labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelTitle_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ labelDay_ = new UILabel();\r
+ if (labelDay_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelDay_ is nullptr");\r
+ return;\r
+ }\r
+ labelDay_->SetPosition(WEATHER_LABEL_DAY_POSITION_X, WEATHER_TITLE_POSITION_Y + labelTitle_->GetTextHeight());\r
+ labelDay_->SetText("今天");\r
+ labelDay_->Resize(WEATHER_LABEL_DAY_SIZE_WIDTH, WEATHER_LABEL_DAY_SIZE_HEIGHT);\r
+ labelDay_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelDay_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelDay_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadTextColorOfDayNight(labelDay_, Color::White().full, Color::Gray().full);\r
+ labelDay_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelDay_->SetText(sun_[0].weekTime);\r
+ group_->Add(labelTitle_);\r
+ group_->Add(labelDay_);\r
+}\r
+\r
+void WeatherPageSunRise::InitLabelSun()\r
+{\r
+ for (int i = 0; i < SUNRISE_TIME_LABEL_COUNT; i++) {\r
+ labelSun_[i] = new UILabel();\r
+ if (labelSun_[i] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelSun_[%d] is nullptr", i);\r
+ return;\r
+ }\r
+ labelSun_[i]->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ labelSun_[i]->SetPosition(WEATHER_TITLE_DAY_POSITION_X + i * WEATHER_TITLE_OFFSET,\r
+ WEATHER_TITLE_DAY_POSITION_Y);\r
+ labelSun_[i]->Resize(WEATHER_LABEL_SUN_SIZE_WIDTH, WEATHER_LABEL_SUN_SIZE_HEIGHT);\r
+ labelSun_[i]->SetFont(BOLD_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ labelSun_[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelSun_[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ WeatherModel::GetInstance().LoadTextColorOfDayNight(labelSun_[i], Color::White().full, Color::Gray().full);\r
+ labelSun_[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group_->Add(labelSun_[i]);\r
+ }\r
+ std::string sunRise = "日出 " + std::string(sun_[0].sunRise);\r
+ std::string sunSet = "日落 " + std::string(sun_[0].sunSet);\r
+ labelSun_[0]->SetText(sunRise.c_str());\r
+ labelSun_[1]->SetText(sunSet.c_str());\r
+}\r
+\r
+void WeatherPageSunRise::InitButton()\r
+{\r
+ buttonChangeLeft_ = new UIButton();\r
+ if (buttonChangeLeft_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeLeft_ is nullptr");\r
+ return;\r
+ }\r
+ buttonChangeLeft_->SetPosition(WEATHER_BUTTON_LEFT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+ buttonChangeLeft_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+ buttonChangeLeft_->SetViewId("buttonLeft");\r
+ buttonChangeLeft_->SetOnClickListener(this);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonChangeLeft_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ buttonChangeLeft_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY, IMAGE_WEATHER_PREV_GRAY);\r
+\r
+ buttonChangeRight_ = new UIButton();\r
+ if (buttonChangeRight_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonChangeRight_ is nullptr");\r
+ return;\r
+ }\r
+ buttonChangeRight_->SetPosition(WEATHER_BUTTON_RIGHT_POSITION_X, WEATHER_BUTTON_POSITION_Y);\r
+ buttonChangeRight_->Resize(WEATHER_BUTTON_SIZE, WEATHER_BUTTON_SIZE);\r
+ buttonChangeRight_->SetViewId("buttonRight");\r
+ buttonChangeRight_->SetOnClickListener(this);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonChangeRight_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ buttonChangeRight_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Disable();\r
+ group_->Add(buttonChangeLeft_);\r
+ group_->Add(buttonChangeRight_);\r
+}\r
+\r
+bool WeatherPageSunRise::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSliceToApplist();\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MONTHRISE_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE,\r
+ TransitionType::TRANSITION_INVALID, false);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool WeatherPageSunRise::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (strcmp(view.GetViewId(), "buttonLeft") == 0) {\r
+ if (index_ > 0) {\r
+ labelDay_->SetText(sun_[--index_].weekTime);\r
+ std::string sunRise = "日出 " + std::string(sun_[index_].sunRise);\r
+ std::string sunSet = "日落 " + std::string(sun_[index_].sunSet);\r
+ labelSun_[0]->SetText(sunRise.c_str());\r
+ labelSun_[1]->SetText(sunSet.c_str());\r
+ if (index_ == 0) {\r
+ sunImg_->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV_GRAY,\r
+ IMAGE_WEATHER_PREV_GRAY);\r
+ buttonChangeLeft_->Disable();\r
+ } else {\r
+ sunImg_->SetVisible(false);\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Enable();\r
+ buttonChangeRight_->Enable();\r
+ }\r
+ }\r
+ } else if (strcmp(view.GetViewId(), "buttonRight") == 0) {\r
+ if (index_ < BUTTON_CHANGE_END) {\r
+ labelDay_->SetText(sun_[++index_].weekTime);\r
+ std::string sunRise = "日出 " + std::string(sun_[index_].sunRise);\r
+ std::string sunSet = "日落 " + std::string(sun_[index_].sunSet);\r
+ labelSun_[0]->SetText(sunRise.c_str());\r
+ labelSun_[1]->SetText(sunSet.c_str());\r
+ sunImg_->SetVisible(false);\r
+ if (index_ == BUTTON_CHANGE_END) {\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT_GRAY,\r
+ IMAGE_WEATHER_NEXT_GRAY);\r
+ buttonChangeRight_->Disable();\r
+ } else {\r
+ LOADIMG::LoadBtnImage(buttonChangeLeft_, WEATHER_IMAGE, IMAGE_WEATHER_PREV, IMAGE_WEATHER_PREV);\r
+ LOADIMG::LoadBtnImage(buttonChangeRight_, WEATHER_IMAGE, IMAGE_WEATHER_NEXT, IMAGE_WEATHER_NEXT);\r
+ buttonChangeLeft_->Enable();\r
+ buttonChangeRight_->Enable();\r
+ }\r
+ }\r
+ }\r
+ return true;\r
+}\r
+}
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: WeatherPresenter\r
* Create: 2025-03-23\r
*/\r
\r
+#include "NativeRegisterManager.h"\r
#include "weather/WeatherView.h"\r
-#include "weather/WeatherModel.h"\r
#include "weather/WeatherPresenter.h"\r
-#include "uiservice/ui_service.h"\r
-#include "NativeRegisterManager.h"\r
-#include "wearable_log.h"\r
\r
namespace OHOS {\r
- REGIST_MENU(VIEW_WEATHER, WeatherView, WeatherPresenter, WEATHER_MAIN_ICON, WEATHER_MAIN_ICON, "天气");\r
+REGIST_MENU(VIEW_WEATHER, WeatherView, WeatherPresenter, WEATHER_ICON, WEATHER_ICON, "天气");\r
}\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: Wearable log header file.\r
+ * Author:\r
+ * Create:\r
+ */\r
+\r
+#ifndef WEARABLE_LOG_H\r
+#define WEARABLE_LOG_H\r
+\r
+#if !defined(SW_UART_DEBUG) && !defined(SW_RTT_DEBUG)\r
+#include "soc_diag_util.h"\r
+#include "log_oam_logger.h"\r
+#include "log_def.h"\r
+#else\r
+#include "debug_print.h"\r
+#endif\r
+#include "wearable_onlinelog.h"\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+\r
+/**\r
+ * @brief Enumerates logging module types.\r
+ *\r
+ * The module type must be globally unique. A maximum of 64 module types can be defined.\r
+ *\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+typedef enum {\r
+ /** applications */\r
+ WEARABLE_LOG_MODULE_APP = 0,\r
+ /** Launcher Framework */\r
+ WEARABLE_LOG_MODULE_LAUNCHER_FWK,\r
+ /** Main Service */\r
+ WEARABLE_LOG_MODULE_MAIN_SERVICE,\r
+ /** Broadcast Service */\r
+ WEARABLE_LOG_MODULE_BROADCASE_SERVICE,\r
+ /** Atomic Ability Framework */\r
+ WEARABLE_LOG_MODULE_AAFWK,\r
+ /** smart voice */\r
+ WEARABLE_LOG_MODULE_SMART_VOICE,\r
+ /* UI SERVICE */\r
+ WEARABLE_LOG_MODULE_UI_SERVICE,\r
+ /* msg_center */\r
+ WEARABLE_LOG_MODULE_MSG_CENTER,\r
+\r
+ WEARABLE_LOG_MODULE_MAX\r
+} WearableLogModuleType;\r
+\r
+#if !defined(SW_UART_DEBUG) && !defined(SW_RTT_DEBUG) && !defined(CONFIG_ONLINE_LOG)\r
+#define WEARABLE_LOGE(mod, fmt, arg...) uapi_diag_error_log(0, fmt, ##arg)\r
+#define WEARABLE_LOGW(mod, fmt, arg...) uapi_diag_warning_log(0, fmt, ##arg)\r
+#define WEARABLE_LOGI(mod, fmt, arg...) uapi_diag_info_log(0, fmt, ##arg)\r
+#ifdef WEARABLE_LOG_DEBUG\r
+#define WEARABLE_LOGD(mod, fmt, arg...) uapi_diag_debug_log(0, fmt, ##arg)\r
+#else\r
+#define WEARABLE_LOGD(mod, fmt, arg...)\r
+#endif\r
+#elif (CONFIG_ONLINE_LOG == 1) && !defined(_WIN32)\r
+#define WEARABLE_LOGE(mod, fmt, arg...) ONLINE_PRINT(ONLINE_ERROR, fmt "\n", ##arg)\r
+#define WEARABLE_LOGW(mod, fmt, arg...) ONLINE_PRINT(ONLINE_WARN, fmt "\n", ##arg)\r
+#define WEARABLE_LOGI(mod, fmt, arg...) ONLINE_PRINT(ONLINE_INFO, fmt "\n", ##arg)\r
+#ifdef WEARABLE_LOG_DEBUG\r
+#define WEARABLE_LOGD(mod, fmt, arg...) ONLINE_PRINT(ONLINE_DEBUG, fmt "\n", ##arg)\r
+#else\r
+#define WEARABLE_LOGD(mod, fmt, arg...)\r
+#endif\r
+#else\r
+#define WEARABLE_LOGE(mod, fmt, arg...) PRINT("[WEARABLE E/] " fmt "\n", ##arg)\r
+#define WEARABLE_LOGW(mod, fmt, arg...) PRINT("[WEARABLE W/] " fmt "\n", ##arg)\r
+#define WEARABLE_LOGI(mod, fmt, arg...) PRINT("[WEARABLE I/] " fmt "\n", ##arg)\r
+#ifdef WEARABLE_LOG_DEBUG\r
+#define WEARABLE_LOGD(mod, fmt, arg...) PRINT("[WEARABLE D/] " fmt "\n", ##arg)\r
+#else\r
+#define WEARABLE_LOGD(mod, fmt, arg...)\r
+#endif\r
+#endif\r
+\r
+#define CHECK_NULL_AND_RETURN(pointer, mod, fmt) \\r
+ do { \\r
+ if ((pointer) == nullptr) { \\r
+ WEARABLE_LOGE((mod), (fmt)); \\r
+ return; \\r
+ } \\r
+ } while (0)\r
+\r
+#define CHECK_NULL_AND_RETURN_NULL(pointer, mod, fmt) \\r
+ do { \\r
+ if ((pointer) == nullptr) { \\r
+ WEARABLE_LOGE((mod), (fmt)); \\r
+ return nullptr; \\r
+ } \\r
+ } while (0)\r
+\r
+#define CHECK_NULL_AND_RETURN_CODE(pointer, mod, fmt, code) \\r
+ do { \\r
+ if ((pointer) == nullptr) { \\r
+ WEARABLE_LOGE((mod), (fmt)); \\r
+ return (code); \\r
+ } \\r
+ } while (0)\r
+\r
+#define DELETE_IF_NOT_NULL(pointer) \\r
+ do { \\r
+ if ((pointer) != nullptr) { \\r
+ delete (pointer); \\r
+ (pointer) = nullptr; \\r
+ } \\r
+ } while (0)\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+}\r
+#endif\r
+#endif\r
+\r
+#endif\r
TOPIC_EVENT_HFP_WATCH_TO_PHONE,\r
TOPIC_EVENT_BLOODOXYGEN_UPDATA,\r
TOPIC_EVENT_SPORT_DISTANCE,\r
- TOPIC_EVENT_LOCATION,\r
+ TOPIC_EVENT_CALENDAR_NOTIFY,\r
TOPIC_END_NUM = 20000,\r
} TopicNum;\r
\r
{TOPIC_EVENT_HFP_WATCH_TO_PHONE, A_CORE_MASK, 1},
{TOPIC_EVENT_BLOODOXYGEN_UPDATA, A_CORE_MASK, 1},
{TOPIC_EVENT_SPORT_DISTANCE, A_CORE_MASK, 1},
- {TOPIC_EVENT_LOCATION, A_CORE_MASK, 1},
};
/* 所有的topic,其对应的位图 */
set(COMPONENT_NAME "device_msg")\r
\r
set(PUBLIC_HEADER\r
-${CMAKE_CURRENT_SOURCE_DIR}\r
)\r
\r
set(PRIVATE_HEADER\r
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include\r
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/innerkits\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks\r
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits\r
${ROOT_DIR}/middleware/services/media/foundation/audiomanager/interfaces/kits/audiomanager\r
${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks\r
${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits\r
${ROOT_DIR}/middleware/chips/brandy/nv/include\r
${ROOT_DIR}/middleware/chips/brandy/nv/nv_config\r
+ ${ROOT_DIR}/application/wearable/nativeapp/nativeui/include\r
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include\r
${ROOT_DIR}/open_source/openharmony/base/sensors/location/interfaces/kits/include\r
${ROOT_DIR}/middleware/utils/dfx/diag/\r
+ ${ROOT_DIR}/open_source/openharmony/third_party/cJSON\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/utils/innerkits\r
+ ${ROOT_DIR}/application/wearable/nativeapp/nativeui/\r
)\r
\r
set(SOURCES\r
${CMAKE_CURRENT_SOURCE_DIR}/device_msg.cpp\r
${CMAKE_CURRENT_SOURCE_DIR}/device_proxy.cpp\r
${CMAKE_CURRENT_SOURCE_DIR}/msg_center_device.cpp\r
- ${CMAKE_CURRENT_SOURCE_DIR}/device_location.cpp\r
)\r
\r
set(COMPONENT_PUBLIC_CCFLAGS\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
- * Description: Breath Ease\r
- * Author: wangle\r
- * Create: 2025-4-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Device Msg\r
+ * Create: 2025-06-06\r
*/\r
+\r
#include "msg_center_protocol.h"\r
#include "msg_center_cmd.h"\r
#include "ohos_init.h"\r
#include "graphic_timer.h"\r
#include "broadcast_feature.h"\r
#include "ohos_timer.h"\r
-#include "heartrate/HeartModel.h"\r
-#include "device_location.h"\r
#endif\r
namespace OHOS {\r
\r
#define HEARTRATE_RANGE 60\r
static uint8_t g_rotation_publish = 0;\r
static GraphicTimer *g_publishTestDataHandle = nullptr;\r
-enum publishDataType {\r
- PUBLISH_SETP = 0,\r
- PUBLISH_DISTANCE,\r
- PUBLISH_HEARTRATE,\r
- PUBLISH_BLOODOXYGEN,\r
- PUBLISH_TYPE_MAX\r
-};\r
-\r
+enum publishDataType { PUBLISH_SETP = 0, PUBLISH_DISTANCE, PUBLISH_HEARTRATE, PUBLISH_BLOODOXYGEN, PUBLISH_TYPE_MAX };\r
static void PublishTopicTestDataEvent(uint16_t topic, const void *data, size_t len)\r
{\r
int32_t ret;\r
}\r
}\r
\r
-void PublishTestData()\r
+static void PublishTestData()\r
{\r
uint32 tick = GetOSTick(5000); // 5秒发布一次测试数据\r
if (g_publishTestDataHandle == nullptr) {\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_STORAGE_INFO, msg_center_get_storage_info},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_PRODUCT_INFO, msg_center_get_product_info},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_LANGUAGE_ID, msg_center_get_language_id},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_VOLUME_INFO, msg_center_get_volume_info},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_LANGUAGE_ID, msg_center_set_language_id},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_VOLUME_INFO, msg_center_set_volume_info},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_HEARTRATE, msg_center_device_heartrate},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_STEPDATA, msg_center_device_stepdata},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN, msg_center_device_bloodoxygen},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH, msg_center_offline_log_switch},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_GET_INFO, msg_center_location_get_info},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_START, msg_center_location_start},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_STOP, msg_center_location_stop},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_ACTION, msg_center_sport_action},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_GET_DATA, msg_center_sport_get_data},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_DATA, msg_center_sport_report_data},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_GET_RECORD, msg_center_sport_get_record},\r
#if (CONFIG_ONLINE_LOG == 1)\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL, msg_center_set_online_log_channel},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL, msg_center_set_online_log_level},\r
#endif\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OTA_INIT, msg_center_ota_init},\r
{MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OTA_UPDATE, msg_center_ota_update},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OFF_FIND_PHONE, msg_center_device_findphone},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_WATCH_EXIT, msg_center_camera_exit},\r
- {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE_SUCCESS, msg_center_camera_online},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_STOP_FIND_PHONE, msg_center_device_findphone},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_WATCH_EXIT_CAMERA, msg_center_camera_exit},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_CONNECTED_PHONE, msg_center_camera_online},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SYNC_WEATHER_REC, msg_center_device_sync_weather_rec},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SYNC_DATE_REC, msg_center_device_sync_date_rec},\r
};\r
\r
errcode_t msg_center_device_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
void device_init(void)\r
{\r
msg_center_register_cmd(MSGCENTER_CMD_DEVICE, msg_center_device_type_dispatch);\r
+#ifdef PUBLISH_TEST_DATA\r
+ PublishTestData();\r
+#endif\r
}\r
\r
APP_FEATURE_INIT_PRI(device_init, LAYER_INIT_LEVEL_4);\r
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
- * Description: Breath Ease\r
- * Author: wangle\r
- * Create: 2025-4-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MsgCenter Device\r
+ * Create: 2025-06-06\r
*/\r
-#include "msg_center_protocol.h"\r
+\r
#include "msg_center_device.h"\r
+#include "msg_center_protocol.h"\r
#include "device_proxy.h"\r
#include "wearable_log.h"\r
-#include "device_location.h"\r
#include "AppViewIDs.h"\r
#include "NativeAbility.h"\r
-#include "sports/SportsModel.h"\r
+#include "sport/SportView.h"\r
+#include "sport/SportModel.h"\r
#include "findphone/FindPhoneMainPage.h"\r
#include "camera/CameraMainPage.h"\r
+#include "weather/WeatherMainPage.h"\r
+#include "date/DateMainPage.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
#include "diag_ind_src.h"\r
\r
uint8_t g_bloodoxygen = 0;\r
-uint16_t g_heartrate = 0;\r
+uint8_t g_heartrate = 0;\r
uint32_t g_stepdata = 0;\r
uint32_t g_distance = 0;\r
-extern LocationInfo_t g_locationInfo;\r
// 获取电量\r
errcode_t msg_center_get_battery_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
}\r
return ERRCODE_SUCC;\r
}\r
-// 获取音量\r
-errcode_t msg_center_get_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_volume_info");\r
- uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
- void *v_data = msg_center_get_tlv_payload(usr_data);\r
- uint8_t v_len = usr_len - tl_len;\r
-\r
- uint8_t vol_type = 0;\r
- if (v_len == sizeof(uint8_t)) {\r
- vol_type = *(uint8_t *)v_data;\r
- }\r
-\r
- std::vector<OHOS::volume_info> vol_info;\r
- OHOS::device_proxy::get_volume_info(vol_type, vol_info);\r
-\r
- errcode_t ret = msg_center_send_data(cmd_id, type, &vol_info[0], vol_info.size() * sizeof(OHOS::volume_info));\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_volume_info_ack fail, ret = %d", ret);\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
// 设置语言\r
errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
}\r
return ERRCODE_SUCC;\r
}\r
-// 设置音量\r
-errcode_t msg_center_set_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set_volume_info");\r
- uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
- void *v_data = msg_center_get_tlv_payload(usr_data);\r
- uint8_t v_len = usr_len - tl_len;\r
-\r
- OHOS::volume_info info;\r
- if (v_len != sizeof(OHOS::volume_info)) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- memcpy_s(&info, sizeof(OHOS::volume_info), v_data, v_len);\r
- OHOS::device_proxy::set_volume_info(info);\r
-\r
- errcode_t ret = msg_center_send_data(cmd_id, type, &info, sizeof(OHOS::volume_info));\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_volume_info_ack fail, ret = %d", ret);\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
// ota初始化\r
errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
return ERRCODE_FAIL;\r
}\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ret = %d", ret);\r
- OHOS::device_proxy::call_ui_ota_update(); \r
+ OHOS::device_proxy::call_ui_ota_update();\r
\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ui over");\r
return ERRCODE_SUCC;\r
\r
return ERRCODE_SUCC;\r
}\r
-\r
-/* LOCATION */\r
-errcode_t msg_center_location_get_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
- uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
- uint16_t payload_len = usr_len - tl_len;\r
- uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
- errcode_t ret = ERRCODE_SUCC;\r
-\r
- ret = msg_center_send_data(cmd_id, type, &g_locationInfo, sizeof(g_locationInfo));\r
- if (ret != ERRCODE_SUCC) {\r
- return ERRCODE_FAIL;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_get_info latitude_:%d,longitude_:%d\n",\r
- g_locationInfo.latitude_, g_locationInfo.longitude_);\r
- /* notify UI or call UI load */\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-errcode_t msg_center_location_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
- uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
- uint16_t payload_len = usr_len - tl_len;\r
- uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
- errcode_t ret = ERRCODE_SUCC;\r
- uint8_t ack = 1;\r
-\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start finish\r\n");\r
- ret = deviceLocationStartLocating();\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start fail\r\n");\r
- ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start send msg fail\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- } else {\r
- ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start send msg fail\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- }\r
-\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start finish\r\n");\r
- /* notify UI or call UI load */\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-errcode_t msg_center_location_stop(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
- uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
- uint16_t payload_len = usr_len - tl_len;\r
- uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
- errcode_t ret = ERRCODE_SUCC;\r
- uint8_t ack = 1;\r
-\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop\r\n");\r
- ret = deviceLocationStopLocating();\r
- ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop fail\r\n");\r
- ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop send msg fail\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- } else {\r
- ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop send msg fail\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- }\r
-\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop\r\n");\r
- /* notify UI or call UI load */\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
/* SPORT */\r
errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
errcode_t ret = ERRCODE_SUCC;\r
uint8_t ack = 1;\r
- sport_action_t action = (sport_action_t)*tlv_payload;\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_action : %d\r\n", action);\r
-\r
- switch (action) {\r
- case SPORT_ACTION_START:\r
- OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_SPORTS);\r
- OHOS::SportsModel::GetInstance()->ResetSportsData();\r
- if (!OHOS::SportsModel::GetInstance()->StartSportsTimer()) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_start StartSportsTimer failed\r\n");\r
- ret = ERRCODE_FAIL;\r
- }\r
+ OHOS::sport_control_t *sport = (OHOS::sport_control_t *)tlv_payload;\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_action=%d, type=%d", sport->action, sport->type);\r
+\r
+ switch (sport->action) {\r
+ case OHOS::SPORT_ACTION_START:\r
+ OHOS::SportModel::GetInstance().SetSportType(static_cast<OHOS::SportType>(sport->type));\r
+ OHOS::SportModel::GetInstance().StartSport(false);\r
+ OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SPORT, OHOS::SportPages::SPORT_PAGE_DATA);\r
break;\r
- case SPORT_ACTION_PAUSE:\r
- OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
+ case OHOS::SPORT_ACTION_PAUSE:\r
+ OHOS::SportModel::GetInstance().PauseAndReport(false);\r
+ OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SPORT, OHOS::SportPages::SPORT_PAGE_PAUSE);\r
break;\r
- case SPORT_ACTION_RESUME:\r
- if (!OHOS::SportsModel::GetInstance()->StartSportsTimer()) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_resume StartSportsTimer failed\r\n");\r
- ret = ERRCODE_FAIL;\r
- }\r
+ case OHOS::SPORT_ACTION_RESUME:\r
+ OHOS::SportModel::GetInstance().ResumeAndReport(false);\r
+ OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SPORT, OHOS::SportPages::SPORT_PAGE_DATA);\r
break;\r
- case SPORT_ACTION_STOP:\r
- OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
- OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+ case OHOS::SPORT_ACTION_STOP:\r
+ OHOS::SportModel::GetInstance().StopAndReport(false);\r
+ OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_SPORT, OHOS::SportPages::SPORT_PAGE_MENU);\r
break;\r
default:\r
ret = ERRCODE_FAIL;\r
\r
ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_resume send data failed\r\n");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_action send data failed\r\n");\r
return ERRCODE_FAIL;\r
}\r
return ERRCODE_SUCC;\r
}\r
\r
-errcode_t msg_center_sport_get_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+errcode_t msg_center_sport_get_record(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
uint16_t payload_len = usr_len - tl_len;\r
uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
errcode_t ret = ERRCODE_SUCC;\r
\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_data\r\n");\r
- OHOS::sport_data_t *sportData = OHOS::SportsModel::GetInstance()->GetSportsData();\r
- ret = msg_center_send_data(cmd_id, type, sportData, sizeof(OHOS::sport_data_t));\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_data end data failed\r\n");\r
+ auto record = OHOS::SportModel::GetInstance().GetRecord();\r
+ uint16_t num = record.size();\r
+ uint16_t size = sizeof(uint16_t) + num * sizeof(OHOS::sport_data_t);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_record record num=%d, malloc szie=%d\r\n", num,\r
+ size);\r
+ uint8_t *data = (uint8_t *)malloc(size);\r
+ if (data == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_record malloc data failed\r\n");\r
return ERRCODE_FAIL;\r
}\r
- return ERRCODE_SUCC;\r
-}\r
+ uint8_t *data_addr = data;\r
+\r
+ memcpy_s(data, sizeof(uint16_t), &num, sizeof(uint16_t));\r
+ data += sizeof(uint16_t);\r
+\r
+ for (int i = 0; i < num; i++) {\r
+ memcpy_s(data, sizeof(OHOS::sport_data_t), &record[i], sizeof(OHOS::sport_data_t));\r
+ data += sizeof(OHOS::sport_data_t);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "========record[%d]=============", i);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "type:%d", record[i].type);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "heartRate:%d", record[i].heartRate);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "calorie:%d", record[i].calorie);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "altitude:%d", record[i].altitude);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "ascent:%d", record[i].ascent);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "descent:%d", record[i].descent);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "distance:%d", record[i].distance);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "lap:%d", record[i].lap);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "startTime:%d", record[i].startTime);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "endTime:%d", record[i].endTime);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "elapsedTime:%d", record[i].elapsedTime);\r
+ }\r
\r
-errcode_t msg_center_sport_report_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
-{\r
+ ret = msg_center_send_data(cmd_id, type, data_addr, size);\r
+ free(data_addr);\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_record send data failed\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+ OHOS::SportModel::GetInstance().ClearRecord();\r
return ERRCODE_SUCC;\r
}\r
\r
errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "recv exit camera from phone");\r
- OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ OHOS::NativeAbility::GetInstance().ChangeSliceToApplist();\r
return ERRCODE_SUCC;\r
}\r
\r
\r
errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
- uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
- uint16_t payload_len = usr_len - tl_len;\r
- uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
bool ret = true;\r
- if ( OHOS::FindPhoneMainPage::GetInstance() != nullptr) {\r
+ if (OHOS::FindPhoneMainPage::GetInstance() != nullptr) {\r
ret = OHOS::FindPhoneMainPage::GetInstance()->StopFindPhone();\r
} else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "FindphonePage not exist\r\n");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "FindphonePage not exist\r\n");\r
}\r
if (!ret) {\r
return ERRCODE_FAIL;\r
}\r
return ERRCODE_SUCC;\r
}\r
+\r
+errcode_t msg_center_device_sync_weather_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ if (OHOS::WeatherMainPage::GetInstance() != nullptr) {\r
+ OHOS::WeatherMainPage::GetInstance()->ReloadPage();\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "WeatherMainPage not exist\r\n");\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_sync_date_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ if (OHOS::DateMainPage::GetInstance() != nullptr) {\r
+ OHOS::DateMainPage::GetInstance()->ReloadPage();\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "DateMainPage not exist\r\n");\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
#ifdef __cplusplus\r
}\r
#endif
\ No newline at end of file
/*\r
- * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
- * Description: Breath Ease\r
- * Author: wangle\r
- * Create: 2025-4-23\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: MsgCenter Device\r
+ * Create: 2025-06-06\r
*/\r
+\r
#ifndef MSG_CENTER_DEVICE_H\r
#define MSG_CENTER_DEVICE_H\r
\r
extern "C" {\r
#endif\r
\r
-typedef enum sport_action {\r
- SPORT_ACTION_START = 1,\r
- SPORT_ACTION_PAUSE = 2,\r
- SPORT_ACTION_RESUME = 3,\r
- SPORT_ACTION_STOP = 4,\r
-} sport_action_t;\r
-\r
typedef enum msg_center_device_type_id {\r
- MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL = 0x1,\r
- MSGCENTER_TYPE_ID_GET_STORAGE_INFO = 0x2,\r
- MSGCENTER_TYPE_ID_GET_PRODUCT_INFO = 0x3,\r
- MSGCENTER_TYPE_ID_GET_LANGUAGE_ID = 0x4,\r
- MSGCENTER_TYPE_ID_GET_VOLUME_INFO = 0x5,\r
- MSGCENTER_TYPE_ID_SET_LANGUAGE_ID = 0x6,\r
- MSGCENTER_TYPE_ID_SET_VOLUME_INFO = 0x7,\r
- MSGCENTER_TYPE_ID_DEVICE_HEARTRATE = 0x8,\r
- MSGCENTER_TYPE_ID_DEVICE_STEPDATA = 0x9,\r
- MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN = 0xa,\r
- MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH = 0xb,\r
- MSGCENTER_TYPE_ID_LOCATION_GET_INFO = 0x20,\r
- MSGCENTER_TYPE_ID_LOCATION_START = 0x21,\r
- MSGCENTER_TYPE_ID_LOCATION_STOP = 0x22,\r
- MSGCENTER_TYPE_ID_LOCATION_REPORT = 0x23,\r
- MSGCENTER_TYPE_ID_SPORT_ACTION = 0x27,\r
- MSGCENTER_TYPE_ID_SPORT_GET_DATA = 0x28,\r
- MSGCENTER_TYPE_ID_SPORT_REPORT_DATA = 0x29,\r
- MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL = 0x30,\r
- MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL = 0x31,\r
- MSGCENTER_TYPE_ID_ONLINELOG_REPORT = 0x33,\r
- MSGCENTER_TYPE_ID_OTA_INIT = 0x34,\r
- MSGCENTER_TYPE_ID_OTA_UPDATE = 0x35,\r
- MSGCENTER_TYPE_ID_ON_FIND_PHONE = 0x36,\r
- MSGCENTER_TYPE_ID_OFF_FIND_PHONE = 0x37,\r
- MSGCENTER_TYPE_ID_SLEEP_DATA = 0x38,\r
- MSGCENTER_TYPE_ID_ON_CAMERA = 0x39,\r
- MSGCENTER_TYPE_ID_CAMERA_WATCH_EXIT = 0x40,\r
- MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT = 0x41,\r
- MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE = 0x42,\r
- MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE_SUCCESS = 0x43,\r
+ MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL = 0x01,\r
+ MSGCENTER_TYPE_ID_GET_STORAGE_INFO = 0x02,\r
+ MSGCENTER_TYPE_ID_GET_PRODUCT_INFO = 0x03,\r
+ MSGCENTER_TYPE_ID_GET_LANGUAGE_ID = 0x04,\r
+ MSGCENTER_TYPE_ID_SET_LANGUAGE_ID = 0x05,\r
+ MSGCENTER_TYPE_ID_DEVICE_HEARTRATE = 0x06,\r
+ MSGCENTER_TYPE_ID_DEVICE_STEPDATA = 0x07,\r
+ MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN = 0x08,\r
+ MSGCENTER_TYPE_ID_SPORT_ACTION = 0x09,\r
+ MSGCENTER_TYPE_ID_SPORT_REPORT_ACTION = 0x0a,\r
+ MSGCENTER_TYPE_ID_SPORT_REPORT_DATA = 0x0b,\r
+ MSGCENTER_TYPE_ID_SPORT_GET_RECORD = 0x0c,\r
+ MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL = 0x0d,\r
+ MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL = 0x0e,\r
+ MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH = 0x0f,\r
+ MSGCENTER_TYPE_ID_ONLINELOG_REPORT = 0x10,\r
+ MSGCENTER_TYPE_ID_START_FIND_PHONE = 0x11,\r
+ MSGCENTER_TYPE_ID_STOP_FIND_PHONE = 0x12,\r
+ MSGCENTER_TYPE_ID_SLEEP_DATA = 0x13,\r
+ MSGCENTER_TYPE_ID_ON_CAMERA = 0x14,\r
+ MSGCENTER_TYPE_ID_WATCH_EXIT_CAMERA = 0x15,\r
+ MSGCENTER_TYPE_ID_PHONE_EXIT_CAMERA = 0x16,\r
+ MSGCENTER_TYPE_ID_CAMERA_CONNECTING_PHONE = 0x17,\r
+ MSGCENTER_TYPE_ID_CAMERA_CONNECTED_PHONE = 0x18,\r
+ MSGCENTER_TYPE_ID_OTA_INIT = 0x19,\r
+ MSGCENTER_TYPE_ID_OTA_UPDATE = 0x1a,\r
+ MSGCENTER_TYPE_ID_SYNC_WEATHER_REQ = 0x1b,\r
+ MSGCENTER_TYPE_ID_SYNC_WEATHER_REC = 0x1c,\r
+ MSGCENTER_TYPE_ID_SYNC_DATE_REQ = 0x1d,\r
+ MSGCENTER_TYPE_ID_SYNC_DATE_REC = 0x1e,\r
} msg_center_device_type_id_t;\r
\r
// 获取电量\r
errcode_t msg_center_get_product_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
// 获取语言\r
errcode_t msg_center_get_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-// 获取音量\r
-errcode_t msg_center_get_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
// 设置语言\r
errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-// 设置音量\r
-errcode_t msg_center_set_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
// ota初始化\r
errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
// ota检测和本地升级\r
errcode_t msg_center_device_stepdata(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
errcode_t msg_center_device_bloodoxygen(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
\r
-/* LOCATION */\r
-errcode_t msg_center_location_get_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-errcode_t msg_center_location_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-errcode_t msg_center_location_stop(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-\r
/* SPORT */\r
errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-errcode_t msg_center_sport_get_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
-errcode_t msg_center_sport_report_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_sport_get_record(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
\r
/* 离线日志开关 */\r
errcode_t msg_center_offline_log_switch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
/* 查找手机 */\r
errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
\r
+/* 天气 */\r
+errcode_t msg_center_device_sync_weather_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* 日历 */\r
+errcode_t msg_center_device_sync_date_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
/* CAMERA */\r
errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
errcode_t msg_center_camera_online(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
set(PUBLIC_HEADER
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/include/notify
- ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/include
)
set(PRIVATE_HEADER
${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components_ext
+ ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
${ROOT_DIR}/application/wearable/service/xiaodu_voice
${ROOT_DIR}/application/wearable/service/watch_setting_msg/include
${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
${ROOT_DIR}/application/wearable/nativeabilityfwk/include
${ROOT_DIR}/open_source/openharmony/foundation/multimedia/player/interfaces/kits
- ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/include
- ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include
- ${ROOT_DIR}/zhihui/4g/cat1Service
- ${ROOT_DIR}/zhihui/4g/cat1Service/include
- ${ROOT_DIR}/zhihui/4g/cat1Service/Service
)
set(SOURCES
${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components_ext
+ ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks
${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audio_player/interfaces/kits
${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiomanager
${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiocommon
${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_customer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/calendar_notification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_common.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_utils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_self_cmd.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_customer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/src/NotifyOnKeyListener.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
)
BT_CONNECTED_TO_MSGCENTER,
MSGCENTER_ADD_SLEEP_VETO,
MSGCENTER_RM_SLEEP_VETO,
+ CALENDAR_TO_MSGCENTER,
} MsgCenterServiceMsgId;
#ifdef __cplusplus
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: calendar notification api
+ * Author: CompanyName
+ * Create: 2025-10-23
+ */
+
+#ifndef CALENDAR_NOTIFICATION_H
+#define CALENDAR_NOTIFICATION_H
+
+static constexpr const char* CALENDAR_IMAGE_DELETE = "calendar_delete";
+static constexpr const char* CALENDAR_IMAGE_CLOCK = "calendar_clock";
+static constexpr const char* CALENDAR_VIEW_CLOSE = "calendar_close";
+static constexpr const char* CALENDAR_VIEW_DELAY = "calendar_delay";
+static constexpr const char* CALENDAR_VIEW_POPUP = "calendar_popup";
+
+enum class CalendarTimerType {
+ NOTIFY_CALENDAR_CLOSE = 0,
+ NOTIFY_CALENDAR_DELAY = 1,
+ NOTIFY_CALENDAR_RING = 2,
+ NOTIFY_CALENDAR_UNKNOWN = 10,
+};
+
+typedef struct {
+ int id;
+ int type;
+ int64_t startTime;
+ int64_t endTime;
+ bool isAllDay;
+ bool hasReminder;
+ bool isRepeat;
+ int64_t recurrenceFrequency;
+ char bundlename[64]; // 外部传入字符串,内部不负责释放
+ char eventContent[256];
+} CalendarEvent;
+
+
+namespace OHOS {
+UIViewGroup* CreateCalendarView(CalendarEvent *event);
+void FreeCalendarView(void);
+
+class CalendarViewEventListener : public OHOS::UIView::OnClickListener,
+ public OHOS::UIView::OnLongPressListener,
+ public OHOS::UIView::OnTouchListener,
+ public OHOS::UIView::OnDragListener {
+public:
+ CalendarViewEventListener();
+ virtual ~CalendarViewEventListener();
+ static CalendarViewEventListener *GetInstance(void);
+ bool OnDrag(UIView& view, const DragEvent& event) override;
+ bool OnDragEnd(OHOS::UIView& view, const OHOS::DragEvent& event) override;
+ bool OnClick(OHOS::UIView& view, const OHOS::ClickEvent& event) override;
+ bool OnPress(OHOS::UIView& view, const OHOS::PressEvent& event) override
+ {
+ return true;
+ }
+ bool OnLongPress(OHOS::UIView& view, const OHOS::LongPressEvent& event) override
+ {
+ return true;
+ }
+ bool OnRelease(OHOS::UIView& view, const OHOS::ReleaseEvent& event) override
+ {
+ return true;
+ }
+
+ bool OnDragStart(OHOS::UIView& view, const OHOS::DragEvent& event) override
+ {
+ return true;
+ }
+};
+}; // namespace OHOS
+
+#endif /* CALENDAR_NOTIFICATION_H */
\ No newline at end of file
#include "components/root_view.h"
#include "components/ui_view_group.h"
#include "alarm_notification.h"
-#include "makephone_notification.h"
#include "phone_msg_notification.h"
+#include "calendar_notification.h"
constexpr uint16_t HALF_SCREEN = 2;
constexpr int16_t NOTIFY_PRIORITY_DEFAULT = 4;
/*\r
* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
- * Description: phone message notification \r
- * Author: \r
+ * Description: phone message notification\r
+ * Author:\r
* Create: 2025-04-25\r
*/\r
\r
#ifndef PHONE_MSG_NOTIFICATION_H\r
#define PHONE_MSG_NOTIFICATION_H\r
\r
+#include <unordered_map>\r
#include "components/ui_view_group.h"\r
#include "components/ui_view_group.h"\r
#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
#include "components/ui_label_button_ext.h"\r
+#include "components/ui_scroll_view.h"\r
#include "graphic_timer.h"\r
-#include <unordered_map>\r
\r
struct PhoneMsg {\r
std::string appName;\r
static void UpDatePhoneMsg(std::string appName, std::string titile, std::string content);\r
static void StartPhoneMsgTimer(int32_t interval);\r
static void DisablePhoneMsgTimer();\r
+ static void ShowDateMsg(std::string appName, std::string title, std::string content);\r
+ static void SetControl();\r
static const uint32_t notifyTime = 5000;\r
\r
private:\r
- static UIViewGroup *phoneMsgView_;\r
+ static UIScrollView *phoneMsgView_;\r
static UILabel *appNameLabel_;\r
+ static UIImageView *appIcon_;\r
static UILabel *titleLabel_;\r
static UILabel *contentLabel_;\r
static GraphicTimer *phoneMsgNotifyStop_;\r
#include "element_name.h"
#include "abilityms_slite_client.h"
#include <string.h>
+#include "appexecfwk_errors.h"
#ifdef __cplusplus
extern "C" {
bool msg_center_is_js_app_install(char *bundleName)
{
- InstallState installState;
- uint8_t installProcess;
- OHOS::BundleMsClient::GetInstance().GetInstallState(bundleName, &installState, &installProcess);
- if (installState == BUNDLE_INSTALL_OK) {
+ if (bundleName == nullptr) {
+ return false;
+ }
+ BundleInfo bundleInfo;
+ uint8_t ret = OHOS::BundleMsClient::GetInstance().GetBundleInfo(bundleName, false, &bundleInfo);
+ if (ret == ERR_OK) {
return true;
}
+
return false;
}
#include "broadcast_service.h"
#include "alarm/AlarmClockModel.h"
#include "alarm/AlarmPopUpPresenter.h"
-#include "callerlog/CallerLogModel.h"
+#include "phonemenu/PhoneMenuCallerLogModel.h"
#include "notification_manager.h"
#include "NativeAbility.h"
#include "abilityms_slite_client.h"
#include "main/VolumeSettingPresenter.h"
#include "main/VolumeSettingView.h"
#include "cJSON.h"
-#include "heartrate/HeartModel.h"
-#include "device_location.h"
+#include "heartrate/HeartRateModel.h"
+#include "phonemenu/PhoneMenuView.h"
+
namespace OHOS {
#ifdef __cplusplus
extern "C" {
#endif
-#ifdef SUPPORT_CYWEE_SERVICE
-#include "cywee_data.h"
-#include "cywee_hal.h"
-#endif
-
extern uint8_t g_bloodoxygen;
-extern uint16_t g_heartrate;
+extern uint8_t g_heartrate;
extern uint32_t g_stepdata;
extern uint32_t g_distance;
-extern LocationInfo_t g_locationInfo;
/* 订阅事件设定优先级 */
const PriorityMapper PRI_MAPPER[] = {
{TOPIC_EVENT_ALARM_RING, PRIORITY_TWO},
- {TOPIC_EVENT_ON_TIME,PRIORITY_TWO},
{TOPIC_EVENT_NEXTDAY_UPDATE, PRIORITY_TWO},
{TOPIC_EVENT_HFP_INCOMMING, PRIORITY_ONE},
{TOPIC_EVENT_HFP_FINISHED, PRIORITY_ONE},
{TOPIC_EVENT_HEARTRATE_UPDATA, PRIORITY_TWO},
{TOPIC_EVENT_BLOODOXYGEN_UPDATA, PRIORITY_TWO},
{TOPIC_EVENT_SPORT_DISTANCE, PRIORITY_TWO},
- {TOPIC_EVENT_LOCATION, PRIORITY_TWO},
+ {TOPIC_EVENT_CALENDAR_NOTIFY, PRIORITY_TWO},
};
bool g_pressFlag = false;
bool g_longPressFlag = false;
-
+CalendarEvent *g_tmpevent = nullptr;
static bool CheckPriority(const Topic topic)
{
uint16_t mapperSize = sizeof(PRI_MAPPER) / sizeof(PRI_MAPPER[0]);
void MsgCenterSubscribe()
{
MsgCenterSubscribeTopic(TOPIC_EVENT_ALARM_RING);
- MsgCenterSubscribeTopic(TOPIC_EVENT_ON_TIME);
MsgCenterSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);
MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_INCOMMING);
MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_PHONE_ACTIVE);
MsgCenterSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);
MsgCenterSubscribeTopic(TOPIC_EVENT_BLOODOXYGEN_UPDATA);
MsgCenterSubscribeTopic(TOPIC_EVENT_SPORT_DISTANCE);
- MsgCenterSubscribeTopic(TOPIC_EVENT_LOCATION);
}
static OHOS::UIViewGroup* ShowAlarmNotify(void)
return OHOS::CreateAlarmView();
}
-static OHOS::UIViewGroup* ShowPhoneCallNotify(void)
-{
- return OHOS::CreatePhoneCallView();
-}
-
-static OHOS::UIViewGroup* ShowCallingNotify(void)
+static OHOS::UIViewGroup* ShowCalendarNotify(void)
{
- return OHOS::CreateCallingView();
-}
-
-static OHOS::UIViewGroup* ShowMultiPhoneCallNotify(void)
-{
- return OHOS::CreateMultiplePhoneView();
+ // only show one notify
+ if (!g_tmpevent) {
+ return nullptr;
+ }
+ OHOS::UIViewGroup* group = OHOS::CreateCalendarView(g_tmpevent);
+ if (g_tmpevent) {
+ free(g_tmpevent);
+ g_tmpevent = nullptr;
+ }
+ if (!group) {
+ return nullptr;
+ }
+ return group;
}
static OHOS::UIViewGroup* ShowMsgNotify(void)
void MsgCenterNotifyAlarmProc(const Topic topic, Request* req)
{
unused(req);
- // The alarm notification is not displayed if the incoming call notification is already being processed
if (CheckPriority(topic)) {
AlarmClockModel::GetInstance()->PopInterPlayMusic();
NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
}
}
+void MsgCenterNotifyCalendarProc(const Topic topic, Request* req)
+{
+ if (g_tmpevent == nullptr) {
+ g_tmpevent = (CalendarEvent *)malloc(sizeof(CalendarEvent));
+ if (g_tmpevent == nullptr) {
+ return;
+ }
+ } else {
+ return;
+ }
+ if (memcpy_s(g_tmpevent, sizeof(CalendarEvent), req->data, sizeof(CalendarEvent)) != EOK) {
+ return;
+ }
+ // The alarm notification is not displayed if the incoming call notification is already being processed
+ if (CheckPriority(topic)) {
+ NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+ NotificationManager::GetInstance()->ShowNotify(ShowCalendarNotify, static_cast<uint16_t>(topic), true);
+ }
+}
+
void MsgCenterNotifyNextDayProc(const Topic topic, Request* req)
{
unused(topic);
} else {
// Prevent this from happening:
// When the incoming call view is displayed, the calling number is not set in CallerLogModel.
- CallerLogModel::GetInstance()->SetoperateNumber(callData.number, callData.number_len);
+ PhoneMenuCallerLogModel::GetInstance()->SetoperateNumber(callData.number, callData.number_len);
}
NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
- CallerLogModel::GetInstance()->SetNotifyFlag(true);
+ PhoneMenuCallerLogModel::GetInstance()->SetNotifyFlag(true);
if (GetCurrCallNum() == 1) {
- NotificationManager::GetInstance()->ShowNotify(ShowPhoneCallNotify, static_cast<uint16_t>(topic), true);
+ PhoneMenuCallerLogModel::GetInstance()->SaveCurPage();
+ } else {
+ PhoneMenuCallerLogModel::GetInstance()->SetCallStatus(false);
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(true);
+ }
+ uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();
+ if (targetId == VIEW_PHONE_MENU) {
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,
+ TransitionType::TRANSITION_INVALID, false);
} else {
- EnableWaitingView();
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);
}
NotificationManager::GetInstance()->SetWatchCallStatus(true);
}
{
unused(req);
// finish a single-channel call, or switch to phone, stop the notify
- if (CallerLogModel::GetInstance()->GetNotifyFlag()) {
- DisableWatingView();
+ if (PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);
if ((topic == TOPIC_EVENT_HFP_FINISHED && GetCurrCallNum() == 0) ||
- topic == TOPIC_EVENT_HFP_PHONE_ACTIVE || topic == TOPIC_EVENT_HFP_WATCH_TO_PHONE) {
+ topic == TOPIC_EVENT_HFP_PHONE_ACTIVE || topic == TOPIC_EVENT_HFP_WATCH_TO_PHONE) {
NotificationManager::GetInstance()->StopNotify();
NotificationManager::GetInstance()->SetWatchCallStatus(false);
}
void MsgCenterNotifyHfpWatchProc(const Topic topic, Request* req)
{
unused(req);
- if (CallerLogModel::GetInstance()->GetNotifyFlag()) {
+ if (PhoneMenuCallerLogModel::GetInstance()->GetNotifyFlag()) {
NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
// default not mute
SetMicMute(false);
- if (CallerLogModel::GetInstance()->IsMulitplePhoneStatus()) {
- NotificationManager::GetInstance()->ShowNotify(ShowMultiPhoneCallNotify,
- static_cast<uint16_t>(topic), true);
+ PhoneMenuCallerLogModel::GetInstance()->SetMicMute(false);
+ if (PhoneMenuCallerLogModel::GetInstance()->IsMulitplePhoneStatus()) {
+ PhoneMenuCallerLogModel::GetInstance()->SetWaitingStatus(false);
+ }
+ uint32_t targetId = NativeAbility::GetInstance().GetCurSliceId();
+ if (targetId == VIEW_PHONE_MENU) {
+ NativeAbility::GetInstance().SwitchPageInSlice(PhoneMenuPages::PHONE_MENU_CALLING_PAGE,
+ TransitionType::TRANSITION_INVALID, false);
} else {
- NotificationManager::GetInstance()->ShowNotify(ShowCallingNotify, static_cast<uint16_t>(topic), true);
+ NativeAbility::GetInstance().SwitchSlice(VIEW_PHONE_MENU, PhoneMenuPages::PHONE_MENU_CALLING_PAGE);
}
NotificationManager::GetInstance()->SetWatchCallStatus(true);
}
}
}
-void MsgCenterNotifyLocationProc(const Topic topic, Request* req)
-{
- unused(topic);
- if(req && req->data){
- LocationInfo_t* location = (LocationInfo_t*)req->data;
- g_locationInfo.latitude_ = location->latitude_;
- g_locationInfo.longitude_ = location->longitude_;
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "latitude_:%d,longitude_:%d\n", g_locationInfo.latitude_, g_locationInfo.longitude_);
- }
-}
-
-
-void MsgCenterNotifyONtimeProc(const Topic topic, Request* req)
-{
- unused(req);
- AlarmClockEventData* time=(AlarmClockEventData*)req->data;
- // The alarm notification is not displayed if the incoming call notification is already being processed
-#ifdef SUPPORT_CYWEE_SERVICE
- cywee_save_data();
-
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时步数");
-
- cywee_step_history_save(time->value);
-
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时站立数据");
- if(cywee_get_stand_flag())
- {
- cywee_stand_history_save(time->value);
- }
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时卡路里数据");
-
- cywee_calories_history_save(time->value);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时距离数据");
-
- cywee_distances_history_save(time->value);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时燃脂数据");
-
- cywee_fat_history_save(time->value);
-#endif
- // 保存完增加一次读取数据
- SendMsgToUIService(UI_UPDATE_GOAL, 0, nullptr, 0);
-}
-
/* 订阅事件通知逻辑可定制 */
static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
{TOPIC_EVENT_ALARM_RING, MsgCenterNotifyAlarmProc},
- {TOPIC_EVENT_ON_TIME, MsgCenterNotifyONtimeProc},//增加整点保存数据
{TOPIC_EVENT_NEXTDAY_UPDATE, MsgCenterNotifyNextDayProc},
{TOPIC_EVENT_HFP_INCOMMING, MsgCenterNotifyHfpIncomingProc},
{TOPIC_EVENT_HFP_PHONE_ACTIVE, MsgCenterNotifyHfpPhoneProc},
{TOPIC_EVENT_STEPDATA_UPDATE, MsgCenterNotifyStepDataProc},
{TOPIC_EVENT_BLOODOXYGEN_UPDATA, MsgCenterNotifyBloodOxygenProc},
{TOPIC_EVENT_SPORT_DISTANCE, MsgCenterNotifyDistanceProc},
- {TOPIC_EVENT_LOCATION, MsgCenterNotifyLocationProc},
+ {TOPIC_EVENT_CALENDAR_NOTIFY, MsgCenterNotifyCalendarProc},
};
static MsgCenterNotifyTable *MsgCenterGetNotifyTblCb(uint8_t idx)
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: calendar notification implement
+ * Author: CompanyName
+ * Create: 2025-10-23
+ */
+
+#include "notification_manager.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label.h"
+#include "ability_manager.h"
+
+namespace OHOS {
+constexpr int32_t NOTIFY_THREE_SECONDS = 3000;
+constexpr int32_t NOTIFY_ONE_SECOND = 1000;
+constexpr int32_t NOTIFY_THIRTY_SECONDS = 30000;
+constexpr int32_t NOTIFY_ONE_MINUTE = 60000;
+constexpr int32_t NOTOFY_NO_OPERATE_TIME = 35000;
+
+UIViewGroup* g_calendarView = nullptr;
+UIImageView* g_calendarExit = nullptr;
+UIImageView* g_calendarConfirm = nullptr;
+UILabel* g_tooltip = nullptr;
+// calendar close view
+constexpr int16_t MAX_SET_SRC_LEN = 90;
+char g_bundlename[256] = {0};
+// calendar main view
+constexpr int16_t CONTAINER_X = 0;
+constexpr int16_t CONTAINER_Y = 0;
+constexpr int16_t IMAGE_DELETE_X = 85;
+constexpr int16_t IMAGE_DELETE_Y = 300;
+constexpr int16_t IMAGE_CLOCK_X = 275;
+constexpr int16_t IMAGE_CLOCK_Y = 300;
+constexpr int16_t BASE_YEARS = 1900;
+
+// calendar delay view
+constexpr int16_t DELAY_LABEL_X = 80;
+constexpr int16_t DELAY_LABEL_Y = 100;
+constexpr int16_t DELAY_LABEL_LENGTH = 350;
+constexpr int16_t DELAY_LABEL_HEIGHT = 35;
+constexpr int16_t DELAY_LABEL_FONT = 25;
+
+static bool CreateCalendarViewImage(void)
+{
+ g_calendarExit = new UIImageView();
+ if (g_calendarExit == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showCalendarNotify g_calendarExit null!");
+ return false;
+ }
+ g_calendarExit->SetPosition(IMAGE_DELETE_X, IMAGE_DELETE_Y);
+ g_calendarExit->SetWidth(MAX_SET_SRC_LEN);
+ g_calendarExit->SetHeight(MAX_SET_SRC_LEN);
+ g_calendarExit->SetViewId(CALENDAR_IMAGE_DELETE);
+ g_calendarExit->SetSrc(ALARM_DELETE_ADD_PATH);
+ g_calendarExit->SetTouchable(true);
+ UIView::OnClickListener *closeListener = static_cast<UIView::OnClickListener *>\
+ (CalendarViewEventListener::GetInstance());
+ g_calendarExit->SetOnClickListener(closeListener);
+ g_calendarConfirm = new UIImageView();
+ if (g_calendarConfirm == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showCalendarNotify g_calendarConfirm null!");
+ delete g_calendarExit;
+ return false;
+ }
+ g_calendarConfirm->SetPosition(IMAGE_CLOCK_X, IMAGE_CLOCK_Y);
+ g_calendarConfirm->SetWidth(MAX_SET_SRC_LEN);
+ g_calendarConfirm->SetHeight(MAX_SET_SRC_LEN);
+ g_calendarConfirm->SetViewId(CALENDAR_IMAGE_CLOCK);
+ g_calendarConfirm->SetSrc(ALARM_CLOCK_ADD_PATH);
+ g_calendarConfirm->SetTouchable(true);
+ UIView::OnClickListener *clockListener = static_cast<UIView::OnClickListener *>\
+ (OHOS::CalendarViewEventListener::GetInstance());
+ g_calendarConfirm->SetOnClickListener(clockListener);
+ return true;
+}
+
+static void FreeCalendarViewImage(void)
+{
+ delete g_calendarExit;
+ g_calendarExit = nullptr;
+ delete g_calendarConfirm;
+ g_calendarConfirm = nullptr;
+}
+
+static const char* GetFormatTimestamp(long long timestamp)
+{
+ static char buffer[20];
+
+ time_t seconds = (time_t)(timestamp / NOTIFY_ONE_SECOND);
+
+ struct tm *localTime = localtime(&seconds);
+ if (localTime == NULL) {
+ return NULL;
+ }
+
+ int size = sprintf_s(buffer, sizeof(buffer), "%04d-%02d-%02d %02d:%02d:%02d",
+ localTime->tm_year + BASE_YEARS,
+ localTime->tm_mon + 1,
+ localTime->tm_mday,
+ localTime->tm_hour,
+ localTime->tm_min,
+ localTime->tm_sec);
+ if (size < 0) {
+ return NULL;
+ }
+ return buffer;
+}
+
+UIViewGroup* CreateCalendarView(CalendarEvent *event)
+{
+ g_calendarView = new UIViewGroup();
+ if (g_calendarView == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateCalendarView g_calendarView null!");
+ return nullptr;
+ }
+ g_calendarView->SetPosition(CONTAINER_X, CONTAINER_Y,
+ Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ g_calendarView->SetViewId(CALENDAR_VIEW_POPUP);
+
+ if (!CreateCalendarViewImage()) {
+ delete g_calendarView;
+ g_calendarView = nullptr;
+ return nullptr;
+ }
+ g_tooltip = new UILabel();
+ if (g_tooltip == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmRingView::g_tooltip null!");
+ delete g_calendarView;
+ g_calendarView = nullptr;
+ FreeCalendarViewImage();
+ return nullptr;
+ }
+ g_tooltip->SetPosition(DELAY_LABEL_X, DELAY_LABEL_Y, DELAY_LABEL_LENGTH, DELAY_LABEL_HEIGHT);
+ g_tooltip->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+ g_tooltip->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DELAY_LABEL_FONT);
+ char text[256] = {0};
+ int size = sprintf_s(text, sizeof(text), "id = %d bundle = %s eventContent = %s starttime = %s",
+ event->id, event->bundlename, event->eventContent, GetFormatTimestamp(event->startTime));
+ memset_s(g_bundlename, sizeof(g_bundlename), 0, sizeof(g_bundlename));
+ int ret = memcpy_s(g_bundlename, sizeof(g_bundlename), event->bundlename, strlen(event->bundlename));
+ if (size < 0 || ret != EOK) {
+ FreeCalendarView();
+ return nullptr;
+ }
+ g_tooltip->SetText(text);
+ g_calendarView->Add(g_calendarExit);
+ g_calendarView->Add(g_calendarConfirm);
+ g_calendarView->Add(g_tooltip);
+ g_calendarView->SetDraggable(true);
+ g_calendarView->SetTouchable(true);
+ UIView::OnDragListener *listener = static_cast<UIView::OnDragListener*>(CalendarViewEventListener::GetInstance());
+ g_calendarView->SetOnDragListener(listener);
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeCalendarView);
+ return g_calendarView;
+}
+void FreeCalendarView(void)
+{
+ if (g_calendarView != nullptr) {
+ g_calendarView->RemoveAll();
+ FreeCalendarViewImage();
+ delete g_tooltip;
+ g_tooltip = nullptr;
+ RootView::GetInstance()->Remove(g_calendarView);
+ delete g_calendarView;
+ g_calendarView = nullptr;
+ }
+}
+
+CalendarViewEventListener::CalendarViewEventListener()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CalendarViewEventListener :%p", this);
+}
+
+CalendarViewEventListener::~CalendarViewEventListener()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~CalendarViewEventListener");
+}
+
+CalendarViewEventListener *CalendarViewEventListener::GetInstance(void)
+{
+ static CalendarViewEventListener calendarViewEventListener;
+ return &calendarViewEventListener;
+}
+
+bool CalendarViewEventListener::OnDrag(UIView& view, const DragEvent& event)
+{
+ return true;
+}
+
+bool CalendarViewEventListener::OnDragEnd(UIView& view, const DragEvent& event)
+{
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
+ if (strcmp(view.GetViewId(), CALENDAR_VIEW_POPUP) == 0) {
+ NotificationManager::GetInstance()->screenContainer_->SetVisible(false);
+ NotificationManager::GetInstance()->StopNotify();
+ } else if (strcmp(view.GetViewId(), CALENDAR_VIEW_CLOSE) == 0 ||
+ strcmp(view.GetViewId(), CALENDAR_VIEW_DELAY) == 0) {
+ NotificationManager::GetInstance()->screenContainer_->SetVisible(false);
+ NotificationManager::GetInstance()->StopNotify();
+ }
+ }
+ return true;
+}
+
+bool CalendarViewEventListener::OnClick(UIView& view, const ClickEvent& event)
+{
+ UNUSED(event);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlamNotify ClickListener %s", view.GetViewId());
+ if (strcmp(view.GetViewId(), CALENDAR_IMAGE_DELETE) == 0) {
+ NotificationManager::GetInstance()->screenContainer_->SetVisible(false);
+ Want *want = new Want();
+ memset_s(want, sizeof(Want), 0, sizeof(Want));
+ ElementName startElement = {};
+ startElement.abilityName = (char *)"default";
+ startElement.bundleName = g_bundlename;
+ startElement.deviceId = nullptr;
+ SetWantElement(want, startElement);
+ StartAbility(want);
+ ClearWant(want);
+ delete want;
+ NotificationManager::GetInstance()->StopNotify();
+ } else if (strcmp(view.GetViewId(), CALENDAR_IMAGE_CLOCK) == 0) {
+ NotificationManager::GetInstance()->screenContainer_->SetVisible(false);
+ NotificationManager::GetInstance()->StopNotify();
+ }
+ return true;
+}
+} // namespace OHOS
\ No newline at end of file
#include "dock/input_device.h"
#include "notification_manager.h"
#include "alarm/AlarmPopUpPresenter.h"
-#include "callerlog/CallerLogModel.h"
-#include "makephone/MainCallingPresenter.h"
+#include "phonemenu/PhoneMenuCallerLogModel.h"
#include "applist/ApplistModel.h"
+
namespace OHOS {
static bool IsNotifyCallStatus()
{
#include "wearable_log.h"\r
#include <string>\r
#include "main/MessageModel.h"\r
+#include "ui_resource_message.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
\r
namespace OHOS {\r
// 三方应用名\r
-static const uint32_t APP_NAME_POS_X = 180;\r
-static const uint32_t APP_NAME_POS_Y = 82;\r
-static const uint32_t APP_NAME_WIDTH = 200;\r
-static const uint32_t APP_NAME_HEIGHT = 60;\r
+static const uint32_t APP_NAME_POS_X = 170;\r
+static const uint32_t APP_NAME_POS_Y = 40;\r
+static const uint32_t APP_NAME_WIDTH = 160;\r
+static const uint32_t APP_NAME_HEIGHT = 53;\r
// 三方消息主题\r
-static const uint32_t MSG_TITLE_POS_X = 81;\r
-static const uint32_t MSG_TITLE_POS_Y = 122;\r
-static const uint32_t MSG_TITLE_WIDTH = 409;\r
-static const uint32_t MSG_TITLE_HEIGHT = 83;\r
+static const uint32_t MSG_TITLE_POS_X = 15;\r
+static const uint32_t MSG_TITLE_POS_Y = 138;\r
+static const uint32_t MSG_TITLE_WIDTH = 370;\r
+static const uint32_t MSG_TITLE_HEIGHT = 50;\r
// 三方消息内容\r
-static const uint32_t MSG_CONTENT_POS_X = 78;\r
-static const uint32_t MSG_CONTENT_POS_Y = 176;\r
-static const uint32_t MSG_CONTENT_WIDTH = 457;\r
-static const uint32_t MSG_CONTENT_HEIGHT = 269;\r
-// 取消通知\r
-static const uint32_t CANCEL_BUTTON_POS_X = 150;\r
-static const uint32_t CANCEL_BUTTON_POS_Y = 323;\r
-static const uint32_t CANCEL_BUTTON_WIDTH = 165;\r
-static const uint32_t CANCEL_BUTTON_HEIGHT = 44;\r
+static const uint32_t MSG_CONTENT_POS_X = 15;\r
+static const uint32_t MSG_CONTENT_POS_Y = 201;\r
+static const uint32_t MSG_CONTENT_WIDTH = 370;\r
+static const uint32_t MSG_CONTENT_HEIGHT = 200;\r
+// 通知图标\r
+static const uint32_t MSG_ICON_POS_X = 130;\r
+static const uint32_t MSG_ICON_POS_Y = 50;\r
+static const uint32_t MSG_ICON_WIDTH = 40;\r
+static const uint32_t MSG_ICON_HEIGHT = 40;\r
+static const uint32_t MSG_PAGE_WIDTH = 454;\r
\r
// 设置字体大小\r
-static const uint32_t APP_NAME_FONT_SIZE = 20;\r
-static const uint32_t MSG_TITLE_FONT_SIZE = 20;\r
-static const uint32_t MSG_CONTENT_FONT_SIZE = 40;\r
+static const uint32_t APP_NAME_FONT_SIZE = 38;\r
+static const uint32_t MSG_TITLE_FONT_SIZE = 36;\r
+static const uint32_t MSG_CONTENT_FONT_SIZE = 36;\r
\r
-UIViewGroup *PhoneMsgView::phoneMsgView_ = nullptr;\r
+UIScrollView *PhoneMsgView::phoneMsgView_ = nullptr;\r
UILabel *PhoneMsgView::appNameLabel_ = nullptr;\r
+UIImageView *PhoneMsgView::appIcon_ = nullptr;\r
UILabel *PhoneMsgView::titleLabel_ = nullptr;\r
UILabel *PhoneMsgView::contentLabel_ = nullptr;\r
GraphicTimer *PhoneMsgView::phoneMsgNotifyStop_ = nullptr;\r
PhoneMsg PhoneMsgView::phoneMsg_;\r
-UILabelButtonExt *PhoneMsgView::cancelButton_ = nullptr;\r
\r
void PhoneMsgStopNotifyCallback(void *data)\r
{\r
UIViewGroup *PhoneMsgView::CreatePhoneMsgView()\r
{\r
if (phoneMsgView_ == nullptr) {\r
- phoneMsgView_ = new UIViewGroup();\r
- phoneMsgView_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ phoneMsgView_ = new UIScrollView();\r
+ phoneMsgView_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
phoneMsgView_->SetViewId("phoneMsgView");\r
+ phoneMsgView_->SetThrowDrag(true);\r
+ phoneMsgView_->SetScrollBlankSize(40);\r
}\r
\r
if (appNameLabel_ == nullptr) {\r
appNameLabel_->SetText(phoneMsg_.appName.c_str());\r
appNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, APP_NAME_FONT_SIZE);\r
appNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- // Add to rootView\r
phoneMsgView_->Add(appNameLabel_);\r
- appNameLabel_->SetVisible(true);\r
+\r
+ if (appIcon_ == nullptr) {\r
+ appIcon_ = new UIImageView();\r
+ }\r
+ appIcon_->SetPosition(MSG_ICON_POS_X, MSG_ICON_POS_Y, MSG_ICON_WIDTH, MSG_ICON_HEIGHT);\r
+ phoneMsgView_->Add(appIcon_);\r
+ appIcon_->SetVisible(true);\r
\r
if (titleLabel_ == nullptr) {\r
titleLabel_ = new UILabel();\r
}\r
titleLabel_->SetPosition(MSG_TITLE_POS_X, MSG_TITLE_POS_Y, MSG_TITLE_WIDTH, MSG_TITLE_HEIGHT);\r
- titleLabel_->SetText(phoneMsg_.msgTitle.c_str());\r
titleLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MSG_TITLE_FONT_SIZE);\r
titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- // Add to rootView\r
phoneMsgView_->Add(titleLabel_);\r
- titleLabel_->SetVisible(true);\r
\r
if (contentLabel_ == nullptr) {\r
contentLabel_ = new UILabel();\r
contentLabel_->SetText(phoneMsg_.msgContent.c_str());\r
contentLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MSG_CONTENT_FONT_SIZE);\r
contentLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
- // Add to rootView\r
+ contentLabel_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
phoneMsgView_->Add(contentLabel_);\r
- contentLabel_->SetVisible(true);\r
-\r
- if (cancelButton_ == nullptr) {\r
- cancelButton_ = new UILabelButtonExt();\r
- }\r
- cancelButton_->SetPosition(CANCEL_BUTTON_POS_X, CANCEL_BUTTON_POS_Y, CANCEL_BUTTON_WIDTH, CANCEL_BUTTON_HEIGHT);\r
- cancelButton_->SetViewId("cancelButton");\r
- cancelButton_->SetText("取消通知");\r
- cancelButton_->SetTouchable(true);\r
- cancelButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, APP_NAME_FONT_SIZE);\r
- // Add to rootView\r
- phoneMsgView_->Add(cancelButton_);\r
\r
+ SetControl();\r
+ phoneMsgView_->Invalidate();\r
phoneMsgView_->SetDraggable(true);\r
phoneMsgView_->SetTouchable(true);\r
UIView::OnDragListener *dragListener =\r
static_cast<UIView::OnClickListener *>(PhoneMsgViewEventListener::GetInstance());\r
phoneMsgView_->SetOnDragListener(dragListener);\r
phoneMsgView_->SetOnClickListener(clickListener);\r
- cancelButton_->SetOnClickListener(clickListener);\r
StartPhoneMsgTimer(PhoneMsgView::notifyTime);\r
NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreePhoneMsgView);\r
return phoneMsgView_;\r
}\r
\r
+void PhoneMsgView::SetControl()\r
+{\r
+ if (strcmp(phoneMsg_.appName.c_str(), "微信") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WX);\r
+ } else if (strcmp(phoneMsg_.appName.c_str(), "QQ") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_QQ);\r
+ } else if (strcmp(phoneMsg_.appName.c_str(), "抖音") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DY);\r
+ } else if (strcmp(phoneMsg_.appName.c_str(), "日历") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_CALENDAR);\r
+ } else if (strcmp(phoneMsg_.appName.c_str(), "信息") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+ } else if (strcmp(phoneMsg_.appName.c_str(), "短信") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_DUANXIN);\r
+ } else if (strcmp(phoneMsg_.appName.c_str(), "今日头条") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_TOUTIAO);\r
+ } else if (strcmp(phoneMsg_.appName.c_str(), "微博") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_WB);\r
+ } else if (strcmp(phoneMsg_.appName.c_str(), "小红书") == 0) {\r
+ LOADIMG::LoadImageViewImg(appIcon_, MESSAGE_IMAGE, IMAGE_MESSAGE_XHS);\r
+ }\r
+ int controlOffset = 10;\r
+ int cut = 2;\r
+ int posX = (MSG_PAGE_WIDTH - appNameLabel_->GetTextWidth() - appIcon_->GetWidth() - controlOffset) / cut;\r
+ appIcon_->SetX(posX);\r
+ appNameLabel_->SetWidth(appNameLabel_->GetTextWidth());\r
+ appNameLabel_->SetX(posX + appIcon_->GetWidth() + controlOffset);\r
+\r
+ titleLabel_->SetText(phoneMsg_.msgTitle.c_str());\r
+ if (titleLabel_->GetTextWidth() > MSG_TITLE_WIDTH) {\r
+ titleLabel_->SetWidth(MSG_TITLE_WIDTH);\r
+ } else {\r
+ titleLabel_->SetWidth(titleLabel_->GetTextWidth());\r
+ }\r
+ titleLabel_->SetX((MSG_PAGE_WIDTH - titleLabel_->GetWidth()) / cut);\r
+\r
+ int height = contentLabel_->GetTextHeight();\r
+ contentLabel_->SetHeight(height);\r
+ posX = (MSG_PAGE_WIDTH - contentLabel_->GetWidth()) / cut;\r
+ contentLabel_->SetX(posX);\r
+}\r
+\r
void PhoneMsgView::FreePhoneMsgView(void)\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FreePhoneMsgView");\r
if (phoneMsgView_ != nullptr) {\r
DisablePhoneMsgTimer();\r
phoneMsgView_->RemoveAll();\r
+ RootView::GetInstance()->Remove(phoneMsgView_);\r
+ delete phoneMsgView_;\r
+ phoneMsgView_ = nullptr;\r
+ }\r
+ if (appNameLabel_ != nullptr) {\r
delete appNameLabel_;\r
appNameLabel_ = nullptr;\r
+ }\r
+ if (appIcon_ != nullptr) {\r
+ delete appIcon_;\r
+ appIcon_ = nullptr;\r
+ }\r
+ if (titleLabel_ != nullptr) {\r
delete titleLabel_;\r
titleLabel_ = nullptr;\r
+ }\r
+ if (contentLabel_ != nullptr) {\r
delete contentLabel_;\r
contentLabel_ = nullptr;\r
- delete cancelButton_;\r
- cancelButton_ = nullptr;\r
- RootView::GetInstance()->Remove(phoneMsgView_);\r
- delete phoneMsgView_;\r
- phoneMsgView_ = nullptr;\r
}\r
}\r
\r
phoneMsg_.appName = appName;\r
phoneMsg_.msgTitle = titile;\r
phoneMsg_.msgContent = content;\r
- MessageModel::GetInstance().GetMessageInfo(appName, titile, content);\r
+ MessageModel::GetInstance().SaveMsgToModel(appName, titile, content);\r
+ MessageModel::GetInstance().SetMsgListItems();\r
+}\r
+\r
+static OHOS::UIViewGroup* ShowMsgNotify(void)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ShowMsgNotify");\r
+ return OHOS::PhoneMsgView::CreatePhoneMsgView();\r
+}\r
+\r
+void PhoneMsgView::ShowDateMsg(std::string appName, std::string title, std::string content)\r
+{\r
+ const uint16_t TOPIC_DEMO_ALL_MSG = 10001;\r
+ UpDatePhoneMsg(appName, title, content);\r
+ int prio = 2;\r
+ NotificationManager::GetInstance()->SetNotifyPriority(prio);\r
+ NotificationManager::GetInstance()->ShowNotify(ShowMsgNotify, static_cast<uint16_t>(TOPIC_DEMO_ALL_MSG), true);\r
}\r
\r
PhoneMsgViewEventListener::PhoneMsgViewEventListener()\r
std::string viewId = view.GetViewId();\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener OnDragEnd %s", viewId.c_str());\r
if (viewId == "phoneMsgView") {\r
- NotificationManager::GetInstance()->StopNotify();\r
+ // NotificationManager::GetInstance()->StopNotify();\r
}\r
return true;\r
}\r
set(PRIVATE_HEADER\r
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits\r
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
+ ${ROOT_DIR}/application/wearable/nativeapp/nativeui/include/phonemenu\r
)\r
\r
set(SOURCES\r
${CMAKE_CURRENT_SOURCE_DIR}/remote_msg.cpp\r
+ ${CMAKE_CURRENT_SOURCE_DIR}/phone_contacts.cpp\r
)\r
\r
set(COMPONENT_PUBLIC_CCFLAGS\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneContacts\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "message.h"\r
+#include "PhoneMenuSync.h"\r
+#include "phone_contacts.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+uint8_t updata_contacts(Request *request)\r
+{\r
+ std::string content((char *)request->data, request->len);\r
+ uint8_t ret = OHOS::PhoneMenuSync::ParseContactsMsg(content);\r
+ if (ret != OHOS::OK) {\r
+ return ret;\r
+ }\r
+ OHOS::PhoneMenuSync::WriteFileContact(OHOS::CONTACTS_FILE_PATH, content);\r
+ return 0;\r
+}\r
+\r
+uint8_t lookup_contacts(std::string &lookupContacts)\r
+{\r
+ return OHOS::PhoneMenuSync::LookContacts(lookupContacts);\r
+}\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: PhoneContacts\r
+ * Create: 2025-07-12\r
+ */\r
+\r
+#ifndef PHONE_CONTACTS_H\r
+#define PHONE_CONTACTS_H\r
+#include <string>\r
+#include "message.h"\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+uint8_t updata_contacts(Request *request); // 同步手机侧联系人到表侧\r
+uint8_t lookup_contacts(std::string &lookupContacts); // 查询表侧联系人到手机\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+}\r
+#endif\r
+#endif\r
+#endif /* PHONE_CONTACTS_H */
\ No newline at end of file
/*\r
- * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
* Description: ota upgrade handle.\r
* This file should be changed only infrequently and with great care.\r
*/\r
+\r
#include <stdio.h>\r
#include "securec.h"\r
#include "msg_center.h"\r
#include "msg_center.h"\r
#include "msg_center_common.h"\r
#include "ohos_init.h"\r
+#include "phone_contacts.h"\r
#include "remote_msg.h"\r
+\r
#ifdef __cplusplus\r
extern "C" {\r
#endif\r
{MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_THIRD_APP, msg_center_phone_msg_rec},\r
{MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_SMS, msg_center_phone_msg_rec},\r
{MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_PHONE, msg_center_phone_msg_rec},\r
+ {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_UPDATE_CONTACTS, msg_center_update_contacts},\r
+ {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_LOOKUP_CONTACTS, msg_center_lookup_contacts},\r
};\r
\r
errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
return ERRCODE_SUCC;\r
}\r
\r
+errcode_t msg_center_update_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ uint8_t msg_result = 0;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "update_contacts, cmd_id = %d, type = %d\r\n", cmd_id, type);\r
+ Request request;\r
+ request.msgId = type;\r
+ request.len = payload_len;\r
+ request.data = tlv_payload;\r
+ updata_contacts(&request);\r
+ ret = msg_center_send_data(cmd_id, type, &msg_result, sizeof(msg_result));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_update_contacts fail, ret = %d\r\n", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_lookup_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ uint8_t msg_result = 0;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "lookup_contacts, cmd_id = %d, type = %d\r\n", cmd_id, type);\r
+ std::string lookupContacts;\r
+ uint8_t result = lookup_contacts(lookupContacts);\r
+ if (!result) {\r
+ ret = msg_center_send_data(cmd_id, type, (void *)lookupContacts.c_str(), lookupContacts.size());\r
+ } else {\r
+ ret = msg_center_send_data(cmd_id, type, (void *)&result, 1);\r
+ }\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_lookup_contacts fail, ret = %d\r\n", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+\r
errcode_t msg_center_phone_msg_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_phone_msg_type_dispatch, cmd_id = %d, type = %d\r\n",\r
MSGCENTER_TYPE_ID_MSG_THIRD_APP = 0x1, // 三方应用消息\r
MSGCENTER_TYPE_ID_MSG_SMS, // 短信\r
MSGCENTER_TYPE_ID_MSG_PHONE, // 电话\r
+ MSGCENTER_TYPE_ID_UPDATE_CONTACTS,\r
+ MSGCENTER_TYPE_ID_LOOKUP_CONTACTS,\r
MSGCENTER_TYPE_ID_MSG_MAX,\r
} msg_center_msg_notify_type_id_t;\r
\r
errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_update_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_lookup_contacts(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
\r
#ifdef __cplusplus\r
#if __cplusplus\r