From d153df5af1deea75bce9ff38a5413a82f951c510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=94=A6=E6=9E=97?= Date: Mon, 27 Dec 2021 07:20:53 +0000 Subject: [PATCH] Add Mms app source Signed-off-by: zhangjinlin --- .gitignore | 15 + LICENSE | 176 + OAT.xml | 69 + README_zh.md | 68 + build.gradle | 36 + doc/Instructions.md | 241 ++ doc/image/screenshot-20211129-202627.png | Bin 0 -> 42845 bytes entry/.gitignore | 1 + entry/build.gradle | 47 + entry/package.json | 1 + entry/proguard-rules.pro | 1 + entry/src/main/config.json | 91 + .../js/ServiceAbility/MmsManagerService.js | 719 ++++ entry/src/main/js/ServiceAbility/service.js | 35 + entry/src/main/js/default/app.js | 92 + entry/src/main/js/default/common/icon/add.png | Bin 0 -> 473 bytes .../src/main/js/default/common/icon/add_2.png | Bin 0 -> 4241 bytes .../src/main/js/default/common/icon/add_2.svg | 2 + .../src/main/js/default/common/icon/back.png | Bin 0 -> 20468 bytes .../src/main/js/default/common/icon/call.svg | 45 + .../main/js/default/common/icon/camera.svg | 1 + .../js/default/common/icon/checkbox_off.svg | 29 + .../js/default/common/icon/checkbox_on.svg | 32 + .../js/default/common/icon/china_mobile.png | Bin 0 -> 20978 bytes .../default/common/icon/circle_selected.svg | 23 + .../default/common/icon/circle_unselected.svg | 18 + .../common/icon/conversation_select_exit.svg | 15 + .../main/js/default/common/icon/delete.png | Bin 0 -> 3954 bytes .../main/js/default/common/icon/delete.svg | 39 + .../default/common/icon/entrance_icon01.svg | 17 + .../common/icon/ic_add_norm_filled_m.svg | 7 + .../js/default/common/icon/ic_allread.svg | 20 + .../main/js/default/common/icon/ic_back.svg | 16 + .../js/default/common/icon/ic_back_white.svg | 33 + .../main/js/default/common/icon/ic_cancel.svg | 49 + .../default/common/icon/ic_cancel_black.svg | 51 + .../common/icon/ic_contacts_sim_1_mini.svg | 12 + .../common/icon/ic_contacts_sim_2_mini.svg | 13 + .../js/default/common/icon/ic_delete_m.svg | 10 + .../js/default/common/icon/ic_gallery.svg | 18 + .../js/default/common/icon/ic_massage_m.svg | 21 + .../js/default/common/icon/ic_more_24x12.svg | 7 + .../js/default/common/icon/ic_more_24x24.svg | 7 + .../common/icon/ic_msg_favorite_copy_m.svg | 1 + .../common/icon/ic_msg_favorite_filled_m.svg | 10 + .../default/common/icon/ic_msg_favorite_m.svg | 27 + .../common/icon/ic_notification_disable.svg | 22 + .../main/js/default/common/icon/ic_play.svg | 57 + .../main/js/default/common/icon/ic_play2.svg | 16 + .../js/default/common/icon/ic_play_filled.svg | 41 + .../js/default/common/icon/ic_play_tag.svg | 57 + .../main/js/default/common/icon/ic_search.svg | 15 + .../js/default/common/icon/ic_select_all.svg | 9 + .../common/icon/ic_select_all_filled.svg | 22 + .../js/default/common/icon/ic_send_fail.svg | 16 + .../main/js/default/common/icon/ic_star.svg | 16 + .../common/icon/ic_tab_image_check.svg | 21 + .../main/js/default/common/icon/ic_tick.svg | 47 + .../js/default/common/icon/ic_transfer.svg | 25 + .../main/js/default/common/icon/ic_voice.svg | 54 + .../js/default/common/icon/ic_voice_left.svg | 81 + .../js/default/common/icon/ic_voice_right.svg | 78 + .../main/js/default/common/icon/ic_wrong.svg | 52 + .../src/main/js/default/common/icon/icbc.png | Bin 0 -> 10758 bytes .../main/js/default/common/icon/icon_add.svg | 24 + .../js/default/common/icon/icon_avatar.jpg | Bin 0 -> 61628 bytes .../main/js/default/common/icon/icon_back.svg | 16 + .../main/js/default/common/icon/icon_card.svg | 93 + .../js/default/common/icon/icon_card_2.svg | 93 + .../main/js/default/common/icon/icon_down.svg | 17 + .../js/default/common/icon/icon_favorite.svg | 17 + .../js/default/common/icon/icon_keyboard.svg | 16 + .../js/default/common/icon/icon_mms_sim_1.svg | 12 + .../js/default/common/icon/icon_mms_sim_2.svg | 13 + .../main/js/default/common/icon/icon_more.svg | 14 + .../common/icon/icon_more_forSetting.svg | 16 + .../main/js/default/common/icon/icon_next.svg | 16 + .../js/default/common/icon/icon_phone.svg | 51 + .../default/common/icon/icon_switch_false.svg | 1 + .../default/common/icon/icon_switch_true.svg | 1 + .../src/main/js/default/common/icon/ikea.png | Bin 0 -> 14829 bytes .../src/main/js/default/common/icon/image.svg | 1 + .../main/js/default/common/icon/keyboard.png | Bin 0 -> 10573 bytes .../js/default/common/icon/mark_as_read.svg | 43 + .../src/main/js/default/common/icon/more.png | Bin 0 -> 14593 bytes .../main/js/default/common/icon/msg_add.svg | 1 + .../default/common/icon/msg_camera_false.svg | 1 + .../default/common/icon/msg_camera_true.svg | 18 + .../js/default/common/icon/msg_cancel.svg | 1 + .../js/default/common/icon/msg_contacts.svg | 20 + .../default/common/icon/msg_contacts_open.svg | 19 + .../common/icon/msg_contacts_retract.svg | 19 + .../common/icon/msg_contacts_select.svg | 19 + .../js/default/common/icon/msg_delete.svg | 57 + .../main/js/default/common/icon/msg_done.svg | 26 + .../main/js/default/common/icon/msg_emoji.svg | 1 + .../default/common/icon/msg_full_screen.svg | 1 + .../common/icon/msg_location_false.svg | 1 + .../default/common/icon/msg_location_true.svg | 1 + .../main/js/default/common/icon/msg_lock.svg | 26 + .../js/default/common/icon/msg_lock_two.svg | 19 + .../js/default/common/icon/msg_more_false.svg | 15 + .../js/default/common/icon/msg_more_true.svg | 1 + .../main/js/default/common/icon/msg_music.svg | 1 + .../default/common/icon/msg_picture_false.svg | 17 + .../default/common/icon/msg_picture_true.svg | 18 + .../main/js/default/common/icon/msg_play.svg | 1 + .../main/js/default/common/icon/msg_ppt.svg | 15 + .../main/js/default/common/icon/msg_puse.svg | 1 + .../common/icon/msg_recording_false.svg | 1 + .../common/icon/msg_recording_true.svg | 53 + .../main/js/default/common/icon/msg_save.svg | 1 + .../js/default/common/icon/msg_schedule.svg | 1 + .../main/js/default/common/icon/msg_send.svg | 1 + .../main/js/default/common/icon/msg_theme.svg | 13 + .../default/common/icon/msg_unfull_screen.svg | 1 + .../js/default/common/icon/msg_unlock.svg | 19 + .../js/default/common/icon/new_contact.png | Bin 0 -> 3688 bytes .../js/default/common/icon/new_message.svg | 21 + entry/src/main/js/default/common/icon/pin.png | Bin 0 -> 1524 bytes .../src/main/js/default/common/icon/play.svg | 1 + .../src/main/js/default/common/icon/plus.png | Bin 0 -> 19692 bytes .../main/js/default/common/icon/position.svg | 1 + entry/src/main/js/default/common/icon/ppt.svg | 1 + .../src/main/js/default/common/icon/send.svg | 1 + .../js/default/common/icon/send_green.svg | 1 + .../src/main/js/default/common/icon/smell.svg | 1 + .../src/main/js/default/common/icon/stop.svg | 1 + entry/src/main/js/default/common/icon/up.png | Bin 0 -> 27992 bytes .../common/icon/user_avatar_full_fill.svg | 17 + .../src/main/js/default/common/icon/vmall.png | Bin 0 -> 16600 bytes entry/src/main/js/default/i18n/en-US.json | 331 ++ entry/src/main/js/default/i18n/zh-CN.json | 364 ++ entry/src/main/js/default/model/BaseModel.js | 32 + .../main/js/default/model/MorkDataModel.js | 69 + .../default/model/cardInfoImpl/CardModel.js | 151 + .../model/contactsImpl/ContactsModel.js | 179 + .../conversationImpl/ConversationModel.js | 649 +++ .../ConversationListModel.js | 197 + .../groupDetailImpl/GroupDetailImplModel.js | 66 + .../model/myStarImpl/MyStarImplModel.js | 108 + .../model/settingsImpl/SettingsModel.js | 114 + entry/src/main/js/default/pages/DateUtil.js | 359 ++ .../advanced_settings/advanced_settings.css | 327 ++ .../advanced_settings/advanced_settings.hml | 241 ++ .../advanced_settings/advanced_settings.js | 339 ++ .../main/js/default/pages/common_constants.js | 289 ++ .../contact_high_light/contact_highlight.css | 34 + .../contact_high_light/contact_highlight.hml | 20 + .../contact_high_light/contact_highlight.js | 95 + .../pages/component/high_light/highlight.css | 33 + .../pages/component/high_light/highlight.hml | 20 + .../pages/component/high_light/highlight.js | 62 + .../highlight_dialog/highlight_dialog.css | 64 + .../highlight_dialog/highlight_dialog.hml | 28 + .../highlight_dialog/highlight_dialog.js | 90 + .../component/msg_highlight/msg_highlight.css | 18 + .../component/msg_highlight/msg_highlight.hml | 23 + .../component/msg_highlight/msg_highlight.js | 253 ++ .../pages/component/receive/receive.css | 180 + .../pages/component/receive/receive.hml | 70 + .../pages/component/receive/receive.js | 388 ++ .../contact_item_pick/contact_item_pick.css | 103 + .../contact_item_pick/contact_item_pick.hml | 41 + .../contact_item_pick/contact_item_pick.js | 50 + .../pages/conversation/conversation.css | 1283 ++++++ .../pages/conversation/conversation.hml | 722 ++++ .../pages/conversation/conversation.js | 3668 +++++++++++++++++ .../conversation_list/conversation_list.css | 617 +++ .../conversation_list/conversation_list.hml | 346 ++ .../conversation_list/conversation_list.js | 1093 +++++ .../full_screen_input/full_screen_input.css | 96 + .../full_screen_input/full_screen_input.hml | 35 + .../full_screen_input/full_screen_input.js | 72 + .../full_screen_show_picture.css | 65 + .../full_screen_show_picture.hml | 29 + .../full_screen_show_picture.js | 62 + .../pages/group_detail/group_detail.css | 294 ++ .../pages/group_detail/group_detail.hml | 99 + .../pages/group_detail/group_detail.js | 250 ++ .../src/main/js/default/pages/index/index.css | 23 + .../src/main/js/default/pages/index/index.hml | 17 + .../src/main/js/default/pages/index/index.js | 132 + .../js/default/pages/info_msg/info_msg.css | 135 + .../js/default/pages/info_msg/info_msg.hml | 271 ++ .../js/default/pages/info_msg/info_msg.js | 859 ++++ .../default/pages/manage_sim/manage_sim.css | 422 ++ .../default/pages/manage_sim/manage_sim.hml | 233 ++ .../js/default/pages/manage_sim/manage_sim.js | 390 ++ entry/src/main/js/default/pages/mms_table.js | 112 + .../main/js/default/pages/my_star/my_star.css | 353 ++ .../main/js/default/pages/my_star/my_star.hml | 228 + .../main/js/default/pages/my_star/my_star.js | 676 +++ .../pages/query_report/query_report.css | 56 + .../pages/query_report/query_report.hml | 31 + .../pages/query_report/query_report.js | 55 + .../js/default/pages/settings/settings.css | 193 + .../js/default/pages/settings/settings.hml | 86 + .../js/default/pages/settings/settings.js | 148 + .../pages/slide_detail/slide_detail.css | 172 + .../pages/slide_detail/slide_detail.hml | 97 + .../pages/slide_detail/slide_detail.js | 227 + .../default/pages/sms_center/sms_center.css | 140 + .../default/pages/sms_center/sms_center.hml | 50 + .../js/default/pages/sms_center/sms_center.js | 211 + .../default/pages/text_select/text_select.css | 104 + .../default/pages/text_select/text_select.hml | 48 + .../default/pages/text_select/text_select.js | 387 ++ .../pages/transmit_msg/transmit_msg.css | 450 ++ .../pages/transmit_msg/transmit_msg.hml | 216 + .../pages/transmit_msg/transmit_msg.js | 388 ++ .../pages/transmit_search/transmit_search.css | 609 +++ .../pages/transmit_search/transmit_search.hml | 287 ++ .../pages/transmit_search/transmit_search.js | 434 ++ .../pages/video_operation/video_operation.css | 108 + .../pages/video_operation/video_operation.hml | 63 + .../pages/video_operation/video_operation.js | 80 + .../main/js/default/service/CallService.js | 43 + .../main/js/default/service/CommonService.js | 195 + .../js/default/service/ContractService.js | 171 + .../service/ConversationListService.js | 638 +++ .../js/default/service/ConversationService.js | 1092 +++++ .../js/default/service/GroupDetailService.js | 157 + .../main/js/default/service/MyStarService.js | 363 ++ .../js/default/service/NotificationService.js | 140 + .../main/js/default/service/SendMsgService.js | 91 + .../main/js/default/service/SettingService.js | 236 ++ .../main/js/default/service/SimCardService.js | 72 + entry/src/main/js/default/utils/MmsLog.js | 36 + entry/src/main/js/default/utils/Pasteboard.js | 32 + .../main/js/default/utils/PreferencesUtil.js | 139 + .../src/main/js/default/utils/RdbStoreUtil.js | 110 + .../main/js/default/utils/TelephoneUtil.js | 162 + .../main/resources/base/element/string.json | 16 + entry/src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../src/main/resources/base/media/smsmms.png | Bin 0 -> 2075 bytes entry/src/ohosTest/config.json | 53 + entry/src/ohosTest/js/default/app.js | 20 + entry/src/ohosTest/js/default/i18n/en-US.json | 8 + entry/src/ohosTest/js/default/i18n/zh-CN.json | 8 + .../ohosTest/js/default/pages/index/index.css | 9 + .../ohosTest/js/default/pages/index/index.hml | 5 + .../ohosTest/js/default/pages/index/index.js | 51 + .../src/ohosTest/js/test/CallService.test.js | 26 + .../ohosTest/js/test/ContractService.test.js | 71 + .../js/test/ConversationListService.test.js | 140 + .../js/test/ConversationService.test.js | 106 + .../js/test/GroupDetailService.test.js | 83 + entry/src/ohosTest/js/test/List.test.js | 24 + .../ohosTest/js/test/MyStarService.test.js | 100 + .../js/test/NotificationService.test.js | 36 + .../ohosTest/js/test/SendMsgService.test.js | 35 + .../ohosTest/js/test/SettingService.test.js | 111 + .../ohosTest/js/test/SimCardService.test.js | 52 + .../resources/base/element/string.json | 12 + .../ohosTest/resources/base/media/icon.png | Bin 0 -> 6790 bytes figures/cmd1.png | Bin 0 -> 71867 bytes figures/cmd2.png | Bin 0 -> 110399 bytes figures/cmd3.png | Bin 0 -> 24588 bytes figures/ds_build_haps.png | Bin 0 -> 13633 bytes figures/ds_hilog_window.png | Bin 0 -> 74859 bytes figures/ds_ohosbuild_output_dir_debug.png | Bin 0 -> 13396 bytes figures/ds_ohosbuild_output_dir_release.png | Bin 0 -> 17848 bytes figures/ds_ohosbuild_variants.png | Bin 0 -> 17602 bytes figures/ds_ohosbuild_variants_debug.png | Bin 0 -> 19164 bytes figures/ds_ohosbuild_variants_release.png | Bin 0 -> 13028 bytes figures/importProject.png | Bin 0 -> 24539 bytes figures/screenshot-20210521-105407.png | Bin 0 -> 60040 bytes figures/screenshot-20210521-110433.png | Bin 0 -> 71270 bytes figures/screenshot-20210521-111223.png | Bin 0 -> 25883 bytes figures/signature_1.png | Bin 0 -> 20463 bytes figures/signature_2.png | Bin 0 -> 37697 bytes figures/signature_3.png | Bin 0 -> 73718 bytes global.gradle | 21 + gradle.properties | 10 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 + gradlew.bat | 103 + settings.gradle | 1 + signature/mms.p7b | Bin 0 -> 3417 bytes 281 files changed, 31197 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 OAT.xml create mode 100644 README_zh.md create mode 100644 build.gradle create mode 100644 doc/Instructions.md create mode 100644 doc/image/screenshot-20211129-202627.png create mode 100644 entry/.gitignore create mode 100644 entry/build.gradle create mode 100644 entry/package.json create mode 100644 entry/proguard-rules.pro create mode 100644 entry/src/main/config.json create mode 100644 entry/src/main/js/ServiceAbility/MmsManagerService.js create mode 100644 entry/src/main/js/ServiceAbility/service.js create mode 100644 entry/src/main/js/default/app.js create mode 100644 entry/src/main/js/default/common/icon/add.png create mode 100644 entry/src/main/js/default/common/icon/add_2.png create mode 100644 entry/src/main/js/default/common/icon/add_2.svg create mode 100644 entry/src/main/js/default/common/icon/back.png create mode 100644 entry/src/main/js/default/common/icon/call.svg create mode 100644 entry/src/main/js/default/common/icon/camera.svg create mode 100644 entry/src/main/js/default/common/icon/checkbox_off.svg create mode 100644 entry/src/main/js/default/common/icon/checkbox_on.svg create mode 100644 entry/src/main/js/default/common/icon/china_mobile.png create mode 100644 entry/src/main/js/default/common/icon/circle_selected.svg create mode 100644 entry/src/main/js/default/common/icon/circle_unselected.svg create mode 100644 entry/src/main/js/default/common/icon/conversation_select_exit.svg create mode 100644 entry/src/main/js/default/common/icon/delete.png create mode 100644 entry/src/main/js/default/common/icon/delete.svg create mode 100644 entry/src/main/js/default/common/icon/entrance_icon01.svg create mode 100644 entry/src/main/js/default/common/icon/ic_add_norm_filled_m.svg create mode 100644 entry/src/main/js/default/common/icon/ic_allread.svg create mode 100644 entry/src/main/js/default/common/icon/ic_back.svg create mode 100644 entry/src/main/js/default/common/icon/ic_back_white.svg create mode 100644 entry/src/main/js/default/common/icon/ic_cancel.svg create mode 100644 entry/src/main/js/default/common/icon/ic_cancel_black.svg create mode 100644 entry/src/main/js/default/common/icon/ic_contacts_sim_1_mini.svg create mode 100644 entry/src/main/js/default/common/icon/ic_contacts_sim_2_mini.svg create mode 100644 entry/src/main/js/default/common/icon/ic_delete_m.svg create mode 100644 entry/src/main/js/default/common/icon/ic_gallery.svg create mode 100644 entry/src/main/js/default/common/icon/ic_massage_m.svg create mode 100644 entry/src/main/js/default/common/icon/ic_more_24x12.svg create mode 100644 entry/src/main/js/default/common/icon/ic_more_24x24.svg create mode 100644 entry/src/main/js/default/common/icon/ic_msg_favorite_copy_m.svg create mode 100644 entry/src/main/js/default/common/icon/ic_msg_favorite_filled_m.svg create mode 100644 entry/src/main/js/default/common/icon/ic_msg_favorite_m.svg create mode 100644 entry/src/main/js/default/common/icon/ic_notification_disable.svg create mode 100644 entry/src/main/js/default/common/icon/ic_play.svg create mode 100644 entry/src/main/js/default/common/icon/ic_play2.svg create mode 100644 entry/src/main/js/default/common/icon/ic_play_filled.svg create mode 100644 entry/src/main/js/default/common/icon/ic_play_tag.svg create mode 100644 entry/src/main/js/default/common/icon/ic_search.svg create mode 100644 entry/src/main/js/default/common/icon/ic_select_all.svg create mode 100644 entry/src/main/js/default/common/icon/ic_select_all_filled.svg create mode 100644 entry/src/main/js/default/common/icon/ic_send_fail.svg create mode 100644 entry/src/main/js/default/common/icon/ic_star.svg create mode 100644 entry/src/main/js/default/common/icon/ic_tab_image_check.svg create mode 100644 entry/src/main/js/default/common/icon/ic_tick.svg create mode 100644 entry/src/main/js/default/common/icon/ic_transfer.svg create mode 100644 entry/src/main/js/default/common/icon/ic_voice.svg create mode 100644 entry/src/main/js/default/common/icon/ic_voice_left.svg create mode 100644 entry/src/main/js/default/common/icon/ic_voice_right.svg create mode 100644 entry/src/main/js/default/common/icon/ic_wrong.svg create mode 100644 entry/src/main/js/default/common/icon/icbc.png create mode 100644 entry/src/main/js/default/common/icon/icon_add.svg create mode 100644 entry/src/main/js/default/common/icon/icon_avatar.jpg create mode 100644 entry/src/main/js/default/common/icon/icon_back.svg create mode 100644 entry/src/main/js/default/common/icon/icon_card.svg create mode 100644 entry/src/main/js/default/common/icon/icon_card_2.svg create mode 100644 entry/src/main/js/default/common/icon/icon_down.svg create mode 100644 entry/src/main/js/default/common/icon/icon_favorite.svg create mode 100644 entry/src/main/js/default/common/icon/icon_keyboard.svg create mode 100644 entry/src/main/js/default/common/icon/icon_mms_sim_1.svg create mode 100644 entry/src/main/js/default/common/icon/icon_mms_sim_2.svg create mode 100644 entry/src/main/js/default/common/icon/icon_more.svg create mode 100644 entry/src/main/js/default/common/icon/icon_more_forSetting.svg create mode 100644 entry/src/main/js/default/common/icon/icon_next.svg create mode 100644 entry/src/main/js/default/common/icon/icon_phone.svg create mode 100644 entry/src/main/js/default/common/icon/icon_switch_false.svg create mode 100644 entry/src/main/js/default/common/icon/icon_switch_true.svg create mode 100644 entry/src/main/js/default/common/icon/ikea.png create mode 100644 entry/src/main/js/default/common/icon/image.svg create mode 100644 entry/src/main/js/default/common/icon/keyboard.png create mode 100644 entry/src/main/js/default/common/icon/mark_as_read.svg create mode 100644 entry/src/main/js/default/common/icon/more.png create mode 100644 entry/src/main/js/default/common/icon/msg_add.svg create mode 100644 entry/src/main/js/default/common/icon/msg_camera_false.svg create mode 100644 entry/src/main/js/default/common/icon/msg_camera_true.svg create mode 100644 entry/src/main/js/default/common/icon/msg_cancel.svg create mode 100644 entry/src/main/js/default/common/icon/msg_contacts.svg create mode 100644 entry/src/main/js/default/common/icon/msg_contacts_open.svg create mode 100644 entry/src/main/js/default/common/icon/msg_contacts_retract.svg create mode 100644 entry/src/main/js/default/common/icon/msg_contacts_select.svg create mode 100644 entry/src/main/js/default/common/icon/msg_delete.svg create mode 100644 entry/src/main/js/default/common/icon/msg_done.svg create mode 100644 entry/src/main/js/default/common/icon/msg_emoji.svg create mode 100644 entry/src/main/js/default/common/icon/msg_full_screen.svg create mode 100644 entry/src/main/js/default/common/icon/msg_location_false.svg create mode 100644 entry/src/main/js/default/common/icon/msg_location_true.svg create mode 100644 entry/src/main/js/default/common/icon/msg_lock.svg create mode 100644 entry/src/main/js/default/common/icon/msg_lock_two.svg create mode 100644 entry/src/main/js/default/common/icon/msg_more_false.svg create mode 100644 entry/src/main/js/default/common/icon/msg_more_true.svg create mode 100644 entry/src/main/js/default/common/icon/msg_music.svg create mode 100644 entry/src/main/js/default/common/icon/msg_picture_false.svg create mode 100644 entry/src/main/js/default/common/icon/msg_picture_true.svg create mode 100644 entry/src/main/js/default/common/icon/msg_play.svg create mode 100644 entry/src/main/js/default/common/icon/msg_ppt.svg create mode 100644 entry/src/main/js/default/common/icon/msg_puse.svg create mode 100644 entry/src/main/js/default/common/icon/msg_recording_false.svg create mode 100644 entry/src/main/js/default/common/icon/msg_recording_true.svg create mode 100644 entry/src/main/js/default/common/icon/msg_save.svg create mode 100644 entry/src/main/js/default/common/icon/msg_schedule.svg create mode 100644 entry/src/main/js/default/common/icon/msg_send.svg create mode 100644 entry/src/main/js/default/common/icon/msg_theme.svg create mode 100644 entry/src/main/js/default/common/icon/msg_unfull_screen.svg create mode 100644 entry/src/main/js/default/common/icon/msg_unlock.svg create mode 100644 entry/src/main/js/default/common/icon/new_contact.png create mode 100644 entry/src/main/js/default/common/icon/new_message.svg create mode 100644 entry/src/main/js/default/common/icon/pin.png create mode 100644 entry/src/main/js/default/common/icon/play.svg create mode 100644 entry/src/main/js/default/common/icon/plus.png create mode 100644 entry/src/main/js/default/common/icon/position.svg create mode 100644 entry/src/main/js/default/common/icon/ppt.svg create mode 100644 entry/src/main/js/default/common/icon/send.svg create mode 100644 entry/src/main/js/default/common/icon/send_green.svg create mode 100644 entry/src/main/js/default/common/icon/smell.svg create mode 100644 entry/src/main/js/default/common/icon/stop.svg create mode 100644 entry/src/main/js/default/common/icon/up.png create mode 100644 entry/src/main/js/default/common/icon/user_avatar_full_fill.svg create mode 100644 entry/src/main/js/default/common/icon/vmall.png create mode 100644 entry/src/main/js/default/i18n/en-US.json create mode 100644 entry/src/main/js/default/i18n/zh-CN.json create mode 100644 entry/src/main/js/default/model/BaseModel.js create mode 100644 entry/src/main/js/default/model/MorkDataModel.js create mode 100644 entry/src/main/js/default/model/cardInfoImpl/CardModel.js create mode 100644 entry/src/main/js/default/model/contactsImpl/ContactsModel.js create mode 100644 entry/src/main/js/default/model/conversationImpl/ConversationModel.js create mode 100644 entry/src/main/js/default/model/conversationListImpl/ConversationListModel.js create mode 100644 entry/src/main/js/default/model/groupDetailImpl/GroupDetailImplModel.js create mode 100644 entry/src/main/js/default/model/myStarImpl/MyStarImplModel.js create mode 100644 entry/src/main/js/default/model/settingsImpl/SettingsModel.js create mode 100644 entry/src/main/js/default/pages/DateUtil.js create mode 100644 entry/src/main/js/default/pages/advanced_settings/advanced_settings.css create mode 100644 entry/src/main/js/default/pages/advanced_settings/advanced_settings.hml create mode 100644 entry/src/main/js/default/pages/advanced_settings/advanced_settings.js create mode 100644 entry/src/main/js/default/pages/common_constants.js create mode 100644 entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.css create mode 100644 entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.hml create mode 100644 entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.js create mode 100644 entry/src/main/js/default/pages/component/high_light/highlight.css create mode 100644 entry/src/main/js/default/pages/component/high_light/highlight.hml create mode 100644 entry/src/main/js/default/pages/component/high_light/highlight.js create mode 100644 entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.css create mode 100644 entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.hml create mode 100644 entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.js create mode 100644 entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.css create mode 100644 entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.hml create mode 100644 entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.js create mode 100644 entry/src/main/js/default/pages/component/receive/receive.css create mode 100644 entry/src/main/js/default/pages/component/receive/receive.hml create mode 100644 entry/src/main/js/default/pages/component/receive/receive.js create mode 100644 entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.css create mode 100644 entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.hml create mode 100644 entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.js create mode 100644 entry/src/main/js/default/pages/conversation/conversation.css create mode 100644 entry/src/main/js/default/pages/conversation/conversation.hml create mode 100644 entry/src/main/js/default/pages/conversation/conversation.js create mode 100644 entry/src/main/js/default/pages/conversation_list/conversation_list.css create mode 100644 entry/src/main/js/default/pages/conversation_list/conversation_list.hml create mode 100644 entry/src/main/js/default/pages/conversation_list/conversation_list.js create mode 100644 entry/src/main/js/default/pages/full_screen_input/full_screen_input.css create mode 100644 entry/src/main/js/default/pages/full_screen_input/full_screen_input.hml create mode 100644 entry/src/main/js/default/pages/full_screen_input/full_screen_input.js create mode 100644 entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.css create mode 100644 entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.hml create mode 100644 entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.js create mode 100644 entry/src/main/js/default/pages/group_detail/group_detail.css create mode 100644 entry/src/main/js/default/pages/group_detail/group_detail.hml create mode 100644 entry/src/main/js/default/pages/group_detail/group_detail.js create mode 100644 entry/src/main/js/default/pages/index/index.css create mode 100644 entry/src/main/js/default/pages/index/index.hml create mode 100644 entry/src/main/js/default/pages/index/index.js create mode 100644 entry/src/main/js/default/pages/info_msg/info_msg.css create mode 100644 entry/src/main/js/default/pages/info_msg/info_msg.hml create mode 100644 entry/src/main/js/default/pages/info_msg/info_msg.js create mode 100644 entry/src/main/js/default/pages/manage_sim/manage_sim.css create mode 100644 entry/src/main/js/default/pages/manage_sim/manage_sim.hml create mode 100644 entry/src/main/js/default/pages/manage_sim/manage_sim.js create mode 100644 entry/src/main/js/default/pages/mms_table.js create mode 100644 entry/src/main/js/default/pages/my_star/my_star.css create mode 100644 entry/src/main/js/default/pages/my_star/my_star.hml create mode 100644 entry/src/main/js/default/pages/my_star/my_star.js create mode 100644 entry/src/main/js/default/pages/query_report/query_report.css create mode 100644 entry/src/main/js/default/pages/query_report/query_report.hml create mode 100644 entry/src/main/js/default/pages/query_report/query_report.js create mode 100644 entry/src/main/js/default/pages/settings/settings.css create mode 100644 entry/src/main/js/default/pages/settings/settings.hml create mode 100644 entry/src/main/js/default/pages/settings/settings.js create mode 100644 entry/src/main/js/default/pages/slide_detail/slide_detail.css create mode 100644 entry/src/main/js/default/pages/slide_detail/slide_detail.hml create mode 100644 entry/src/main/js/default/pages/slide_detail/slide_detail.js create mode 100644 entry/src/main/js/default/pages/sms_center/sms_center.css create mode 100644 entry/src/main/js/default/pages/sms_center/sms_center.hml create mode 100644 entry/src/main/js/default/pages/sms_center/sms_center.js create mode 100644 entry/src/main/js/default/pages/text_select/text_select.css create mode 100644 entry/src/main/js/default/pages/text_select/text_select.hml create mode 100644 entry/src/main/js/default/pages/text_select/text_select.js create mode 100644 entry/src/main/js/default/pages/transmit_msg/transmit_msg.css create mode 100644 entry/src/main/js/default/pages/transmit_msg/transmit_msg.hml create mode 100644 entry/src/main/js/default/pages/transmit_msg/transmit_msg.js create mode 100644 entry/src/main/js/default/pages/transmit_search/transmit_search.css create mode 100644 entry/src/main/js/default/pages/transmit_search/transmit_search.hml create mode 100644 entry/src/main/js/default/pages/transmit_search/transmit_search.js create mode 100644 entry/src/main/js/default/pages/video_operation/video_operation.css create mode 100644 entry/src/main/js/default/pages/video_operation/video_operation.hml create mode 100644 entry/src/main/js/default/pages/video_operation/video_operation.js create mode 100644 entry/src/main/js/default/service/CallService.js create mode 100644 entry/src/main/js/default/service/CommonService.js create mode 100644 entry/src/main/js/default/service/ContractService.js create mode 100644 entry/src/main/js/default/service/ConversationListService.js create mode 100644 entry/src/main/js/default/service/ConversationService.js create mode 100644 entry/src/main/js/default/service/GroupDetailService.js create mode 100644 entry/src/main/js/default/service/MyStarService.js create mode 100644 entry/src/main/js/default/service/NotificationService.js create mode 100644 entry/src/main/js/default/service/SendMsgService.js create mode 100644 entry/src/main/js/default/service/SettingService.js create mode 100644 entry/src/main/js/default/service/SimCardService.js create mode 100644 entry/src/main/js/default/utils/MmsLog.js create mode 100644 entry/src/main/js/default/utils/Pasteboard.js create mode 100644 entry/src/main/js/default/utils/PreferencesUtil.js create mode 100644 entry/src/main/js/default/utils/RdbStoreUtil.js create mode 100644 entry/src/main/js/default/utils/TelephoneUtil.js create mode 100644 entry/src/main/resources/base/element/string.json create mode 100644 entry/src/main/resources/base/media/icon.png create mode 100644 entry/src/main/resources/base/media/smsmms.png create mode 100644 entry/src/ohosTest/config.json create mode 100644 entry/src/ohosTest/js/default/app.js create mode 100644 entry/src/ohosTest/js/default/i18n/en-US.json create mode 100644 entry/src/ohosTest/js/default/i18n/zh-CN.json create mode 100644 entry/src/ohosTest/js/default/pages/index/index.css create mode 100644 entry/src/ohosTest/js/default/pages/index/index.hml create mode 100644 entry/src/ohosTest/js/default/pages/index/index.js create mode 100644 entry/src/ohosTest/js/test/CallService.test.js create mode 100644 entry/src/ohosTest/js/test/ContractService.test.js create mode 100644 entry/src/ohosTest/js/test/ConversationListService.test.js create mode 100644 entry/src/ohosTest/js/test/ConversationService.test.js create mode 100644 entry/src/ohosTest/js/test/GroupDetailService.test.js create mode 100644 entry/src/ohosTest/js/test/List.test.js create mode 100644 entry/src/ohosTest/js/test/MyStarService.test.js create mode 100644 entry/src/ohosTest/js/test/NotificationService.test.js create mode 100644 entry/src/ohosTest/js/test/SendMsgService.test.js create mode 100644 entry/src/ohosTest/js/test/SettingService.test.js create mode 100644 entry/src/ohosTest/js/test/SimCardService.test.js create mode 100644 entry/src/ohosTest/resources/base/element/string.json create mode 100644 entry/src/ohosTest/resources/base/media/icon.png create mode 100644 figures/cmd1.png create mode 100644 figures/cmd2.png create mode 100644 figures/cmd3.png create mode 100644 figures/ds_build_haps.png create mode 100644 figures/ds_hilog_window.png create mode 100644 figures/ds_ohosbuild_output_dir_debug.png create mode 100644 figures/ds_ohosbuild_output_dir_release.png create mode 100644 figures/ds_ohosbuild_variants.png create mode 100644 figures/ds_ohosbuild_variants_debug.png create mode 100644 figures/ds_ohosbuild_variants_release.png create mode 100644 figures/importProject.png create mode 100644 figures/screenshot-20210521-105407.png create mode 100644 figures/screenshot-20210521-110433.png create mode 100644 figures/screenshot-20210521-111223.png create mode 100644 figures/signature_1.png create mode 100644 figures/signature_2.png create mode 100644 figures/signature_3.png create mode 100644 global.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 signature/mms.p7b diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..37a4eb8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +/entry/.preview +.cxx diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d0381d6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/OAT.xml b/OAT.xml new file mode 100644 index 0000000..3292e0f --- /dev/null +++ b/OAT.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..2c424f3 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,68 @@ +# 短彩信 + +- [简介](#section11660541593) + - [架构图](#section48896451454) + +- [目录](#section161941989596) +- [使用说明](#section123459000) +- [相关仓](#section1371113476307) + +## 简介 + +短彩信应用是OpenHarmony中预置的系统应用,主要的功能包含发送短信、接收短信、转发、收藏、锁定、重新发送等功能; + + +### 架构图 + +![](./doc/image/screenshot-20211129-202627.png) + +## 目录 + +``` +/applications/standard/mms +├── figures # 架构图目录 +├── entry # 主entry模块目录 +│ ├── src +│ ├── main +│ └── js # js代码目录 +│ └── default +│ └── common.icon # 图标 +│ └── i18n # 国际化 +│ └── model # 数据管理层 +│ └── pages # 页面 +│ └── advanced_settings # 高级设置页面 +│ └── component # 组件 +│ └── conversation # 信息列表页面 +│ └── conversation_list # 会话列表页面 +│ └── full_screen_input # 全屏发送页面 +│ └── full_srceen_show_picture # 全屏展示图片页面 +│ └── group_detail # 群发组详情页面 +│ └── info_msg # 通知信息会话列表页面 +│ └── index # 首页 +│ └── manage_sim # sim卡管理页面 +│ └── my_star # 收藏页面 +│ └── query_report # 查看报告 +│ └── settings # 设置页面 +│ └── sms_center # 短信中心页面 +│ └── text_select # 文本选中页面 +│ └── transmit_select # 转发页面 +│ └── transmit_search # 转发搜索页面 +│ └── service # 业务逻辑 +│ └── utils # 工具类 +│ └── resources # 资源存放目录 +│ └── config.json # 全局配置文件 +├── gradle # gradle +│ ├──wrapper +├── KeyStore # 许可文件 +``` + +## 使用说明 + + 参见使用说明([使用说明](./doc/Instructions.md)) + +## 相关仓 + +系统应用 + +**applications_standard_mms** + diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..de0b8fa --- /dev/null +++ b/build.gradle @@ -0,0 +1,36 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' +apply from: this.file('global.gradle') + +ohos { + compileSdkVersion 7 + supportSystem "standard" + defaultConfig { + compatibleSdkVersion 7 + } +} + +buildscript { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } + dependencies { + classpath 'com.huawei.ohos:hap:3.0.3.4' + } +} + +allprojects { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } +} diff --git a/doc/Instructions.md b/doc/Instructions.md new file mode 100644 index 0000000..807cae4 --- /dev/null +++ b/doc/Instructions.md @@ -0,0 +1,241 @@ +# MMS 使用说明 +## 代码使用 +### 代码下载 +#### 配置码云ssh +1. 打开本地git bash窗口 +2. 进入到.ssh 目录:cd ~/.ssh +3. 找到id_rsa.pub文件:ls +4. 查看公钥:cat id_rsa.pub +5. 在码云个人设置-安全设置-ssh公钥中配置公钥 + +#### 下载代码 + 1. 打开码云MMS地址([下载地址](https://gitee.com/openharmony/applications_mms))。 + 2. 选择克隆/下载 - ssh方式 -复制下载地址 + 3. 本机git bash 中执行: + ``` + git clone '复制的下载地址' + ``` + +### 环境搭建 +打开DevEco Studio链接下载安装,安装步骤及安装说明详见官网 + +## 基础开发说明 +### 系统接口调用 +### 异步回调的使用 +- 在需要回调操作的js文件中创建回调函数 +```JavaScript +subscribeCallback(err, data){ + // do something +}, +``` +- 调用应用内部封装的接口,并传入回调函数 +```JavaScript +Notification.subscribe(mSubscriber, this.subscribeCallback.bind(this)); +``` +- 在AsyncCallback返回数据时可以获取到错误信息或目标数据 +```JavaScript +subscribeCallback(err, data) { + Log.showInfo(TAG, 'subscribeCallback finished ====================' + JSON.stringify(data)); +} +``` +### 如何引用资源文件 +- 在i18n/zh-CN.json文件中,可直接通过$t()引用资源 +```` JavaScript +this.title = this.$t('app.string.hello_world'); +```` + +## 典型接口的使用 + 1. 接收三方应用跳转 + ``` JavaScript + import featureAbility from '@ohos.ability.featureAbility'; + let str = { + 'want': { + 'bundleName': 'com.ohos.mms', + 'abilityName': 'com.ohos.mms.MainAbility', + 'parameters' : { + contactObjects: '{contactsName:asa,telephone:111}' + }, + 'entities': [ + common.string.COMMON_ENTITIES + ] + }, + }; + featureAbility.startAbility(str).then((data) => { + console.info(TAG + 'jumpToMmsApp successful' + data); + }).catch((error) => { + console.error(TAG + 'jumpToMmsApp failed,Cause: ' + JSON.stringify(error)); + }); + ``` +## 签名打包 +### 签名 +#### 签名文件的获取 +1. 拷贝OpenHarmony标准版工程的 prebuilts\signcenter 目录到操作目录 +2. 拷贝applications_mms工程的 signature\mms.p7b 到该目录下 +#### 签名文件的配置 +打开项目工程,选择 File → Project Structure + +![](../figures/signature_1.png) + +选择 Modules → Signing Configs,将对应的签名文件配置如下,完成后点击Apply,再点击OK。 + +![](../figures/signature_2.png) + +配置完成后,对应的build.gradle文件中会出现如下内容 + +![](../figures/signature_3.png) +### 打包 +DevEco Studio 支持 debug 与 release 两种打包类型。可以在 OhosBuild Variants 窗口中进行切换。 + + ![](../figures/ds_ohosbuild_variants.png) + +#### debug打包 +1. 代码准备完成后,在 OhosBuild Variants 窗口的 Selected Variant 中选择 debug。 + + ![](../figures/ds_ohosbuild_variants_debug.png) + +2. 选择Build → Build Haps(s)/APP(s) → Build Hap(s) + + ![](../figures/ds_build_haps.png) + +3. 编译完成后,hap包会生成在工程目录下的 `\build\outputs\hap\debug\phone\`路径下(如果没有配置签名,则只会生成未签名的hap包) + + ![](../figures/ds_ohosbuild_output_dir_debug.png) +#### release打包 +1. 代码准备完成后,在 OhosBuild Variants 窗口的 Selected Variant 中选择 release + + ![](../figures/ds_ohosbuild_variants_release.png) + +2. 选择Build → Build Haps(s)/APP(s) → Build Hap(s) + + ![](../figures/ds_build_haps.png) + +3. 编译完成后,hap包会生成在工程目录下的 `\build\outputs\hap\release\phone\`路径下(配置好签名后,生成的hap包会显示signed) + + ![](../figures/ds_ohosbuild_output_dir_release.png) +## 安装、运行、调试 +## 应用安装 +配置 hdc: +进入SDK目录中的toolchains文件夹下,获取文件路径: + +![](../figures/screenshot-20210521-105407.png) + +> 注意,此处的hdc.exe如果版本较老,可能不能正常使用,需要获取新的hdc.exe文件 +> hdc命令介绍与下载详见:[hdc仓库地址](https://gitee.com/openharmony/developtools_hdc_standard) + + +并将此路径配置到环境变量中: + +![](../figures/screenshot-20210521-111223.png) + +重启电脑使环境变量生效 + +连接开发板,打开cmd命令窗口,执行hdc list targets,弹出窗口如下: + +![](../figures/cmd1.png) + +等待一段时间后,窗口出现如下打印,可回到输入 hdc list targets 的命令窗口继续操作: + +![](../figures/cmd2.png) + +再次输入hdc list targets,出现如下结果,说明hdc连接成功 + +![](../figures/cmd3.png) + +获取读写权限: + +``` +hdc target mount +``` +将签名好的 hap 包放入设备的 `/system/app` 目录下,并修改hap包的权限 + +``` +hdc file send 本地路径 /system/app/hap包名称 +例如:hdc file send Mms.hap /system/app/Mms.hap +``` +> 注意,如果设备不存在 `/system/app` 目录,则需要手动创建该目录并修改权限。 +> ``` +> hdc shell +> cd system +> mkdir app +> chmod 777 app +> ``` +> `/system/app` 目录放置系统应用,例如:Mms 等。 +> +> 但hap包需要在该目录下手动设置权限 +> ``` +> chmod 666 hap包名 +> ``` +> 此目录应用不用手动安装,系统自动拉起。 +## 应用运行 +MMS属于系统应用,在将签名的 hap 包放入 `/system/app` 目录后,重启系统,应用会自动拉起。 +``` +hdc shell +reboot +(不可以直接执行hdc reboot,命令是无效的) +``` +> 注意,如果设备之前安装过系统应用,则需要执行如下两条命令清除设备中存储的应用信息才能够在设备重启的时候将我们装入设备的新 hap 包正常拉起。 +> ``` +> hdc shell rm -rf /data/misc_de/0/mdds/0/default/bundle_manager_service +> hdc shell rm -rf /data/accounts +> ``` +## 应用调试 +### log打印 +- 在程序中添加 log +```JS +console.info("mms log info"); +``` +### log获取及过滤 +- log获取 + +将log输出至文件 +``` +hdc shell hilog > 输出文件名称 +``` + +例: +在真实环境查看log,将全log输出到当前目录的hilog.log文件中 +``` +hdc shell hilog > hilog.log +``` + +- log过滤 + +在命令行窗口中过滤log +``` +hilog │ grep 过滤信息 +``` + +例:过滤包含信息 Label 的 hilog +``` +hilog │ grep Label +``` +## 贡献代码 +### Fork 代码仓库 +1. 在码云上打开 MMS 代码仓库([仓库地址](https://gitee.com/openharmony/applications_mms))。 + +2. 点击仓库右上角的 Forked 按钮,在弹出的画面中,选择将仓库 fork 到哪里,点击确认。 + +3. Fork 成功之后,会在自己的账号下看见 fork 的代码仓库。 + +### 提交代码 +1. 访问我们自己在码云账号上 fork 的代码仓库,点击“克隆/下载”按钮,选择 SSH,点击“复制”按钮。 + +2. 在本地新建 MMS 目录,在 MMS 目录中执行如下命令 + ``` + git clone 步骤1中复制的地址 + ``` + +3. 修改代码。 + > 将代码引入工程,以及编译工程等相关内容请参见 **3. 代码使用** 部分的相关内容。 +4. 提交代码到 fork 仓库。 + > 修改后的代码,首先执行 `git add` 命令,然后执行 `git commit` 命令与 `git push` 命令,将代码 push 到我们自己的 fork 仓中。 + > 关于代码提交的这部分内容涉及 git 的使用,可以参照 [git官网](https://git-scm.com/) 的内容,在此不再赘述。 + +### 发起 Pull Request (PR) +在将代码提交到 fork 仓之后,我们可以通过发起 Pull Request(PR)的方式来为 OpenHarmony 的相关项目贡献代码。 + +1. 打开 fork 仓库。选择 `Pull Requests` → `新建 Pull Request` + +2. 在 `新建 Pull Request` 画面填入标题与说明,点击 `创建` 按钮。 + +3. 创建 Pull Request 完成。 PR 创建完成后,会有专门的代码审查人员对代码进行评审,评审通过之后会合入相应的代码库。 \ No newline at end of file diff --git a/doc/image/screenshot-20211129-202627.png b/doc/image/screenshot-20211129-202627.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7a7aab8e467d89a96685f4c802619c2da35367 GIT binary patch literal 42845 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�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 UzWN8VQ2+n{07*qoM6N<$g2ce6UH||9 literal 0 HcmV?d00001 diff --git a/entry/.gitignore b/entry/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/entry/.gitignore @@ -0,0 +1 @@ +/build diff --git a/entry/build.gradle b/entry/build.gradle new file mode 100644 index 0000000..5efbec6 --- /dev/null +++ b/entry/build.gradle @@ -0,0 +1,47 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.hap' +ohos { + signingConfigs { + debug { + storePassword rootProject.ext.debugSignConfigs.storePassword + keyAlias rootProject.ext.debugSignConfigs.keyAlias + keyPassword rootProject.ext.debugSignConfigs.keyPassword + signAlg rootProject.ext.debugSignConfigs.signAlg + storeFile file(rootProject.ext.debugSignConfigs.storeFile) + profile file(rootProject.ext.debugSignConfigs.profile) + certpath file(rootProject.ext.debugSignConfigs.cerPath) + } + release { + storePassword rootProject.ext.signConfigs.storePassword + keyAlias rootProject.ext.signConfigs.keyAlias + keyPassword rootProject.ext.signConfigs.keyPassword + signAlg rootProject.ext.signConfigs.signAlg + storeFile file(rootProject.ext.signConfigs.storeFile) + profile file(rootProject.ext.signConfigs.profile) + certpath file(rootProject.ext.signConfigs.cerPath) + } + } + compileSdkVersion 7 + defaultConfig { + compatibleSdkVersion 7 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } + arkEnabled false +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + + // 单元测试相关依赖 + testImplementation 'junit:junit:4.13' + testImplementation 'org.mockito:mockito-core:2.19.0' + + ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.100' +} diff --git a/entry/package.json b/entry/package.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/entry/package.json @@ -0,0 +1 @@ +{} diff --git a/entry/proguard-rules.pro b/entry/proguard-rules.pro new file mode 100644 index 0000000..f7666e4 --- /dev/null +++ b/entry/proguard-rules.pro @@ -0,0 +1 @@ +# config module specific ProGuard rules here. \ No newline at end of file diff --git a/entry/src/main/config.json b/entry/src/main/config.json new file mode 100644 index 0000000..7f56dc4 --- /dev/null +++ b/entry/src/main/config.json @@ -0,0 +1,91 @@ +{ + "app": { + "bundleName": "com.ohos.mms", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.mms", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry", + "installationFree": true + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "visible": true, + "orientation": "unspecified", + "name": "com.ohos.mms.MainAbility", + "icon": "$media:smsmms", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "page", + "launchType": "standard", + "srcPath": "default", + "srcLanguage": "js" + }, + { + "srcPath": "ServiceAbility", + "name": ".ServiceAbility", + "icon": "$media:icon", + "srcLanguage": "js", + "description": "service", + "type": "service" + } + ], + "js": [ + { + "pages": [ + "pages/index/index", + "pages/conversation_list/conversation_list", + "pages/info_msg/info_msg", + "pages/conversation/conversation", + "pages/text_select/text_select", + "pages/group_detail/group_detail", + "pages/full_screen_input/full_screen_input", + "pages/my_star/my_star", + "pages/full_screen_show_picture/full_screen_show_picture", + "pages/video_operation/video_operation", + "pages/contact_item_pick/contact_item_pick", + "pages/transmit_msg/transmit_msg", + "pages/transmit_search/transmit_search", + "pages/settings/settings", + "pages/sms_center/sms_center", + "pages/advanced_settings/advanced_settings", + "pages/manage_sim/manage_sim", + "pages/query_report/query_report", + "pages/slide_detail/slide_detail" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.DISTRIBUTED_DATASYNC" + } + ] + } +} \ No newline at end of file diff --git a/entry/src/main/js/ServiceAbility/MmsManagerService.js b/entry/src/main/js/ServiceAbility/MmsManagerService.js new file mode 100644 index 0000000..e15e806 --- /dev/null +++ b/entry/src/main/js/ServiceAbility/MmsManagerService.js @@ -0,0 +1,719 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import commonEvent from '@ohos.commonevent'; +import common from '../default/pages/common_constants.js'; +import mmsTable from '../default/pages/mms_table.js'; +import telephoneUtils from '../default/utils/TelephoneUtil.js'; +import mmsLog from '../default/utils/MmsLog.js'; +import particleAbility from '@ohos.ability.particleability'; +import ohosDataAbility from '@ohos.data.dataability'; +import telSim from '@ohos.telephony.sms'; +import ohosDataRdb from '@ohos.data.rdb'; +import commonService from '../default/service/CommonService.js'; +import http from '@ohos.net.http'; +import notificationService from '../default/service/NotificationService.js'; + +// 数据库实例对象 +var rdbStore = undefined; +var dataAbilityHelper = undefined; +var contactDataAbilityHelper = undefined; + +// 数据库名称 +const STORE_CONFIG = { + name: 'mmssms.db', +} +const TAG = 'MmsManagerService.js ---> ' + +export default class CallManagerService { + constructor() { + this.addSubscriberListener(); + // 初始化数据库 + this.initRdb(); + // 初始化 + dataAbilityHelper = particleAbility.acquireDataAbilityHelper(common.string.URI_MESSAGE_LOG); + contactDataAbilityHelper = particleAbility.acquireDataAbilityHelper(common.string.URI_ROW_CONTACTS); + } + + /** + * add mms app subscriber + */ + async addSubscriberListener() { + let events = [common.string.SUBSCRIBER_EVENT, common.string.MMS_SUBSCRIBER_EVENT]; + let commonEventSubscribeInfo = { + events: events + }; + // 创建订阅信息 + commonEvent.createSubscriber(commonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); + } + + createSubscriberCallBack(err, data) { + this.commonEventData = data; + // 接收到订阅 + commonEvent.subscribe(this.commonEventData, this.subscriberCallBack.bind(this)); + } + + subscriberCallBack(err, data) { + // 短信接收 + if (data.event === common.string.SUBSCRIBER_EVENT) { + this.dealSmsReceiveData(data); + } else { + // 彩信接收 + this.dealMmsReceiveData(data); + } + } + + async dealSmsReceiveData(data) { + // 同步等待操作 + let createMessagePromise = telSim.createMessage(this.convertStrArray(data.data), '3gpp'); + let result = {}; + createMessagePromise.then((shortMessage) => { + mmsLog.log(TAG + 'shortMessage visibleMessageBody = ' + shortMessage); + result.code = common.int.SUCCESS; + result.telephone = telephoneUtils.formatTelephone(shortMessage.visibleRawAddress); + result.content = shortMessage.visibleMessageBody; + }).catch((err) => { + mmsLog.log(TAG + 'createShortMessage err ' + err.message); + result.code = common.int.FAILURE; + }); + await createMessagePromise; + let actionData = { + telephone: result.telephone, + content: result.content, + isMms: false, + mmsSource: [] + } + this.insertMessageDetailBy(actionData, res => { + this.sendNotification(result.telephone, res.initDatas[0].id, result.content); + this.publishData(result.telephone, result.content); + }); + } + + dealMmsReceiveData(data) { + let result = JSON.parse(data.data); + this.saveAttachment(result.mmsSource); + let content = commonService.getMmsContent(result.mmsSource); + let actionData = { + telephone: result.telephone, + content: content, + isMms: true, + mmsSource: result.mmsSource + } + this.insertMessageDetailBy(actionData, res => { + let notificationContent = this.getNotificationContent(result.mmsSource, content); + this.sendNotification(result.telephone, res.initDatas[0].id, notificationContent); + this.publishData(result.telephone, result.content); + }); + } + + saveAttachment(mmsSource) { + for (let item of mmsSource) { + let baseUrl = item.msgUriPath; + let httpRequest = http.createHttp(); + httpRequest.request(common.string.MMS_URL, + { + method: 'GET', + header: { + 'Content-Type': 'application/json', + }, + extraData: baseUrl, + readTimeout: 50000, + connectTimeout: 50000 + }, (err, data) => { + mmsLog.log(TAG + 'saveAttachment err:' + err + ' data:' + data); + } + ); + } + } + + getNotificationContent(mmsSource, themeContent) { + let content = common.string.EMPTY_STR; + if (mmsSource.length === 1) { + let item = mmsSource[0]; + switch (item.msgType) { + // 主题 + case 0: + content = themeContent; + break; + // 图片 + case 1: + content = '(picture)' + themeContent; + break; + // 视频 + case 2: + content = '(video)' + themeContent; + break; + // 音频 + case 3: + content = '(audio)' + themeContent; + break; + } + } else { + content = '(slide)' + mmsSource[0].content; + } + return content; + } + + // 插入接收到的数据 + insertMessageDetailBy(param, callback) { + let sendResults = []; + let sendResult = { + telephone: param.telephone, + content: param.content, + sendStatus: 0 + } + sendResults.push(sendResult); + let hasAttachment = commonService.judgeIsAttachment(param.mmsSource); + let actionData = { + sendResults: sendResults, + isReceive: true, + ownNumber: common.string.EMPTY_STR, + isSender: 1, + isMms: param.isMms, + mmsSource: param.mmsSource, + hasAttachment: hasAttachment + } + this.insertSessionAndDetail(actionData, callback); + } + + convertStrArray(sourceStr) { + let wby = sourceStr; + let length = wby.length; + let isDouble = (length % 2) == 0; + let halfSize = parseInt(length / 2); + mmsLog.log(TAG + 'length......' + length); + if (isDouble) { + mmsLog.log(TAG + 'isDouble......' + isDouble); + let number0xArray = new Array(halfSize); + for (let i = 0;i < halfSize; i++) { + number0xArray[i] = '0x' + wby.substr(i * 2, 2); + } + let numberArray = new Array(halfSize); + for (let i = 0;i < halfSize; i++) { + numberArray[i] = parseInt(number0xArray[i], 16); + } + return numberArray; + } else { + mmsLog.log('pdu error...'); + let number0xArray = new Array(halfSize + 1); + for (let i = 0;i < halfSize; i++) { + number0xArray[i] = '0x' + wby.substr(i * 2, 2); + } + number0xArray[halfSize] = '0x' + wby.substr((halfSize * 2) + 1, 1); + let numberArray = new Array(halfSize + 1); + for (let i = 0;i < halfSize; i++) { + numberArray[i] = parseInt(number0xArray[i], 16); + } + let last0x = '0x' + wby.substr(wby.length - 1, 1); + numberArray[halfSize] = parseInt(last0x); + return numberArray; + } + } + + // 取消订阅 + unsubscribe() { + commonEvent.unsubscribe(this.commonEventData, () => { + mmsLog.log('conversation_list unsubscribe'); + }); + } + + // 初始化数据库 + async initRdb() { + // 创建数据库表 + this.createRdbStore().then(async (ret) => { + mmsLog.log(' logMessage createRdbStore first done: ' + ret); + await this.createTable(mmsTable.table.session); + }).catch((err) => { + mmsLog.log(' logMessage error insert first done: ' + err); + }); + } + + /** + * 创建数据库 + */ + async createRdbStore() { + mmsLog.log(TAG + ' createRdbStore start'); + rdbStore = await ohosDataRdb.getRdbStore(STORE_CONFIG, 1); + mmsLog.log(TAG + ' createRdbStore end'); + } + + /** + * 创建数据库表 + */ + async createTable(table) { + await rdbStore.executeSql(table, null); + } + + insertSessionAndDetail(actionData, callback) { + let sendResults = actionData.sendResults; + let isReceive = actionData.isReceive; + if (sendResults.length == 0) { + return; + } + let value = this.dealSendResults(sendResults); + // 先判断是否创建过会话列表 + this.querySessionByTelephone(value.telephone, res => { + mmsLog.log(TAG + 'insertSessionAndDetail,querySessionByTelephone:' + res); + let response = res.response; + if (res.code == common.int.SUCCESS && response.id < 0) { + this.insertNoExitingSession(isReceive, value, actionData, callback); + } else { + this.insertExitingSession(response, value, actionData, callback); + } + }); + mmsLog.log(TAG + 'insertSessionAndDetail,end'); + } + + insertNoExitingSession(isReceive, value, actionData, callback) { + let unreadCount = 0; + if (isReceive) { + unreadCount = 1; + } + let valueBucket = { + 'telephone': value.telephone, + 'content': value.content, + 'contacts_num': value.contractsNum, + 'sms_type': value.smsType, + 'unread_count': unreadCount, + 'sending_status': value.sendStatus, + 'has_draft': 0, + 'time': value.timestamp, + 'message_count': 1, + 'has_mms': actionData.isMms ? 1 : 0, + 'has_attachment': actionData.hasAttachment ? 1 : 0 + } + this.insertSession(valueBucket, res => { + // 这里调用短信数据库,插入短信信息 + mmsLog.log(TAG + 'insertSession,rowId:' + res); + this.dealInsertMessageDetail(value, actionData, res.rowId, initDatas => { + mmsLog.log(TAG + 'dealInsertMessageDetail,initDatas:' + initDatas); + let result = { + rowId: res.rowId, + initDatas: initDatas + } + callback(result); + }); + }); + } + + insertExitingSession(response, param, actionData, callback) { + let sessionId = response.id; + // 这里调用短信数据库,插入短信信息 + let threadIds = [sessionId]; + let time = new Date(); + let unreadCount = 0; + if(actionData.isReceive) { + unreadCount = response.unreadCount; + unreadCount = unreadCount + 1; + } + let messageCount = response.messageCount; + messageCount = messageCount + 1; + let valueBucket = { + 'content': param.content, + 'unread_count': unreadCount, + 'time': time.getTime(), + 'sending_status': param.sendStatus, + 'message_count': messageCount, + 'has_mms': actionData.isMms ? 1 : 0, + 'has_draft': 0, + 'has_attachment': actionData.hasAttachment ? 1 : 0 + }; + this.updateById(threadIds, valueBucket, res => { + mmsLog.log(TAG + 'updateById,res:' + res); + // 这里调用短信数据库,插入短信信息 + this.dealInsertMessageDetail(param, actionData, sessionId, initDatas => { + mmsLog.log('dealInsertMessageDetail,initDatas:' + initDatas); + let result = { + rowId: sessionId, + initDatas: initDatas + } + callback(result); + }); + }); + } + + querySessionByTelephone(telephone, callback) { + let result = {}; + let queryPromise = this.querySessionByTelephoneRdb(telephone); + Promise.all([queryPromise]).then((res) => { + mmsLog.log('querySessionByTelephone,result:' + res[0]); + result.code = common.int.SUCCESS; + result.response = res[0]; + callback(result); + }).catch((err) => { + mmsLog.log('querySessionByTelephone error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + } + + // 根据手机号,获取会话列表 + async querySessionByTelephoneRdb(telephone) { + // 创建查询条件对象 + let predicates = new ohosDataRdb.RdbPredicates(common.tableName.SESSION); + mmsLog.log('querySessionByTelephoneRdb, predicates:' + predicates); + // 如果为空,查询所有的列表数据 + if (telephone) { + await predicates.equalTo(mmsTable.sessionField.telephone, telephone); + } + mmsLog.log('querySessionByTelephoneRdb, rdbStore:' + rdbStore); + // 获取到结果集 + let resultSet = await rdbStore.query(predicates); + // 获取第一条 + resultSet.goToFirstRow(); + let result = {}; + result.id = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.id)); + result.time = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.time)); + result.telephone = await resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.telephone)); + result.content = await resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.content)); + result.contactsNum = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.contactsNum)); + result.smsType = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.smsType)); + result.unreadCount = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.unreadCount)); + result.sendingStatus = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.sendingStatus)); + result.hasDraft = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.hasDraft)); + result.messageCount = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.messageCount)); + return result; + } + + // 插入 + insertSession(valueBucket, callback) { + this.insertSessionRdb(common.tableName.SESSION, valueBucket, callback); + } + + insertSessionRdb(tableName, valueBucket, callback) { + let insertPromise = this.insert(tableName, valueBucket); + let result = {}; + insertPromise.then((ret) => { + mmsLog.log('insertSession rowId:' + ret); + result.code = common.int.SUCCESS; + result.rowId = ret; + callback(result); + }).catch((err) => { + mmsLog.log('insertSession error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + } + + /** + * 新增数据 + */ + async insert(tableName, valueBucket) { + mmsLog.log('insert,enter:' + rdbStore); + let promise = rdbStore.insert(tableName, valueBucket); + let rowId = 0; + promise.then((ret) => { + rowId = ret; + }).catch((err) => { + mmsLog.log(TAG + ' insert first done: ' + err); + }) + await promise; + return rowId; + } + + dealInsertMessageDetail(param, actionData, threadId, callback) { + // 获取到最大的groupId + this.queryMaxGroupId(actionData, res => { + let maxGroupId = res == common.string.EMPTY_STR ? 0 : parseInt(res); + maxGroupId = maxGroupId + 1; + this.insertMessageDetailByGroupId(param, threadId, maxGroupId, actionData, callback); + }); + } + + insertMessageDetailByGroupId(param, threadId, maxGroupId, actionData, callback) { + let initDatas = []; + let count = 0; + let sendResults = actionData.sendResults; + for (let sendResult of sendResults) { + let insertDetail = { + receiverNumber: common.string.EMPTY_STR, + senderNumber: common.string.EMPTY_STR, + smsType: param.smsType, + content: param.content, + sendStatus: 0, + sessionType: 0, + threadId: threadId, + isSender: actionData.isSender, + groupId: maxGroupId, + mmsSource: actionData.mmsSource, + isMms: actionData.isMms + }; + if (actionData.isReceive) { + insertDetail.receiverNumber = actionData.ownNumber; + insertDetail.senderNumber = sendResult.telephone; + insertDetail.isRead = 0; + } + this.insertMessageDetail(insertDetail, result => { + count++; + mmsLog.log(TAG + 'insertMessageDetail,result:' + result); + let initData = { + id: result, + telephone: sendResult.telephone + }; + initDatas.push(initData); + if (count == sendResults.length) { + callback(initDatas); + } + }); + } + } + + dealSendResults(sendResults) { + let contractsNum = sendResults.length; + let telephone = common.string.EMPTY_STR; + let content = common.string.EMPTY_STR; + // 发送成功 + let sendStatus = 0; + for (let sendResult of sendResults) { + telephone = telephone + sendResult.telephone + common.string.COMMA; + content = sendResult.content; + sendStatus = sendResult.sendStatus; + } + telephone = telephone.substring(0, telephone.length - 1); + let smsType = 0; + if (contractsNum == 1 && telephoneUtils.judgeIsInfoMsg(telephone)) { + smsType = 1; + } + let timestamp = new Date().getTime(); + let result = {}; + result.contractsNum = contractsNum; + result.telephone = telephoneUtils.dealTelephoneSort(telephone); + result.content = content; + result.sendStatus = sendStatus; + result.smsType = smsType; + result.timestamp = timestamp; + return result; + } + + insertMessageDetail(value, callback) { + let actionData = {}; + let time = new Date(); + let timeStr = time.getTime() + common.string.EMPTY_STR; + var stringValue = { + 'receiver_number': value.receiverNumber, + 'sender_number': value.senderNumber, + 'start_time': timeStr, + 'end_time': timeStr, + 'msg_type': value.isMms ? '1' : '0', + 'sms_type': value.smsType, + 'msg_title': value.content, + 'msg_content': value.content, + 'msg_state': value.sendStatus, + 'operator_service_number': common.string.EMPTY_STR, + 'msg_code': common.string.EMPTY_STR, + 'session_id': value.threadId, + 'is_lock': '0', + 'is_read': value.isRead, + 'is_collect': '0', + 'session_type': value.sessionType, + 'is_subsection': '0', + 'is_sender': value.isSender, + 'is_send_report': 0, + 'group_id': value.groupId + }; + mmsLog.log(TAG + 'insertMessageDetail stringValue:' + stringValue); + actionData.stringValue = stringValue; + this.insertMessageDetailRdb(actionData, msgId => { + mmsLog.log(TAG + 'insertMessageDetailRdb msgId:' + msgId); + if (value.isMms) { + value.msgId = msgId; + this.batchInsertMmsPart(value); + } + callback(msgId); + }); + } + + batchInsertMmsPart(value) { + let bacthmsParts = []; + for (let source of value.mmsSource) { + let stringValue = { + 'msg_id': value.msgId, + 'group_id': value.groupId, + 'type': source.msgType, + 'location_path': source.msgUriPath, + 'content': source.content, + 'recording_time': source.time, + 'part_size': source.fileSize + }; + bacthmsParts.push(stringValue); + } + mmsLog.log(TAG + 'batchInsertMmsPart stringValue' + bacthmsParts); + for(let stringValue of bacthmsParts) { + this.insertMmsPart(stringValue); + } + } + + async insertMmsPart(stringValue) { + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MMS_PART; + dataAbilityHelper.insert(managerUri, stringValue).then(data => { + mmsLog.log(TAG + 'insertMmsPart, success:' + data); + }).catch(error => { + mmsLog.log(TAG + 'insertMmsPart fail:' + error); + }); + } + + // 插入单个短信信息 + async insertMessageDetailRdb(actionData, callback) { + // 获取DataAbilityHelper对象 + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.insert(managerUri, actionData.stringValue).then(data => { + mmsLog.log('dataAbilityHelper, success:' + data); + callback(data); + }).catch(error => { + mmsLog.log('insertMessageDetail fail:' + error); + }); + } + + /** + * 根据主键ID,更新数据 + * @param threadIds 会话ID + * @return + */ + async updateById(threadIds, valueBucket, callback) { + mmsLog.log('updateById, threadIds:' + threadIds); + if (threadIds.length != 0) { + for (let threadId of threadIds) { + // 创建查询条件对象 + let predicates = new ohosDataRdb.RdbPredicates(common.tableName.SESSION); + await predicates.equalTo(mmsTable.sessionField.id, threadId); + this.update(predicates, valueBucket, res => { + mmsLog.log(TAG + 'updated row count: ' + res); + callback(res); + }); + } + + } + } + + /** + * 更新接口 + * @param predicates 更新条件 + * @param predicates 更新值 + * @return + */ + async update(predicates, valueBucket, callback) { + let changedRows = await rdbStore.update(valueBucket, predicates); + callback(changedRows); + } + + /** + * 查询最大的groupId + * @param actionData 参数 + * @param callBack 回调 + * @return + */ + queryMaxGroupId(actionData, callBack) { + this.queryMaxGroupIdDb(actionData, res => { + mmsLog.log(TAG + 'queryMaxGroupId, end:' + res); + callBack(res.maxGroupId); + }); + } + + // 获取最大的groupId + async queryMaxGroupIdDb(actionData, callback) { + mmsLog.log('queryMaxGroupIdDb dataAbilityHelper :' + dataAbilityHelper); + let resultColumns = [ + 'maxGroupId' + ]; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MAX_GROUP; + dataAbilityHelper.query(managerUri, resultColumns, condition, (err, resultSet) => { + let result = {}; + while (resultSet.goToNextRow()) { + result.maxGroupId = resultSet.getString(0); + mmsLog.log(TAG + 'queryMaxGroupId result = ' + result); + } + callback(result); + }); + } + + /** + * commonEvent publish data + */ + publishData(telephone, content) { + let actionData = {}; + actionData.telephone = telephone; + actionData.content = content; + mmsLog.log('receive_message.publishData start'); + commonEvent.publish(common.string.RECEIVE_TRANSMIT_EVENT, { + bundleName: common.string.BUNDLE_NAME, + isOrdered: false, + data: JSON.stringify(actionData) + }, (res) => { + mmsLog.log('receive_message.publish callback res: ' + res); + }); + } + + async sendNotification(telephone, msgId, content) { + let telephones = [telephone]; + this.queryContactDataByTelephone(telephones, async (contracts) => { + mmsLog.log('queryContactDataByTelephone contracts:' + contracts); + let actionData = this.dealContactParams(contracts, telephone); + if (content.length > 15) { + content = content.substring(0, 15) + '...'; + } + let message = { + title: content, + text: content, + }; + actionData.message = message; + actionData.msgId = msgId; + notificationService.sendNotify(actionData); + }); + } + + dealContactParams(contracts, telephone) { + let actionData = {}; + let params = []; + if(contracts.length == 0) { + params.push({ + telephone: telephone, + }); + } else { + let contact = contracts[0]; + params.push({ + contactsName: contact.displayName, + telephone: telephone, + telephoneFormat: contact.detailInfo, + }); + } + actionData.contactObjects = JSON.stringify(params); + return actionData; + } + + async queryContactDataByTelephone(telephones, callback) { + let resultColumns = [ + mmsTable.contactDataColumns.detailInfo, + mmsTable.contactDataColumns.displayName, + ]; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let contactDataUri = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI; + condition.in(mmsTable.contactDataColumns.detailInfo, telephones); + condition.and(); + condition.equalTo(mmsTable.contactDataColumns.type_id, '5'); + contactDataAbilityHelper.query(contactDataUri, resultColumns, condition).then(resultSet => { + let contracts = []; + while (resultSet.goToNextRow()) { + let contract = {}; + contract.detailInfo = resultSet.getString(0); + contract.displayName = resultSet.getString(1); + contracts.push(contract); + } + callback(contracts); + }).catch(error => { + mmsLog.log('queryContactDataByTelephone error:' + error); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/ServiceAbility/service.js b/entry/src/main/js/ServiceAbility/service.js new file mode 100644 index 0000000..ab180f2 --- /dev/null +++ b/entry/src/main/js/ServiceAbility/service.js @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import MmsManagerService from './MmsManagerService.js'; +import mmsLog from '../default/utils/MmsLog.js'; + +export default { + + /** + * onStart + */ + onStart() { + mmsLog.log('service onStart mmsservice'); + new MmsManagerService(); + }, + + /** + * onDestroy + */ + onDestroy() { + mmsLog.log('service onDestroy mmsservice'); + } +} diff --git a/entry/src/main/js/default/app.js b/entry/src/main/js/default/app.js new file mode 100644 index 0000000..1b1bb24 --- /dev/null +++ b/entry/src/main/js/default/app.js @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../default/utils/MmsLog.js'; +import featureAbility from '@ohos.ability.featureAbility'; +import ohosDataAbility from '@ohos.data.dataability'; +import sendMsgService from '../default/service/SendMsgService.js'; +import conversationListService from '../default/service/ConversationListService.js'; +import notificationService from '../default/service/NotificationService.js'; +import commonService from '../default/service/CommonService.js'; +import rdbStore from '../default/utils/RdbStoreUtil.js'; +import dateUtil from '../../js/default/pages/DateUtil.js'; +import preferences from '../default/utils/PreferencesUtil.js'; + +const TAG = 'app.js->'; + +export default { + globalData: { + // 是否展示通知信息 + hasInfoMsg: true, + }, + onCreate() { + mmsLog.info(TAG + 'onCreate(): start, AceApplication onCreate'); + mmsLog.info(TAG + 'onCreate(): end, AceApplication onCreate'); + }, + onDestroy() { + mmsLog.info(TAG + 'onDestroy(): AceApplication onDestroy'); + }, + // full_screen_show_picture页面中图片或视频的index + indexInShowPicPage: null, + // full_screen_show_picture页面中图片或视频的checkbox的值 + checkedValueInShowPicPage: null, + // contact_item_pick页面中的电话号码列表 + oneContactInContactItemPickPage: null, + // 全屏发送值 + textValueOther: '', + // 全屏发送标记 + sendFlag: false, + // 转发发送的标记 + transmitFlag: false, + // 转发内容 + transmitContent: '', + // 转发的内容包含彩信 + transmitContents: [], + isSlideDetail: false, + mmsSource: [], + transmitSource: [], + isContainerOriginSource: false, + // 卡的槽位 + slotId: 0, + // 列表Id + threadId: '', + // 联系人数量 + contactsNum: 0, + // 联系人名称 + strContactsName: '', + // 联系人号码 + strContactsNumber: '', + // 格式化联系人号码 + strContactsNumberFormat: '', + // 跳转三方应用使用 + featureAbility: featureAbility, + // 查询数据库使用 + ohosDataAbility: ohosDataAbility, + // 发送短信的服务 + sendMsgService: sendMsgService, + // 消息通知 + notificationService: notificationService, + // 列表数据查询 + conversationListService: conversationListService, + // 公共的服务处理 + commonService: commonService, + // 数据库操作 + rdbStore: rdbStore, + // 时间类转化 + dateUtil: dateUtil, + // 是否从全屏界面回来 + isFromFullScreen: false, + // 偏量数据库 + preferences: preferences +}; diff --git a/entry/src/main/js/default/common/icon/add.png b/entry/src/main/js/default/common/icon/add.png new file mode 100644 index 0000000000000000000000000000000000000000..120fa59bc4aa5cb1ad9cf9a68b10937663cdfc6c GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^$v_;%!2~3gb?TP`Db50q$YKTtz9S&aI8~cZ8Yn1O z;u=vBoS#-wo>-L15S*7;kXT%j8Y_P8E&~H&o~MgrNX4ADw;b~h8Hlhw+_f!#YHRI( zZB?UguN6kTvsfQo&)6rsMow8U_2Y8GW78YnUuFLzJ#CSWYh>3Z5z!SP@AqDd%6_|d z{l2IA%5B$fyNhg<=> z{L(91JbQN>S53Zf{)gm)Po1yYT_cYi6MuSNd_KsZ=BGAED(Bbof})JU)78&qol`;+ E0C;A{PXGV_ literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/icon/add_2.png b/entry/src/main/js/default/common/icon/add_2.png new file mode 100644 index 0000000000000000000000000000000000000000..54f9beba947b02dc41dadd9dcaf75b4d03a99ece GIT binary patch literal 4241 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 literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/icon/add_2.svg b/entry/src/main/js/default/common/icon/add_2.svg new file mode 100644 index 0000000..3e53dba --- /dev/null +++ b/entry/src/main/js/default/common/icon/add_2.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/back.png b/entry/src/main/js/default/common/icon/back.png new file mode 100644 index 0000000000000000000000000000000000000000..026b8d81cba819c77c3c82d5a2a5dc3d77792a50 GIT binary patch literal 20468 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 p8=jx)XWe%)Ys>bq`*};3-ker& + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/camera.svg b/entry/src/main/js/default/common/icon/camera.svg new file mode 100644 index 0000000..bfe3366 --- /dev/null +++ b/entry/src/main/js/default/common/icon/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/checkbox_off.svg b/entry/src/main/js/default/common/icon/checkbox_off.svg new file mode 100644 index 0000000..a15611e --- /dev/null +++ b/entry/src/main/js/default/common/icon/checkbox_off.svg @@ -0,0 +1,29 @@ + + + + Checkbox_off + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/checkbox_on.svg b/entry/src/main/js/default/common/icon/checkbox_on.svg new file mode 100644 index 0000000..8631f17 --- /dev/null +++ b/entry/src/main/js/default/common/icon/checkbox_on.svg @@ -0,0 +1,32 @@ + + + + Checkbox/Light/on + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/china_mobile.png b/entry/src/main/js/default/common/icon/china_mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..03ce675dfda264f06aba9be4858e4bc4fc6e8bb1 GIT binary patch literal 20978 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 l + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/circle_unselected.svg b/entry/src/main/js/default/common/icon/circle_unselected.svg new file mode 100644 index 0000000..233a6e7 --- /dev/null +++ b/entry/src/main/js/default/common/icon/circle_unselected.svg @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/conversation_select_exit.svg b/entry/src/main/js/default/common/icon/conversation_select_exit.svg new file mode 100644 index 0000000..bfb8d84 --- /dev/null +++ b/entry/src/main/js/default/common/icon/conversation_select_exit.svg @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/delete.png b/entry/src/main/js/default/common/icon/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..7380004311d88680e6fb6a20d57b706dd4968e7e GIT binary patch literal 3954 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 literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/icon/delete.svg b/entry/src/main/js/default/common/icon/delete.svg new file mode 100644 index 0000000..f948b8f --- /dev/null +++ b/entry/src/main/js/default/common/icon/delete.svg @@ -0,0 +1,39 @@ + + + + delete + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/entrance_icon01.svg b/entry/src/main/js/default/common/icon/entrance_icon01.svg new file mode 100644 index 0000000..db0fa09 --- /dev/null +++ b/entry/src/main/js/default/common/icon/entrance_icon01.svg @@ -0,0 +1,17 @@ + + + + entrance_icon01 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_add_norm_filled_m.svg b/entry/src/main/js/default/common/icon/ic_add_norm_filled_m.svg new file mode 100644 index 0000000..73b6227 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_add_norm_filled_m.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_allread.svg b/entry/src/main/js/default/common/icon/ic_allread.svg new file mode 100644 index 0000000..2436834 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_allread.svg @@ -0,0 +1,20 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_back.svg b/entry/src/main/js/default/common/icon/ic_back.svg new file mode 100644 index 0000000..64b8b16 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_back.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_back_white.svg b/entry/src/main/js/default/common/icon/ic_back_white.svg new file mode 100644 index 0000000..9b96bc4 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_back_white.svg @@ -0,0 +1,33 @@ + + + + ic_back + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_cancel.svg b/entry/src/main/js/default/common/icon/ic_cancel.svg new file mode 100644 index 0000000..f343d26 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_cancel.svg @@ -0,0 +1,49 @@ + + + + Public_cancel2 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_cancel_black.svg b/entry/src/main/js/default/common/icon/ic_cancel_black.svg new file mode 100644 index 0000000..d585083 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_cancel_black.svg @@ -0,0 +1,51 @@ + + + + ic_cancel + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_contacts_sim_1_mini.svg b/entry/src/main/js/default/common/icon/ic_contacts_sim_1_mini.svg new file mode 100644 index 0000000..56cb79f --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_contacts_sim_1_mini.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_contacts_sim_2_mini.svg b/entry/src/main/js/default/common/icon/ic_contacts_sim_2_mini.svg new file mode 100644 index 0000000..830ab5b --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_contacts_sim_2_mini.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_delete_m.svg b/entry/src/main/js/default/common/icon/ic_delete_m.svg new file mode 100644 index 0000000..95da0d2 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_delete_m.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_gallery.svg b/entry/src/main/js/default/common/icon/ic_gallery.svg new file mode 100644 index 0000000..551eccd --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_gallery.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_massage_m.svg b/entry/src/main/js/default/common/icon/ic_massage_m.svg new file mode 100644 index 0000000..ee518c4 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_massage_m.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_more_24x12.svg b/entry/src/main/js/default/common/icon/ic_more_24x12.svg new file mode 100644 index 0000000..d74c64c --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_more_24x12.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_more_24x24.svg b/entry/src/main/js/default/common/icon/ic_more_24x24.svg new file mode 100644 index 0000000..c9d42b8 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_more_24x24.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_msg_favorite_copy_m.svg b/entry/src/main/js/default/common/icon/ic_msg_favorite_copy_m.svg new file mode 100644 index 0000000..6cd20f4 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_msg_favorite_copy_m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_msg_favorite_filled_m.svg b/entry/src/main/js/default/common/icon/ic_msg_favorite_filled_m.svg new file mode 100644 index 0000000..c016d71 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_msg_favorite_filled_m.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_msg_favorite_m.svg b/entry/src/main/js/default/common/icon/ic_msg_favorite_m.svg new file mode 100644 index 0000000..20fba0f --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_msg_favorite_m.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_notification_disable.svg b/entry/src/main/js/default/common/icon/ic_notification_disable.svg new file mode 100644 index 0000000..288849a --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_notification_disable.svg @@ -0,0 +1,22 @@ + + + + ic/notification/ic_notification_disable + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_play.svg b/entry/src/main/js/default/common/icon/ic_play.svg new file mode 100644 index 0000000..b5e94c5 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_play.svg @@ -0,0 +1,57 @@ + + + + ic_play + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_play2.svg b/entry/src/main/js/default/common/icon/ic_play2.svg new file mode 100644 index 0000000..058f9b5 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_play2.svg @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_play_filled.svg b/entry/src/main/js/default/common/icon/ic_play_filled.svg new file mode 100644 index 0000000..5b842ef --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_play_filled.svg @@ -0,0 +1,41 @@ + + + + ic_play_filled + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_play_tag.svg b/entry/src/main/js/default/common/icon/ic_play_tag.svg new file mode 100644 index 0000000..1db2a6c --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_play_tag.svg @@ -0,0 +1,57 @@ + + + + ic_play + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_search.svg b/entry/src/main/js/default/common/icon/ic_search.svg new file mode 100644 index 0000000..1847d87 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_search.svg @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_select_all.svg b/entry/src/main/js/default/common/icon/ic_select_all.svg new file mode 100644 index 0000000..f891fec --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_select_all.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_select_all_filled.svg b/entry/src/main/js/default/common/icon/ic_select_all_filled.svg new file mode 100644 index 0000000..4dde2c9 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_select_all_filled.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/entry/src/main/js/default/common/icon/ic_send_fail.svg b/entry/src/main/js/default/common/icon/ic_send_fail.svg new file mode 100644 index 0000000..60ffc3b --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_send_fail.svg @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_star.svg b/entry/src/main/js/default/common/icon/ic_star.svg new file mode 100644 index 0000000..57a95ee --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_star.svg @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_tab_image_check.svg b/entry/src/main/js/default/common/icon/ic_tab_image_check.svg new file mode 100644 index 0000000..c6da6e6 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_tab_image_check.svg @@ -0,0 +1,21 @@ + + + Checkbox/Light/on + Created with Sketch. + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_tick.svg b/entry/src/main/js/default/common/icon/ic_tick.svg new file mode 100644 index 0000000..02fe09b --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_tick.svg @@ -0,0 +1,47 @@ + + + + ic_tick + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_transfer.svg b/entry/src/main/js/default/common/icon/ic_transfer.svg new file mode 100644 index 0000000..6b91361 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_transfer.svg @@ -0,0 +1,25 @@ + + + ic_transfer + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_voice.svg b/entry/src/main/js/default/common/icon/ic_voice.svg new file mode 100644 index 0000000..492a480 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_voice.svg @@ -0,0 +1,54 @@ + + + + ic_voice + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_voice_left.svg b/entry/src/main/js/default/common/icon/ic_voice_left.svg new file mode 100644 index 0000000..2a71957 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_voice_left.svg @@ -0,0 +1,81 @@ + + + + ic_voice_left + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_voice_right.svg b/entry/src/main/js/default/common/icon/ic_voice_right.svg new file mode 100644 index 0000000..c44c00c --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_voice_right.svg @@ -0,0 +1,78 @@ + + + + ic_voice_left + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ic_wrong.svg b/entry/src/main/js/default/common/icon/ic_wrong.svg new file mode 100644 index 0000000..b6b5f96 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ic_wrong.svg @@ -0,0 +1,52 @@ + + + + ic_cancel + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icbc.png b/entry/src/main/js/default/common/icon/icbc.png new file mode 100644 index 0000000000000000000000000000000000000000..3445c9ed41e4d9e2e44a727bda4e341a4872ad42 GIT binary patch literal 10758 zcmV+hD*4rkP)eh4bY)!^&fNe2AOJ~3K~#90?R|Ne zRK?ZzIaPP*p1o&bX4q9gNc>z77fdvwC>k*)5uzADjV1xn_f_1ZnD+}rVgyXw(D%)! z0Yr#vA{ga$!KlHwAZijpK$Kx-n0;PjePicmqPjxX*T|-3 zh(y3LK$;*C5s5KGL?l8a2|yAg0TD7FrlG1*hM(o+vVsy`T%u3>X2#@Gv~d%ZqG8OR zG0>0LTO6u1+l>v;9sh3K@`|zjL-FM<*;o(ZFp@yz$QW=0R0t7)5P*;Y0003X00WQ! z2t>pH34omA1SEh2NdResBtljCeY~KMj~%C=PWg z%o#KN6DBdgKRplD_c#P-meFW<`}@HSYm9f_q66hg{Orj1WGuU~6@`XP^mQB#2r;u(Pu z(u$HVQ#tPBoJ;5Ces4C<%o=E!x?*tAY}M5^Jie;+*|oB4FXNmmjF2A+(;GrUX`50A z9DP*g?8^(TTA&sd4YX7TF<59e4^-BzTo!)m8LX>ex&~b7tP>4#wCU=AAcQodvT#_& zcV`b<^b56g_(01BFc@gIYAWj=SRQ(AEjBcO?n8E{Q0odw(l8*uDC6Qeh1cJr7MBjJ zI0H$u2#4w(TG_JtVXUiRx*r%rk~CPgn4~~RNDQPPBPt7r=Uh3zaN#1BF<@qv0iu~G z_~P>o_x+dL^DnOYfb#*6q2C}ZVG1_>==@ukfM(;%y;Zj_G~a%WGmeUa zK-7ydm;ezZ0!jb`L?9vw&Ky@tkdjCO5CC(|$EMmu2na*~(lL`EW5^gV1Z02+fCPk& zy$o1qlS{G^N=6C^Q%IqlKE32O5BZKbD&^8rL%-5Yrdj*&%H~H`vgQWV^|WbN1SBQc zCP_g|Mcs$lnN%=LD=gu|ie-L*o*Q6!d8qqQQIK;203k`(6p4zapc$;k#(Gg(ZPip` zL#=3S#%LHNA>+su;5?0rAQ@4aQ;>D-jl&i!Vw#q=a=p-hG)H&uIb6{$( z%OeniEFr;0e>N)_p-lLOI$@%3{3PYb@mfhK3*__6tfWkxBGf7y8;q(0_TDd|yFasc z?XY+4w5uyH+{yq^<-pT0yF+Q)hQUrgefa%<@Qs_$%hD39w0~%BShu=i=`Ac6WV)7G zeFTJnNJK)AWeZJZB_p-tPs;e#cl6_?_>MeE$<0fk5Qim41nl8VXV}4D^vgZQCm)5j zzG-iNk17vhP6{%FR5=?nRzLlmtm)_bkDsCz7WI!lLjYD?t?}{u&984Z-g;H;`vPs7X?{q3 z`bQ*C2qWX7%S)F(#4pIC-j?7i+jN;js^u*S3W!z_#XY2OC50zZ=^0LiBH&WpyRz3{(|>0C9u*-}s4X7rq^RNOR*~o~gUzMy0Wud^)C5i6Fz4j48*SkbUvItQj-)QKQo? zWN%>XFKgMnvE|vP#6LgcQh=tVHgJ<^ioAlNWe?r~GfA$Tz5)>dN(2S~b|ljJ+AB?KAG6+jiW7)80wMwuNJxkt1Q29OV#H57JAeKS zS!YgX%vpA9HyIB$5CI|pN!haHwZ_NpH@E&xkv3?FI+PuJC`rOH{8wH#eCY~Ix4kIM zG)vR0Trk(z^eprFk~a6)LfAr?a%$k(Te4@I&j$12V;l%!w{Cu^@sZ`?!*`jgB)xu0 zB%)E@%vr-%tzlYny@ET^NwWxt%dWmezVR~iWdKUg>j@A+03Z-hG(w|}%AJ2h;Ig0a z41b3i&!B9>T|k{=6_HTmx<59rx*y8FM4u0k0f+<@Gyg8ZZ1nRzvFD<<3PT!~_(jv@YKxF?{^~>*x{P{`67N}^Hj20>* zQDy3PMy`2*=j5bCnDo#rLak+&|4?pygZq6+Oqhs-5ytVy1a4oNcfmyf&PaD~>T-yJ z2nZxYMgYN=UaY@&G4A>|^Cjgk#$+Uzx0Yjo>DJ3Zi01BKiRb8c2-}5 zx|;ZkoQ#Bh7t9*|KkIv`d-rx4df={`%uP=-UlJV)g$?@VaV6{iQgG=N(3=&$Lj(u} z2!)qiUcBxF`sVQ>5`}~ZYUa<3y!1@PU5k1tL$7GAesFpCiHDib58$m=0{{@nh@s7# zHR7p_na52506YvjXm20@5J1*(CyjjSFY1M}g%M(je%-`<8O9$UseW*IuOvvh({6n6 z+4_a^I0CT5z7;8LTV`H;UGZJN=DJQK;V|+0N(e+iKnzhBM)lG=!+&^?t31(HMJr2Cj8?+6!R3$6v0tjM4HQwfq0 z_T`e&V231fmelIk{2_Sv4O|LHjA=4WoOJw{jayjqQ>+xmW~#hp0sM0t={h4pp4Kj5 z+gu4OdnkYIPZ5aqTiDZJh2tCn0EP3e2`qcWW(r7=h$f1fCjYgq@|NpT&{~tGx#6ib z#tZAw??VCt=3W9xOK>fJ*(3RL<`GB$bda=|hY=9Lc?Coem@_Z`HxEn3KqREYGGAu+ zg|!XqS0`O*Qk`~m&#v+dzs*8T$Q17(SxTGn{9moipZ8M&354wHO>kEb5C9_7ul+;A z;u{nxJvA~yKpSLM=E#lj=;OvGUR4sUnN0J*jaRc^6EM~LMk3pmIk){Pf8I|4hyfeo zxGT_^Q$zmTYqD=!YTK4)Z;S-M37hH<+;BCSX5v*PL37b8Zfxe>gEWMUGd7XF_ThAq3F`+VRiT|*ql2evsAqR%&M+3)d~lcZsLE8dLp z=EmyVuLqe>D@};z;7c!qkH~@| z5(&(&blrUG)uxwTNThIYnq?&1aPKdWhCrbx;M>r53Z1V{*8*8TN8o+P=pcj&AL4BqaVk-r#*`v z!a>CHAQ3?R>>vAnI9C{9kCkbXsH(7gXYIq@x|oLwX4M?nH*GR+2?ArT#1UB*9C`GJ z=U&r?6(2hG>OttjKm=%2SC`K^2fzFb6qkTP0w9tgv-8Gm`A8jB;!>!G>tVwK%dx&1 zd|vKd1d?fmzxcJ|2a+JiW>vKaHMiwx>+m@34u1qO$3W=u6mkO+LbK73?1 zg`bGPtk_S60f=4iI#^UJu%m~nyHwZx6tw#u6U)ldirtuKF9iX#;^O>Y{JQSvmvFc5 z5CISwU|m)H1NW6IUEx-!OKY|cRF<7}91Dd#BZVju*5+J2;&=a@R3k3C;W~5Ub4>TQ z3EhRU9tCSZ)nlf&?ynihGL^|wMy-E_u};F8h)E=si@sXqVkTBKNAhUvuyX zA&?QtnEAuuzk8^sTjGGA{KlUe8y@#|%aKB4W{=tOiCPjj^@Uq&u3fnd8XCZ#>FPCr zU|Tfm$fBF?Otu3=%VN zhzyf|YkKzd8AGK-+u9%zp4`P};SL#BAxL%^_;@StzU?yD}mWwk0gfU3v7fh$1jzid*)aUVcXe zkbU;K!Q+mnPq%{_S1(48sHxG{UzWzbT{5|Mr8%8Ws)zC=ZOXg&3hvM7ol)5R z@rj7CZvKUS^dutD>5d+aoe;-7Ma1%QdY(EX6x{Jk8Eou&*4@lSovuN~jn6*|-G3jZ zo+Zfx2%z{gvoF3PxP6w7zn^vL866LIrL%GUT4viWG!qgEi6z6c&by%3 zhJV+)2_<39x6kmOFu7Ni#0O_Qcj~u#Urwm7pyhYJb?Fik4yB0;0?0aVX7It^VnZ!( zw_%0}3a($>h2~CQv5Z8Fci%$I?Snx=GK4nm9Bt%i>RT%%06*>}`uUEI$2!s6x_J|thKGl}5NzxbnI})}h1f$#8qSE2anfmQ>``F5uQC8L zt(O0NvD1-*e-cIBc@-7+c@&Xl>t~#sNP^5Eq#a6bo__jtvfOEAsPM?!Z+2|-2Whs0 zjrN|M$Te5bY80xPHT}Ha$~%OVfB@Ok&y%W0Q$)_~Jv;5j#`Z%8X*PEJ8ycHE0-S`+ zN=IZIe^M{S9YV_RoiK%!jt1e{pc%tpqp{;(2M@IW)w<;skhZ%M7g<6(;bf(tuwOiL z31e|aKy5#<6CHlHpXqW9K)2J~PP*UHy?p2_LuYwh6`J&Es#-yzdcqX4tT?i_L0GL@ zHn;zGP`K#!4;YUttF!7X!OlGGJFy%KeGF$40w;+Mc1~Y`9e%f;>2eJ~r_vqy5M;9xtm#}V5K7im&~CqIWQ1NQvILSL1jhU zKyn0f!t`BCT#Q-!%NVjm6R`9ezT>8#KO3Y?$l{8nDB{a6WF+ilxc#on2R}jT!^(G@E;NK{yQVndoejPng8} zcPiEU%xAYa(Xf{6o3|-?Ykbsz~kDruIVTX_^)bSIk z$2GSOKqjM~f9Cuh+l^jSR{*+gL_r`?*OjCCX+xbMxI;hkXz=T<6E#G}psL*YhXDXt zHr3a7n6JG}U~)_^)cFTG{B%D~ z9e$_7KPiFfPM1m(5cS~Mv|7QysVXBAi%VQ-CO`&}kZfrNXF?@gTgWopLt9BoR#cqk zlwLxRZKG}XXm0GWrf&95LO|q7iu2M0a$6%1Nt+1T=gwVykX(I=$kASH+rtW-Bp9Mn zRBT9>?*{=$+QMpSR%0|b)`2vU`Q6lWk`yQaZ~wO>z)MTzgo&X0uq`~aqlnH+C2)6L zU|^ZDq6}SAaJcxmcp2wOa>hoDLsfG#aJkqZ_d_{o3-1|3 z0J^W_vB$MBNA%VqDt&tnIjw@_1td`XLY#`UEDhy02-w(0ts>+GQH-g9RLQHs@gMLLn>{vS> z8`gV)`TXvx5)u$Ys4RyV&E@5u0j>bx_zw-nC;nQ(%bg1V02$ilW#G_kRP0A2_iY>r zfhADx5c&-)k!|9U8Rh%Hp_zdsMD$oLrM6&$q4qpzkjQ+z-L*v>F_t8_E73?mUVfuP z=ub%7&0i%3B7J20Lga{1K+;RmK#EQ9hdl5H1;{Hc4ib=*>Zs8Wqq$^+;{xPbDpBWn zjlqI`2>cjyu_Xim!ic)tb|eBwNyA4#Y~DO-6p-{9bfpY7rB6@*0BM@!Z31*PyCKR* zq>noo6p@ICMqPV5Pun0NSJGl9I4D*y=-vS%fCRviqrjnAD=m%fy%7JiMF2BcpGGMG zpz=4rGG2QXeOk&|9RiYVD$$5rN+^gwgn8AAh+r61^REI;b2piKxV4#v|LhsV?_T0j zUt%CfVGhQ;aZ8q-X(sH$eWJ_FsKa&triU`Pu0n)17y zapjtbEZnyjyi`g&XJwBgrNKSGba$18p?t zP=+6xgAhO82r_2ZREcm%$;?Whv0hXBsF`8AC z6_mL9?;zZo}92>@dLT4e0r;d0Fo`VHpp9q199M{G}X=(?NPA+4~Rg4V7bOi^MH z;5~u}{C<60EPNtHvr;sS1qz|23gU-21Lt;iMP%<6Stp#BCV^dTbp!%2$( z0}%kY&E`o8Rx(0%n=CrJqvy`OMxK41OK4$i7ao^Eka4T*%joleB3HMvG$Ok93t3g} z;af%m^NW?DBImyt&CH*nj2$lylp~M#T{A$!aLD*%Th<9DrfF{)S1S%85anGqFD>cc zx_f>iA!Af<>1Dkyymk9WtuOp3RWIUXKtKr5Pqtw=ggzgkjQ0-7mh6b5oZx2Y=rg8I zK9Ph?7;h?10Kfo4Ti@(2zXBp8X?o?6P7FQRixAK&+AL8RQS3SIL7L%M;v!qOAUe*% z@%u1gXPj^_Ma;qH%${~0aTUom{7Pl^_V=v%+I~uePec1lb^-!e^|ki)4={d$))<(U zG41?=|F!?6PdWy3b3wW$F5#Ri4;UYR*jssrkSe0vKNJTlJiNZ8q`X|;q+{9-9Hd#v z3-EChNf@r34}yp`zqUF41w-gtw7mW@T9*4YWSh#kiAr9e{YZzw3DJN0bg+ec?juxH zZireN=+9YQLwnu5mPUUlr3@j+5Z|LJFSY^|Lb&6+V&s=8~`EHI|XeS1P5yi0@B zP5tnM^QOb^Z?t5|OF?$eWvu^0Gcwg9(AWRmy}* zOZZ^Yz_dDf#i;{~^0MfguefJB2LNeX+SD_<>@3;Uj-7Yum6gvv=^lXv9H_doW%EY; z>V+u^9fQYPCdAgQf3xaq-K=0;w~OrtDKRfE^OVyV>v9=MDO=xrmx4iL@t@e!492*z z^WRPsyJvt>%0PhDS2jU)rAJaP0OBm~(kr?g>`JqL^2vO}SU6DTzSkJ%to7OTfy=I9 z{)}Ecnaiz23>Aqj_ubR%sshAbZTynRG?kN1&HVFUyF4rb08!mNOXY`KUHXi+SQA$; z#<}8{?c6U+4Fo77k=EzdaaTVA003dL5l8qZpVH-US1y_E^PPP`4ac^7=&5hUH;F`^^_V2axNH^)`py*VNvAuttD(ZNG^^@dE_K1V$O0b1VJY=8O@ zkKbbxAcBylm2viYPP)5}=%KU9|H;ou_j|hMb19luKN|D>?~}d?AsvIKYoD7o3ndby zYozZE5_Z$-|K`#y9V-G65cx9#KbhbCY!5X1#vRR%KZR^}V=@O#xBl@~%Uf?IEA$YO z0s*wX^``ZYw@6n#K1xfd$4&8#>md_kkGnHr?xpjjM?3@p60@wvRV$@!^-Fr~uOkSE zEW2UV3T7Fe^BO7aoHvKSbE`fkajrK@bGdj-Qu1A z2!Nz%WX+z-GkZ?l7I(f_aMgTSI1D7k-$oMv05nB>_-^BdKOz9Rr)?TSQXnLNruD1E z2Y(06E5VIKDkv`KN%?XRmu97~DD%5Nl7@lgYC#2LDsO&xMWnopc?5fO0}+yhzW+gr zt2`hPkmx5Fk^+KJUKU)nf~l%k-hCt^?7wifQcx7{3O5@_(V{!bHa-pEW>@ci1g=o| zSM~QT9r63el8OZ;O||?Po@Sk1f-Dtv-RYCM$VLRV?h~1rF59T4M+U|f&lcJF4j`yo zz6AE~L%(NJ1_%@t-RPEK4c)iRt-9-`(Er@u?o#AZiU~06(G7X$U+5uI2Slq5h}IT# zb#_Suh`^`&M~v#eK?g~SRFs3^<=37L8F*H9Qo`kT5&1%fmQ5l0s;a+v!<%z;&a*F&&kz1 zM?fe^Wao_8^07M1?Hls&c~gg#WM8>Jn1YdO8fFlv=&|p7TQdO2aQLfpPsXqIfZ{TcJJ}9ET2|oxCklRaS$nS4 zA;J^G!BvwnTX3t%)f(jPc-- zTSA|Hhyc>nNpuJuL4cAZ0E9l?*0|(W&R7De!ljU+@b+JMatw*k3;=l-T%?|H4#f#k z=?LV=>T0VOU2D`m|d`PCqC2f{PL# z2P7JH;2V2X&UH5m!}eNkBLZN)40F@d)l2V^F?DQ+XEzW4NUFJKvAOX%=JR{!y#W%Y znX~X_-`GTV`14l54wh}2UtK(%w*4JrGkuTbkG5%L{qnaZ^Z%1#xm%b$CV!}1W% zUEsX>#x;MazxxJ7O0OQ6000DvtgLKE!h!$*36DucK~#~O-u4|eKJki@ixu-7H6j1* zWwtPwOyEYw7>UNk|Jks9jiYl9_1zueG?a!7YZ?|WQiPqrD2qtk7SX`sdz0cAlBF2{ z^5@LUxae}*2m?U;@X0p080SJZ-m$Q8!y2b4)6jBd8xWv=!bu8y1Db)}#Oi%@9a_s)bJpCmdqNFf=^Tk`w-xz_*yq$f7|5Js#WulYm6-HW&| z6XY076DA!ydgEI>fr)Y#q!QrEGc$)jx>n}pyC(+hPzmFL8W!JBz3O-HH6EiK&kKj+ z+Eu@Axci2LIVKR6%*!u%bX^J@LuxbwfN%W7!etLi!XDB9^Z+Ez6e(Mm+){b>P0}z3 zKz{u?Zz2K&X+$d*-xOSO3zss{c1%J5&;QLs{_#hrR(0y(`gs@4&bn=hu#7}UTgJGm z8;{;!zVJ%3riyuu>xUT#fFYVSRTT@b2>(pT==xiGBSR`GSSLAzDF4|UbJGjV@4jl*p-Pa_Fl9k${$2M3E}eVW57Y!eK#d!o zZ2a}@ysjE_J;7Fi03sUFX8vg8V^6u{I!dUh-dmidY3!RfOKy3Y`Tb5pcF#%yh=dem z`+qpM=+0m3#U*XlmcztY)-ltPSzT4L^zO*>t2yJy(LHZ@+wFh=G7{y}&L6$zS*9i0 zgyJC$Gy{Mg4psd4d-m2X%%7QfCyWw>8N%_$W=xMUVW+Ikrm>DzcW=$R&PQAI~vw!&K|L9P4CC!&LyYYOhH0a-nl69$49uP zQ3@U;rfqZ3rk)v?zbO06>Bv}zK=MJQpg9|D#8fRJ+49EgjgPIgw!Xn7fu<)tQ6wP@ z;lJwI;Y(NaQm^ig^waF1`oZNbzrCA*z*HI~kzq>JubnzId*1x)>E|hJn=}uSb!%!< zr4c|x!Y!|DZd&_4)<53jmI1n!f`lY20X*;4Ulv_|TVDv=S2P1a@GsBQ-|-(9tWPZi z3ju*)6GMLN@tGIT%bqdQH)?d+g-jU)V3hA`eR)&s^H15Ie#E5!&-mjW%0K`h)0BAy z114GXO+(?>I1j9{uYh?#q-+U~;aW7&9$cmJkw(NBYk^C+ouR`=@+M z&C6?B){J=$_w5v{bG~6K7z};*_tuRsM&EoHsw+9?Dde<3r&MCL5$4C7P_pVt|M(ul z&(npzr5ON3C{%gN!pNW3s@$KD&q*Ahkis%Z(b$+H_0!MInm!}r_!E`FqJHSXofl-) z)kHtu*7Ewx#@}9*`@UqtMoo3!JI1X{1hl~xhX4DQl`elIjY@To=yRGKG_3n$wO zSkH7{YV~0(Gn52dk|m_7u+ow0@hAJgb-Mq!Df*G)cy3;&Y)~CM=i;X$c3wct9@FI; zBmmJAjPBhN{bXC@?{C^4e`r^gbJIpm0nU1%A`k$8VTioKz~XxgE=$@+AO-Xj%>WSH zy{qcRYwQo+;kqx;#Thpc2uYSDL4rSqyK0I z0J6-QhgUSOTB$TOg3qzw%ig8)q1XzLlq5{D5f~%C53_Q3{xBR?tP~aVKmp4OKwcix z{m3~}I01kyq!7Z0VlXHg>t$2DRZ|VsHKMVGTALseMUuccQxxEc1eAsZ>j)spFl0_3 zXTeQH3m2s?fnfr5_rJ4zWbdAuJO0yp`&Gse6cs`CVm;K!)5O|3UB{+|KoX&M7zf4y(b4ESIHNjIE{+Nd%$<(xKy7v zMGOGV002Zy8=tTL?JsHf4%BtGT#APQq?CpM;KKW@CO63>GuH93;+N!9Ikz6 zMa$|(u&$cveqfwHA~3HU41*m9(}+qUBPt7vvah_hXyMI?#I*Gh29jn6R&{0lgUef= zdlDNPP}7k0aq@!x0D(klgdo2#Shf@bM~};zb$R|z7N~`B^ZN8Z1{ci^WNT}1)`*X{K{U*?^h{X$3c{9_ zNxn?=*eTg_uE@P`7SBrKPUh*sV5B()qUi1&^-nw&ef_VpVjmO4R0doj1e9#x_Fq5% ziG(1euubBejTq}cYewKF3w+}z4u}?=2nI3DZIDJZ^wE1w8`hZbz9SEmp=p7_8RzLR zr6nthB-@lilBV<0;ri4w^Ddd^pL`1I-(Y@! z`~n9T4kem9!ftGc?)X<|%jW1u+r(F2$c9>oM1TY`i41`$hzcMBkbsf^5V|flAc2fo zxn#^=frvr+bGg%^e{lVXL;*-1B*K z+k4T^KZB}rv!NcE8X*#rwvDy`C#MldM2tD$kt9h#k_Z45QjjSe{8^A2Pzr{z;!=I$ zB>#z1^`j;zMMa)T4hKID2b#NsEK`O;vZdK-X@+2fsI8^)GCWXWm+y=2F9QI5)EIT- zXeu3!qet + + ic_favourites + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_avatar.jpg b/entry/src/main/js/default/common/icon/icon_avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3633aca611281aa70a9ba4bede5710ec2607abd GIT binary patch literal 61628 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 + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_card.svg b/entry/src/main/js/default/common/icon/icon_card.svg new file mode 100644 index 0000000..42ec1d9 --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_card.svg @@ -0,0 +1,93 @@ + + + + Card + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_card_2.svg b/entry/src/main/js/default/common/icon/icon_card_2.svg new file mode 100644 index 0000000..6daa6da --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_card_2.svg @@ -0,0 +1,93 @@ + + + + Card + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_down.svg b/entry/src/main/js/default/common/icon/icon_down.svg new file mode 100644 index 0000000..f3d4757 --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_down.svg @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_favorite.svg b/entry/src/main/js/default/common/icon/icon_favorite.svg new file mode 100644 index 0000000..759d911 --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_favorite.svg @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_keyboard.svg b/entry/src/main/js/default/common/icon/icon_keyboard.svg new file mode 100644 index 0000000..8d9d8d0 --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_keyboard.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/icon_mms_sim_1.svg b/entry/src/main/js/default/common/icon/icon_mms_sim_1.svg new file mode 100644 index 0000000..b7d2c5e --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_mms_sim_1.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/entry/src/main/js/default/common/icon/icon_mms_sim_2.svg b/entry/src/main/js/default/common/icon/icon_mms_sim_2.svg new file mode 100644 index 0000000..962d207 --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_mms_sim_2.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/entry/src/main/js/default/common/icon/icon_more.svg b/entry/src/main/js/default/common/icon/icon_more.svg new file mode 100644 index 0000000..01cc3dd --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_more.svg @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_more_forSetting.svg b/entry/src/main/js/default/common/icon/icon_more_forSetting.svg new file mode 100644 index 0000000..5ea3468 --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_more_forSetting.svg @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_next.svg b/entry/src/main/js/default/common/icon/icon_next.svg new file mode 100644 index 0000000..ebaf24b --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_next.svg @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_phone.svg b/entry/src/main/js/default/common/icon/icon_phone.svg new file mode 100644 index 0000000..44b24cb --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_phone.svg @@ -0,0 +1,51 @@ + + + + ic_search + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_switch_false.svg b/entry/src/main/js/default/common/icon/icon_switch_false.svg new file mode 100644 index 0000000..7d82356 --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_switch_false.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/icon_switch_true.svg b/entry/src/main/js/default/common/icon/icon_switch_true.svg new file mode 100644 index 0000000..303935b --- /dev/null +++ b/entry/src/main/js/default/common/icon/icon_switch_true.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ikea.png b/entry/src/main/js/default/common/icon/ikea.png new file mode 100644 index 0000000000000000000000000000000000000000..cceb617325837b7adcb362ecb6f74c290af4fdbe GIT binary patch literal 14829 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/icon/image.svg b/entry/src/main/js/default/common/icon/image.svg new file mode 100644 index 0000000..2ad3b06 --- /dev/null +++ b/entry/src/main/js/default/common/icon/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/keyboard.png b/entry/src/main/js/default/common/icon/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..7293f4d67c7147c924ab2a28046bf12604f57116 GIT binary patch literal 10573 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 + + + mark_as_read + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/more.png b/entry/src/main/js/default/common/icon/more.png new file mode 100644 index 0000000000000000000000000000000000000000..ee4f587bd2be75849fcf5ddb71e64a4bdda1348a GIT binary patch literal 14593 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 cdk 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 \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_camera_false.svg b/entry/src/main/js/default/common/icon/msg_camera_false.svg new file mode 100644 index 0000000..82d9af5 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_camera_false.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_camera_true.svg b/entry/src/main/js/default/common/icon/msg_camera_true.svg new file mode 100644 index 0000000..e8da73f --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_camera_true.svg @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_cancel.svg b/entry/src/main/js/default/common/icon/msg_cancel.svg new file mode 100644 index 0000000..2881abd --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_cancel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_contacts.svg b/entry/src/main/js/default/common/icon/msg_contacts.svg new file mode 100644 index 0000000..cce5d95 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_contacts.svg @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_contacts_open.svg b/entry/src/main/js/default/common/icon/msg_contacts_open.svg new file mode 100644 index 0000000..7d998f8 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_contacts_open.svg @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_contacts_retract.svg b/entry/src/main/js/default/common/icon/msg_contacts_retract.svg new file mode 100644 index 0000000..1774751 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_contacts_retract.svg @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_contacts_select.svg b/entry/src/main/js/default/common/icon/msg_contacts_select.svg new file mode 100644 index 0000000..e5159b6 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_contacts_select.svg @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_delete.svg b/entry/src/main/js/default/common/icon/msg_delete.svg new file mode 100644 index 0000000..9959f10 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_delete.svg @@ -0,0 +1,57 @@ + + + mark as read copy + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_done.svg b/entry/src/main/js/default/common/icon/msg_done.svg new file mode 100644 index 0000000..6c98e94 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_done.svg @@ -0,0 +1,26 @@ + + + mark as read + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_emoji.svg b/entry/src/main/js/default/common/icon/msg_emoji.svg new file mode 100644 index 0000000..fefcf97 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_emoji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_full_screen.svg b/entry/src/main/js/default/common/icon/msg_full_screen.svg new file mode 100644 index 0000000..d2281f3 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_full_screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_location_false.svg b/entry/src/main/js/default/common/icon/msg_location_false.svg new file mode 100644 index 0000000..a9d4ae3 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_location_false.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_location_true.svg b/entry/src/main/js/default/common/icon/msg_location_true.svg new file mode 100644 index 0000000..ed6e383 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_location_true.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_lock.svg b/entry/src/main/js/default/common/icon/msg_lock.svg new file mode 100644 index 0000000..916628c --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_lock.svg @@ -0,0 +1,26 @@ + + + + ic_lock + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_lock_two.svg b/entry/src/main/js/default/common/icon/msg_lock_two.svg new file mode 100644 index 0000000..ed847df --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_lock_two.svg @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_more_false.svg b/entry/src/main/js/default/common/icon/msg_more_false.svg new file mode 100644 index 0000000..8ee648e --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_more_false.svg @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_more_true.svg b/entry/src/main/js/default/common/icon/msg_more_true.svg new file mode 100644 index 0000000..cf11215 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_more_true.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_music.svg b/entry/src/main/js/default/common/icon/msg_music.svg new file mode 100644 index 0000000..3d08091 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_picture_false.svg b/entry/src/main/js/default/common/icon/msg_picture_false.svg new file mode 100644 index 0000000..4ebd68b --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_picture_false.svg @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_picture_true.svg b/entry/src/main/js/default/common/icon/msg_picture_true.svg new file mode 100644 index 0000000..8ce922a --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_picture_true.svg @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_play.svg b/entry/src/main/js/default/common/icon/msg_play.svg new file mode 100644 index 0000000..b1d81db --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_ppt.svg b/entry/src/main/js/default/common/icon/msg_ppt.svg new file mode 100644 index 0000000..678f73a --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_ppt.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/entry/src/main/js/default/common/icon/msg_puse.svg b/entry/src/main/js/default/common/icon/msg_puse.svg new file mode 100644 index 0000000..967f45b --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_puse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_recording_false.svg b/entry/src/main/js/default/common/icon/msg_recording_false.svg new file mode 100644 index 0000000..d8749fe --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_recording_false.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_recording_true.svg b/entry/src/main/js/default/common/icon/msg_recording_true.svg new file mode 100644 index 0000000..40ca14f --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_recording_true.svg @@ -0,0 +1,53 @@ + + + + ic_voice_select + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_save.svg b/entry/src/main/js/default/common/icon/msg_save.svg new file mode 100644 index 0000000..767a325 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_schedule.svg b/entry/src/main/js/default/common/icon/msg_schedule.svg new file mode 100644 index 0000000..774c498 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_schedule.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_send.svg b/entry/src/main/js/default/common/icon/msg_send.svg new file mode 100644 index 0000000..52274c5 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_send.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_theme.svg b/entry/src/main/js/default/common/icon/msg_theme.svg new file mode 100644 index 0000000..6605b05 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_theme.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/entry/src/main/js/default/common/icon/msg_unfull_screen.svg b/entry/src/main/js/default/common/icon/msg_unfull_screen.svg new file mode 100644 index 0000000..dbe21e0 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_unfull_screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/msg_unlock.svg b/entry/src/main/js/default/common/icon/msg_unlock.svg new file mode 100644 index 0000000..9364f53 --- /dev/null +++ b/entry/src/main/js/default/common/icon/msg_unlock.svg @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/new_contact.png b/entry/src/main/js/default/common/icon/new_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..d0fbd8873c85ba3234124c00fa388e962b29e0e6 GIT binary patch literal 3688 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 J4}0?Be*l;$NlE|! literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/icon/new_message.svg b/entry/src/main/js/default/common/icon/new_message.svg new file mode 100644 index 0000000..5b867c5 --- /dev/null +++ b/entry/src/main/js/default/common/icon/new_message.svg @@ -0,0 +1,21 @@ + + + + 画板 + Created with Sketch. + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/pin.png b/entry/src/main/js/default/common/icon/pin.png new file mode 100644 index 0000000000000000000000000000000000000000..7340cc32cbcd818d31559ffe31167aefce364500 GIT binary patch literal 1524 zcmVeh4bY)!^&fNe21&K*SK~#90?VL+2 zGi?;dr!$?mRa7YyLjbJ0O!oor% zLgEr)!?e%0nD^^9p`F(BoH_F)ev3Erw)J<;FQ%P7moYKMxL?AjV&k|dc-CZ6Yco;UxCAP9mW$Oob*%EzJtzuzxO(&y*r=jW$3ZtrfN3(X0cen%8G&Z_IALg zAO*Fzw^PgEL{U6DI|FPA_^U=*S{kjOnVA{bj(`R2?(PbLKxL<~u@SZ%1}=y(wz|4X zVkajj2fP=CA&5~payT3qjW8rZOkYQMb{L)@rk5jBI}BA2!~fvtdH(qL7_|jlLEGEg zsDfNB7i#?saJVBRgM))krxP!KWMl*{Tn2qsBR4k}FMN1-7%yA~T~I?q15&amiY}K6 zDLe?epyuXgq-1?YpwI;s7Z)QXI~)$AWF_c=%FD}053%b6(MoI=8cvb;j z(CO(ZQu4#Y15&aQbV29m=Saz~udhhSO3(#eU0oq1e|&r(B`ZM}ba8Qk7w+@<@WN%# z1)1h&uv4jDz!IeMH1yKa5>g{5g8uyZqo*C2si`T9 zUVsH%US8_2CJ4s41}SKLeVx#bOlD^0!NCDwQ(%HT9uKvgzlfqZJ39;27mT3F%1UZ2 zUl|w}0BH?CkUk@O8tCcip%>KG*GKI^jiI3-N@U5dmICt<>h5v1=ZHpQn&mwN=r+%b!uXo_E^~M_P4h;@HX(U*=+Cc z?;3tkqac&Xq~WJ%(blQPAy@MC&_6|U!5RhO&A20>yHJQ+S=OV<7069za&Y4 zKtOpAya_(#H4jDLO!0D zn5c6lA)yx(?pj&p)YB7sK^+|(AqS_!oq9S$FDM})!D_XBf1GxlEC{_IF3c5keSN+D zm3+q#f \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/plus.png b/entry/src/main/js/default/common/icon/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d4086a6d679e642d623ac583f52e738534ae02d0 GIT binary patch literal 19692 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 literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/icon/position.svg b/entry/src/main/js/default/common/icon/position.svg new file mode 100644 index 0000000..bb6888e --- /dev/null +++ b/entry/src/main/js/default/common/icon/position.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/ppt.svg b/entry/src/main/js/default/common/icon/ppt.svg new file mode 100644 index 0000000..e1ece77 --- /dev/null +++ b/entry/src/main/js/default/common/icon/ppt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/send.svg b/entry/src/main/js/default/common/icon/send.svg new file mode 100644 index 0000000..44f2e1a --- /dev/null +++ b/entry/src/main/js/default/common/icon/send.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/send_green.svg b/entry/src/main/js/default/common/icon/send_green.svg new file mode 100644 index 0000000..71ae2bd --- /dev/null +++ b/entry/src/main/js/default/common/icon/send_green.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/smell.svg b/entry/src/main/js/default/common/icon/smell.svg new file mode 100644 index 0000000..2ef9c67 --- /dev/null +++ b/entry/src/main/js/default/common/icon/smell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/stop.svg b/entry/src/main/js/default/common/icon/stop.svg new file mode 100644 index 0000000..fa3139a --- /dev/null +++ b/entry/src/main/js/default/common/icon/stop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/up.png b/entry/src/main/js/default/common/icon/up.png new file mode 100644 index 0000000000000000000000000000000000000000..18734d889e9042179c9905ce0c27691f4aeb7b01 GIT binary patch literal 27992 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 i_Kt@bb-YLJv5$ + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/icon/vmall.png b/entry/src/main/js/default/common/icon/vmall.png new file mode 100644 index 0000000000000000000000000000000000000000..53ca62cbae775923d0022f8356fdd417b266b857 GIT binary patch literal 16600 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 Z{tZr#Ll121NdsEI;OXk;vd$@?2>?|Zz9|3z literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/i18n/en-US.json b/entry/src/main/js/default/i18n/en-US.json new file mode 100644 index 0000000..85c3d48 --- /dev/null +++ b/entry/src/main/js/default/i18n/en-US.json @@ -0,0 +1,331 @@ +{ + "strings": { + "copy_phone": "COPY TO PHONE", + "add_Contact": "ADD TO CONTACTS", + "addToContact": "Add contact", + "load": "Refreshing...", + "enabled": "Enabled", + "disable": "DISABLE", + "disabled": "Disabled", + "on": "On", + "sim1": "SIM 1", + "sim2": "SIM 2", + "default": "Default", + "noMessages": "No messages", + "unread": "unread", + "search1": "Search", + "search2": "Search", + "infoMessages": "Info messages", + "delete_low": "Delete", + "favorites": "Favorites", + "blocked": "Blocked", + "markAllAsRead": "Mark all as read", + "greaterThanSign": ">", + "lessThanSign": "<", + "there_is_no_match": " There is no match", + "msg_information_up": " MESSAGE", + "msg_informations_up": " MESSAGES", + "msg_information": " message", + "msg_informations": " messages", + "msg_find": "FOUND ", + "msg_conversation_up": " CONVERSATION", + "msg_conversations_up": " CONVERSATIONS", + "attachment_no_subject": "[Attachment](No subject)", + "attachment": "[Attachment]", + "no_subject": "(No subject)", + "justNow": "Just now", + "minAgo": "{minute} min ago", + "hourAndMinute": "{hour}:{minute}", + "msg_new_contact": "Create new contact", + "view_contact": "View Contact", + "msg_save_to_an_existing_contact": "Add to existing contact", + "msg_pre_call_editor": "Edit before call", + "msg_blacklist": "Add to blocklist", + "msg_remove_from_blacklist": "Remove Form Blacklist", + "msg_copy": "COPY", + "msg_transmit": "FORWARD", + "msg_select_text": "SELECT TEXT", + "msg_save": "SAVE", + "msg_note_mms": "Text message", + "msg_note_mms2": "Add description or send", + "msg_lock": "Lock", + "msg_star": "Star", + "my_msg_star": "Favorites", + "sim_msg_manage": "Manage SIM messages", + "no_star_info": "No favorites", + "info_is_stared": "This message is already in favorites", + "msg_select_all": "Check All", + "msg_deselect_all": "Cancel the Option", + "msg_take_photos": "Camera", + "msg_picture": "Picture", + "msg_gallery": "Gallery", + "msg_record": "Recording", + "msg_record_short": "Recording too short", + "msg_contacts": "Contacts", + "msg_schedule": "Calendar", + "msg_music": "Audio", + "msg_theme": "Subject", + "msg_slide": "Slides", + "msg_location": "Location", + "converting_mms": "Converting to MMS...", + "converting_sms": "Converting to SMS...", + "attachment_failed": "Failed to add attachment, exceeding the maximum size of 300KB", + "messageSendFailed": "Sending failed", + "messageSending": "Message sending...", + "messageDeliver": "Message deliver", + "delete": "DELETE", + "more": "MORE", + "more_low": "More", + "fullScreenInput": "fullScreenInput", + "to": "To:", + "new_message": "New message", + "search": "Search", + "back": "Back", + "lock": "Lock", + "unlock": "Unlock", + "query_details": "Display details", + "msg_delete_dialog_tip1": "Delete this message?", + "msg_delete_dialog_tip2": "Delete {number} messages?", + "msg_delete_dialog_tip3": "Delete all message?", + "msg_delete_dialog_cb_tip": "Also delete locked messages", + "msg_delete_dialog_lock": "Delete this locked message?", + "msg_delete_dialog_cancel": "CANCEL", + "msg_selected_tip": "{number} item selected", + "msg_unselected_tip": "unselected", + "press_speak": "Touch and hold to record", + "tips": "Tips", + "tips_replace": "Existing content will be replaced.", + "confirm": "Confirm", + "addresser": "addresser", + "query_report": "quaryReport", + "video_connect_succeed": "VideoConnectSuccess", + "video_start_play": "VideoStartPlay", + "video_pause_play": "VideoPausePlay", + "video_play_end": "VideoPlayEnd", + "video_play_error": "VideoPlayError", + "all_save": "AllSave", + "select_items": "Select items", + "mobile1": "MOBILE", + "mobile2": "Mobile", + "mobile3": "Mobile: ", + "name1": "Name: ", + "contact": "Contact", + "text": "Text", + "mmsVcard": "MMS vCard", + "invalid_receive": "Invalid receive:<{str}>", + "and_others": "{name}and{number}others", + "addSlide": "Add slide", + "type": "Type: ", + "sendAddresser": "From: ", + "putAddresser": "To: ", + "msgDetails": "Message details", + "sendTime": "Sent: ", + "recipients": "Recipients", + "transmitHeadText": "Select conversation", + "recently": "RECEBTS", + "searchHit": "Enter number or search", + "selectContracts": "Select contact", + "me": "Me", + "transmitContentMe": "Me:", + "transmitContent": "Forwarded from Me:", + "transmitContentReceive": "Forwarded from {name}:", + "transmitContentMulti": "Forwarded my conversation with {name}", + "transmitContentMultiForFavorite": "Forwarded favorite", + "showSource": "Show source", + "contentSentTo": "This content will be sent to", + "contentSentContentTo": "send this content to", + "people": "People", + "including": "including", + "transmitButton": "FORWARD", + "transmitButtonOne": "SEND (SIM1)", + "transmitButtonTwo": "SEND (SIM2)", + "msg_detail_mms": "Detail ", + "msg_detail_resend_all": "Resend all", + "tap_content_to_edit": "Tap content to edit", + "msg_resend_prompt": "Message sending failed. Resend?", + "msg_resend": "resend", + "msg_send_failed": "Failed: ", + "messaging": "Messaging", + "contacts_found": "Find {number} contact", + "contacts_open": "open", + "contacts_retract": "retract", + "draft": "Draft", + "multiUnread": "messages: ", + "just": "just", + "msg_send_to": "Send to", + "attachment_saved_to": "Attachment saved to", + "please_keep_it_secure": "Please keep it secure", + "recents": "Recents", + "enter_number_or_search": "Enter number or search", + "just_now": "just now", + "week_sunday": "Sun", + "week_monday": "Mon", + "week_tuesday": "Tue", + "week_wednesday": "Wed", + "week_thursday": "Thu", + "week_friday": "Fri", + "week_saturday": "Sat", + "msg_send_cancel": "Double click the message to cancel sending ", + "week": "week ", + "year": "year", + "month": "month", + "day": "day ", + "Monday": "Monday", + "Tuesday": "Tuesday", + "Wednesday": "Wednesday", + "Thursday": "Thursday", + "Friday": "Friday", + "Saturday": "Saturday", + "Sunday": "Sunday", + "members": "{count} members", + "serviceCenter": "Service center:", + "january": "January", + "february": "February", + "march": "March", + "april": "April", + "may": "May", + "june": "June", + "july": "July", + "august": "August", + "september": "September", + "october": "October", + "november": "November", + "december": "December", + "yesterday": "Yesterday", + "today": "Today", + "monthAndDay": "{month}/{day}", + "yearAndMonthAndDay": "{month}/{day}/{year}", + "postMidnight": "{hour}:{minute} AM", + "beforeDawn": "{hour}:{minute} AM", + "earlyMorning": "{hour}:{minute} AM", + "morning": "{hour}:{minute} AM", + "forenoon": "{hour}:{minute} AM", + "preNoon": "{hour}:{minute} AM", + "postNoon": "{hour}:{minute} PM", + "afternoon": "{hour}:{minute} PM", + "towardEvening": "{hour}:{minute} PM", + "evening": "{hour}:{minute} PM", + "preMidnight": "{hour}:{minute} PM", + "recentDate": "{week}, {recent}", + "monthDayDate": "{week}, {month} {day}", + "yearMonthDayDate": "{week}, {month} {day}, {year}", + "recentDateWithoutWeek": "{recent},", + "monthDayDateWithoutWeek": "{month} {day},", + "yearMonthDayDateWithoutWeek": "{month} {day}, {year},", + "settings": "Settings", + "archive_info_messages": "Archive info messages", + "archive_info_messages_hint": "Show info messages in a single list.", + "malicious_website_identification": "Malicious website identification", + "malicious_website_identification_hint": "Identify malicious links in your messages (Internet access required).", + "verification_code_security": "Verification code security", + "verification_code_security_hint": "Do not allow third-party apps to access and use your verification codes", + "message_tone": "Message tone", + "show_contact_profile_pics": "Show contact profile pics", + "restore_default_settings": "Restore default settings", + "restore_all_default_settings": "Restore all default settings?", + "cancel": "CANCEL", + "restore": "RESTORE", + "advanced": "Advanced", + "delivery_reports": "Delivery reports", + "send_reports": "Send reports", + "delivery_reports_hint": "Request a delivery report for each message you send.", + "sms": "SMS", + "mms": "MMS", + "sms_and_mms": "SMS and MMS", + "ok": "OK", + "auto_retrieve_mms": "Auto-retrieve MMS", + "not_when_roaming": "Not when roaming", + "always": "Always", + "roaming_fees_may_apply": "Roaming fees may apply", + "off": "Off", + "recall_messages": "Recall messages", + "recall_messages_hint": "Double-touch a message within 6 seconds to recall it.", + "auto_delete_info_messages": "Auto-delete info messages", + "auto_delete_info_messages_hint": "Automatically delete info messages 30 days after receipt.", + "enable_auto_delete": "Enable auto-delete", + "enable_auto_delete_hint": "When enabled, info messages older than 30 days will be deleted, including those that may be important. Enable?", + "enable": "ENABLE", + "sms_center": "SMS center number", + "manage_sim_card_messages": "Manage SIM card messages", + "sim": "SIM", + "manage": "Manage Sim", + "messages": "messages", + "sms_center_hint": "Warning: You may not be able to send text messages if this number is not set correctly. For the SMS center number, contact your service provider.", + "change_sms_center_number": "Change SMS Center Number", + "no_messages": "No messages", + "refreshing": "Refresh...", + "phone": "PHONE", + "share": "SHARE", + "new_contact": "NEW CONTACT", + "message": "MESSAGE", + "send_message": "Send Message", + "pasteboard": "paste", + "open_web": "Open web address", + "add_to_bookmarks": "Add to bookmarks", + "send_email": "Send email", + "new_schedule_reminder": "New schedule reminder", + "call": "call", + "calling": "calling", + "call_failed": "call failed", + "camera_post": "post position", + "camera_front": "front position", + "save_img_failed": "save image failed", + "message_copied_to_phone": "Message copied to phone", + "message_in_favorites": "Message in Favorites", + "Status": "Status:", + "Delivered": "Delivered:", + "rending" : "Rending", + "received" : "Received", + "failed": "Failed", + "refused": "Refused", + "enter_text": "Enter text", + "delete_slide": "Delete slide", + "save_all": "save all", + "save_attachments": "Save attachments", + "view_vCard_detail": "view vCard detail", + "slide_preview": "preview", + "slide_duration": "duration", + "slide_duration_unit": "second", + "slide_duration_title": "slide duration 2/2" + }, + "svg": { + "delete": "/common/icon/ic_delete_m.svg", + "chat_list": { + "empty": "/common/icon/ic_massage_m.svg", + "more": "/common/icon/ic_more_24x24.svg", + "info": "/common/icon/entrance_icon01.svg", + "mark_as_read": "/common/icon/mark_as_read.png", + "delete": "/common/icon/delete.png", + "newMessage": "/common/icon/add_2.png" + }, + "info": { + "back": "/common/icon/ic_back.svg", + "allRead": "/common/icon/ic_allread.svg" + }, + "new": { + + }, + + "favorites": { + "unselected": "/common/icon/ic_msg_favorite_m.svg", + "selected": "/common/icon/ic_msg_favorite_filled_m.svg", + "copy": "/common/icon/ic_msg_favorite_copy_m.svg" + }, + "styleFullScreenMore": { + "fullscreen": "/common/icon/msg_full_screen.svg", + "unfullscreen": "/common/icon/msg_unfull_screen.svg" + }, + "transfer": "/common/icon/ic_transfer.svg", + "select_all": "/common/icon/ic_select_all.svg", + "more": "/common/icon/ic_more_24x24.svg", + "checkbox_off": "/common/icon/checkbox_off.svg", + "checkbox_on": "/common/icon/checkbox_on.svg", + "gallery": "/common/icon/ic_gallery.svg", + "video_flag": "/common/icon/ic_play.svg", + "cancel": "/common/icon/ic_wrong.svg", + "right": "/common/icon/ic_tick.svg" + }, + "abc": { + + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/i18n/zh-CN.json b/entry/src/main/js/default/i18n/zh-CN.json new file mode 100644 index 0000000..c95d2ad --- /dev/null +++ b/entry/src/main/js/default/i18n/zh-CN.json @@ -0,0 +1,364 @@ +{ + "strings": { + "copy_phone": "复制到手机", + "add_Contact": "添加到联系人", + "addToContact": "添加联系人", + "load": "正在刷新...", + "enable": "开启", + "enabled": "已开启", + "disable": "关闭", + "disabled": "已关闭", + "cancel": "取消", + "restore": "还原", + "on": "开启", + "off": "关闭", + "ok": "确定", + "sim1": "卡 1", + "sim2": "卡 2", + "default": "默认", + "messaging": "信息", + "noMessages": "没有会话信息", + "unread": "条未读", + "search": "搜索信息", + "search2": "搜索通知信息", + "infoMessages": "通知信息", + "delete": "删除", + "delete_low": "删除", + "msg_select_all": "全选", + "msg_deselect_all": "取消全选", + "favorites": "我的收藏", + "blocked": "骚扰拦截", + "markAllAsRead": "全部已读", + "settings": "设置", + "draft": "草稿", + "greaterThanSign": ">", + "lessThanSign": "<", + "more": "更多", + "more_low": "更多", + "multiUnread": "条:", + "msg_delete_dialog_cancel": "取消", + "there_is_no_match": "没有匹配的结果", + "msg_information_up": " 条信息", + "msg_informations_up": " 条信息", + "msg_information": " 条信息", + "msg_informations": " 条信息", + "msg_find": "找到 ", + "msg_conversation_up": " 个会话", + "msg_conversations_up": " 个会话", + "just_now": "刚刚", + "attachment_no_subject": "[附件](无主题)", + "attachment": "[附件]", + "no_subject": "(无主题)", + "minAgo": "{minute}分钟前", + "yesterday": "昨天", + "monthAndDay": "{month}/{day}", + "yearAndMonthAndDay": "{year}/{month}/{day}", + "postMidnight": "半夜{hour}:{minute}", + "beforeDawn": "凌晨{hour}:{minute}", + "earlyMorning": "清晨{hour}:{minute}", + "morning": "早上{hour}:{minute}", + "forenoon": "上午{hour}:{minute}", + "preNoon": "中午{hour}:{minute}", + "postNoon": "中午{hour}:{minute}", + "afternoon": "下午{hour}:{minute}", + "towardEvening": "傍晚{hour}:{minute}", + "evening": "晚上{hour}:{minute}", + "preMidnight": "半夜{hour}:{minute}", + "msg_new_contact": "新建联系人", + "view_contact": "查看联系人", + "msg_save_to_an_existing_contact": "保存至已有联系人", + "msg_pre_call_editor": "呼叫前编辑", + "msg_blacklist": "加入黑名单", + "msg_remove_from_blacklist": "从黑名单移除", + "msg_copy": "复制", + "msg_transmit": "转发", + "msg_select_text": "选择文本", + "msg_save": "保存", + "msg_note_mms": "短信/彩信", + "msg_note_mms2": "添加说明或发送", + "msg_lock": "锁定", + "msg_star": "收藏", + "my_msg_star": "我的收藏", + "sim_msg_manage": "管理卡信息", + "no_star_info": "没有收藏信息", + "info_is_stared": "信息已被收藏", + "msg_take_photos": "拍摄照片", + "msg_picture": "图片", + "msg_gallery": "图库", + "msg_record": "录音", + "msg_record_short": "录音太短", + "msg_contacts": "联系人", + "msg_schedule": "日程", + "msg_music": "音乐", + "msg_theme": "主题", + "msg_slide": "幻灯片", + "msg_location": "位置", + "converting_mms": "正在转化为彩信...", + "converting_sms": "正在转化为短信...", + "attachment_failed": "添加附件失败,超出300KB的大小上限", + "messageSendFailed": "发送失败", + "messageSending": "正在发送...", + "messageDeliver": "已送达", + "fullScreenInput": "全屏输入", + "addresser": "发件人", + "to": "收件人", + "new_message": "新建信息", + "back": "返回", + "share": "分享", + "lock": "锁定", + "unlock": "解锁", + "query_details": "查看详情", + "msg_delete_dialog_tip1": "是否删除此信息?", + "msg_delete_dialog_tip2": "是否删除{number}条信息?", + "msg_delete_dialog_tip3": "是否删除全部信息?", + "msg_delete_dialog_cb_tip": "同时删除锁定信息", + "msg_delete_dialog_lock": "是否删除此锁定的信息?", + "msg_selected_tip": "已选择 {number} 项", + "msg_unselected_tip": "未选择", + "press_speak": "按住说话", + "tips": "提示", + "tips_replace": "已有内容将被替换。", + "confirm": "确定", + "query_report": "查看报告", + "video_connect_succeed": "视频连接成功", + "video_start_play": "视频开始播放", + "video_pause_play": "视频暂停播放", + "video_play_end": "视频播放结束", + "video_play_error": "视频播放错误", + "all_save": "全部保存", + "select_items": "选择项", + "mobile1": "手机", + "mobile2": "手机", + "mobile3": "手机:", + "name1": "名字:", + "contact": "联系人", + "text": "文本", + "mmsVcard": "彩信 vCard", + "type": "类型: ", + "sendTime": "发送时间: ", + "putTime": "接收时间: ", + "addSlide": "添加幻灯片", + "sendAddresser": "发件人: ", + "putAddresser": "收件人: ", + "invalid_receive": "无效收件人:<{str}>", + "and_others": "{name}以及其他{number}个", + "msgDetails": "信息详情", + "transmitButton": "转发", + "transmitButtonOne": "卡1转发", + "transmitButtonTwo": "卡2转发", + "transmitHeadText": "选择会话", + "recently":"最近", + "searchHit": "输入号码或搜索", + "selectContracts": "选择联系人", + "me": "我", + "transmitContentMe": "我:", + "transmitContent": "转自 我:", + "transmitContentReceive": "转自 {name}:", + "transmitContentMulti": "转自 我与 {name} 的会话", + "transmitContentMultiForFavorite": "转自 收藏", + "showSource": "包含转发来源", + "contentSentTo": "以下内容将转发至", + "contentSentContentTo": "是否发送所选内容至", + "people": "人", + "including": "等", + "msg_detail_mms": "详情", + "msg_detail_resend_all": "全部重发", + "tap_content_to_edit": "轻触内容可编辑", + "msg_resend_prompt": "信息发送失败。是否重新发送?", + "msg_resend": "重新发送", + "msg_send_failed": "失败:", + "contacts_found": "找到 {number} 个联系人", + "contacts_open": "展开", + "contacts_retract": "收起", + "just": "刚刚", + "msg_send_to": "发送至", + "attachment_saved_to": "附件已保存到:", + "please_keep_it_secure": ", 请妥善保存", + "msg_send_cancel": "双击消息内容取消发送 ", + "week_sunday": "星期日", + "week_monday": "星期一", + "week_tuesday": "星期二", + "week_wednesday": "星期三", + "week_thursday": "星期四", + "week_friday": "星期五", + "week_saturday": "星期六", + "week": "星期 ", + "week_number": "", + "year": "年", + "month": "月", + "day": "日 ", + "Monday": "星期一", + "Tuesday": "星期二", + "Wednesday": "星期三", + "Thursday": "星期四", + "Friday": "星期五", + "Saturday": "星期六", + "Sunday": "星期日", + "members": "{count} 人", + "serviceCenter": "服务中心:", + "recipients": "收件人", + "january": "1月", + "february": "2月", + "march": "3月", + "april": "4月", + "may": "5月", + "june": "6月", + "july": "7月", + "august": "8月", + "september": "9月", + "october": "10月", + "november": "11月", + "december": "12月", + "justNow": "刚刚", + "hourAndMinute": "{hour}:{minute}", + "today": "今天", + "recentDate": "{recent}{week}", + "monthDayDate": "{month}{day}日{week}", + "yearMonthDayDate": "{year}年{month}{day}日{week}", + "recentDateWithoutWeek": "{recent}", + "monthDayDateWithoutWeek": "{month}{day}日", + "yearMonthDayDateWithoutWeek": "{year}年{month}{day}日", + "archive_info_messages": "通知信息整合", + "archive_info_messages_hint": "通知类信息收起在一个单独的信息列表中", + "malicious_website_identification": "恶意网址识别", + "malicious_website_identification_hint": "联网查询以识别信息中的恶意网址", + "verification_code_security": "验证码安全保护", + "verification_code_security_hint": "禁止第三方应用读取和使用验证码信息", + "message_tone": "信息铃声", + "show_contact_profile_pics": "显示联系人头像", + "restore_default_settings": "还原默认设置", + "restore_all_default_settings": "是否将全部设置项还原为默认设置?", + "advanced": "高级", + "delivery_reports": "送达报告", + "send_reports": "发送报告", + "delivery_reports_hint": "发送信息后,返回发送报告", + "sms": "短信", + "mms": "彩信", + "sms_and_mms": "短信和彩信", + "auto_retrieve_mms": "自动下载彩信", + "not_when_roaming": "非漫游时", + "always": "所有网络下", + "roaming_fees_may_apply": "可能产生漫游费", + "recall_messages": "取消发送", + "recall_messages_hint": "点击发送6秒内,双击信息气泡框取消发送", + "auto_delete_info_messages": "自动删除通知信息", + "auto_delete_info_messages_hint": "超过30天的通知信息", + "enable_auto_delete": "开启自动删除", + "enable_auto_delete_hint": "开启后,将删除30天以前的通知信息。您有用的通知信息可能被删除。是否开启?", + "sms_center": "短信中心", + "manage_sim_card_messages": "管理SIM卡中的信息", + "sim": "卡", + "manage": "管理卡", + "messages": "信息", + "sms_center_hint": "重要提示:配置不当会造成短信发送功能不可用。请联系运营商获取正确的短信中心号码。", + "change_sms_center_number": "修改短信中心号码", + "no_messages": "没有信息", + "refreshing": "正在刷新...", + "phone": "电话", + "new_contact": "添加", + "message": "发短信", + "send_message": "发送信息", + "pasteboard": "复制到剪贴板", + "open_web": "打开网址", + "add_to_bookmarks": "添加到书签", + "send_email": "发送邮件", + "new_schedule_reminder": "新建日程提醒", + "call": "呼叫", + "calling": "呼叫中", + "call_failed": "呼叫失败", + "camera_post": "后置", + "camera_front": "前置", + "save_img_failed": "保存图片失败", + "message_copied_to_phone": "已将信息复制到手机存储", + "message_in_favorites": "已收藏的信息", + "Status": "状态:", + "Delivered": "已送达:", + "rending" : "待发送", + "received" : "已收到", + "failed": "失败", + "refused": "已拒绝", + "enter_text": "输入文本", + "delete_slide": "删除幻灯片", + "save_all": "保存全部", + "save_attachments": "保存附件", + "view_vCard_detail": "查看vCard详情", + "slide_preview": "预览", + "slide_duration": "持续时间", + "slide_duration_unit": "秒", + "slide_duration_title": "幻灯片持续时间2/2" + }, + "svg": { + "session": "/common/icon/ic_massage_m.svg", + "delete": "/common/icon/ic_delete_m.svg", + "chat_list": { + "empty": "/common/icon/ic_massage_m.svg", + "more": "/common/icon/ic_more_24x24.svg", + "info": "/common/icon/entrance_icon01.svg", + "mark_as_read": "/common/icon/mark_as_read.png", + "delete": "/common/icon/delete.png", + "newMessage": "/common/icon/add_2.png" + }, + "info": { + "back": "/common/icon/ic_back.svg", + "allRead": "/common/icon/ic_allread.svg" + }, + "new": { + + }, + + "favorites": { + "unselected": "/common/icon/ic_msg_favorite_m.svg", + "selected": "/common/icon/ic_msg_favorite_filled_m.svg", + "copy": "/common/icon/ic_msg_favorite_copy_m.svg" + }, + "styleFullScreenMore": { + "fullscreen": "/common/icon/msg_full_screen.svg", + "unfullscreen": "/common/icon/msg_unfull_screen.svg" + }, + "transfer": "/common/icon/ic_transfer.svg", + "select_all": "/common/icon/ic_select_all.svg", + "more": "/common/icon/ic_more_24x24.svg", + "checkbox_off": "/common/icon/checkbox_off.svg", + "checkbox_on": "/common/icon/checkbox_on.svg", + "gallery": "/common/icon/ic_gallery.svg", + "video_flag": "/common/icon/ic_play.svg", + "cancel": "/common/icon/ic_wrong.svg", + "right": "/common/icon/ic_tick.svg" + }, + "acb": { + "moreMenu": "更多选项,按钮", + "moreMenuHint": "弹出式窗口,1至{max},共{max}项", + "selected": "已选中{item}", + "searchBox": "搜索{item}编辑框,双击即可输入文字,", + "singleFinger": "单指双击即可执行", + "doubleClick": "双击并按住即可,弹出更多选项", + "contactHeadIcon": "联系人头像", + "button": "按钮", + "newMsg": "新建信息", + "navigationUp": "向上导航", + "notClickable": "不可点击", + "clickable": "可以点击", + "call": "呼叫", + "moreMenu": "更多选项", + "video": "视频", + "card1": "卡1", + "card2": "卡2", + "myHeadIcon": "我的头像", + "previewImage": "预览图片", + "addAttachment": "添加附件", + "emoji": "表情符号", + "send": "发送", + "play": "播放", + "multiPage": "多页面视图,用双指滑动即可切换页面", + "hadSelected": "已选中", + "unselected": "未选中", + "checkbox": "复选框", + "single": "单指双击即可", + "select": "选中", + "cancelSelect": "取消选中", + "switch": "开关", + "refreshSimMsg": "正在刷新SIM卡中的信息", + "editBox": "编辑框", + "editText": "双击即可输入文字" + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/BaseModel.js b/entry/src/main/js/default/model/BaseModel.js new file mode 100644 index 0000000..c0717d3 --- /dev/null +++ b/entry/src/main/js/default/model/BaseModel.js @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default class BaseModel { + constructor() { + } + encapsulateReturnResult(code, abilityResult) { + var result = {}; + result.code = code; + result.abilityResult = abilityResult; + return result; + } + + encapsulateReturnCode(code) { + var result = {}; + result.code = code; + return result; + } + +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/MorkDataModel.js b/entry/src/main/js/default/model/MorkDataModel.js new file mode 100644 index 0000000..e0158ba --- /dev/null +++ b/entry/src/main/js/default/model/MorkDataModel.js @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +var savedImageInfo = { + filePath: '' +}; + +var pictureListFromGallery = [ + { + path: '/common/icon/add.png', + checkedValue: false, + fileSize: 55.6, // 单位KB + type: 1 // 1图片,3视频 + }, + { + path: '/common/icon/up.png', + checkedValue: false, + fileSize: 95.6, + type: 1 + }, + { + path: '/common/icon/vmall.png', + checkedValue: false, + fileSize: 75.6, + type: 1 + }, + { + path: '/common/icon/pin.png', + checkedValue: false, + fileSize: 55.6, + type: 1 + }, + { + path: '/common/icon/delete.png', + checkedValue: false, + fileSize: 55.6, + type: 1 + }, + { + path: '/common/icon/ikea.png', + checkedValue: false, + fileSize: 55.6, + type: 1 + } +]; + +export default class MorkModel { + + saveImage() { + return savedImageInfo; + } + + queryFromGallery() { + return pictureListFromGallery; + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/cardInfoImpl/CardModel.js b/entry/src/main/js/default/model/cardInfoImpl/CardModel.js new file mode 100644 index 0000000..2b05f25 --- /dev/null +++ b/entry/src/main/js/default/model/cardInfoImpl/CardModel.js @@ -0,0 +1,151 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BaseModel from '../BaseModel.js'; +import common from '../../pages/common_constants.js'; +import mmsLog from '../../../default/utils/MmsLog.js'; +import telephonySMS from '@ohos.telephony.sms'; +import telephonySim from '@ohos.telephony.sim'; + +const TAG = 'CardModel ->'; + +export default class CardModel extends BaseModel { + getSimSpn(preferences) { + telephonySim.getSimSpn(common.int.SIM_ONE, (err, value) => { + if (err) { + mmsLog.log('getSimSpn error = ' + err.message); + } else { + preferences.setValueForSwitch(common.string.KEY_OF_SIM_0_SPN, value); + mmsLog.log('getSimSpn spn = ' + value); + } + }); + telephonySim.getSimSpn(common.int.SIM_TWO, (err, value) => { + if (err) { + mmsLog.log('getSimSpn error = ' + err.message); + } else { + preferences.setValueForSwitch(common.string.KEY_OF_SIM_1_SPN, value); + mmsLog.log('getSimSpn spn = ' + value); + } + }); + } + + getSmscNumber(slotId, preferences, callback) { + mmsLog.info(TAG + 'getSmscAddr,slotId:' + slotId); + let smsNumber = common.string.EMPTY_STR; + let simOne = preferences.getNewSmscOfSim1(); + let simTwo = preferences.getNewSmscOfSim2(); + if (slotId == common.int.SIM_ONE && simOne != common.string.EMPTY_STR) { + smsNumber = simOne; + } else if (slotId == common.int.SIM_TWO && simTwo != common.string.EMPTY_STR) { + smsNumber = simTwo; + } else { + // 调用API获取 + telephonySMS.getSmscAddr(slotId).then((simPhoneNumber) => { + smsNumber = simPhoneNumber; + if (slotId == common.int.SIM_ONE) { + preferences.setValueForSwitch(common.string.KEY_OF_NEW_SIM_0_SMSC, simPhoneNumber); + } else if (slotId == common.int.SIM_TWO) { + preferences.setValueForSwitch(common.string.KEY_OF_NEW_SIM_1_SMSC, simPhoneNumber); + } + callback(smsNumber); + }).catch((error) => { + mmsLog.info(TAG + 'getSmNumber smsNumber: error = ' + JSON.stringify(error)); + }); + } + callback(smsNumber); + } + + queryMessageInSimCard(actionData, callback) { + let index = actionData.index - 1; + // 获取sim卡内信息的API目前未提供. 获取sim卡内短信 + let simMessageList = []; + telephonySMS.getAllSimMessages(index, (error, msgArray) => { + if (error) { + mmsLog.log(TAG + 'getAllSimMessages callback error cause :' + error.message); + return; + } + for (let i = 0;i < msgArray.length; i++) { + let data = {}; + data.image = '/common/icon/user_avatar_full_fill.svg'; + data.date = common.string.EMPTY_STR; + data.time = common.string.EMPTY_STR; + data.timeMillisecond = msgArray[i].shortMessage.scTimestamp; + data.content = msgArray[i].shortMessage.visibleMessageBody; + data.indexOnSim = msgArray[i].indexOnSim; + data.isCbChecked = false; + data.msgType = [0]; + data.type = 0; + data.address = msgArray[i].shortMessage.visibleRawAddress; + data.isMsm = false; + simMessageList.push(data); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, simMessageList)); + }); + } + + delSimMessage(actionData) { + let index = actionData.index - 1; + let msgIndex = actionData.indexOnSim; + telephonySMS.delSimMessage(index, msgIndex, (error, value) => { + if (error) { + mmsLog.log(TAG + 'delSimMessage error cause: ' + error.message); + } else { + mmsLog.log(TAG + 'delSimMessage value cause: ' + value); + } + }); + } + + getSimCardNum(preferences) { + mmsLog.log(TAG + 'getSimCardNum start' + telephonySim); + telephonySim.hasSimCard(common.int.SIM_ONE, (error, value) => { + if (error) { + mmsLog.log(TAG + 'hasSimCard0 error cause: ' + error.message); + } else { + mmsLog.log(TAG + 'hasSimCard0 result: ' + value); + let result = value ? common.bool.TRUE : common.bool.FALSE; + preferences.setValueForSwitch(common.string.KEY_OF_SIM_0_EXIST_FLAG, result); + } + }); + telephonySim.hasSimCard(common.int.SIM_TWO, (error, value) => { + if (error) { + mmsLog.log(TAG + 'hasSimCard1 error cause: ' + error.message); + } else { + mmsLog.log(TAG + 'hasSimCard1 result: ' + value); + let result = value ? common.bool.TRUE : common.bool.FALSE; + preferences.setValueForSwitch(common.string.KEY_OF_SIM_1_EXIST_FLAG, result); + } + }); + } + + getSimTelephoneNumber(preferences) { + mmsLog.log(TAG + 'getSimTelephoneNumber start'); + telephonySim.getSimTelephoneNumber(common.int.SIM_ONE, (error, value) => { + if (error) { + mmsLog.log('getSimTelephoneNumber error cause: ' + error.message); + } else { + mmsLog.log('getSimTelephoneNumber success: ' + value); + preferences.setValueForSwitch(common.string.KEY_OF_SIM_0_NUMBER, value); + } + }); + telephonySim.getSimTelephoneNumber(common.int.SIM_TWO, (error, value) => { + if (error) { + mmsLog.log('getSimTelephoneNumber error cause: ' + error.message); + } else { + mmsLog.log('getSimTelephoneNumber success: ' + value); + preferences.setValueForSwitch(common.string.KEY_OF_SIM_1_NUMBER, value); + } + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/contactsImpl/ContactsModel.js b/entry/src/main/js/default/model/contactsImpl/ContactsModel.js new file mode 100644 index 0000000..dd7f324 --- /dev/null +++ b/entry/src/main/js/default/model/contactsImpl/ContactsModel.js @@ -0,0 +1,179 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BaseModel from '../BaseModel.js'; +import common from '../../pages/common_constants.js'; +import mmsLog from '../../../default/utils/MmsLog.js'; +import mmsTable from '../../pages/mms_table.js'; + +const TAG = 'ContactsModel ->'; + +export default class ContactsModel extends BaseModel { + async queryContactDataByIds(actionData, callback) { + mmsLog.log(TAG + 'queryContactDataByIds, params:' + actionData); + let featureAbility = actionData.featureAbility; + let dataHelper = await featureAbility.getDataAbilityHelper(common.string.URI_ROW_CONTACTS); + let resultColumns = [ + mmsTable.contactDataColumns.detailInfo, + mmsTable.contactDataColumns.displayName, + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let contactDataUri = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI; + condition.in(mmsTable.contactDataColumns.contactId, actionData.contractIds); + condition.and(); + condition.equalTo(mmsTable.contactDataColumns.typeId, '5'); + condition.and(); + condition.equalTo(mmsTable.contactDataColumns.hasDelete, '0'); + dataHelper.query(contactDataUri, resultColumns, condition).then(resultSet => { + callback(this.dealResultSet(resultSet)); + }).catch(error => { + mmsLog.info('queryContactDataByIds error:' + error); + }); + } + + async queryContactDataByTelephone(actionData, callback) { + let featureAbility = actionData.featureAbility; + let telephoneDataHelp = await featureAbility.getDataAbilityHelper(common.string.URI_ROW_CONTACTS); + let resultColumns = [ + mmsTable.contactDataColumns.detailInfo, + mmsTable.contactDataColumns.displayName, + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let contactDataUri = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI; + condition.in(mmsTable.contactDataColumns.detailInfo, actionData.telephones); + condition.and(); + condition.equalTo(mmsTable.contactDataColumns.typeId, '5'); + condition.and(); + condition.equalTo(mmsTable.contactDataColumns.hasDelete, '0'); + telephoneDataHelp.query(contactDataUri, resultColumns, condition).then(resultSet => { + callback(this.dealResultSet(resultSet)); + }).catch(error => { + mmsLog.info('queryContactDataByTelephone error:' + error); + }); + } + + dealResultSet(resultSet) { + let contracts = []; + while (resultSet.goToNextRow()) { + let contract = {}; + contract.detailInfo = resultSet.getString(0); + contract.displayName = resultSet.getString(1); + contracts.push(contract); + } + return contracts; + } + + async queryContact(actionData, callback) { + let featureAbility = actionData.featureAbility; + let DAHelper = await featureAbility.getDataAbilityHelper(common.string.URI_ROW_CONTACTS); + let resultColumns = [ + mmsTable.contactColumns.id + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let rawContactUri = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI; + let offset = (actionData.page - 1) * actionData.limit; + condition.limitAs(actionData.limit) + .orderByDesc(mmsTable.contactColumns.lastestContactedTime) + .offsetAs(offset); + DAHelper.query(rawContactUri, resultColumns, condition).then(resultSet => { + let rawContactIds = []; + while (resultSet.goToNextRow()) { + rawContactIds.push(resultSet.getString(0)); + } + callback(rawContactIds); + }).catch(error => { + mmsLog.info('queryRowContact ,error:' + error); + }); + } + + async countContact(actionData, callback) { + let featureAbility = actionData.featureAbility; + let DAHelper = await featureAbility.getDataAbilityHelper(common.string.URI_ROW_CONTACTS); + let resultColumns = [ + mmsTable.contactColumns.id + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let rawContactUri = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI; + condition.orderByDesc(mmsTable.contactColumns.lastestContactedTime); + DAHelper.query(rawContactUri, resultColumns, condition).then(resultSet => { + let count = 0; + while (resultSet.goToNextRow()) { + count++; + } + callback(count); + }).catch(error => { + mmsLog.info('countContact ,error:' + error); + }); + } + + async searchContracts(actionData, callback) { + mmsLog.log(TAG + 'searchContracts,actionData:' + actionData); + let featureAbility = actionData.featureAbility; + let searchDataHelper = await featureAbility.getDataAbilityHelper(common.string.URI_ROW_CONTACTS); + let resultColumns = [ + mmsTable.searchContactView.detailInfo, + mmsTable.searchContactView.displayName + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let searchContactsUri = common.string.URI_ROW_CONTACTS + common.string.CONTACT_SEARCHE; + condition.equalTo(mmsTable.searchContactView.contentType, 'phone') + .beginWrap() + .contains(mmsTable.searchContactView.displayName, actionData.telephone) + .or() + .contains(mmsTable.searchContactView.detailInfo, actionData.telephone) + .endWrap(); + searchDataHelper.query(searchContactsUri, resultColumns, condition).then(resultSet => { + let contracts = this.dealResultSet(resultSet); + callback(super.encapsulateReturnResult(common.int.SUCCESS, contracts)); + }).catch(error => { + mmsLog.info(TAG + 'searchContracts contracts error:' + error); + callback(super.encapsulateReturnCode(common.int.FAILURE)); + }); + } + + /** + * 查询名片数据 + * @param actionData 查询参数 + * @param callback 回调 + */ + async queryProfile(actionData, callback) { + mmsLog.log('jumpToCard queryProfile is start '); + let featureAbility = actionData.featureAbility; + let DAHelper = await featureAbility.getDataAbilityHelper(common.string.URI_ROW_CONTACTS); + mmsLog.log('jumpToCard queryProfile is condition: '+ DAHelper); + let resultColumns = [ + mmsTable.contactDataColumns.id, + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let contactDataUri = common.string.URI_ROW_CONTACTS + common.string.PROFILE_DATA_URI; + DAHelper.query(contactDataUri, resultColumns, condition).then(resultSet => { + let count = 0; + while (resultSet.goToNextRow()) { + count++; + } + mmsLog.log('jumpToCard queryProfile is goToNextRow: ' + count); + resultSet.close(); + callback(count); + }).catch(error => { + mmsLog.info('queryProfile error:' + error); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/conversationImpl/ConversationModel.js b/entry/src/main/js/default/model/conversationImpl/ConversationModel.js new file mode 100644 index 0000000..9143b23 --- /dev/null +++ b/entry/src/main/js/default/model/conversationImpl/ConversationModel.js @@ -0,0 +1,649 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BaseModel from '../BaseModel.js'; +import MorkDataModel from '../MorkDataModel.js'; +import common from '../../pages/common_constants.js'; +import mmsTable from '../../pages/mms_table.js'; +// log 工具类 +import mmsLog from '../../utils/MmsLog.js'; + +let morkDataModel = new MorkDataModel(); +const TAG = 'ConversationModel ->'; + +export default class ConversationModel extends BaseModel { + async queryMessageDetail(actionData, callback) { + mmsLog.log(TAG + 'queryMessageDetail param:' + actionData); + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var resultColumns = this.buildResultColumns(); + let condition = this.buildQueryCondition(actionData); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.query(managerUri, resultColumns, condition).then(resultSet => { + let resultList = []; + while (resultSet.goToNextRow()) { + let result = {}; + this.dealBaseColumsData(result, resultSet); + result.operatorServiceNumber = resultSet.getString(10); + result.msgCode = resultSet.getString(11); + result.isLock = resultSet.getString(12); + result.isRead = resultSet.getString(13); + result.isCollect = resultSet.getString(14); + result.sessionType = resultSet.getString(15); + result.retrNumber = resultSet.getString(16); + result.isSubsection = resultSet.getString(17); + result.sessionId = resultSet.getString(18); + result.groupId = resultSet.getString(19); + result.isSender = resultSet.getString(20); + result.isSendReport = resultSet.getString(21); + resultList.push(result); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, resultList)); + }).catch(error => { + mmsLog.log(TAG + 'queryMessageDetail error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } + + buildQueryCondition(actionData) { + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + if (actionData.isDraft != null && actionData.isDraft) { + condition.equalTo(mmsTable.messageInfo.groupId, actionData.groupId); + condition.equalTo(mmsTable.messageInfo.msgState, actionData.sendStatus); + } + if (actionData.threadId != null) { + let sessionId = actionData.threadId + common.string.EMPTY_STR; + condition.equalTo(mmsTable.messageInfo.sessionId, sessionId); + } + if (actionData.threadIds != null && actionData.threadIds.length > 0) { + let sessionIds = this.groupIdToString(actionData.threadIds); + condition.in(mmsTable.messageInfo.sessionId, sessionIds); + } + if (actionData.msgIds != null && actionData.msgIds.length != 0) { + condition.in(mmsTable.messageInfo.msgId, actionData.msgIds); + } + if (actionData.hasLock != null) { + condition.equalTo(mmsTable.messageInfo.isLock, actionData.hasLock); + } + if (actionData.hasRead != null) { + condition.equalTo(mmsTable.messageInfo.isRead, actionData.hasRead); + } + return condition; + } + + buildBaseColumns() { + var resultColumns = [ + mmsTable.messageInfo.msgId, + // 接收者手机号 + mmsTable.messageInfo.receiverNumber, + mmsTable.messageInfo.senderNumber, + mmsTable.messageInfo.startTime, + mmsTable.messageInfo.endTime, + mmsTable.messageInfo.msgType, + // sms = 0,mms, + mmsTable.messageInfo.smsType, + // 0-普通,1-通知 + mmsTable.messageInfo.msgTitle, + mmsTable.messageInfo.msgContent, + mmsTable.messageInfo.msgState + ]; + return resultColumns; + } + + buildResultColumns() { + let bascColums = this.buildBaseColumns(); + var resultColumns = [ + mmsTable.messageInfo.operatorServiceNumber, + mmsTable.messageInfo.msgCode, + mmsTable.messageInfo.isLock, + mmsTable.messageInfo.isRead, + mmsTable.messageInfo.isCollect, + mmsTable.messageInfo.sessionType, + // 0 - 普通 1 - 广播 2 - 群发 + mmsTable.messageInfo.retryNumber, + // 重发次数 + mmsTable.messageInfo.isSubsection, + mmsTable.messageInfo.sessionId, + mmsTable.messageInfo.groupId, + mmsTable.messageInfo.isSender, + mmsTable.messageInfo.isSendReport, + ]; + return bascColums.concat(resultColumns); + } + + async searchSmsMessageByContent(actionData, callback) { + mmsLog.info(TAG + 'searchSmsMessageByContent param:' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var resultColumns = this.buildSearchResultColums(); + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + condition.like(mmsTable.messageInfo.msgContent, '%' + actionData.content + '%'); + condition.equalTo(mmsTable.messageInfo.msgType, 0); + if (actionData.numberType != null) { + condition.equalTo(mmsTable.messageInfo.smsType, actionData.numberType); + } + let resultList = []; + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.query(managerUri, resultColumns, condition).then(resultSet => { + while (resultSet.goToNextRow()) { + let result = {}; + this.dealBaseColumsData(result, resultSet); + result.isCollect = resultSet.getString(10); + result.sessionId = resultSet.getString(11); + result.groupId = resultSet.getString(12); + result.isSender = resultSet.getString(13); + resultList.push(result); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, resultList)); + }).catch(error => { + mmsLog.info(TAG + 'searchSmsMessageByContent error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } + + buildSearchResultColums() { + let bascColums = this.buildBaseColumns(); + var resultColumns = [ + mmsTable.messageInfo.isCollect, + mmsTable.messageInfo.sessionId, + mmsTable.messageInfo.groupId, + mmsTable.messageInfo.isSender + ]; + return bascColums.concat(resultColumns); + } + + dealBaseColumsData(result, resultSet) { + result.msgId = resultSet.getString(0); + result.receiverNumber = resultSet.getString(1); + result.senderNumber = resultSet.getString(2); + result.startTime = resultSet.getString(3); + result.endTime = resultSet.getString(4); + result.msgType = resultSet.getString(5); + result.smsType = resultSet.getString(6); + result.msgTitle = resultSet.getString(7); + result.msgContent = resultSet.getString(8); + result.msgState = resultSet.getString(9); + } + + async insertMessageDetail(actionData, callback) { + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.insert(managerUri, actionData.stringValue).then(data => { + mmsLog.info(TAG + 'insertMessageDetail, success:' + data); + callback(super.encapsulateReturnResult(common.int.SUCCESS, data)); + }).catch(error => { + mmsLog.info(TAG + 'insertMessageDetail fail:' + error); + }); + } + + async updateLock(actionData, callback) { + mmsLog.info(TAG + 'updateLock , actionData = ' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var groupIds = this.groupIdToString(actionData.groupIds); + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.in(mmsTable.messageInfo.groupId, groupIds); + var stringValue = { + 'is_lock': actionData.hasLock, + }; + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.update(managerUri, stringValue, condition).then((data) => { + mmsLog.info(TAG + 'updateLock success! data = ' + data); + callback(super.encapsulateReturnCode(common.int.SUCCESS)); + }).catch((err) => { + mmsLog.info(TAG + 'updateLock err = ' + err); + mmsLog.info(TAG + 'updateLock err = ' + JSON.stringify(err)); + callback(super.encapsulateReturnCode(common.int.FAILURE)); + }); + } + + groupIdToString(groupIds) { + let ids = []; + groupIds.forEach(item => { + ids.push(item + ''); + }); + return ids; + } + + async updateCollect(actionData, callback) { + mmsLog.info(TAG + 'updateCollect , actionData = ' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var groupIds = this.groupIdToString(actionData.groupIds); + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.in(mmsTable.messageInfo.groupId, groupIds); + var stringValue = { + 'is_collect': actionData.hasCollect, + }; + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.update(managerUri, stringValue, condition).then((data) => { + mmsLog.info(TAG + 'updateCollect success! data = ' + data); + callback(super.encapsulateReturnCode(common.int.SUCCESS)); + }).catch((err) => { + mmsLog.info(TAG + 'updateCollect err = ' + err); + mmsLog.info(TAG + 'updateCollect err = ' + JSON.stringify(err)); + callback(super.encapsulateReturnCode(common.int.FAILURE)); + }); + } + + async deleteMessageByIds(actionData) { + mmsLog.info(TAG + 'deleteMessage, actionData :' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var msgIds = actionData.msgIds; + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.in(mmsTable.messageInfo.msgId, msgIds); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.delete(managerUri, condition); + } + + async deleteMessageByGroupIds(actionData) { + mmsLog.info(TAG + 'deleteMessage by group id, actionData :' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var groupIds = this.groupIdToString(actionData.groupIds); + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.in(mmsTable.messageInfo.groupId, groupIds); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.delete(managerUri, condition).then((data) => { + mmsLog.info(TAG + 'deleteMessageByGroupIds success! data = ' + data); + }).catch((err) => { + mmsLog.info(TAG + 'deleteMessageByGroupIds err = ' + err); + }); + } + + async deleteMessageBySessionIds(actionData) { + mmsLog.info(TAG + 'deleteMessageBySessionIds, threadIds :' + actionData.threadIds); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + let threadIds = []; + for (let id of actionData.threadIds) { + let threadId = id + common.string.EMPTY_STR; + threadIds.push(threadId); + } + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.in(mmsTable.messageInfo.sessionId, threadIds); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.delete(managerUri, condition).then((data) => { + mmsLog.info(TAG + 'deleteMessageBySessionIds success! data = ' + data); + }).catch((err) => { + mmsLog.info(TAG + 'deleteMessageBySessionIds err = ' + err); + }); + } + + async deleteMessageBySessionIdsAndLock(actionData) { + mmsLog.info(TAG + 'deleteMessageBySessionIdsAndLock, threadIds:' + actionData); + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper(common.string.URI_MESSAGE_LOG); + let threadIds = this.groupIdToString(actionData.threadIds); + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.equalTo(mmsTable.messageInfo.isLock, actionData.hasLock); + condition.in(mmsTable.messageInfo.sessionId, threadIds); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.delete(managerUri, condition).then((data) => { + mmsLog.info(TAG + 'deleteMessageBySessionIdsAndLock success! data = ' + data); + }).catch((err) => { + mmsLog.info(TAG + 'deleteMessageBySessionIdsAndLock err = ' + err); + }); + } + + async updateById(actionData, callback) { + mmsLog.info(TAG + 'updateById , actionData = ' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var msgId = actionData.msgId; + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.equalTo(mmsTable.messageInfo.msgId, msgId); + var stringValue = { + 'msg_state': actionData.sendStatus, + }; + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.update(managerUri, stringValue, condition).then((data) => { + mmsLog.info(TAG + 'updateById success! data = ' + data); + callback(super.encapsulateReturnCode(common.int.SUCCESS)); + }).catch((err) => { + mmsLog.info(TAG + 'updateById err = ' + err); + mmsLog.info(TAG + 'updateById err = ' + JSON.stringify(err)); + callback(super.encapsulateReturnCode(common.int.FAILURE)); + }); + } + + async markAllAsRead(actionData) { + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = featureAbility.acquireDataAbilityHelper(common.string.URI_MESSAGE_LOG); + let threadIds = []; + for (let id of actionData.threadIds) { + let threadId = id + common.string.EMPTY_STR; + threadIds.push(threadId); + } + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.in(mmsTable.messageInfo.sessionId, threadIds); + var stringValue = { + 'is_read': actionData.hasRead + }; + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.update(managerUri, stringValue, condition).then((data) => { + mmsLog.info(TAG + 'markAllAsRead success! data = ' + data); + }).catch((err) => { + mmsLog.info(TAG + 'markAllAsRead err = ' + err); + }); + } + + markAllToRead(actionData) { + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = featureAbility.acquireDataAbilityHelper(common.string.URI_MESSAGE_LOG); + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.equalTo(mmsTable.messageInfo.isRead, 0); + condition.equalTo(mmsTable.messageInfo.smsType, actionData.smsType); + var stringValue = { + 'is_read': actionData.hasRead + }; + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.update(managerUri, stringValue, condition).then((data) => { + mmsLog.info(TAG + 'markAllToRead success! data = ' + data); + }).catch((err) => { + mmsLog.info(TAG + 'markAllToRead err = ' + err); + }); + } + + async queryMaxGroupId(actionData, callback) { + mmsLog.info(TAG + 'queryMaxGroupId start:' + actionData); + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + let resultColumns = [ + 'maxGroupId' + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MAX_GROUP; + dataAbilityHelper.query(managerUri, resultColumns, condition, (err, resultSet) => { + let result = {}; + while (resultSet.goToNextRow()) { + result.maxGroupId = resultSet.getString(0); + mmsLog.info(TAG + 'queryMaxGroupId result = ' + result); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, result)); + }); + } + + saveImage(actionData, callback) { + var savedImageInfo = morkDataModel.saveImage(); + callback(super.encapsulateReturnResult(common.int.SUCCESS, savedImageInfo)); + } + + gotoShare(actionData, callback) { + callback(super.encapsulateReturnCode(common.int.SUCCESS)); + } + + queryFromGallery(actionData, callback) { + var pictureListFromGallery = morkDataModel.queryFromGallery(); + callback(super.encapsulateReturnResult(common.int.SUCCESS, pictureListFromGallery)); + } + + dealContractsTransmit(actionData, callback) { + callback(super.encapsulateReturnCode(common.int.SUCCESS)); + } + + async queryMessageThirty(actionData, callback) { + let timestamp = new Date().getTime(); + let lastTime = timestamp - 2592000000; + let ohosDataAbility = actionData.ohosDataAbility; + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + let resultColumns = [ + mmsTable.messageInfo.msgId, + mmsTable.messageInfo.sessionId + ]; + let condition = new ohosDataAbility.DataAbilityPredicates(); + condition.lessThan(mmsTable.messageInfo.endTime, lastTime); + condition.equalTo(mmsTable.messageInfo.smsType, actionData.numberType); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.query(managerUri, resultColumns, condition).then((resultSet) => { + let mmsList = []; + while (resultSet.goToNextRow()) { + let item = {}; + item.msgId = resultSet.getString(0); + item.sessionId = resultSet.getString(1); + mmsList.push(item); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, mmsList)); + }).catch((err) => { + mmsLog.info(TAG + 'queryMessageThirty err = ' + err); + callback(super.encapsulateReturnCode(common.int.FAILURE)); + }); + } + + statisticsUnreadNotify(actionData, callback) { + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = featureAbility.acquireDataAbilityHelper(common.string.URI_MESSAGE_LOG); + let ohosDataAbility = actionData.ohosDataAbility; + var condition = new ohosDataAbility.DataAbilityPredicates(); + condition.equalTo(mmsTable.messageInfo.isRead, 0); + condition.equalTo(mmsTable.messageInfo.smsType, 1); + let resultColumns = [ + mmsTable.messageInfo.msgId + ]; + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.query(managerUri, resultColumns, condition).then((resultSet) => { + let count = 0; + while (resultSet.goToNextRow()) { + count++; + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, count)); + }).catch((err) => { + mmsLog.info(TAG + 'statisticsUnreadNotify err = ' + err); + callback(super.encapsulateReturnCode(common.int.FAILURE)); + }); + } + + async searchMmsPartByContent(actionData, callback) { + mmsLog.info(TAG + 'searchMmsPartByContent param:' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + let ohosDataAbility = actionData.ohosDataAbility; + let resultColumns = this.buildMmsPartResultColumns(); + let condition = new ohosDataAbility.DataAbilityPredicates(); + condition.like(mmsTable.mmsPart.content, '%' + actionData.content + '%'); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MMS_PART; + dataAbilityHelper.query(managerUri, resultColumns, condition).then(resultSet => { + let resultList = this.dealMmsPartResult(resultSet); + callback(super.encapsulateReturnResult(common.int.SUCCESS, resultList)); + }).catch(error => { + mmsLog.info(TAG + 'searchMmsPartByContent error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } + + async queryMmsPart(actionData, callback) { + mmsLog.log(TAG + 'queryMmsPart param:' + actionData); + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var resultColumns = this.buildMmsPartResultColumns(); + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + condition.in(mmsTable.mmsPart.msgId, actionData.msgIds); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MMS_PART; + dataAbilityHelper.query(managerUri, resultColumns, condition).then(resultSet => { + let resultList = this.dealMmsPartResult(resultSet); + callback(super.encapsulateReturnResult(common.int.SUCCESS, resultList)); + }).catch(error => { + mmsLog.log(TAG + 'queryMmsPart error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } + + buildMmsPartResultColumns() { + let resultColumns = [ + mmsTable.mmsPart.msgId, + mmsTable.mmsPart.groupId, + mmsTable.mmsPart.type, + mmsTable.mmsPart.locationPath, + mmsTable.mmsPart.content, + mmsTable.mmsPart.recordingTime, + mmsTable.mmsPart.partSize, + mmsTable.mmsPart.state + ]; + return resultColumns; + } + + dealMmsPartResult(resultSet) { + let resultList = []; + while (resultSet.goToNextRow()) { + let result = {}; + result.msgId = resultSet.getString(0); + result.groupId = resultSet.getString(1); + result.type = resultSet.getString(2); + result.locationPath = resultSet.getString(3); + result.content = resultSet.getString(4); + result.recordingTime = resultSet.getString(5); + result.fileSize = resultSet.getString(6); + result.messageType = resultSet.getString(7); + resultList.push(result); + } + return resultList; + } + + async deleteMmsPartByGroupIds(actionData) { + mmsLog.info(TAG + 'deleteMmsPartByGroupIds by group id, actionData :' + actionData); + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + let groupIds = this.groupIdToString(actionData.groupIds); + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + condition.in(mmsTable.mmsPart.groupId, groupIds); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MMS_PART; + dataAbilityHelper.delete(managerUri, condition).then((data) => { + mmsLog.info(TAG + 'deleteMmsPartByGroupIds success! data = ' + data); + }).catch((err) => { + mmsLog.info(TAG + 'deleteMmsPartByGroupIds err = ' + err); + }); + } + + async batchInsertMmsPart(actionData, callback) { + for (let stringValue of actionData.bacthmsParts) { + this.insertMmsPart(actionData, stringValue, res => { + mmsLog.info(TAG + 'batchInsertMmsPart, res:' + JSON.stringify(res)); + }); + } + callback(super.encapsulateReturnCode(common.int.SUCCESS)); + } + + async insertMmsPart(actionData, stringValue, callback) { + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MMS_PART; + dataAbilityHelper.insert(managerUri, stringValue).then(data => { + mmsLog.info(TAG + 'insertMmsPart, success:' + data); + callback(super.encapsulateReturnResult(data, common.int.SUCCESS)); + }).catch(error => { + mmsLog.info(TAG + 'insertMmsPart fail:' + error); + callback(super.encapsulateReturnCode(common.int.FAILURE)); + }); + } + + async queryMessageLockBySessionId(actionData, callback) { + mmsLog.info(TAG + 'queryMessageLockBySessionId param:' + actionData); + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var resultColumns = [mmsTable.messageInfo.isLock]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let sessionId = actionData.threadId + common.string.EMPTY_STR; + condition.equalTo(mmsTable.messageInfo.sessionId, sessionId); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.query(managerUri, resultColumns, condition).then(resultSet => { + let lockStatus = []; + while (resultSet.goToNextRow()) { + let result = {}; + result.isLock = resultSet.getString(0); + lockStatus.push(result); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, lockStatus)); + }).catch(error => { + mmsLog.info(TAG + 'queryMessageLockBySessionId error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } + + async queryGroupIdBySessionId(actionData, callback) { + mmsLog.info(TAG + 'queryGroupIdBySessionId param:' + actionData); + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var resultColumns = [mmsTable.messageInfo.groupId]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let threadIds = this.groupIdToString(actionData.threadIds); + condition.in(mmsTable.messageInfo.sessionId, threadIds); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.query(managerUri, resultColumns, condition).then(resultSet => { + let groupIds = []; + resultSet.goToFirstRow(); + do { + let groupId = resultSet.getString(0); + groupIds.push(groupId); + } while (resultSet.goToNextRow()); + callback(super.encapsulateReturnResult(common.int.SUCCESS, groupIds)); + }).catch(error => { + mmsLog.info(TAG + 'queryGroupIdBySessionId error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/conversationListImpl/ConversationListModel.js b/entry/src/main/js/default/model/conversationListImpl/ConversationListModel.js new file mode 100644 index 0000000..058f0d5 --- /dev/null +++ b/entry/src/main/js/default/model/conversationListImpl/ConversationListModel.js @@ -0,0 +1,197 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BaseModel from '../BaseModel.js'; +import common from '../../pages/common_constants.js'; +import mmsTable from '../../pages/mms_table.js'; +import mmsLog from '../../utils/MmsLog.js'; + +const TAG = 'ConversationListModel ->'; + +export default class ConversationListModel extends BaseModel { + + async querySessionList(rdbStore, actionData) { + mmsLog.log(TAG + 'querySessionList,db,actionData:' + actionData); + let predicates = rdbStore.getRdbPredicates(common.tableName.SESSION); + let numberType = actionData.numberType; + if (numberType != null) { + await predicates.equalTo(mmsTable.sessionField.smsType, numberType); + } + await predicates.orderByDesc(mmsTable.sessionField.time); + await predicates.limitAs(actionData.limit); + let offset = (actionData.page - 1) * actionData.limit; + await predicates.offsetAs(offset); + let resultSet = await rdbStore.getRdbStore().query(predicates); + let sessionList = []; + while (resultSet.goToNextRow()) { + let item = await this.buildResultSet(resultSet); + sessionList.push(item); + } + let result = { + response: sessionList, + } + return result; + } + + async querySessionByTelephone(rdbStore, telephone) { + let predicates = rdbStore.getRdbPredicates(common.tableName.SESSION); + if (telephone) { + await predicates.equalTo(mmsTable.sessionField.telephone, telephone); + } + let resultSet = await rdbStore.getRdbStore().query(predicates); + resultSet.goToFirstRow(); + let result = await this.buildResultSet(resultSet); + return result; + } + + async querySessionById(rdbStore, threadId) { + let predicates = rdbStore.getRdbPredicates(common.tableName.SESSION); + if (threadId) { + await predicates.equalTo(mmsTable.sessionField.id, threadId); + } + let resultSet = await rdbStore.getRdbStore().query(predicates); + resultSet.goToFirstRow(); + let result = await this.buildResultSet(resultSet); + return result; + } + + async searchSessionByTelephone(rdbStore, telephone, numberType) { + let predicates = rdbStore.getRdbPredicates(common.tableName.SESSION); + if (telephone != common.string.EMPTY_STR) { + await predicates.like(mmsTable.sessionField.telephone, '%' + telephone + '%'); + } + if (numberType != null) { + await predicates.equalTo(mmsTable.sessionField.smsType, numberType); + } + let resultSet = await rdbStore.getRdbStore().query(predicates); + let sessionList = []; + while (resultSet.goToNextRow()) { + let item = await this.buildResultSet(resultSet); + sessionList.push(item); + } + return sessionList; + } + + async buildResultSet(resultSet) { + let result = {}; + result.id = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.id)); + result.time = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.time)); + result.hasDraft = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.hasDraft)); + result.smsType = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.smsType)); + result.telephone = await resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.telephone)); + result.content = await resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.content)); + result.contactsNum = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.contactsNum)); + result.unreadCount = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.unreadCount)); + result.messageCount = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.messageCount)); + result.hasMms = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.hasMms)); + result.sendingStatus = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.sendingStatus)); + result.hasAttachment = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.hasAttachment)); + result.hasLock = await resultSet.getLong(resultSet.getColumnIndex(mmsTable.sessionField.hasLock)); + result.telephoneFormat = result.telephone; + return result; + } + + async countSessionList(rdbStore, actionData) { + let predicates = rdbStore.getRdbPredicates(common.tableName.SESSION); + let numberType = actionData.numberType; + if (numberType != null) { + await predicates.equalTo(mmsTable.sessionField.smsType, numberType); + } + let resultSet = await rdbStore.getRdbStore().query(predicates); + let count = 0; + while (resultSet.goToNextRow()) { + count++; + } + let result = { + total: count, + } + return result; + } + + async statisticalData(actionData, callback) { + let featureAbility = actionData.featureAbility; + let dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + let resultColumns = [ + 'totalListCount', + 'unreadCount', + 'unreadTotalOfInfo' + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_UNREAD_COUNT; + dataAbilityHelper.query(managerUri, resultColumns, condition, (err, resultSet) => { + let result = {}; + while (resultSet.goToNextRow()) { + result.totalListCount = resultSet.getString(0); + result.unreadCount = resultSet.getString(1); + result.unreadTotalOfInfo = resultSet.getString(2); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, result)); + }); + } + + async markAllAsRead(rdbStore, threadIds, valueBucket) { + mmsLog.info(TAG + 'markAllAsReadById, threadIds:' + JSON.stringify(threadIds)); + this.updateById(rdbStore, threadIds, valueBucket); + } + + async markAllToRead(rdbStore, smsType) { + let predicates = rdbStore.getRdbPredicates(common.tableName.SESSION); + predicates.equalTo(mmsTable.sessionField.sms_type, smsType); + predicates.greaterThan(mmsTable.sessionField.unread_count, 0); + let valueBucket = { + 'unread_count': 0 + }; + rdbStore.update(predicates, valueBucket); + } + + async updateById(rdbStore, threadIds, valueBucket) { + if (threadIds.length != 0) { + for (let threadId of threadIds) { + let predicates = rdbStore.getRdbPredicates(common.tableName.SESSION); + await predicates.equalTo(mmsTable.sessionField.id, threadId); + rdbStore.update(predicates, valueBucket); + } + } + } + + async deleteMessageById(rdbStore, threadIds) { + mmsLog.info(TAG + 'deleteMessageById, threadIds:' + threadIds); + if (threadIds.length != 0) { + for (let threadId of threadIds) { + let predicates = rdbStore.getRdbPredicates(common.tableName.SESSION); + await predicates.equalTo(mmsTable.sessionField.id, threadId); + rdbStore.deleteItem(predicates); + } + } + } + + insertSession(rdbStore, tableName, valueBucket, callback) { + let insertPromise = rdbStore.insert(tableName, valueBucket); + let result = {}; + insertPromise.then((ret) => { + mmsLog.log(TAG + 'insertSession rowId:' + ret); + result.code = common.int.SUCCESS; + result.rowId = ret; + callback(result); + }).catch((err) => { + mmsLog.log(TAG + 'insertSession error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/groupDetailImpl/GroupDetailImplModel.js b/entry/src/main/js/default/model/groupDetailImpl/GroupDetailImplModel.js new file mode 100644 index 0000000..58a6529 --- /dev/null +++ b/entry/src/main/js/default/model/groupDetailImpl/GroupDetailImplModel.js @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BaseModel from '../BaseModel.js'; +import common from '../../pages/common_constants.js'; +import mmsTable from '../../pages/mms_table.js'; +import mmsLog from '../../utils/MmsLog.js'; + +const TAG = 'GroupDetailImplModel ->'; + +export default class GroupDetailImplModel extends BaseModel { + async queryGroupDetail(actionData, callback) { + mmsLog.info(TAG + 'queryGroupDetail param:' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var resultColumns = [ + mmsTable.messageInfo.msgId, + mmsTable.messageInfo.receiverNumber, + mmsTable.messageInfo.senderNumber, + mmsTable.messageInfo.startTime, + mmsTable.messageInfo.endTime, + mmsTable.messageInfo.msgType, + mmsTable.messageInfo.msgContent, + mmsTable.messageInfo.msgState + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + condition.equalTo(mmsTable.messageInfo.sessionId, actionData.threadId); + condition.equalTo(mmsTable.messageInfo.groupId, actionData.groupId); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.query(managerUri, resultColumns, condition).then(resultSet => { + let resultList = []; + while (resultSet.goToNextRow()) { + let result = {}; + result.msgId = resultSet.getString(0); + result.receiverNumber = resultSet.getString(1); + result.senderNumber = resultSet.getString(2); + result.startTime = resultSet.getString(3); + result.endTime = resultSet.getString(4); + result.msgType = resultSet.getString(5); + result.msgContent = resultSet.getString(6); + result.msgState = resultSet.getString(7); + resultList.push(result); + } + ; + callback(super.encapsulateReturnResult(common.int.SUCCESS, resultList)); + }).catch(error => { + mmsLog.info(TAG + 'queryGroupDetail error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/myStarImpl/MyStarImplModel.js b/entry/src/main/js/default/model/myStarImpl/MyStarImplModel.js new file mode 100644 index 0000000..02dbcbb --- /dev/null +++ b/entry/src/main/js/default/model/myStarImpl/MyStarImplModel.js @@ -0,0 +1,108 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BaseModel from '../BaseModel.js'; +import common from '../../pages/common_constants.js'; +// log 工具类 +import mmsLog from '../../utils/MmsLog.js'; +import mmsTable from '../../pages/mms_table.js'; + +const TAG = 'MyStarImplModel ->'; + +export default class MyStarImplModel extends BaseModel { + async queryFavoriteMessageList(actionData, callback) { + mmsLog.info(TAG + 'queryFavoriteMessageList param:' + actionData); + let featureAbility = actionData.featureAbility; + var dataHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var resultColumns = this.dealFavoriteResultColumns(); + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + condition.equalTo(mmsTable.messageInfo.isCollect, actionData.hasCollect); + condition.limitAs(actionData.limit); + let offset = (actionData.page - 1) * actionData.limit; + condition.offsetAs(offset); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataHelper.query(managerUri, resultColumns, condition).then(resultSet => { + let resultList = []; + while (resultSet.goToNextRow()) { + let result = {}; + result.msgId = resultSet.getString(0); + result.receiverNumber = resultSet.getString(1); + result.senderNumber = resultSet.getString(2); + result.startTime = resultSet.getString(3); + result.endTime = resultSet.getString(4); + result.msgType = resultSet.getString(5); + result.msgTitle = resultSet.getString(6); + result.msgContent = resultSet.getString(7); + result.isCollect = resultSet.getString(8); + result.sessionId = resultSet.getString(9); + result.groupId = resultSet.getString(10); + result.isSender = resultSet.getString(11); + resultList.push(result); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, resultList)); + }).catch(error => { + mmsLog.info(TAG + 'queryFavoriteMessageList error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } + + dealFavoriteResultColumns() { + var resultColumns = [ + mmsTable.messageInfo.msgId, + mmsTable.messageInfo.receiverNumber, + mmsTable.messageInfo.senderNumber, + mmsTable.messageInfo.startTime, + mmsTable.messageInfo.endTime, + mmsTable.messageInfo.msgType, + mmsTable.messageInfo.msgTitle, + mmsTable.messageInfo.msgContent, + mmsTable.messageInfo.isCollect, + mmsTable.messageInfo.sessionId, + mmsTable.messageInfo.groupId, + mmsTable.messageInfo.isSender + ]; + return resultColumns; + } + + async countFavoriteList(actionData, callback) { + mmsLog.info(TAG + 'countFavoriteList param:' + actionData); + let featureAbility = actionData.featureAbility; + var dataAbilityHelper = await featureAbility.getDataAbilityHelper( + common.string.URI_MESSAGE_LOG + ); + var resultColumns = [ + mmsTable.messageInfo.msgId, + ]; + let ohosDataAbility = actionData.ohosDataAbility; + let condition = new ohosDataAbility.DataAbilityPredicates(); + condition.equalTo(mmsTable.messageInfo.isCollect, actionData.hasCollect); + let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; + dataAbilityHelper.query(managerUri, resultColumns, condition).then(resultSet => { + let count = 0; + while (resultSet.goToNextRow()) { + let result = {}; + result.msgId = resultSet.getString(0); + count++; + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, count)); + }).catch(error => { + mmsLog.info(TAG + 'queryFavoriteMessageList error:' + error); + callback(super.encapsulateReturnResult(common.int.FAILURE)); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/model/settingsImpl/SettingsModel.js b/entry/src/main/js/default/model/settingsImpl/SettingsModel.js new file mode 100644 index 0000000..b67a6c0 --- /dev/null +++ b/entry/src/main/js/default/model/settingsImpl/SettingsModel.js @@ -0,0 +1,114 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BaseModel from '../BaseModel.js'; +import common from '../../pages/common_constants.js'; +import mmsLog from '../../../default/utils/MmsLog.js'; +import telephonySMS from '@ohos.telephony.sms'; + +const TAG = 'SettingModel.js->'; + +export default class SettingModel extends BaseModel { + setOnSettingValueListener(preferences, callback) { + let data = {}; + data.integrationSwitch = preferences.getValueOfIntegrationSwitch(); + data.maliciousWebSwitch = preferences.getValueOfMaliciousWebSwitch(); + data.showContactSwitch = preferences.getValueOfShowContactSwitch(); + mmsLog.info(TAG + 'setOnSettingValueListener(): data = ' + JSON.stringify(data)); + callback(data); + } + + getSettingValue(preferences, callback) { + let settingValues = {}; + settingValues.hasAggregate = preferences.getValueOfIntegrationSwitch(); + settingValues.isShowContactHeadIcon = preferences.getValueOfShowContactSwitch(); + settingValues.recallMessagesFlag = preferences.getValueOfRecallMessageSwitch(); + mmsLog.info(TAG + 'getSettingValue(): settingValues = ' + settingValues); + callback(super.encapsulateReturnResult(common.int.SUCCESS, settingValues)); + } + + getAdvancedPageSwitchValue(preferences, callback) { + let result = { + deliveryReportSwitch: false, + autoRetrieveMmsSwitch: false, + recallMessageSwitch: false, + autoDeleteInfoSwitch: false + }; + result.deliveryReportSwitch = preferences.getValueOfDeliveryReportSwitch(); + result.autoRetrieveMmsSwitch = preferences.getValueOfAutoRetrieveMmsSwitch(); + if (preferences.getValueOfRecallMessageSwitch() == common.bool.TRUE) { + result.recallMessageSwitch = true; + } + if (preferences.getValueOfAutoDeleteInfoSwitch() == common.bool.TRUE) { + result.autoDeleteInfoSwitch = true; + } + result.simCount = preferences.getCountOfSim(); + if (result.simCount == common.int.SIM_COUNT) { + result.firstSpnNameOfTwoSimCard = preferences.getSpnOfSim1(); + result.secondSpnNameOfTwoSimCard = preferences.getSpnOfSim2(); + } else { + if (preferences.getSim1ExistFlag() == common.bool.TRUE) { + result.spnNameOfOneSimCard = preferences.getSpnOfSim1(); + } else if (preferences.getSim2ExistFlag() == common.bool.TRUE) { + result.spnNameOfOneSimCard = preferences.getSpnOfSim2(); + } else { + result.spnNameOfOneSimCard = common.string.EMPTY_STR; + } + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, result)); + } + + updateSmscNumber(actionData, callback) { + let index = actionData.index - 1; + let newTelNum = actionData.number; + let preferences = actionData.preferences; + mmsLog.log(TAG + 'setSmscAddr actionData:' + actionData); + telephonySMS.setSmscAddr(index, newTelNum, (value) => { + mmsLog.log(TAG + 'setSmscAddr ,value :' + value); + // 如果是卡1 + if(index == common.int.SIM_ONE) { + preferences.setValueForSwitch(common.string.KEY_OF_NEW_SIM_0_SMSC, newTelNum); + } else if(index == common.int.SIM_TWO) { + preferences.setValueForSwitch(common.string.KEY_OF_NEW_SIM_1_SMSC, newTelNum); + } + callback(super.encapsulateReturnResult(common.int.SUCCESS, common.string.SUCCESS)); + }).catch((error) => { + mmsLog.info(TAG + 'setSmscAddr smsNumber: error = ' + error); + callback(super.encapsulateReturnCode(common.int.FAILURE)); + }); + } + + shareSmsEnterSelectedText(actionData, callback) { + // 分享API目前未提供 + callback(super.encapsulateReturnResult(common.int.SUCCESS, common.string.SUCCESS)); + } + + updateSwitchValue(prefer, keyOfSwitch, valueOfSwitch, callback) { + prefer.setValueForSwitch(keyOfSwitch, valueOfSwitch); + callback(super.encapsulateReturnResult(common.int.SUCCESS, common.string.SUCCESS)); + } + + restoreSwitchValueToDefault(preferences, callback) { + preferences.setValueForSwitch(common.string.KEY_OF_INTEGRATION_SWITCH, common.bool.TRUE); + preferences.setValueForSwitch(common.string.KEY_OF_MALICIOUS_WEB_SWITCH, common.bool.FALSE); + preferences.setValueForSwitch(common.string.KEY_OF_SHOW_CONTACT_SWITCH, common.bool.TRUE); + preferences.setValueForSwitch(common.string.KEY_OF_DELIVERY_REPORT_SWITCH, common.DELIVERY_REPORTS.DISABLED); + preferences.setValueForSwitch(common.string.KEY_OF_AUTO_RETRIEVE_SWITCH, + common.AUTO_RETRIEVE_MMS.NOT_WHEN_ROAMING); + preferences.setValueForSwitch(common.string.KEY_OF_RECALL_MESSAGE_SWITCH, common.bool.FALSE); + preferences.setValueForSwitch(common.string.KEY_OF_AUTO_DELETE_INFO_SWITCH, common.bool.FALSE); + callback(super.encapsulateReturnResult(common.int.SUCCESS, common.string.SUCCESS)); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/DateUtil.js b/entry/src/main/js/default/pages/DateUtil.js new file mode 100644 index 0000000..5d29591 --- /dev/null +++ b/entry/src/main/js/default/pages/DateUtil.js @@ -0,0 +1,359 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import common from '../pages/common_constants.js'; + +// 时间常量 +const ONE_MINUTE_IN_MILLISECOND = 60000; +const ONE_HOUR_IN_MILLISECOND = 3600000; + +export default { + + /** + * 将时间进行转化 + * @param messageItem 单个item + * @param is24HourTime 是否是24小时 + * @param that + * @return + */ + convertDateFormatForItem(messageItem, is24HourTime, that) { + let now = new Date(); + let currentDate = { + timeOfNow: now.getTime(), + yearOfNow: now.getFullYear(), + monthOfNow: now.getMonth() + 1, + dayOfNow: now.getDate() + }; + let timeMillisecond = messageItem.timeMillisecond; + messageItem.time = this.convertTimeStampToTime(timeMillisecond, currentDate, is24HourTime, that); + }, + + /** + * 把时间戳形式转换为时间形式 + * @param timeStampFromDb + * @param timeStampOfNow + * @param yearOfNow + * @param monthOfNow + * @param dayOfNow + * @param is24HourTime + * @param that + * @return + */ + convertTimeStampToTime(timeStampFromDb, currentDate, is24HourTime, that) { + let time = common.string.EMPTY_STR; + let sms = new Date(timeStampFromDb); + let timeStampOfSms = sms.getTime(); + let yearOfSms = sms.getFullYear(); + let monthOfSms = sms.getMonth() + 1; + let dayOfSms = sms.getDate(); + let hoursOfSms = sms.getHours(); + let minutesOfSms = sms.getMinutes(); + let diff = currentDate.timeOfNow - timeStampOfSms; + if (currentDate.yearOfNow == yearOfSms && currentDate.monthOfNow == monthOfSms + && currentDate.dayOfNow == dayOfSms) { + if (diff < ONE_MINUTE_IN_MILLISECOND) { + time = that.$t('strings.justNow'); + return time; + } else if (diff < ONE_HOUR_IN_MILLISECOND) { + time = that.$t('strings.minAgo', { + minute: Math.floor(diff / ONE_MINUTE_IN_MILLISECOND) + }); + return time; + } + } + let tempHoursOfSms = hoursOfSms; + if (hoursOfSms < 10) { + tempHoursOfSms = '0' + hoursOfSms; + } + if (minutesOfSms < 10) { + minutesOfSms = '0' + minutesOfSms; + } + if (is24HourTime) { + // 24小时制 + time = that.$t('strings.hourAndMinute', { + hour: tempHoursOfSms, + minute: minutesOfSms + }); + return time; + } + return this.timeTwelveHourSystem(hoursOfSms, minutesOfSms, tempHoursOfSms, that); + }, + timeTwelveHourSystem(hoursOfSms, minutesOfSms, tempHoursOfSms, that) { + let time = common.string.EMPTY_STR; + if (hoursOfSms <= 12) { + time = this.morningTimeTwelveHourSystem(hoursOfSms, minutesOfSms, tempHoursOfSms, that); + } else { + time = this.afterTimeTwelveHourSystem(hoursOfSms, minutesOfSms, tempHoursOfSms, that); + } + return time; + }, + morningTimeTwelveHourSystem(hoursOfSms, minutesOfSms, tempHoursOfSms, that) { + let time = common.string.EMPTY_STR; + // 12小时制 + if (hoursOfSms < 1) { + time = that.$t('strings.postMidnight', { + hour: 12, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 1 && hoursOfSms < 4) { + time = that.$t('strings.beforeDawn', { + hour: tempHoursOfSms, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 4 && hoursOfSms < 6) { + time = that.$t('strings.earlyMorning', { + hour: tempHoursOfSms, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 6 && hoursOfSms < 9) { + time = that.$t('strings.morning', { + hour: tempHoursOfSms, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 9 && hoursOfSms < 11) { + time = that.$t('strings.forenoon', { + hour: tempHoursOfSms, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 11 && hoursOfSms <= 12) { + time = that.$t('strings.preNoon', { + hour: hoursOfSms, + minute: minutesOfSms + }); + } + return time; + }, + afterTimeTwelveHourSystem(hoursOfSms, minutesOfSms, tempHoursOfSms, that) { + let time = common.string.EMPTY_STR; + if (hoursOfSms > 12 && hoursOfSms < 13) { + time = that.$t('strings.postNoon', { + hour: hoursOfSms, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 13 && hoursOfSms < 17) { + time = that.$t('strings.afternoon', { + hour: hoursOfSms - 12, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 17 && hoursOfSms < 19) { + time = that.$t('strings.towardEvening', { + hour: hoursOfSms - 12, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 19 && hoursOfSms < 23) { + time = that.$t('strings.evening', { + hour: hoursOfSms - 12, + minute: minutesOfSms + }); + } + if (hoursOfSms >= 23) { + time = that.$t('strings.preMidnight', { + hour: hoursOfSms - 12, + minute: minutesOfSms + }); + } + return time; + }, + + /** + * 将时间进行转化 + * @param messageItem 单个item + * @param is24HourTime 是否是24小时 + * @param that + * @return + */ + convertTimeStampToDateWeek(messageItem, is24HourTime, that) { + let now = new Date(); + let yearOfNow = now.getFullYear(); + let monthOfNow = now.getMonth() + 1; + let dayOfNow = now.getDate(); + let timeMillisecond = messageItem.timeMillisecond; + messageItem.date = this.convertTimeStampToDate(timeMillisecond, yearOfNow, monthOfNow, dayOfNow, that); + }, + + /** + * 把时间戳形式转换为日期形式 + */ + convertTimeStampToDate(timeStampFromDb, yearOfNow, monthOfNow, dayOfNow, that) { + let date = common.string.EMPTY_STR; + let sms = new Date(timeStampFromDb); + let yearOfSms = sms.getFullYear(); + let monthOfSms = sms.getMonth() + 1; + let dayOfSms = sms.getDate(); + let weekOfSms = sms.getDay(); + if (yearOfNow == yearOfSms && monthOfNow == monthOfSms && dayOfNow == dayOfSms) { + date = that.$t('strings.recentDate', { + recent: that.$t('strings.today'), + week: this.getWeek(weekOfSms, that) + }); + } else if (yearOfNow == yearOfSms && monthOfNow == monthOfSms && dayOfNow - dayOfSms == 1) { + date = that.$t('strings.recentDate', { + recent: that.$t('strings.yesterday'), + week: this.getWeek(weekOfSms, that) + }); + } else if (yearOfNow == yearOfSms) { + date = that.$t('strings.monthDayDate', { + month: this.getMonth(monthOfSms, that), + day: dayOfSms, + week: this.getWeek(weekOfSms, that) + }); + } else { + date = that.$t('strings.yearMonthDayDate', { + year: yearOfSms, + month: this.getMonth(monthOfSms, that), + day: dayOfSms, + week: this.getWeek(weekOfSms, that) + }); + } + return date; + }, + + /** + * 获取星期/周几 + * @param day + * @param that + * @return + */ + getWeek(day, that) { + let week = common.string.EMPTY_STR; + switch (day) { + case 0: + week = that.$t('strings.Sunday'); + break; + case 1: + week = that.$t('strings.Monday'); + break; + case 2: + week = that.$t('strings.Tuesday'); + break; + case 3: + week = that.$t('strings.Wednesday'); + break; + case 4: + week = that.$t('strings.Thursday'); + break; + case 5: + week = that.$t('strings.Friday'); + break; + case 6: + week = that.$t('strings.Saturday'); + break; + + } + return week; + }, + + /** + * 获取月份 + * @param mon + * @param that + * @return + */ + getMonth(mon, that) { + let month = common.string.EMPTY_STR; + switch (mon) { + case 1: + month = that.$t('strings.january'); + break; + case 2: + month = that.$t('strings.february'); + break; + case 3: + month = that.$t('strings.march'); + break; + case 4: + month = that.$t('strings.april'); + break; + case 5: + month = that.$t('strings.may'); + break; + case 6: + month = that.$t('strings.june'); + break; + case 7: + month = that.$t('strings.july'); + break; + case 8: + month = that.$t('strings.august'); + break; + case 9: + month = that.$t('strings.september'); + break; + case 10: + month = that.$t('strings.october'); + break; + case 11: + month = that.$t('strings.november'); + break; + case 12: + month = that.$t('strings.december'); + break; + } + return month; + }, + + convertTimeStampDate(timeStampFromDb, that) { + let date = common.string.EMPTY_STR; + let sms = new Date(timeStampFromDb); + let yearOfSms = sms.getFullYear(); + let monthOfSms = sms.getMonth() + 1; + let dayOfSms = sms.getDate(); + date = that.$t('strings.yearMonthDayDate', { + year: yearOfSms, + month: this.getMonth(monthOfSms, that), + day: dayOfSms, + }); + let time = this.convertTimeStampTime(timeStampFromDb, false, that); + return date + ' ' + time; + }, + + /** + * + * @param timeStampFromDb + * @param is24HourTime + * @param that + * @return + */ + convertTimeStampTime(timeStampFromDb, is24HourTime, that) { + let timeStr = common.string.EMPTY_STR; + let sms = new Date(timeStampFromDb); + let hoursOfSms = sms.getHours(); + let minutesOfSms = sms.getMinutes(); + let tempHoursOfSms = hoursOfSms; + if (minutesOfSms < 10) { + minutesOfSms = '0' + minutesOfSms; + } + if (hoursOfSms < 10) { + tempHoursOfSms = '0' + hoursOfSms; + } + if (is24HourTime) { + // 24小时制 + timeStr = that.$t('strings.hourAndMinute', { + hour: tempHoursOfSms, + minute: minutesOfSms + }); + return timeStr; + } + return this.timeTwelveHourSystem(hoursOfSms, minutesOfSms, tempHoursOfSms, that); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/advanced_settings/advanced_settings.css b/entry/src/main/js/default/pages/advanced_settings/advanced_settings.css new file mode 100644 index 0000000..757b239 --- /dev/null +++ b/entry/src/main/js/default/pages/advanced_settings/advanced_settings.css @@ -0,0 +1,327 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.advanced { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + align-items: center;/*flex容器当前行的交叉轴对齐格式 元素在交叉轴居中*/ + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #fff; +} + +/*高级标题栏*/ +.advanced-bar { + align-items: center; + width: 100%; + height: 120px; + padding-left: 50px; + padding-right: 50px; + display: flex; +} + +/*返回按钮*/ +.advanced-bar-back { + width: 40px; + height: 40px; +} + +/*高级字体*/ +.advanced-bar-set { + margin-left: 30px; + font-size: 40px; + flex: 1; +} + +/*还原按钮*/ +.advanced-bar-restore { + width: 48px; + height: 48px; + text-align: right; +} + +.popup { + width: 300px; + height: 100px; + background-color: #F2F0F8FF; + border-style: solid; +} + +.dialog { + width: 680px; + height: 240px; +} + +.setting-bar-restore-dialog { + flex-direction: column; + align-items: center; +} + +.setting-bar-text { + margin-left: 120px; +} + +.setting-bar-button { + width: 500px; + height: 120px; + justify-content: space-around; + align-items: center; + margin-top: 20px; +} + +.button-choose { + width: 50%; + height: 100%; + background-color: #fff; + text-color: #007DFF; +} + +.btn-restore { + width: 200px; + height: 100px; + background-color: #f0f8ff; + text-color: #000; +} + +.setting-vertical-divider { + color: #ff0000ff; + width: 2px; + height: 80px; +} + +/*送达报告*/ +.advanced-delivery-report { + width: 100%; + height: 120px; + padding-left: 50px; + padding-right: 50px; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.advanced-download-restore-dialog { + flex-direction: column; + padding-left: 50px; + padding-right: 50px; +} + +.screen-height { + margin-bottom: 120px; +} + +.no-screen-height { + margin-bottom: 20px; +} + +.advanced-download-text { + height: 100px; + width: 100%; + margin-top: 20px; +} + +.advanced-download-text-reports { + font-size: 40px; + font-weight: 500; +} + +.advanced-download-choose { + flex-direction: column; +} + +.advanced-download-choose-sms { + height: 100px; + width: 100%; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.advanced-download-transverse-divider { + color: grey; + stroke-width: 2px; +} + +.advanced-download-vertical-divider { + color: #585858; + height: 60px; +} + +.advanced-download-button { + height: 120px; + width: 100%; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +/*消息整合左侧列表*/ +.delivery-report-left { + flex-direction: column; + align-items: flex-start; + justify-content: space-evenly; + width: 60%; +} + +.delivery-report-right { + width: 40%; + flex-direction: row; + align-items: center; + justify-content: flex-end; +} + +/*自动下载短信*/ + +.advanced-download { + width: 100%; + height: 100px; + padding-left: 50px; + padding-right: 50px; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.advanced-left { + width: 60%; + align-items: center; +} + +.recall-msg-left { + width: 90%; + flex-direction: column; + align-items: flex-start; + justify-content: space-evenly; +} + +/*自动下载短信title*/ +.advanced-download-type { + margin-right: 26px; +} + +.auto-retrieve-mms { + flex-direction: column; + padding-left: 50px; + padding-right: 30px; +} + +.auto-retrieve-left { + height: 120px; + width: 100%; + align-items: center; +} +.auto-retrieve-left-text { + font-size: 40px; + font-weight: 500; +} + +.auto-retrieve-center-between { + height: 100px; + width: 100%; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.auto-retrieve-center-between-image { + width: 40px; + height: 40px; +} + +.auto-retrieve-center { + height: 100px; + width: 100%; + align-items: center; + justify-content: center; +} + +.grey-divider { + color: grey; + stroke-width: 2px; +} + +/*高级标题通用字体*/ +.setting-title-typeface { + font-size: 30px; +} + +/*整合文字2*/ +.msg-integration-text2 { + font-size: 21px; + color: #848484; +} +.advanced-right-button { + width: 80px; + height: 100px; + align-items: center; +} +/*整合按钮*/ +.msg-integration-button { + width: 80px; + height: 100px; + line-height: 120px; + margin-left: 20px; +} + +/*下划线*/ +.setting-underline { + width: 100%; + height: 2px; + background-color: #e6e6fa; + margin-left: 50px; + margin-right: 50px; +} + +/*分割线*/ +.setting-underlines { + width: 100%; + height: 10px; + background-color: #F2F2F2; +} + +/*信息铃声*/ +.setting-msg-voice { + width: 100%; + height: 100px; + padding-left: 50px; + padding-right: 50px; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +/*铃声更多箭头*/ +.setting-msg-voice-more { + width: 30px; + height: 30px; +} + +.setting-style { + margin-right: 20px; +} + +/*送达报告弹窗*/ +.dialog-delivery-repor { + width: 100px; + background-color: cadetblue; + flex-direction: column; +} + +/*短信DIV*/ +.dialog-delivery-mms { + width: 100%; + +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/advanced_settings/advanced_settings.hml b/entry/src/main/js/default/pages/advanced_settings/advanced_settings.hml new file mode 100644 index 0000000..5be0e00 --- /dev/null +++ b/entry/src/main/js/default/pages/advanced_settings/advanced_settings.hml @@ -0,0 +1,241 @@ + + +
+ + +
+ + + + + + {{ $t('strings.advanced') }} + + +
+ + + + + +
+ + +
+ {{ $t('strings.delivery_reports') }} + {{ $t('strings.delivery_reports_hint') }} +
+
+ + {{ deliveryReportSwitchInText }} + +
+ + + +
+ + +
+ {{ $t('strings.delivery_reports') }} +
+
+ + +
+ {{ $t('strings.sms') }} + +
+ + + + + +
+ {{ $t('strings.mms') }} + +
+
+
+ + + + + + + + + +
+
+
+
+ + + + + +
+
+ {{ $t('strings.auto_retrieve_mms') }} +
+
+ {{ autoRetrieveMmsSwitchInText }} + +
+ + + +
+ + +
+ {{ $t('strings.auto_retrieve_mms') }} +
+ + +
+
+ {{ $t('strings.always') }} + {{ $t('strings.roaming_fees_may_apply') }} + +
+ +
+ + + +
+ {{ $t('strings.not_when_roaming') }} + +
+ + + +
+ {{ $t('strings.off') }} + +
+ + +
+ {{ $t('strings.cancel') }} +
+
+
+
+ + + + + +
+ + +
+ {{ $t('strings.recall_messages') }} + {{ $t('strings.recall_messages_hint') }} +
+ + +
+ + +
+
+ + + + + +
+ + +
+ {{ $t('strings.auto_delete_info_messages') }} + {{ $t('strings.auto_delete_info_messages_hint') }} +
+ + +
+ + +
+
+ + + + + + +
+ + {{ $t('strings.sms_center') }} + +
+ + +
+ + +
+ {{ $t('strings.sim') }} 1 {{ $t('strings.sms_center') }} + +
+ + +
+ {{ $t('strings.sim') }} 2 {{ $t('strings.sms_center') }} + +
+
+ + + + + +
+ + {{ $t('strings.manage_sim_card_messages') }} + +
+
+ + +
+ {{ $t('strings.manage') }} 1 {{ $t('strings.messages') }} + +
+ + +
+ {{ $t('strings.manage') }} 2 {{ $t('strings.messages') }} + +
+
+
diff --git a/entry/src/main/js/default/pages/advanced_settings/advanced_settings.js b/entry/src/main/js/default/pages/advanced_settings/advanced_settings.js new file mode 100644 index 0000000..9b92c84 --- /dev/null +++ b/entry/src/main/js/default/pages/advanced_settings/advanced_settings.js @@ -0,0 +1,339 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +import prompt from '@system.prompt'; +import settingService from '../../service/SettingService.js' +import common from '../common_constants.js'; + +const TAG = 'JS->advanced_settings.js->'; + +export default { + data: { + // 送达报告短信 + checkedValueOfSms: null, + // 送达报告彩信 + checkedValueOfMms: null, + // 送达报告开关的值 + deliveryReportSwitch: null, + // 送达报告文本 + deliveryReportSwitchInText: null, + // 自动下载彩信开关 + autoRetrieveMmsSwitch: null, + // 自动下载彩信开关文本 + autoRetrieveMmsSwitchInText: null, + // 取消发送开关 + recallMessageSwitch: null, + // 自动删除通知信息开关 + autoDeleteInfoSwitch: null, + // 自动删除通知信息开关,临时变量 + tempAutoDeleteInfoSwitch: null, + // 中国电信 + snpNameOfChinaTelecom: common.SPN_CHINA.TELECOM, + // sim卡的数量 + simCount: null, + // 如果是1张卡,运营商的名字 + spnNameOfOneSimCard: null, + // 如果是2张卡,卡1运营商的名字 + firstSpnNameOfTwoSimCard: null, + // 如果是2张卡,卡2运营商的名字 + secondSpnNameOfTwoSimCard: null + }, + onInit() { + mmsLog.info(TAG + 'onInit(): start'); + }, + onShow() { + this.getAdvancedPageSwitchValue(); + }, + getAdvancedPageSwitchValue() { + mmsLog.info(TAG + 'initializeAdvancedPage(): start'); + let that = this; + let preferences = this.$app.$def.preferences; + settingService.getAdvancedPageSwitchValue(preferences, function (result) { + mmsLog.info(TAG + 'getAdvancedPageSwitchValue(): success' + result); + if (result.code === common.int.SUCCESS) { + mmsLog.info(TAG + 'getAdvancedPageSwitchValue(): success'); + let switchValue = result.abilityResult; + that.deliveryReportSwitch = switchValue.deliveryReportSwitch; + that.returnDeliveryReportResultInText(that.deliveryReportSwitch); + that.autoRetrieveMmsSwitch = switchValue.autoRetrieveMmsSwitch; + that.returnAutoRetrieveMmsResultInText(that.autoRetrieveMmsSwitch); + that.recallMessageSwitch = switchValue.recallMessageSwitch; + that.autoDeleteInfoSwitch = switchValue.autoDeleteInfoSwitch; + that.tempAutoDeleteInfoSwitch = that.autoDeleteInfoSwitch; + // 等sim卡功能好,需要换成 switchValue.simCount; + that.simCount = switchValue.simCount; + if (that.simCount === 2) { + that.firstSpnNameOfTwoSimCard = switchValue.firstSpnNameOfTwoSimCard; + that.secondSpnNameOfTwoSimCard = switchValue.secondSpnNameOfTwoSimCard; + } else { + that.spnNameOfOneSimCard = switchValue.spnNameOfOneSimCard; + } + } else { + mmsLog.info(TAG + 'getAdvancedPageSwitchValue(): fail'); + } + }); + }, + // 根据整数值返回文本版的送达报告结果 + returnDeliveryReportResultInText(intValue) { + let tempValue = common.string.EMPTY_STR; + if (intValue == common.DELIVERY_REPORTS.DISABLED) { + tempValue = this.$t('strings.disabled'); + this.checkedValueOfSms = false; + this.checkedValueOfMms = false; + } else if (intValue == common.DELIVERY_REPORTS.SMS) { + tempValue = this.$t('strings.sms'); + this.checkedValueOfSms = true; + this.checkedValueOfMms = false; + } else if (intValue == common.DELIVERY_REPORTS.MMS) { + tempValue = this.$t('strings.mms'); + this.checkedValueOfSms = false; + this.checkedValueOfMms = true; + } else { + tempValue = this.$t('strings.sms_and_mms'); + this.checkedValueOfSms = true; + this.checkedValueOfMms = true; + } + this.deliveryReportSwitchInText = tempValue; + }, + // 根据整数值返回文本版的送达报告结果 + returnAutoRetrieveMmsResultInText(intValue) { + let tempValue = common.string.EMPTY_STR; + if (intValue == common.AUTO_RETRIEVE_MMS.OFF) { + tempValue = this.$t('strings.off'); + } else if (intValue == common.AUTO_RETRIEVE_MMS.NOT_WHEN_ROAMING) { + tempValue = this.$t('strings.not_when_roaming'); + } else { + tempValue = this.$t('strings.always'); + } + this.autoRetrieveMmsSwitchInText = tempValue; + }, + // 返回按键 + back() { + router.back(); + }, + // 展示还原配置的弹框 + showDialog() { + let that = this; + prompt.showDialog({ + message: this.$t('strings.restore_all_default_settings'), + buttons: [ + { + text: this.$t('strings.cancel'), + color: '#007DFF' + }, + { + text: this.$t('strings.restore'), + color: '#007DFF' + } + ], + success: function (data) { + mmsLog.info(TAG + 'showDialog->success: index = ' + data.index); + if (data.index == 1) { + // 还原 + that.restoreSettingPageSwitchValue(); + } + }, + cancel: function () { + mmsLog.info(TAG + 'showDialog->cancel: dialog cancel callback'); + } + }); + }, + // 还原设置页面的默认值 + restoreSettingPageSwitchValue() { + let that = this; + let preferences = this.$app.$def.preferences; + settingService.restoreSwitchValue(preferences, function (result) { + if (result.code === common.int.SUCCESS) { + that.deliveryReportSwitch = common.DELIVERY_REPORTS.DISABLED; + that.returnDeliveryReportResultInText(common.DELIVERY_REPORTS.DISABLED); + that.autoRetrieveMmsSwitch = common.AUTO_RETRIEVE_MMS.NOT_WHEN_ROAMING; + that.returnAutoRetrieveMmsResultInText(common.AUTO_RETRIEVE_MMS.NOT_WHEN_ROAMING); + that.recallMessageSwitch = common.bool.FALSE; + that.autoDeleteInfoSwitch = common.bool.FALSE; + that.tempAutoDeleteInfoSwitch = common.bool.FALSE; + mmsLog.info(TAG + 'restoreSettingPageSwitchValue(): success'); + } else { + mmsLog.info(TAG + 'restoreSettingPageSwitchValue(): fail'); + } + }); + }, + // 显示'送达报告'dialog + showDeliveryReport() { + this.$element('delivery-report-dialog').show(); + }, + // 点击短信那行 + clickSmsDiv() { + this.checkedValueOfSms = !this.checkedValueOfSms; + }, + // 点击短信那行的checkbox + clickSmsCheckbox(e) { + this.checkedValueOfSms = e.checked; + }, + // 点击彩信那行 + clickMmsDiv() { + this.checkedValueOfMms = !this.checkedValueOfMms; + }, + // 点击彩信那行的checkbox + clickMmsCheckbox(e) { + this.checkedValueOfMms = e.checked; + }, + // 取消还原配置的弹框 + cancelRestore() { + this.returnDeliveryReportResultInText(this.deliveryReportSwitch); + this.$element('delivery-report-dialog').close(); + }, + // 送达报告dialog,确定 + setRestore() { + this.deliveryReportSwitch = common.string.EMPTY_STR; + if (this.checkedValueOfSms && this.checkedValueOfMms) { + this.deliveryReportSwitch = common.DELIVERY_REPORTS.SMS_AND_MMS; + } else if(this.checkedValueOfSms) { + this.deliveryReportSwitch = common.DELIVERY_REPORTS.SMS; + } else if(this.checkedValueOfMms) { + this.deliveryReportSwitch = common.DELIVERY_REPORTS.MMS; + } else { + this.deliveryReportSwitch = common.DELIVERY_REPORTS.DISABLED; + } + this.returnDeliveryReportResultInText(this.deliveryReportSwitch); + this.$element('delivery-report-dialog').close(); + this.autoHandleDeliveryReportValueChange(this.deliveryReportSwitch); + }, + // 当deliveryReportSwitch开关的值变化时,由该方法处理 + autoHandleDeliveryReportValueChange(newValue) { + mmsLog.info(TAG + 'autoHandleDeliveryReportValueChange(): newV = ' + newValue); + let messageCode = common.route.MESSAGE_CODE_UPDATE_DELIVERY_REPORTS_VALUE; + let actionData = {}; + actionData.intValue = newValue; + actionData.preferences = this.$app.$def.preferences; + this.updateAdvancedPageSwitchValue(messageCode, actionData); + }, + // 显示'自动下载彩信'dialog + showAutoRetrieveMmsDialog() { + this.$element('auto-retrieve-mms-dialog').show(); + }, + // 点击'自动下载彩信'dialog内相应的选项 + clickDiv(idx) { + this.autoRetrieveMmsSwitch = idx + common.string.EMPTY_STR; + this.returnAutoRetrieveMmsResultInText(idx); + this.$element('auto-retrieve-mms-dialog').close(); + this.autoHandleAutoRetrieveMmsValueChange(this.autoRetrieveMmsSwitch); + }, + // 关闭'自动下载彩信'dialog + closeAutoRetrieveMmsDialog() { + this.$element('auto-retrieve-mms-dialog').close(); + }, + // 当autoRetrieveMmsSwitch开关的值变化时,由该方法处理 + autoHandleAutoRetrieveMmsValueChange(newValue) { + mmsLog.info(TAG + 'autoHandleAutoRetrieveMmsValueChange(): newV = ' + newValue); + let messageCode = common.route.MESSAGE_CODE_UPDATE_AUTO_RETRIEVE_MMS_VALUE; + let actionData = {}; + actionData.intValue = newValue; + actionData.preferences = this.$app.$def.preferences; + this.updateAdvancedPageSwitchValue(messageCode, actionData); + }, + // 取消发送 + recallMsg(e) { + let messageCode = common.route.MESSAGE_CODE_UPDATE_RECALL_MESSAGES_VALUE; + let actionData = {}; + this.recallMessageSwitch = e.checked; + actionData.preferences = this.$app.$def.preferences; + if (this.recallMessageSwitch) { + actionData.booleanValue = common.bool.TRUE; + } else { + actionData.booleanValue = common.bool.FALSE; + } + this.updateAdvancedPageSwitchValue(messageCode, actionData); + }, + // 自动删除通知信息 + autoDeleteInfo(e) { + let that = this; + this.tempAutoDeleteInfoSwitch = e.checked; + if (e.checked) { + prompt.showDialog({ + title: that.$t('strings.enable_auto_delete'), + message: that.$t('strings.enable_auto_delete_hint'), + buttons: [ + {text: that.$t('strings.cancel'), color: '#007DFF'}, + {text: that.$t('strings.enable'), color: '#007DFF'} + ], + success: function (data) { + that.autoDeleteSuccess(data); + }, + cancel: function () { + mmsLog.info(TAG + 'autoDeleteInfo(): cancel: dialog cancel callback'); + that.tempAutoDeleteInfoSwitch = false; + that.autoDeleteInfoSwitch = false; + } + }); + } else { + that.autoDeleteInfoSwitch = false; + that.autoHandleAutoDeleteInfoValueChange(common.bool.FALSE); + } + }, + autoDeleteSuccess(data) { + if (data.index == 0) { + this.tempAutoDeleteInfoSwitch = false; + } else { + this.autoDeleteInfoSwitch = true; + this.autoHandleAutoDeleteInfoValueChange(common.bool.TRUE); + } + }, + // 当autoDeleteInfoSwitch开关的值变化时,由该方法处理 + autoHandleAutoDeleteInfoValueChange(newValue) { + mmsLog.info(TAG + 'autoHandleAutoDeleteInfoValueChange(): newV = ' + newValue); + let messageCode = common.route.MESSAGE_CODE_UPDATE_AUTO_DELETE_INFO_MESSAGES_VALUE; + let actionData = {}; + actionData.preferences = this.$app.$def.preferences; + actionData.booleanValue = newValue; + this.updateAdvancedPageSwitchValue(messageCode, actionData); + }, + // 跳转至'短信中心'页面 + jumpToSmsCenterPage(index) { + if (this.simCount == 0) { + return; + } + router.push({ + uri: 'pages/sms_center/sms_center', + params: { + idx: index, + countOfSim: this.simCount + } + }); + }, + // 跳转至'管理Sim卡'页面 + jumpToManageSimPage(index) { + if (this.simCount == 0) { + return; + } + router.push({ + uri: 'pages/manage_sim/manage_sim', + params: { + idx: index, + countOfSim: this.simCount + } + }); + }, + // 更新开关值 + updateAdvancedPageSwitchValue(messageCode, actionData) { + settingService.updateSettingValue(messageCode, actionData, function (result) { + if (result.code == common.int.SUCCESS) { + mmsLog.info(TAG + 'updateAdvancedPageSwitchValue(): success'); + } else { + mmsLog.info(TAG + 'updateAdvancedPageSwitchValue(): fail'); + } + }); + } +} diff --git a/entry/src/main/js/default/pages/common_constants.js b/entry/src/main/js/default/pages/common_constants.js new file mode 100644 index 0000000..ed11636 --- /dev/null +++ b/entry/src/main/js/default/pages/common_constants.js @@ -0,0 +1,289 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default { + bool: { + TRUE: '1', + FALSE: '0', + }, + route: { + // 更新送达报告开关的值 + MESSAGE_CODE_UPDATE_DELIVERY_REPORTS_VALUE: 32001, + // 更新自动下载彩信开关的值 + MESSAGE_CODE_UPDATE_AUTO_RETRIEVE_MMS_VALUE: 32002, + // 更新取消发送开关的值 + MESSAGE_CODE_UPDATE_RECALL_MESSAGES_VALUE: 32003, + // 更新自动删除通知信息开关的值 + MESSAGE_CODE_UPDATE_AUTO_DELETE_INFO_MESSAGES_VALUE: 32004, + // 更新通知信息整合开关的值 + MESSAGE_CODE_UPDATE_ARCHIVE_INFO_MESSAGES_VALUE: 30002, + // 更新恶意网址识别开关的值 + MESSAGE_CODE_UPDATE_MALICIOUS_WEBSITE_IDENTIFICATION_VALUE: 30003, + // 更新显示联系人头像开关的值 + MESSAGE_CODE_UPDATE_SHOW_CONTACT_PROFILE_PICS_VALUE: 30004, + // 还原高级页面开关的值 + MESSAGE_CODE_RESTORE_ADVANCED_PAGE_SWITCH_VALUE: 30005 + }, + int: { + // status code + SUCCESS: 0, + FAILURE: -1, + // CheckBox select status code 1 全选 2.全不选 3.未知 + CHECKBOX_SELECT_ALL: 1, + // 全不选 + CHECKBOX_SELECT_NONE: 2, + // 未知 + CHECKBOX_SELECT_UNKNOWN: 3, + MESSAGE_CODE_TWENTY_FIVE: 60, + MESSAGE_CODE_THREE_FOUR_ZERO: 660, + // 文本 + TYPE_TEXT: 0, + // 图片 + TYPE_IMAGE: 1, + // 音频 + TYPE_AUDIO: 2, + // 视频 + TYPE_VIDEO: 3, + // 0 + MESSAGE_CODE_ZERO: 0, + // 1 + MESSAGE_CODE_ONE: 1, + // 2 + MESSAGE_CODE_TWO: 2, + // 300 + MESSAGE_CODE_THREE_ZERO_ZERO: 300, + // 1000 + MESSAGE_CODE_THOUSAND: 1000, + // 发送短信成功 + SEND_MESSAGE_SUCCESS: 0, + // 正在发送中 + SEND_MESSAGE_SENDING: 1, + // 发送短信失败 + SEND_MESSAGE_FAILED: 2, + // 草稿数据类型 + SEND_DRAFT: 3, + // 列表左移滑动操作控件的宽度 + OPERATE_DELETE_WIDTH: 145, + OPERATE_UNREAD_WIDTH: 230, + // sim卡数量 + SIM_COUNT: 2, + // sim卡1 + SIM_ONE: 0, + // sim卡2 + SIM_TWO: 1, + // 550默认高度 + TAB_HEIGHT: 550, + // 550+720tab全屏高度 + FULL_HEIGHT: 550 + 720, + // 取消短信倒计时 + CANCEL_TIME_COUNT: 6, + // 全屏的字数 + FULL_SCREEN_SEND_LENGTH: 38, + }, + string: { + SMS_TYPE: '0', + // 空字符串 + EMPTY_STR: '', + // 逗号 + COMMA: ',', + // 分号 + SEMICOLON: ';', + // bundleName + BUNDLE_NAME: 'com.ohos.mms', + // abilityName + ABILITY_NAME: 'com.ohos.mms.MainAbility', + // 联系人的bundleName + CONTRACT_BUNDLE_NAME: 'com.ohos.contacts', + // 联系人AbilityName + CONTRACT_ABILITY_NAME: 'com.ohos.contacts.MainAbility', + // 公用的entity + COMMON_ENTITIES: 'entity.system.home', + // 处理成功 + SUCCESS: 'success', + // 轻量级偏好数据库的存储路径 + PATH_OF_PREFERENCES: '/PREFERENCES_FOR_MMS', + // 通知信息整合 + KEY_OF_INTEGRATION_SWITCH: 'integrationSwitch', + // 恶意网址识别 + KEY_OF_MALICIOUS_WEB_SWITCH: 'maliciousWebSwitch', + // 显示联系人头像 + KEY_OF_SHOW_CONTACT_SWITCH: 'showContactSwitch', + // 送达报告 + KEY_OF_DELIVERY_REPORT_SWITCH: 'deliveryReportSwitch', + // 自动下载彩信 + KEY_OF_AUTO_RETRIEVE_SWITCH: 'autoRetrieveMmsSwitch', + // 取消发送 + KEY_OF_RECALL_MESSAGE_SWITCH: 'recallMessageSwitch', + // 自动删除通知信息 + KEY_OF_AUTO_DELETE_INFO_SWITCH: 'autoDeleteInfoSwitch', + // sim卡的个数 + KEY_OF_SIM_COUNT: 'simCount', + // sim卡1的运营商名称 + KEY_OF_SIM_0_SPN: 'simSpn0', + // sim卡2的运营商名称 + KEY_OF_SIM_1_SPN: 'simSpn1', + // sim卡1是否存在 + KEY_OF_SIM_0_EXIST_FLAG: 'simExistFlag0', + // sim卡2是否存在 + KEY_OF_SIM_1_EXIST_FLAG: 'simExistFlag1', + // 如果sim卡1的短信中心号码被修改过,新的短信中心号码 + KEY_OF_NEW_SIM_0_SMSC: 'newSimSmsc0', + // 如果sim卡2的短信中心号码被修改过,新的短信中心号码 + KEY_OF_NEW_SIM_1_SMSC: 'newSimSmsc1', + // sim卡的手机号 + KEY_OF_SIM_0_NUMBER: 'sim_0_number', + KEY_OF_SIM_1_NUMBER: 'sim_1_number', + // 订阅通知的事件 + SUBSCRIBER_EVENT: 'usual.event.SMS_RECEIVE_COMPLETED', + // 接收转发 + RECEIVE_TRANSMIT_EVENT: 'usual.event.RECEIVE_COMPLETED_TRANSMIT', + // 彩信接收事件 + MMS_SUBSCRIBER_EVENT: 'usual.event.MMS_RECEIVE_COMPLETED', + // 联系人数据库 + URI_ROW_CONTACTS: 'dataability:///com.ohos.contactsdataability', + // 联系人信息 + CONTACT_DATA_URI: '/contacts/contact_data', + // 名片联系人 + PROFILE_DATA_URI: '/profile/raw_contact', + // 查询联系人 + CONTACT_SEARCHE: '/contacts/search_contact', + // 联系人信息 + CONTACT_URI: '/contacts/contact', + // 短信数据库 + URI_MESSAGE_LOG: 'dataability:///com.ohos.smsmmsability', + // 查询短信 + URI_MESSAGE_INFO_TABLE: '/sms_mms/sms_mms_info', + // 统计 + URI_MESSAGE_UNREAD_COUNT: '/sms_mms/sms_mms_info/unread_total', + // 获取最大的groupID + URI_MESSAGE_MAX_GROUP: '/sms_mms/sms_mms_info/max_group', + // 查询彩信 + URI_MESSAGE_MMS_PART: '/sms_mms/mms_part', + AUDIO_NAME: 'recording2021111512454545.amr', + // 彩信中心 + MMS_URL: 'http://mmsc.monternet.com' + }, + DELIVERY_REPORTS: { + // 已关闭 + DISABLED: '0', + // 短信 + SMS: '1', + // 彩信 + MMS: '2', + // 短信和彩信 + SMS_AND_MMS: '3' + }, + AUTO_RETRIEVE_MMS: { + // 关闭 + OFF: '0', + // 非漫游时 + NOT_WHEN_ROAMING: '1', + // 所有网络下 + ALWAYS: '2' + }, + SPN_CHINA: { + // 电信 + TELECOM: '中国电信', + // 移动 + MOBILE: 'CMCC', + // 联通 + UNICOM: 'China Unicom', + }, + contractPage: { + // 跳转至新建联系人 + PAGE_FLAG_SAVE_CONTACT: 'page_flag_save_contact', + // 呼叫前编辑 + PAGE_FLAG_EDIT_BEFORE_CALLING: 'page_flag_edit_before_calling', + // 保存至已有联系人 + PAGE_FLAG_SAVE_EXIST_CONTACT: 'page_flag_save_exist_contact', + // 短信发送跳转到选择联系人界面 + PAGE_FLAG_MULT_CHOOSE: 'page_flag_mult_choose', + // 选择联系人列表页面 + PAGE_FLAG_CHOOSE_CONTACTS: 'page_flag_choose_contacts', + // 联系人详情页面 + PAGE_FLAG_CONTACT_DETAILS: 'page_flag_contact_details', + // 跳转至我的名片界面 + PAGE_FLAG_CALLING_CARD: 'page_flag_card_details', + // 查询彩信数据 + URI_MESSAGE_MMS_PART: '/sms_mms/mms_part' + }, + MESSAGE_TAB_INDEX: { + TAB_CAMERA: 0, + TAB_PICTURE: 1, + TAB_AUDIO: 2, + TAB_MORE: 3 + }, + TAG: { + // 信息列表首页 + MsgList: 'message_list :', + // 通知信息 + MsgInfo: 'message_info :' + }, + HIGHLIGHT_TYPE: { + // 普通数据 + NORMAL: 0, + // 邮箱 + EMAIL: 1, + // 网址 + URL: 2, + // 电话 + TEL: 3, + // 时间 + DATE: 4, + // 验证码 + NUM: 5 + }, + tableName: { + SESSION: 'session' + }, + MESSAGE_TYPE: { + // 普通信息 + NORMAL: 0, + // 主题 + THEME: 1, + // 幻灯片 + PPT: 2, + // 主题和幻灯片 + THEME_AND_PPT: 3, + }, + MESSAGE_SHOW_TYPE: { + // 普通短信样式 + NORMAL: 0, + // 不包含图片主题样式 + THEME_NO_IMAGE: 1, + // 不包含图片幻灯片样式 + PPT_NO_IMAGE: 2, + // 含图片幻灯片样式 + PPT_IMAGE: 3, + // 含图片主题样式 + THEME_IMAGE: 4 + }, + MSG_ITEM_TYPE: { + THEME: 0, + IMAGE: 1, + VIDEO: 2, + AUDIO: 3, + TEXT: 4, + CARD: 5 + }, + TRANSMIT_ITEM_HEIGHT: { + TEXT_HEIGHT: 150, + THEME_HEIGHT: 200, + THEME_IMAGE_HEIGHT: 300, + PPT_IMAGE_HEIGHT: 220, + DISTANCE: 20, + TOTAL_HEIGHT: 650 + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.css b/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.css new file mode 100644 index 0000000..48fe93b --- /dev/null +++ b/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.css @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.container { + flex-direction: row; + background-color: #00f; +} + +.container-div { +} + +.container-div-text { + border: 0; + margin: 0; + padding: 0; + text-align: left; + text-overflow: ellipsis; + max-lines: 1; +} + +.orangeText { + color: #00f; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.hml b/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.hml new file mode 100644 index 0000000..a0e4943 --- /dev/null +++ b/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.hml @@ -0,0 +1,20 @@ + + + + {{$item.text}} + {{$item.text}} + + \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.js b/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.js new file mode 100644 index 0000000..ad7e048 --- /dev/null +++ b/entry/src/main/js/default/pages/component/contact_high_light/contact_highlight.js @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const NORMAL_TYPE = 0; +const BRIGHT_TYPE = 1; +export default { + props: { + texts: { + default: 'wo sdf sdf 86 sdfsfa' + }, + search: { + default: '' + } + }, + computed: { + textSpans() { + if (this.search.trim() === '') { + let mapNormal = {} + mapNormal.text = this.texts + mapNormal.type = NORMAL_TYPE + return [mapNormal] + } + this.textSpans = [] + let arrays = [this.texts] + let pattern = '' + if (this.search.length > 1) { + for (let i = 0; i < this.search.length; i++) { + pattern += this.search.charAt(i) + if (i < this.search.length - 1) { + pattern += '(\\s)*' + } + } + } + let result = [this.search] + if (pattern != '') { + try { + let rule = new RegExp(pattern, 'g') + result = rule.exec(this.texts) + } catch (e) { + this.hitLog('error:' + JSON.stringify(e)) + } + } + if (!result) { + let mapNormal = {} + mapNormal.text = this.texts + mapNormal.type = NORMAL_TYPE + return [mapNormal] + } + let that = this + arrays = this.splitText(arrays, result[0]) + let returnArray = [] + let i = 0 + arrays.forEach(element => { + let text = element.text + if (text !== '') { + returnArray.push(element) + i++ + } + }); + return returnArray + } + }, + splitText(arr, val) { + let finalArrays = [] + arr.forEach((value, index) => { + value += '' + let temp = value.split(val) + temp.forEach((x, y, z) => { + let mapNormal = {} + mapNormal.text = x + mapNormal.type = NORMAL_TYPE + finalArrays.push(mapNormal) + if (y < temp.length - 1) { + let mapHigh = {} + mapHigh.text = val + mapHigh.type = BRIGHT_TYPE + finalArrays.push(mapHigh) + } + }) + }) + return finalArrays + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/high_light/highlight.css b/entry/src/main/js/default/pages/component/high_light/highlight.css new file mode 100644 index 0000000..4118189 --- /dev/null +++ b/entry/src/main/js/default/pages/component/high_light/highlight.css @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.container { + flex-direction: row; +} + +.container-div { +} + +.container-div-text { + border: 0; + margin: 0; + padding: 0; + text-align: left; + text-overflow: ellipsis; + max-lines: 1; +} + +.orangeText { + color: #00f; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/high_light/highlight.hml b/entry/src/main/js/default/pages/component/high_light/highlight.hml new file mode 100644 index 0000000..75d5d13 --- /dev/null +++ b/entry/src/main/js/default/pages/component/high_light/highlight.hml @@ -0,0 +1,20 @@ + + + + {{$item}} + {{$item}} + + \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/high_light/highlight.js b/entry/src/main/js/default/pages/component/high_light/highlight.js new file mode 100644 index 0000000..1c52e5a --- /dev/null +++ b/entry/src/main/js/default/pages/component/high_light/highlight.js @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default { + props: { + texts: { + default: 'wo sdf sdf 86 sdfsfa' + }, + searchText: { + default: '' + } + }, + computed: { + textSpans() { + this.textSpans = [] + let arrays = [this.texts] + let that = this + arrays = this.splitText(arrays, this.searchText) + let returnArray = [] + let i = 0 + arrays.forEach(element => { + if (i > 4) { + return + } + if (element !== that.searchText) { + if (element.length > 9) { + element = element.slice(0, 6) + '...' + } + } + returnArray.push(element) + i++ + }); + return returnArray + } + }, + splitText(arr, value) { + let arrays = []; + arr.forEach((item, index) => { + item += ''; + let temp = item.split(value) + temp.forEach((x, y, z) => { + arrays.push(x) + if (y < temp.length - 1) { + arrays.push(value) + } + }) + }) + return arrays; + } +} diff --git a/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.css b/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.css new file mode 100644 index 0000000..b8a5259 --- /dev/null +++ b/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.css @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.dialog-div { + flex-direction: column; + align-items: center; + justify-content: center; +} + +.title { + margin: 40px; +} + +.txt { + color: #000; + font-size: 45px; + font-weight: bold; +} + +.inner-txt { + width: 100%; + flex-direction: column; +} + +.info { + padding-left: 40px; + padding-top: 25px; + padding-bottom: 25px; +} + +.info:active { + background-color: #d3d3d3; +} + +.info-text { + font-size: 36px; +} + +.divider { + margin-left: 40px; + margin-right: 40px; + color: #959494; + stroke-width: 1px; + line-cap: round; +} + +.inner-btn { + width: 400px; + height: 120px; + justify-content: space-around; + align-items: center; + margin-top: 20px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.hml b/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.hml new file mode 100644 index 0000000..eed0fe1 --- /dev/null +++ b/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.hml @@ -0,0 +1,28 @@ + +
+
+ {{text}} +
+
+
+ {{$item}} +
+ +
+
+ +
+
diff --git a/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.js b/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.js new file mode 100644 index 0000000..bc9f6ed --- /dev/null +++ b/entry/src/main/js/default/pages/component/highlight_dialog/highlight_dialog.js @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { commonPasteboard } from '../../../utils/Pasteboard.js'; +import common from '../../common_constants.js'; +export default { + props: ['text', 'highlightsType'], + data: { + telInfo: null, + urlInfo: null, + emailInfo: null, + dateInfo: null + }, + onInit() { + this.telInfo = [ + this.$t('strings.call'), + this.$t('strings.msg_pre_call_editor'), + this.$t('strings.send_message'), + this.$t('strings.pasteboard'), + this.$t('strings.msg_new_contact'), + this.$t('strings.msg_save_to_an_existing_contact') + ]; + this.urlInfo = [ + this.$t('strings.open_web'), + this.$t('strings.pasteboard'), + this.$t('strings.add_to_bookmarks') + ]; + this.emailInfo = [ + this.$t('strings.send_message'), + this.$t('strings.send_email'), + this.$t('strings.pasteboard'), + this.$t('strings.msg_new_contact'), + this.$t('strings.msg_save_to_an_existing_contact') + ]; + this.dateInfo = [ + this.$t('strings.new_schedule_reminder'), + this.$t('strings.pasteboard') + ]; + }, + onShow() { + }, + computed: { + info() { + if (this.highlightsType === common.HIGHLIGHT_TYPE.TEL) { + return this.telInfo; + } else if (this.highlightsType === common.HIGHLIGHT_TYPE.EMAIL) { + return this.emailInfo; + } else if (this.highlightsType === common.HIGHLIGHT_TYPE.URL) { + return this.urlInfo; + } else if (this.highlightsType === common.HIGHLIGHT_TYPE.DATE) { + return this.dateInfo; + } + return null; + } + }, + cellClickAction(index) { + if (this.highlightsType === common.HIGHLIGHT_TYPE.TEL || + this.highlightsType === common.HIGHLIGHT_TYPE.EMAIL || + this.highlightsType === common.HIGHLIGHT_TYPE.DATE) { + this.$emit('clickAction', index); + } else if (this.highlightsType === common.HIGHLIGHT_TYPE.URL) { + this.clickUrlAction(index); + } + }, + clickUrlAction(index) { + if (index === 0) { + // 打开网址 + } else if (index === 1) { + // 复制到剪贴板 + commonPasteboard.setPasteboard(this.text); + } else { + // 添加到书签 + } + this.$emit('cancelDialog'); + }, + cancelDialog() { + this.$emit('cancelDialog'); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.css b/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.css new file mode 100644 index 0000000..f8f3c30 --- /dev/null +++ b/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.css @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#msgHighlight { + flex-direction: row; + flex-wrap: wrap; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.hml b/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.hml new file mode 100644 index 0000000..7c6762d --- /dev/null +++ b/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.hml @@ -0,0 +1,23 @@ + + + {{$item.value}} + {{$item.value}} + + {{element.value}} + {{element.value}} + + {{$item.value}} + \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.js b/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.js new file mode 100644 index 0000000..5fb2f66 --- /dev/null +++ b/entry/src/main/js/default/pages/component/msg_highlight/msg_highlight.js @@ -0,0 +1,253 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const URL_REG = /(((ht|f)tps?):\/\/)?(www\.)?[a-zA-Z0-9]+([\-\.]{1}[a-zA-Z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.[a-zA-Z0-9\&\.\/\?\:@\-_=#]+)?/g; +const EMAIL_REG = /[\d\w]+\b@[a-zA-ZA-z0-9]+(\.[com,cn,net]{1,3})+/g; +const TEL_REG = /((\+?86[\s]?)?(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\s?\d{4}\s?\d{4})|(0[\d]{2,3}[-]?[\d]{7,8}|400[-]?[\d]{3}[-]?[\d]{4})|(? { + return a.start - b.start; + }); + }, + getItemPositions(value, item, start) { + let positions = []; + let index = value.indexOf(item); + while(index !== -1) { + positions.push(index + start); + index = value.indexOf(item, index + item.length); + } + return positions; + }, + getHighlights() { + // 根据正则表达式,从数据源中筛选出对应的数据,并生成对象。筛选顺序:网址,邮件,电话,日期,验证码 + let messages = []; + let regs = [ + EMAIL_REG, URL_REG, TEL_REG, DATE_REG, DATE_CH_REG, + DATE_EN_REG, DATE_NO_TIME_REG, TIME_REG, NUM_REG + ]; + let lastStr = this.text; + regs.forEach((reg, index) => { + let matchArr = lastStr.match(reg); + if (matchArr) { + this.dealMatchArr(matchArr, index, regs, messages); + // 获取去除特殊数据后的字串 + lastStr = lastStr.replace(reg, common.string.EMPTY_STR); + } + }); + let texts = []; + if (messages.length === 0) { + texts = [ + { + value: this.text, + type: 0, + start: 0, + hasBold: false, + extra: [] + } + ]; + } else { + messages = this.sortMsg(messages); + texts = this.addNormals(messages); + } + return this.getTextOverstriking(texts, this.keyword); + }, + getTextOverstriking(texts, keyword) { + if (keyword === null || keyword === common.string.EMPTY_STR) { + return texts; + } + let newTexts = []; + for (let text of texts) { + if (text.type === 0) { + this.dealText(text, newTexts, keyword); + } else { + let resultTexts = []; + this.dealText(text, resultTexts, keyword); + text.extra = resultTexts; + newTexts.push(text); + } + } + return newTexts; + }, + formatValue(value, keyword) { + if (value === common.string.EMPTY_STR || keyword === common.string.EMPTY_STR) { + return value; + } + let index = value.indexOf(keyword); + if (index === -1) { + return value; + } + let hasOneDeal = true; + let valueStr = common.string.EMPTY_STR; + for (let i = 0; i < value.length; i++) { + if (i >= index && i < index + keyword.length) { + if (hasOneDeal) { + valueStr = valueStr + common.string.SEMICOLON; + hasOneDeal = false; + } + } else { + valueStr = valueStr + value[i]; + } + } + return this.formatValue(valueStr, keyword); + }, + dealText(text, newTexts, keyword) { + let oldValue = text.value; + let newValue = this.formatValue(oldValue, keyword); + for (let value of newValue) { + if (value === common.string.SEMICOLON) { + newTexts.push(this.getText(text, true, keyword)); + } else { + newTexts.push(this.getText(text, false, value)); + } + } + }, + getText(text, hasBold, value) { + let newText = { + value: value, + type: text.type, + start: text.start, + hasBold: hasBold, + extra: [] + }; + return newText; + }, + putText(text, hasBold, value, newTexts) { + newTexts.push(this.getText(text, hasBold, value)); + }, + dealMatchArr(matchArr, index, regs, messages) { + matchArr.forEach((item, matchIdx) => { + let type = common.HIGHLIGHT_TYPE.NORMAL; + if (index >= 3 && index <= regs.length - 2) { + type = common.HIGHLIGHT_TYPE.DATE; + } else if (index === regs.length - 1) { + type = common.HIGHLIGHT_TYPE.NUM; + item = item.substring(4); + } else { + type = index + 1; + } + let position = this.dealHighlight(type, messages, matchIdx, item); + let obj = this.createObj(item, type, position); + messages.push(obj); + }); + }, + dealHighlight(type, messages, matchIdx, item) { + let position = 0; + // 由于url中有可能包含有电话号码如10086,所以做特殊处理 + if (type === common.HIGHLIGHT_TYPE.TEL && messages.length !== 0) { + let telPositions = []; + // 查找已匹配信息中是否包含电话号码,记录位置 + messages.forEach((msg) => { + telPositions = telPositions.concat(this.getItemPositions(msg.value, item, msg.start)); + }); + if (telPositions.length === 0) { + if (matchIdx !== 0) { + let pre = messages[messages.length - 1]; + position = pre.start + pre.value.length; + } + } else { + // 获取item在字符串中的所有位置 + let positions = this.getItemPositions(this.text, item, 0); + // 去除在已匹配信息中包含item的位置 + this.dealTelPositions(telPositions, positions); + position = positions[0]; + } + } else if (matchIdx !== 0) { + let pre = messages[messages.length - 1]; + position = pre.start + pre.value.length; + } + return position; + }, + dealTelPositions(telPositions, positions) { + telPositions.forEach((tel) => { + let telIdx = positions.indexOf(tel); + if (telIdx >= 0) { + positions.splice(telIdx, 1); + } + }); + }, + addNormals(messages) { + // 获取除特殊数据外的所有普通数据,并生成对象 + let copyMsg = JSON.parse(JSON.stringify(messages)); + messages.forEach((msg, index) => { + let start = msg.start; + let subStr = ''; + let obj = {}; + if (index === 0) { + subStr = this.text.substring(0, start); + obj = this.createObj(subStr, common.HIGHLIGHT_TYPE.NORMAL); + } else { + let preItem = messages[index - 1]; + let idx = preItem.start + preItem.value.length; + subStr = this.text.substring(idx, start); + obj = this.createObj(subStr, common.HIGHLIGHT_TYPE.NORMAL, idx); + } + copyMsg.push(obj); + if (index === messages.length - 1) { + subStr = this.text.substring(start + msg.value.length); + obj = this.createObj(subStr, common.HIGHLIGHT_TYPE.NORMAL); + copyMsg.push(obj); + } + }); + return this.sortMsg(copyMsg); + }, + clickTextAction(type, value) { + if (type === common.HIGHLIGHT_TYPE.NUM) { + return; + } + this.$emit('clickHighlights', { + type: type, + value: value + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/receive/receive.css b/entry/src/main/js/default/pages/component/receive/receive.css new file mode 100644 index 0000000..273938b --- /dev/null +++ b/entry/src/main/js/default/pages/component/receive/receive.css @@ -0,0 +1,180 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*收件人组件*/ +.receive { + flex-direction: column; + display: flex; +} + +.content { + width: 100%; + display: flex; + padding-left: 40px; + padding-right: 10px; + flex-direction: row; + justify-content: flex-start; + padding-right: 30px; + align-items: center; + margin-top: 10px; +} + +.content-addressee-div { + flex-grow: 1; + display: flex; + align-items: center; + flex-direction: row; + justify-content: flex-start; + width: 85%; +} + +.content-addressee-send { + height: 96px; + width: 180px; + font-size: 30px; + color: grey; + max-lines: 1; +} + +.select-contact { + width: 100%; + flex-wrap: wrap; +} + +.select-contact-div { + background-color: #EEE; + height: 60px; + padding-left: 15px; + padding-right: 8px; + align-items: center; + margin-right: 10px; + margin-top: 10px; + border-radius: 30px; +} + +.select-contact-textarea { + color: #000; + background-color: #fff; +} + +.select-contact-text { + font-size: 32px; + color: #000; + align-items: center; + text-overflow: ellipsis; +} + +.content-addressee-text { + color: #171BFA; + font-size: 32px; + text-align: center; + background-color: #fff; + text-overflow: ellipsis; +} + +.addressee-add-div { + width: 60px; + height: 60px; + align-items: center; + justify-content: center; +} + +.content-addressee-add { + height: 48px; + width: 48px; +} + +.divide { + width: 100%; + padding-left: 40px; + padding-right: 40px; +} + +.divide-line { + height: 1px; + color: #808080; +} + +.contacts-list { + width: 100%; + height: 90%; + padding-bottom: 115px; +} + +.contacts-list-item { + display: flex; + flex-direction: row; + width: 100%; + height: 138px; + align-items: center; + padding-left: 30px; + padding-right: 10px; +} + +.contact-image { + width: 100px; + height: 100px; +} + +.contact-image-div { + width: 150px; + height: 150px; + align-items: center; + justify-content: center; +} + +.contact-text-div { + flex-grow: 1; + display: flex; + justify-content: space-around; + flex-direction: column; + align-content: center; + margin-left: 30px; + margin-right: 30px; +} + +.contact-text-div-tel { + flex-direction: row; +} + +.contact-text-div-name { + flex-direction: column; +} + +.contact-text-name { + font-size: 30px; + weights: 500; + text-overflow: ellipsis; + color: #000; +} + +.contact-text-name-light { + font-size: 30px; + weights: 500; + text-overflow: ellipsis; + color: #00f; + flex-direction: row; +} + +.contact-text-telephone { + font-size: 25px; + color: grey; + flex-direction: row; +} + +.contact-text-telephone-light { + font-size: 25px; + color: #00f; + flex-direction: row; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/receive/receive.hml b/entry/src/main/js/default/pages/component/receive/receive.hml new file mode 100644 index 0000000..1ea8a1c --- /dev/null +++ b/entry/src/main/js/default/pages/component/receive/receive.hml @@ -0,0 +1,70 @@ + + + +
+
+
+ + {{ $t('strings.putAddresser') }} + +
+
+
+ + {{ $item.telephoneFormat }} + + + {{ $item.contactName }} + + +
+
+ {{ strSelectContact }} + + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+
+
+ +
+
+ + +
+
+
+
+
+
\ No newline at end of file diff --git a/entry/src/main/js/default/pages/component/receive/receive.js b/entry/src/main/js/default/pages/component/receive/receive.js new file mode 100644 index 0000000..3327ef4 --- /dev/null +++ b/entry/src/main/js/default/pages/component/receive/receive.js @@ -0,0 +1,388 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../../default/utils/MmsLog.js'; +// 收件人 +import prompt from '@system.prompt'; +// JS公共常量 +import common from '../../common_constants.js'; +import contractService from '../../../service/ContractService.js'; + +const RECEIVE_TAG = 'receive.js -> '; + +export default { + props: ['paramContact'], + data: { + // 收件人信息(已经选择) + selectContacts: [], + contacts: [], + // 收件人列表信息(所有的) + contactsTemp: [], + // 收件人内容 + myText: '', + colorContact: '#000000', + // true 焦点编辑状态(灰色), false无焦点状态(蓝色字体) + isInputStatus: true, + // true 显示搜索列表 + isShowSearch: true, + strSelectContact: '', + styleTextarea: 'select-contact-textarea', + hasBlur: false, + // 列表分页,页数 + page: 0, + // 列表分页,数量 + limit: 10, + // 联系人的总数 + totalMessage: 0 + }, + onInit() { + this.selectContacts = this.paramContact.transmitContracts; + this.$watch('paramContact', 'onPropertyChange'); + if (this.selectContacts.length > 0) { + let that = this; + setTimeout(function () { + that.setContactValue(); + }, 200); + this.isShowSearch = false; + this.setInputStatus(false); + } + }, + requestItem() { + let count = this.page * this.limit; + if (this.page === 0) { + this.page++; + this.queryContacts(); + } else if (count < this.totalMessage && this.contacts.length > (this.page - 1) * this.limit) { + // 对Contacts的限制,是防止初始化时多次刷新请求 + this.page++; + this.queryContacts(); + } + }, + queryContacts() { + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + page: this.page, + limit: this.limit + }; + mmsLog.log('queryContacts, start:' + actionData); + // 查询联系人 + contractService.queryContact(actionData, contacts => { + mmsLog.log(RECEIVE_TAG + 'queryContact, contracts:' + contacts); + if (common.int.SUCCESS == contacts.code) { + let response = this.contacts.concat(contacts.response); + this.contacts = []; + this.contacts = response; + this.contactsTemp = this.contacts.slice(0); + } else { + mmsLog.log('queryContacts, fail'); + } + }); + // 统计数量 + contractService.countContact(actionData, contacts => { + this.totalMessage = contacts.response; + }); + }, + searchContacts(textValue, callback) { + mmsLog.log(RECEIVE_TAG + 'searchContracts,contracts: start'); + let actionData = { + telephone: textValue, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + contractService.searchContracts(actionData, res => { + let code = res.code; + if (common.int.SUCCESS == res.code) { + this.contacts = []; + this.contacts = res.response; + } else { + mmsLog.log('queryContactByCondtion, fail'); + } + callback(code); + }); + }, + // 过滤搜索词匹配联系人 + filterContacts(textValue) { + this.contacts = this.contactsTemp.filter((contact) => { + if (contact.contactName && contact.contactName.toLowerCase().search(textValue) != -1) { + mmsLog.info('jsRe searchChange contactName==>'); + return true; + } else if (contact.telephone && contact.telephone.toLowerCase().search(textValue) != -1) { + mmsLog.info('jsRe searchChange telephone==>'); + return true; + } + return false; + }); + }, + isPhoneNumber(str) { + // 判断是否是数字 + let reg = /^\d{1,}$/; + let pattern = new RegExp(reg); + return pattern.test(str); + }, + setInputStatus(flag) { + this.isInputStatus = flag; + if (flag) { + this.styleTextarea = 'select-contact-textarea'; + } else { + this.styleTextarea = 'content-addressee-text'; + this.strSelectContact = this.setShowContactName(); + } + }, + checkReceive() { + mmsLog.info('jsRe checkReceive isInputStatus:' + this.isInputStatus); + if (this.myText.trim() == common.string.EMPTY_STR) { + this.setInputStatus(false); + this.isShowSearch = false; + return; + } + this.hasBlur = true; + if (this.isPhoneNumber(this.myText)) { + // 从联系人列表中获取信息 + let that = this; + let selectContact = {}; + let hasSelect = false; + for (let index in this.contacts) { + let contract = this.contacts[index]; + if (contract.telephone == that.myText) { + selectContact.headImage = '/common/icon/user_avatar_full_fill.svg'; + selectContact.contactName = contract.contactName; + selectContact.telephone = contract.telephone; + selectContact.telephoneFormat = contract.telephone; + selectContact.select = false; + hasSelect = true; + break; + } + } + if (!hasSelect) { + selectContact.headImage = common.string.EMPTY_STR; + selectContact.contactName = common.string.EMPTY_STR; + selectContact.telephone = that.myText; + selectContact.telephoneFormat = that.myText; + selectContact.select = false; + } + mmsLog.info('jsRe isPhoneNumber yes'); + this.selectContacts.push(selectContact); + this.setInputStatus(false); + this.isShowSearch = false; + this.setContactValue(); + } else { + mmsLog.info('jsRe isPhoneNumber no'); + prompt.showToast({ + // 无效收件人 + message: this.$t('strings.invalid_receive', { + str: this.myText + }), + duration: 1000, + }); + this.setInputStatus(false); + this.isShowSearch = false; + } + }, + searchChange(e) { + mmsLog.info('jsRe searchChange ==>'); + this.myText = e.text; + if (!this.isInputStatus) { + mmsLog.info('jsRe searchChange isInputStatus false'); + return; + } + this.searchContacts(this.myText, code => { + if (code == common.int.SUCCESS) { + this.setContactValue(); + mmsLog.info('jsRe searchChange textValue:' + this.myText); + this.dealSearchData(); + this.setContactValue(); + } + }); + }, + dealSearchData() { + if (this.myText.trim() == common.int.SUCCESS) { + this.contacts = this.contactsTemp.slice(0); + this.$element('receiveTxt').focus({ + focus: true + }); + } else { + let textValue = this.myText.toLowerCase(); + // 过滤逻辑 + this.filterContacts(textValue); + mmsLog.info('jsRe searchChange contact:' + JSON.stringify(this.contacts)) + } + }, + setContactValue() { + // 将收件人信息,传给调用的父组件 + this.$emit('eventReceive', { + // 输入框的内容 + contactValue: this.myText, + // 已经选择的收件人信息 + selectContacts: this.selectContacts, + // 焦点是否丢失 + hasBlur: this.hasBlur + }); + }, + addContact(index) { + let curItem = this.contacts[index]; + this.selectContacts.push(curItem); + this.contactsTemp = this.contactsTemp.filter((item) => { + return item.telephone != curItem.telephone + }); + this.contacts.splice(index, 1); + mmsLog.info('jsRe addContact length:' + this.selectContacts.length); + this.myText = ''; + if (this.selectContacts.length == 1) { + this.setInputStatus(false); + this.isShowSearch = false; + this.setContactValue(); + } else { + this.setInputStatus(true); + this.isShowSearch = true; + this.setContactValue(); + } + mmsLog.info('jsRe addContact isInputStatus:' + this.isInputStatus); + }, + setShowContactName() { + if (this.selectContacts.length == 0) { + return ''; + } + let myName = this.selectContacts[0].contactName.trim(); + if (myName == '') { + myName = this.selectContacts[0].telephone; + } + if (this.selectContacts.length >= 2) { + // name以及其他number个 + return this.$t('strings.and_others', { + name: myName, + number: (this.selectContacts.length - 1) + }); + } else { + return myName + } + }, + myContactFocus() { + mmsLog.info('jsRe myContactFocus ==>'); + this.myText = common.string.EMPTY_STR; + this.setInputStatus(true); + this.isShowSearch = true; + }, + myContactClick() { + mmsLog.info('jsRe myContactClick ==>'); + if (!this.isInputStatus) { + this.myText = common.string.EMPTY_STR; + this.setInputStatus(true); + this.isShowSearch = true; + this.$element('receiveTxt').focus({ + focus: true + }); + } + }, + nameClick(idx) { + if (this.selectContacts[idx].select) { + let item = this.selectContacts.splice(idx, 1); + // 已经删除的添加到 需要搜索的集合 + this.contactsTemp.push(item); + this.contacts.push(item[0]); + return; + } + for (let element of this.selectContacts) { + element.select = false; + } + this.selectContacts[idx].select = true; + }, + clickToContracts() { + var actionData = {}; + actionData.pageFlag = common.contractPage.PAGE_FLAG_MULT_CHOOSE; + this.jumpToContractForResult(actionData); + }, + // 点击联系人头像,跳转至联系人详情 + titleBarAvatar(index) { + var actionData = {}; + actionData.phoneNumber = this.contacts[index].telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + this.jumpToContract(actionData); + }, + // 跳转联系人app + jumpToContract(actionData) { + let commonService = this.$app.$def.commonService; + let str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info('jumpToContract,data: ' + JSON.stringify(data)); + }).catch((error) => { + mmsLog.error('jumpToContract failed. Cause: ' + JSON.stringify(error)); + }); + }, + // 跳转联系人app + async jumpToContractForResult(actionData) { + let commonService = this.$app.$def.commonService; + let featureAbility = this.$app.$def.featureAbility; + let str = commonService.commonContractParam(actionData); + var data = await featureAbility.startAbilityForResult(str); + if (data.resultCode == 0) { + this.dealContractParams(data.want.parameters.contactObjects); + } + }, + dealContractParams(contactObjects) { + let params = JSON.parse(contactObjects); + for (let element of params) { + let selectContact = {}; + selectContact.headImage = '/common/icon/user_avatar_full_fill.svg'; + selectContact.contactName = element.contactName; + selectContact.telephone = element.telephone; + selectContact.telephoneFormat = element.telephone; + selectContact.select = false; + this.selectContacts.push(selectContact); + } + if (this.selectContacts.length > 0) { + this.deleteRepetitionContracts(this.contacts, this.selectContacts); + this.setInputStatus(false); + this.isShowSearch = false; + this.setContactValue(); + } + this.paramContact.isSelectContact = false; + this.paramContact.isNewRecallMessagesFlag = false; + }, + deleteRepetitionContracts(contacts, selectContacts) { + let indexs = []; + let count = 0; + for(let item of contacts) { + let telephone = item.telephone; + for(let selectContact of selectContacts) { + if(telephone == selectContact.telephone) { + indexs.push(count); + break; + } + } + count ++; + } + let selectContactIndexs = []; + for(let i=0; i < selectContacts.length; i++) { + let telephone = selectContacts[i].telephone; + for(let j=i+1; j < selectContacts.length; j++) { + if(telephone == selectContacts[j].telephone) { + selectContactIndexs.push(i); + break; + } + } + } + if(indexs.length > 0) { + for(let index of indexs) { + contacts.splice(index, 1); + } + } + if(selectContactIndexs.length > 0) { + for(let index of selectContactIndexs) { + selectContacts.splice(index, 1); + } + } + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.css b/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.css new file mode 100644 index 0000000..5cd591d --- /dev/null +++ b/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.css @@ -0,0 +1,103 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.container { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; +} + +.title-bar { + width: 100%; + height: 150px; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding-left: 40px; + padding-right: 40px; +} + +.title-bar-left { + width: 40%; + flex-direction: row; + align-items: center; +} + +.image-48 { + width: 48px; + height: 48px; +} + +.image-120 { + width: 120px; + height: 120px; +} + +.title-bar-text { + font-size: 45px; + font-weight: 500; + margin-left: 20px; +} + +.header-icon-and-name { + height: 300px; + width: 100%; + flex-direction: column; + align-items: center; + justify-content: space-evenly; +} + +.contact-name { + font-size: 40px; +} + +.body { + width: 100%; + height: 100%; + padding-left: 40px; + padding-right: 10px; +} + +.telephone-number-title { + height: 100px; + width: 100%; + align-items: center; +} + +.telephone-number-list-item { + height: 130px; + width: 100%; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.telephone-number-and-text { + width: 80%; + height: 100%; + flex-direction: column; + align-items: flex-start; + justify-content: space-evenly; +} + +.text-30 { + font-size: 30px; + color: grey; +} + +.text-35 { + font-size: 35px; + font-weight: 500; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.hml b/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.hml new file mode 100644 index 0000000..8402475 --- /dev/null +++ b/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.hml @@ -0,0 +1,41 @@ + +
+ +
+
+ + {{$t('strings.select_items')}} +
+ +
+ +
+ + {{name}} +
+ + + {{$t('strings.mobile1')}} + + +
+ {{$item.telephone}} + {{$t('strings.mobile2')}} +
+ +
+
+
diff --git a/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.js b/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.js new file mode 100644 index 0000000..601f495 --- /dev/null +++ b/entry/src/main/js/default/pages/contact_item_pick/contact_item_pick.js @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import Router from '@system.router'; + +export default { + data: { + // 图标 + icon: 'ic_avatar_default.svg', + // 名称 + name: '', + // 手机号 + telephoneNum: [] + }, + onInit() { + this.icon = this.iconFromConvPage; + this.name = this.nameFromConvPage; + this.telephoneNum = this.telephoneNumFromConvPage; + }, + // 点击X号 + backToConversationPage() { + Router.back({ + uri: 'pages/conversation/conversation' + }) + }, + // 点击√号 + clickToSelectThisContact() { + var oneContact = {}; + oneContact.icon = this.icon; + oneContact.name = this.name; + oneContact.telephoneNum = this.telephoneNum; + this.$app.$def.oneContactInContactItemPickPage = oneContact; + this.backToConversationPage(); + }, + // 点击checkbox + changeOfCheckedValue(index, e) { + this.telephoneNum[index].checked = e.checked; + } +} diff --git a/entry/src/main/js/default/pages/conversation/conversation.css b/entry/src/main/js/default/pages/conversation/conversation.css new file mode 100644 index 0000000..1b4b94b --- /dev/null +++ b/entry/src/main/js/default/pages/conversation/conversation.css @@ -0,0 +1,1283 @@ +/* +* Copyright (c) 2021 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/*最大的布局*/ +.chat-msg-page { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + justify-content: center;/*flex容器当前行的主轴对齐格式 项目位于容器的中心。*/ + align-items: center;/*flex容器当前行的交叉轴对齐格式 元素在交叉轴居中*/ + left: 0px; + top: 0px; + width: 100%; + height: 100%; +} + +/*上方TitleBar*/ +.title-bar { + align-items: center; + width: 100%; + height: 150px; + margin-left: 25px; + margin-right: 25px; +} + +.title-bar-new { + align-items: center; + width: 100%; + height: 150px; + margin-left: 15px; + margin-right: 25px; +} + +.chat-msg-title { + padding-left: 30px; + padding-right: 30px; + font-size: 50px; +} + +.chat-msg-back-div { + margin-left: 20px; + width: 100px; +} + +.chat-msg-back-div:active { + background-color: lightgray; +} + +/*返回按钮*/ +.chat-msg-back-container { + width: 80px; + height: 100px; + padding-left: 26px; + padding-top: 26px; +} + +.chat-msg-back { + height: 48px; + width: 48px; +} + +.chat-msg-avatar-div { + width: 80px; + height: 80px; +} + +/*头像*/ +.chat-msg-avatar { + height: 80px; + width: 80px; + align-items: center; + justify-content: flex-start; +} + +.image-more-div { + margin-left: 30px; +} + +/*手机*/ +.image-phone { + height: 56px; + width: 56px; +} + +/*更多*/ +.image-more { + height: 56px; + width: 56px; +} + +/*发送失败*/ +.image-sending-failed-container { + width: 100px; + height: 60px; + padding-left: 55px; + padding-top: 15px; +} + +.image-sending-failed { + height: 45px; + width: 45px; +} + +/*联系人Div*/ +.chat-msg-contact { + flex: 1; + height: 100%; + align-items: flex-start; + justify-content: center; + flex-direction: column; + margin-left: 10px; + margin-right: 30px; +} + +.chat-msg-contact div { + flex-direction: column; +} + +.title-text { + font-size: 45px; + color: #000000; + width: 100%; + margin-left: 20px; + weights: 500; +} + +/*联系人名称*/ +.chat-msg-contact-name { + font-size: 42px; + color: #000000; + text-overflow: ellipsis; + flex-direction: row; +} + +/*联系人电话*/ +.chat-msg-contact-number { + font-size: 32px; + color: #7a787d; + margin-top: 10px; + text-overflow: ellipsis; +} + +.chat-msg-contact-number-single { + font-size: 55px; + color: black; + text-overflow: ellipsis; + background-color: white; +} + +/*list-item*/ +.list-item { + padding-left: 30px; + padding-right: 30px; + background-color: white; +} + +/*收件人布局*/ +.mms-receive { + width: 100%; + display: flex; + flex-direction: column; +} + +/*收件人日期*/ +.mms-date { + width: 100%; + text-align: center; + font-size: 26px; + margin-top: 20px; + margin-bottom: 20px; +} + +/*收件人信息+复选框布局*/ +.mms-text { + display: flex; + flex-direction: column; + align-items: flex-start; + width: 100%; +} + +/*基本的*/ +.mms-text-base { + border-bottom-right-radius: 15px; + border-bottom-left-radius: 15px; + padding: 20px; +} + +.mms-img-base { + border-radius: 15px; + margin-bottom: 10px; +} + +.mms-audio-base { + width: 150px; +} + +.mms-audio-container { + flex-direction: column; + width: 200px; +} + +.mms-edit-area-audio { + width: 100%; + height: 90px; + margin-left: 8px; + align-items: center; + background-color: #DDF5DD; + border-radius: 20px; + padding-left: 15px; + padding-right: 15px; +} + +.mms-video-base { + height: 450px; + width: 380px; + border-radius: 15px; +} +.mms-video-tag { + height: 100px; + width: 100px; + position: absolute; + top: 175px; + left: 140px; +} + +.subscript { + font-size: 18px; + text-align: end; + margin-top: 5px; + padding-right: 10px; +} + +/*收件人信息*/ +.mms-text-left { + border-top-right-radius: 15px; + background-color: #F0F0F0; +} + +/*发件人信息*/ +.mms-text-right { + border-top-left-radius: 15px; + background-color: #DDF5DD; + justify-content: flex-end; +} + +.group-head-image-div { + height: 70px; + width: 90px; + align-items: center; + justify-content: center; +} + +.group-head-image { + height: 70px; + width: 70px; +} + +/*收件人复选框*/ +.mms-input { + width: 100px; + height: 100px; +} + +.empty-list-item { + width: 100%; + height: 50px; +} + +.mms-time-star { + flex-direction: row; +} + +/*收件人时间*/ +.mms-time { + top: 9px; + margin-bottom: 30px; + text-align: right; + font-size: 22px; + color: #646464; +} + +/*收信息是否加锁*/ +.mms-lock-left { + top: 10px; + margin-left: 10px; + height: 25px; + width: 25px; +} + +/*发信息是否加锁*/ +.mms-lock-right { + margin-right: 10px; + height: 25px; + width: 25px; +} + +/*双卡时,代表卡1和卡2*/ +.mms-card-left { + margin-top: 10px; + margin-left: 10px; + height: 25px; + width: 25px; +} + +/*双卡时,代表卡1和卡2*/ +.mms-card-right { + margin-right: 10px; + height: 25px; + width: 25px; +} + +/*发件人item*/ +.mms-send { + width: 100%; + flex-direction: column; + display: flex; + margin-top: 10px; +} + +/*发件人时间*/ +.mms-send-date { + text-align: center; + width: 100%; + display: flex; + margin-top: 20px; + margin-bottom: 20px; + font-size: 28px; + color: grey; +} + +/*包含文本、发送状态、锁状态*/ +.mms-status-content { + flex-direction: row; +} + +/*发送信息文本和发送时间和发送达状态*/ +.mms-status { + flex-direction: column; + width: 100%; +} + +.mms-left-slide { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + border-radius: 15px; + background-color: #DDF5DD; + border-top-left-radius: 0px; + width: 50%; +} + +.left-mms-image { + width: 100%; + height: 150px; +} + +.sending-status-and-content-div { + flex-direction: row; + align-items: flex-end; + justify-content: flex-end; +} + +.image-45 { + height: 45px; + width: 50px; +} + +/*发件人信息+复选框布局*/ +.mms-send-text { + display: flex; + flex-direction: column; + align-items: flex-end; + justify-content: flex-start; +/* width: 100%;*/ +} + +.border-left { + border-top-left-radius: 0px; +} + +.mms-send-text-left-row { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; + padding: 20px; + border-radius: 15px; + background-color: #DDF5DD; + border-top-left-radius: 0px; +} + +.mms-send-text-right-row { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; + padding: 20px; + border-radius: 15px; + background-color: #DDF5DD; + border-top-right-radius: 0px; +} + +.ppt-image { + width: 64px; + height: 64px; + margin-right: 20px; +} + +.theme-text { + flex-direction: column; + align-items: flex-end; + justify-content: flex-start; +} +.mms-right-slide { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + border-radius: 15px; + background-color: #DDF5DD; + border-top-right-radius: 0px; +} + +.mms-image { + width: 50%; + height: 150px; +} + +.mms-slide-text { + margin-top: 10px; + margin-left: 30px; + margin-bottom: 10px; +} + +.text-and-send-fail { + flex-direction: row; + align-items: flex-end; + justify-content: flex-end; +} + +/*发件人时间和是否送达*/ +.time-deliver { + width: 100%; + height: 50px; + flex-direction: row; + align-items: center; + justify-content: flex-end; + margin-bottom: 20px; +} + +/*群发详情按钮*/ +.mms-send-detail { + margin-right: 10px; + display: flex; + justify-content: flex-end; + font-size: 22px; + font-weight: 500; + color: #E9005EFF; +} + +/*发件人时间*/ +.mms-send-time { + margin-right: 10px; + display: flex; + justify-content: flex-end; + font-size: 22px; + color: #646464; +} + +/*是否送达*/ +.mms-deliver { + margin-right: 10px; + display: flex; + justify-content: flex-end; +} + +.mms-deliver-div { + flex-direction: row; +} + +/*送达失败样式*/ +.mms-deliver-error { + font-size: 22px; + color: #D94028; +} + +/*送达成功/送达中样式*/ +.mms-deliver-success { + font-size: 22px; + color: #646464; +} + +/*定时送达提示语*/ +.mms-deliver-interval { + font-size: 22px; + color: #646464; +} + +/*定时送达倒数秒数样式*/ +.mms-deliver-interval-time { + font-size: 22px; + color: blue; + margin-top: 3px; +} + +/*会话列表*/ +.chat-msg-list { + width: 100%; + height: 90%; + padding-right: 5px; + padding-left: 5px; + padding-bottom: 120px; +} + +.chat-msg-list-flag { + width: 100%; + height: 90%; + padding-right: 5px; + padding-left: 5px; + padding-bottom: 670px; +} + +.msg-note-mms { + width: 100%; + text-align: center; + font-size: 26px; + margin-top: 20px; + margin-bottom: 10px; +} + +/*彩信编辑*/ +.mms-edit-card { + display: flex; + height: 100px; + flex-direction: row; + background-color: #DDF5DD; + border-radius: 20px; + align-items: center; + justify-content: center; + margin-bottom: 10px; +} + +.edit-card-img { + width: 48px; + height: 48px; + margin-left: 10px; + margin-right: 10px; +} + +.mms-edit-card-item { + flex-direction: column; + padding: 5px; + margin-right: 40px; + align-items: center; + justify-content: center; +} + +.mms-edit-area { + flex-direction: row; + margin-left: 5px; + margin-top: 10px; + align-items: flex-end; + justify-content: flex-end; +} + +.mms-edit-area-audio { + width: 200px; + height: 90px; + margin-left: 8px; + align-items: center; + background-color: #DDF5DD; + border-radius: 20px; + padding-left: 15px; + padding-right: 15px; +} + +.mms-edit-card-text { + height: 50px; + align-items: flex-start; +} + +.mms-edit-audio-text { + width: 100px; + height: 50px; + align-items: center; + margin-left: 5px; +} + +.mms-edit-audio-delete { + width: 32px; + height: 32px; + align-items: center; +} + +.mms-image-container { + flex-direction: column; + width: 170px; +} + +.mms-edit-area-image { + width: 100%; + height: 170px; + margin-left: 8px; + background-color: #A8A7A8; + border-radius: 20px; +} + +.mms-edit-area-image-bg { + width: 170px; + height: 170px; + border-radius: 20px; +} +.mms-edit-delete { + width: 32px; + height: 32px; + position: absolute; + right: 10px; + top: 10px; +} + +/*发送/编辑栏*/ +.send-bar { + display: flex; + width: 100%; + padding-left: 28px; + align-items: flex-end; + flex-direction: row; +} + +/*更多按钮和全屏显示按钮*/ +.full-screen-mores-false { + width: 100px; + height: 100px; + flex-direction: column; + justify-content: flex-end; + align-items: center; + margin-bottom: 10px; +} + +.full-screen-mores-true { + width: 100px; + height: 200px; + flex-direction: column; + justify-content: flex-end; + align-items: flex-start; +} + +/*全屏显示*/ +.style-full-screen-more-full { + width: 96px; + height: 96px; + padding-top: 20px; +} +.add-div { +/* width: 40%;*/ +/* height: 60%;*/ +/* left: 10px;*/ +/* bottom: 4px;*/ + width: 100px; + height: 80px; + align-items: center; +} +/*更多按钮*/ +.style-full-screen-more-more { + width: 80%; + height: 80%; + line-height: 80px; + align-items: center; + margin-top: 5px; +/* top: 5px;*/ +/* width: 96px;*/ +/* height: 96px;*/ +/* padding-top: 20px;*/ +/* padding-bottom: 20px;*/ +} + +/*发送文本字数统计*/ +.send-text-size { + font-size: 18px; + margin-left: 6px; +} + +/*发送按钮*/ +.send-img-container { +/* width: 80px;*/ +/* height: 70px;*/ + width: 30%; + height: 60%; + position: absolute; + left: 20px; + bottom: 4px; +} + +.send-bar-send { +/* width: 60px;*/ +/* height: 60px;*/ +/* margin-bottom: 10px;*/ +/* margin-top: 10px;*/ +} + +/*单个彩信更多*/ +.send-bar-details-more { + width: 100%; + height: 140px; + align-items: center; + padding-left: 30px; + padding-right: 30px; + flex-direction: row; +} + +.send-bar-details-more-delete { + width: 100%; + height: 140px; + align-items: center; + justify-content: center; + padding-left: 30px; + padding-right: 30px; + flex-direction: row; +} + +/*更多详情 dev*/ +.send-msg-detail { + flex-direction: column; + justify-content: center; + align-items: center; + width: 25%; +} + +/*更多栏目图片*/ +.send-bar-detail-image { + width: 48px; + height: 48px; +} + +.media-swipe-div { + width: 100%; + position: absolute; + bottom: 0px; + left: 0px; + flex-direction: column; + background-color: #F7F7F7; +} + +.msg-sed-bar { + flex-direction: column; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 0px; + bottom: 0px; + width: 100%; + background-color: #F7F7F7; +} + +.tab-content { + width: 100%; + height: 80%; + justify-content: center; +} + +.item-image { + flex-wrap: wrap; + justify-content: space-between; + width: 100%; +} + +.item-image-div { + flex-wrap: wrap; + justify-content: space-between; + width: 100%; + height: 100%; +} + +.item-content { + width: 100%; + margin-top: 100px; + justify-content: center; + flex-direction: column; +} + +.picture-list { + flex-direction: column; + columns: 4; + align-items: center; +} + +.picture-item-first { + width: 175px; + height: 150px; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.picture-item { + width: 175px; + height: 150px; + background-color: orange; + margin-bottom: 5px; +} + +.picture-item-image { + width: 175px; + height: 150px; +} + +.picture-item-checkbox { + position: absolute; + width: 40px; + height: 40px; + right: 5px; + bottom: 5px; +} + +.video-play-icon { + width: 40px; + height: 40px; + position: absolute; + left: 5px; + bottom: 5px; +} + +.item-content-more { + flex-direction: column; + align-items: center; +} + +.item-content-more-div { + flex-direction: column; + align-items: center; +} + +.item-recording { + width: 100%; + height: 100%; + align-items: center; + justify-content: center; + flex-direction: column; +} + +.recording-container { + align-items: center; + justify-content: center; + margin-bottom: 20px; + margin-top: 20px; +} + +#recordingBackground { + background-color: #442686D9; + border: 1px solid #AA2686D9; + width: 134px; + height: 134px; + border-radius: 67px; +} + +.image-background { + width: 134px; + height: 134px; + border-radius: 67px; + background-color: white; +} + +.item-content-div { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-content: center; +} + +.tabs-recording-image { + width: 150px; + height: 150px; +} + +.tabs-recording-time { + font-size: 24px; + text-color: #000000; + justify-content: center; +} + +.tabs-recording-text { + font-size: 24px; + text-color: #A5A5A5; + justify-content: center; +} + +.item-title { + font-size: 60px; +} + +/*更多栏目底部导航*/ +.tab-bar { + width: 100%; + height: 120px; + align-items: center; + flex-direction: row; +} + +/*更多栏目单个导航*/ +.tab-bar-status { + height: 100%; + flex-direction: column; + align-items: center; + width: 100%; +} + +/*更多栏目图片*/ +.tab-bar-status-image { + width: 48px; + height: 48px; + margin-top: 10px; + margin-bottom: 10px; +} + +.item-content-vcards { + width: 100%; + padding-left: 10px; + padding-right: 50px; + margin-bottom: 10px; +} + +.item-content-vcard { + width: 25%; + height: 160px; + margin: 5px; + border-radius: 20px; + background-color: #1B808080; + flex-direction: column; + justify-content: center; + flex: 1; + align-items: center; +} + +.item-content-vcard-slide-show { + width: 160px; + height: 160px; + margin: 5px; + border-radius: 20px; + background-color: #1B808080; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.vcard-title { + color: black; + margin-top: 20px; + font-size: 20px; +} + +.tab-bar-image { + width: 45px; + height: 45px; + align-items: center; +} + +.send-bar-detail-text { + font-size: 22px; +} + +/*删除里面布局*/ +.delete-dialog-div { + display: flex; + width: 100%; + flex-direction: column; + padding: 20px; +} + +/*删除信息*/ +.dialog-inner-text1 { + width: 100%; + margin-top: 10px; + margin-bottom: 20px; + text-align: center; +} + +.dialog-inner-text2 { + width: 100%; + margin-top: 10px; + margin-bottom: 10px; + text-align: left; + margin-left: 30px; +} + +.dialog-tips { + width: 100%; + margin-top: 10px; + text-align: left; + font-size: 60px; + margin-left: 30px; +} + +/*删除执行逻辑div*/ +.dialog-inner-logic { + width: 100%; + height: 60px; + flex-direction: row; + justify-content: center; + margin-top: 10px; +} + +.dialog-inner-cb { + width: 100%; + height: 80px; + flex-direction: row; + align-items: center; +} + +.dialog-inner-cb-text { + height: 100%; + justify-content: center; +} + +/*竖线*/ +.dialog-inner-logic-vertical { + width: 2px; + height: 50px; + background-color: darkgrey; +} + +/*取消字体*/ +.dialog-inner-logic-cancel { + flex: 1; + text-align: center; + color: blue; +} + +/*删除字体*/ +.dialog-inner-logic-delete { + flex: 1; + text-align: center; + color: red; +} + +/*确认字体*/ +.dialog-inner-logic-confirm { + flex: 1; + text-align: center; + color: blue; +} + +/*画布区域(录音动效) 父440 */ +.mms-record-canvas { + position: absolute; + left: 150px; + height: 420px; + width: 420px; +} + +.text-or-vcard-dialog { + height: 400px; + width: 100%; + flex-direction: column; +} + +.text-or-vcard-dialog-item { + height: 100px; + width: 100%; + margin-left: 40px; + margin-right: 40px; + flex-direction: row; + align-items: center; +} + +.visibility-visible { + visibility: visible; +} + +.visibility-hidden { + visibility: hidden; +} + +.bottom-input { + background-color: white; + border-radius: 30px; + margin-bottom: 25px; + flex-direction: row; + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: row; + margin-top: 10px; + margin-left: 12px; +} + +/* 底部标签栏 */ +.bottom-input-image { + flex-direction: row; + align-items: center; + width: 25%; + height: 40px; + margin-left: 30px; +} + +.bottom-card { + width: 50%; + height: 50px; +} + +.down-image { + width: 50%; + height: 44px; +} + +/*输入框*/ +.send-bar-input { + width: 420px; + background-color: #FFF; +} + +/*发送emoji*/ +.send-bar-emoji { + margin-left: 20px; + margin-top: 30px; + top: 6px; + width: 100px; +} + +.send-bar-emoji-div { + height: 120px; +} + +/*发送*/ +.send-button-text { + width: 176px; + height: 96px; + flex-direction: column; + align-items: center; + margin-bottom: 20px; + position: relative; +} + +/*短信详情弹窗*/ +.mms-details { + width: 100%; + margin-left: 20px; + margin-right: 20px; + flex-direction: column; +} + +/*详情标题*/ +.mms-details-title { + font-size: 48px; + margin-top: 30px; + margin-bottom: 40px; +} + +/*详情文字*/ +.mms-details-text { + margin-top: 5px; + margin-bottom: 5px; + font-size: 32px; + margin-left: 30px; +} + +/*知道了文字*/ +.mms-details-cancel { + width: 100%; + text-align: center; + margin-top: 40px; + margin-bottom: 40px; + font-size: 32px; + color: #1E94FB; +} + +/*重新发送弹框展示*/ +.fail_dialog { + flex-direction: column; + justify-content: center; + align-items: center; + padding-top: 40px; + padding-bottom: 40px; + padding-left: 10px; + padding-right: 10px; +} + +.fail_text { + margin-bottom: 20px; + margin-left: 45px; + margin-right: 45px; + flex-direction: row; + justify-content: center; + align-items: center; +} + +.fail_text_title { + font-size: 35px; +} + +.text-font-28 { + font-size: 28px; +} + +.text-font-40 { + font-size: 40px; +} + +.list-item-size { + flex-direction: column; + width: 100%; + height: 65px; + padding-left: 40px; + padding-right: 20px; + justify-content: center; +} + +.fail_button { + flex-direction: row; + height: 80px; + justify-content: center; + align-items: center; + margin-left: 10px; + margin-right: 10px; +} + +.btn_cancel_double { + color: #F30000FF; + width: 50%; +} + +.btn_restore_double { + color: #F30000FF; + width: 50%; +} + +.fail_divider { + stroke-width: 1px; + height: 50px; + color: #A1808080; +} + +/*相机*/ +.show-Camera { + width: 100%; + height: 100%; +} + +/*切换前后置摄像头*/ +.cut-Camera { + width: 36px; + height: 36px; + position: absolute; + radius: 18px; + left: 85%; + font-size: 12px; + top: 20px; +} + +.shoot-image { + width: 48px; + height: 48px; + radius: 24px; + background-color: aqua; + position: absolute; + left: 45%; + top: 85%; +} + +.text-container { + flex-direction: column; +} + +.slide-counter { + width: 60px; + font-size: 12px; +} + +.textarea-divider { + border-bottom: 1px solid lightgray; + width: 90%; + margin-left: 8%; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/conversation/conversation.hml b/entry/src/main/js/default/pages/conversation/conversation.hml new file mode 100644 index 0000000..ad28e80 --- /dev/null +++ b/entry/src/main/js/default/pages/conversation/conversation.hml @@ -0,0 +1,722 @@ + + + + +
+ +
+ + + {{strTabTitleText}} + +
+ +
+
+ +
+ {{$t('strings.new_message')}} +
+ +
+ + + + {{selectDeleteMsgCount==0 ? $t('strings.msg_unselected_tip') : $t('strings.msg_selected_tip', {number:selectDeleteMsgCount}) }} + + +
+ +
+ +
+ +
+ +
+
+ {{strContactsName}} + {{$t('strings.members', {count: contactsNum})}} +
+
+ {{strContactsNumberFormat}} +
+
+ {{strContactsName}} + {{strContactsNumberFormat}} +
+
+ +
+ +
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + {{$t('strings.msg_note_mms')}} + + + {{$item.date}} +
+
+ +
+ +
+ {{$item.audioTime}} + +
+
+ + +
+
+ +
+ {{$item.msgUriPath}} + {{$item.audioTime}} +
+
+ + + +
+
+ +
+ + + +
+
+
+ + + + +
+
+ + {{$item.time}} + + + +
+
+ + +
+
+
+ +
+ + {{$t('strings.msg_note_mms')}} + + {{$item.date}} + +
+
+
+ +
+ +
+ +
+ + + +
+ + {{$item.audioTime}} +
+ +
+ + +
+
+ +
+ {{$item.msgUriPath}} + {{$item.audioTime}} +
+
+ +
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ + + + +
+
+ +
+
+ + {{$t('strings.msg_detail_mms')}} + +
+ + + {{$item.time}} + + {{$item.time}} +
+ + + +
+ +
+
+ + {{$t('strings.msg_send_cancel')}} + + + {{ $item.cancelTimeCount }} + +
+
+ + {{$t('strings.msg_send_failed')}}{{$item.failuresNumber}} + + + {{$t('strings.messageSending')}} ({{$item.completeNumber+1}}/{{contactsNum}}) + +
+
+
+
+ + {{$t('strings.msg_send_cancel')}} + + + {{ $item.cancelTimeCount }} + +
+
+ + {{$t('strings.messageSendFailed')}} + + + {{$t('strings.messageSending')}} + +
+
+
+
+ +
+ +
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + {{$item.time}} + +
+ {{$item.index}}/{{pptTotalCount}} +
+
+ +
+ {{$item.uriPath}} + {{$item.time}} +
+ +
+ +
+
+ + +
+ {{$item.index}}/{{pptTotalCount}} +
+
+
+ +
+ +
+ + + +
+ +
+
+ +
+
+ + + +
+
+ +
+
+ +
+ + {{$item.pptIndex}}/{{pptTotalCount}} +
+ +
+
+
+ +
+ + {{msgSendTip}} + {{''}} + +
+ +
+
+
+ +
+ +
+ + {{$t('strings.delete')}} +
+ +
+ + {{$t('strings.msg_transmit')}} +
+ +
+ + {{$t('strings.msg_star')}} +
+ +
+ + + {{isMessageCheckAll ? $t('strings.msg_deselect_all') : $t('strings.msg_select_all')}} + +
+ +
+ + {{$t('strings.more')}} + +
+
+
+ +
+ + {{$t('strings.delete')}} + +
+ +
+ + + {{isMessageCheckAll ? $t('strings.msg_deselect_all') : $t('strings.msg_select_all')}} + +
+
+
+ +
+ + + +
+
+ {{$t('strings.msg_take_photos')}} +
+
+ + +
+
+ + + + + {{ $t('strings.msg_gallery') }} + + + + + + + + + + + + + + +
+
+ +
+ {{curRecordingTime}} + +
+
+ +
+ {{$t('strings.press_speak')}} +
+ +
+ +
+ +
+ + {{$t('strings.msg_contacts')}} +
+ +
+ + {{$t('strings.msg_schedule')}} +
+ +
+ + {{$t('strings.msg_music')}} +
+ +
+ + {{$t('strings.msg_theme')}} +
+
+ +
+ +
+ + {{$t('strings.msg_slide')}} +
+
+
+
+ + + +
+ + + {{tabTextList[0]}} +
+ +
+ + + {{tabTextList[1]}} +
+ +
+ + + {{tabTextList[2]}} + +
+ +
+ + + {{tabTextList[3]}} + +
+
+
+
+ + +
+ {{strMsgDeleteDialogTip}} +
+ + + {{$t('strings.msg_delete_dialog_cb_tip')}} + +
+
+ + {{$t('strings.msg_delete_dialog_cancel')}} + +
+ + {{$t('strings.delete')}} +
+
+
+ + +
+ {{$t('strings.tips')}} + {{$t('strings.tips_replace')}} +
+ + {{$t('strings.msg_delete_dialog_cancel')}} + +
+ + {{$t('strings.confirm')}} +
+
+
+ + +
+
+ {{$t('strings.contact')}} +
+
+ {{$t('strings.text')}} +
+
+ {{$t('strings.mmsVcard')}} +
+
+ {{$t('strings.cancel')}} +
+
+
+ + +
+
+ {{$t('strings.msg_slide')}} +
+
+ {{$t('strings.slide_preview')}} +
+
+ {{$t('strings.addSlide')}} +
+
+ {{$t('strings.delete_slide')}} +
+
+ {{$t('strings.slide_duration')}}({{slideDuration}}{{$t('strings.slide_duration_unit')}}) +
+
+ {{$t('strings.cancel')}} +
+
+
+ + +
+ + {{$t('strings.msgDetails')}} + + {{$t('strings.type')}}{{isMmsType}} + + {{isSendRecipient ? $t('strings.sendAddresser') : $t('strings.putAddresser')}}{{strContactsNumberFormat}} + + {{$t('strings.sendTime')}}{{mmsTime}} + {{$t('strings.serviceCenter')}}+8613010305500 + {{$t('strings.putTime')}}{{mmsTime}} + {{$t('strings.ok')}} +
+
+ + +
+ +
+ {{ $t('strings.msg_resend_prompt') }} +
+ +
+ + + +
+
+
+ + + + + + +
+
+ {{$t('strings.slide_duration_title')}} +
+ + +
+ {{$item}} {{$t('strings.slide_duration_unit')}} +
+
+
+
+
+
diff --git a/entry/src/main/js/default/pages/conversation/conversation.js b/entry/src/main/js/default/pages/conversation/conversation.js new file mode 100644 index 0000000..1f2f95a --- /dev/null +++ b/entry/src/main/js/default/pages/conversation/conversation.js @@ -0,0 +1,3668 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +// 会话列表 +import router from '@system.router'; +import Prompt from '@system.prompt'; + +// JS公共常量 +import common from '../common_constants.js' +import {commonPasteboard} from '../../../default/utils/Pasteboard.js'; +import commonEvent from '@ohos.commonevent'; +import conversationService from '../../service/ConversationService.js'; +import callService from '../../service/CallService.js'; +import settingService from '../../service/SettingService.js'; +import simCardService from '../../service/SimCardService.js'; +import contactService from '../../service/ContractService.js'; +import conversationListService from '../../service/ConversationListService.js'; +import commonService from '../../service/CommonService.js'; +import notificationService from '../../service/NotificationService.js'; +import telephoneUtil from '../../../default/utils/TelephoneUtil.js'; + +const ANIMATION_DURATION = 1500; +const TRANSFORM_SCALE_MIN = '1.0'; +const TRANSFORM_SCALE_MAX = '3.0'; +const COMMON_FILE_SIZE_STRING = '/300KB'; +const COMMON_FILE_SIZE = 300; + +export default { + data: { + // 信息删除提示 + strMsgDeleteDialogTip: '', + // 点击状态 + isClickStatus: false, + // 信息是否加锁 + hasLockMsg: false, + // 选择状态 + isSelectStatus: false, + // 是否选择加锁信息 + isSelectLockMsg: false, + // 更多操作 + isShowMoreOperation: false, + // 判断是否为同一天 默认为 false + isLessOneDay: false, + // 判断是否达到全屏条件 + isShowFullScreen: false, + // 判断是否达全选 + isMessageCheckAll: false, + // 是否只是录音 + isOnlyAudio: false, + // 删除个数 + selectDeleteMsgCount: 0, + // 输入框输入的文本,也是要发送的短信的内容 + textValue: '', + // 录音动画任务 + drawRecordingTaskId: 0, + // tab选项页,0拍摄照片,1图片,2录音,3更多 + tabIndex: 1, + // tab选项页文本内容 + tabTextList: [], + // 录音状态 + isRecordingStatus: true, + // 当前录音时间 + curRecordingTime: '00:00', + // 当前录音文件的大小(KB) + curSize: 0, + // 开始录音时间 + startRecordTime: 0, + // 是否含有sim卡 + haveSimCard: false, + // 是否显示卡图标 + cardImage: false, + // 是否飞行模式 + isFlightMode: false, + // 信息附件大小提示 + msgSendTip: '', + // 当前能否发送短信 + canSendMessage: false, + // 当前编辑的是否为彩信 + isEditMms: false, + // 当前编辑的彩信附件大小 + curEdtFileSize: 0, + // 获取单选的时间显示 + mmsTime: '', + // 是否是短信和彩信 + isMmsType: '', + // 是否收件人 + isSendRecipient: '', + // 联系人名字 + strContactsName: '', + // 联系人电话号码 + strContactsNumber: '', + // 联系人电话号码格式化 + strContactsNumberFormat: '', + // 附件类型为名片 + isVCard: false, + // 是否是新建信息 + isNewMsg: false, + // 联系人数量 + contactsNum: 0, + // 名片 + vCard: {}, + // 彩信编辑列表 + mmsEditList: [], + // 信息列表 + mmsList: [], + // 当前选中信息index + mmsIndex: 0, + // 初始x位置 + rawX: '', + // 初始y位置 + rawY: '', + // 图库中的缩略图 + pictureListFromGallery: [], + // 选项卡标题 + tabTitleText: '', + // 发送工具栏距离底部位置 + sendBarMarginBottom: 0, + // 选项卡高度 + tabHeight: common.int.TAB_HEIGHT, + // 恢复任务id + restoreTimeoutId: 0, + // 是否真正执行动画 + isTabHeightAnimation: false, + // 0默认状态,1滑动状态,2全屏状态 + tabSlideStatus: 0, + // 滑动距离 + slideDistance: 0, + // 滑动的起点坐标 + slideStartPoint: { + x: 0, + y: 0 + }, + // 是否上滑动 + isTabSlideUp: 0, + // 联系人列表,从联系人app那里获取的,作为发彩信时的附件 + contactListFromContactApp: [], + // 卡槽 + slotId: 0, + // 选择的联系人 + selectContacts: [], + // 收件人输入框内容 + receiveContactValue: '', + // 给receive传递的参数数据 + paramContact: {}, + // 时间 + mmsDateSet: new Set(), + // 控制最后div显示与隐藏 + isSendStatus: false, + // 会话列表的id + threadId: 0, + // 是否是详情页面 + isDetail: true, + // 需要重新发送的下标 + reSendIndex: 0, + // 复制选项是否可见 + showText: true, + // 搜索传来的值 + searchKey: '', + // 是否是草搞 + isDraft: false, + // 草稿的内容 + draftContent: '', + draftGroupId: 0, + // 是否可以双击取消发送 + recallMessagesFlag: false, + // 双击取消状态 + doubleClickStatus: false, + // 距离底部的动态变化标志 + distanceBottomFlag: false, + // 详情页删除 + hasDetailDelete: false, + // 是否存在联系人 + hasExitContract: false, + // 新建页面进行取发送 + isNewRecallMessagesFlag: false, + // 录音动画 + recordingAnimation: null, + // 动画样式属性 + animationOptions: null, + // 动画样式属性对象 + animationFrames: null, + // 默认后置摄像头 + cameraPattern: 'back', + pattern: '', + // 是否锁 + hasLock: false, + // 高亮信息类型 + highlightsType: 0, + // 高亮信息内容 + highlightsText: '', + // 公共订阅数据 + commonEventData: {}, + timeFormat: '00:01', + // 0 - 普通,1 - 通知 + smsType: 0, + isPicCheckboxClicked: false, + // 是否支持发送报告 + hasReport: false, + messageType: common.MESSAGE_TYPE.NORMAL, + textareaDatasource: [], + pptTotalCount: 0, + selectedTextareaIdx: -1, + hasImage: false, + hasContent: false, + hasVcard: false, + mmsAddType: 0, + picItemSelectedIndex: -1, + slideDuration: 5, + slideDurations: [], + hasDouble: true, + searchContent: '' + }, + onInit() { + mmsLog.info('JS_conversation: ' + 'onInit()......'); + this.initData(); + if(this.hasDouble) { + this.initNewPageContracts(); + this.hasDouble = false; + } + this.initSendTip(); + this.setTabTitleText(); + }, + onShow() { + mmsLog.info('JS_conversation: ' + 'onShow()......'); + this.mmsList = []; + if (this.mmsDateSet.size > 0) { + this.mmsDateSet.clear(); + } + let preferences = this.$app.$def.preferences; + this.haveSimCard = conversationService.judgeHasSimCard(preferences); + // 判断发送按钮是否可点击 + this.judgeSendBtnCanClicked(); + // 初始化转发的数据 + this.initTransmitMeg(); + // 获取真实数据 + this.queryMessageDetail(this.strContactsNumber, this.threadId); + // 获取取消发送的状态 + this.getSettingFlagForConvListPage(); + // 订阅PA + this.subscribeDetail(); + // 判断联系人是否存在 + this.judgeContactExists(); + if (this.$app.$def.isFromFullScreen) { + this.$app.$def.isFromFullScreen = false; + // 判断是否是全屏发送 + this.judgeFullScreenSend(this.$app.$def.textValueOther); + // 全屏页面的时候使用 + this.fullScreenSend(); + } + // 转发发送 + this.transmitSend(); + // 外部应用获取数据 + this.dataFromPick(); + }, + onHide() { + this.unSubscribeDetail(); + }, + initData() { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip2', { + number: this.selectDeleteMsgCount + }); + this.tabTextList = [ + this.$t('strings.msg_take_photos'), + this.$t('strings.msg_picture'), + this.$t('strings.msg_record'), + this.$t('strings.more_low') + ]; + this.animationOptions = { + duration: ANIMATION_DURATION, + easing: 'linear', + fill: 'forwards', + iterations: 'Infinity', + }; + this.animationFrames = [ + { + transform: { + scale: TRANSFORM_SCALE_MIN + } + }, + { + transform: { + scale: TRANSFORM_SCALE_MAX + } + } + ]; + this.pattern = this.$t('strings.camera_post'); + this.initSlideDurations(); + }, + initSlideDurations() { + let arr = []; + for (let i = 1; i <= 10; i++) { + arr.push(i); + } + this.slideDurations = arr; + }, + dataFromPick() { + let indexPicPage = this.$app.$def.indexInShowPicPage; + let checkedValuePicPage = this.$app.$def.checkedValueInShowPicPage; + if (indexPicPage != null && this.pictureListFromGallery[indexPicPage].checkedValue != checkedValuePicPage) { + this.pictureItemCheckboxOnchange(indexPicPage); + this.$app.$def.indexInShowPicPage = null; + this.$app.$def.checkedValueInShowPicPage = null; + } + let oneContact = this.$app.$def.oneContactInContactItemPickPage; + if (oneContact != null) { + this.contactListFromContactApp[0] = oneContact; + this.$app.$def.oneContactInContactItemPickPage = null; + setTimeout(() => { + this.$element('select_text_or_vcard_to_send_dialog').show(); + }, 200); + } + }, + initNewPageContracts() { + let transmitContracts = []; + if (this.strContactsNumber) { + let contactsNames = this.strContactsName.split(','); + let telephones = this.strContactsNumber.split(','); + let telephoneFormat = this.strContactsNumberFormat.split(','); + for (let index in contactsNames) { + let item = {}; + item.contactName = contactsNames[index]; + item.telephone = telephones[index]; + if (contactsNames[index] == common.string.EMPTY && telephoneFormat[index] == common.string.EMPTY) { + item.telephoneFormat = telephones[index]; + } else { + item.telephoneFormat = telephoneFormat[index]; + } + item.headImage = common.string.EMPTY; + item.select = false; + transmitContracts.push(item); + } + } + this.paramContact.transmitContracts = transmitContracts; + this.paramContact.isSelectContact = false; + this.paramContact.isNewRecallMessagesFlag = false; + }, + // 设置草稿内容 + setDraft() { + // 如果是草稿需要配展示草稿内容 + if (this.isDraft) { + this.textValue = this.draftContent; + this.canSendMessage = true; + this.judgeFullScreenSend(this.textValue); + } + }, + // 清楚草稿 + cleanDraft() { + this.isDraft = false; + this.draftContent = common.string.EMPTY_STR; + }, + // 全屏发送 + fullScreenSend() { + var sendFlag = this.$app.$def.sendFlag; + if (sendFlag) { + let content = this.textValue; + this.textValue = common.string.EMPTY_STR; + this.isShowFullScreen = false; + this.canSendMessage = false; + this.newSend(); + setTimeout(() => { + this.sendSms(content, common.string.EMPTY, this.isEditMms); + }, 500); + } + }, + // 判断是否全屏展示 + judgeFullScreenSend(textValueOther) { + this.textValue = textValueOther; + if (this.textValue.length > common.int.FULL_SCREEN_SEND_LENGTH) { + this.isShowFullScreen = true; + } else { + this.isShowFullScreen = false; + } + }, + // 初始化转发数据 + initTransmitMeg() { + if (this.$app.$def.transmitFlag) { + this.threadId = this.$app.$def.threadId; + this.slotId = this.$app.$def.slotId; + this.contactsNum = this.$app.$def.contactsNum; + this.strContactsName = this.$app.$def.strContactsName; + this.strContactsNumber = this.$app.$def.strContactsNumber; + this.strContactsNumberFormat = this.$app.$def.strContactsNumberFormat; + this.initNewPageContracts(); + } + }, + // 转发发送 + transmitSend() { + let transmitFlag = this.$app.$def.transmitFlag; + let isSlideDetail = this.$app.$def.isSlideDetail; + if (transmitFlag) { + if(isSlideDetail) { + this.isEditMms = true; + this.mmsTransmitSend(); + } else { + this.generalTransmitSend(); + } + } + }, + generalTransmitSend() { + let transmitSource = this.$app.$def.transmitSource; + let isSource = this.$app.$def.isContainerOriginSource; + this.canSendMessage = false; + for (let element of transmitSource) { + let content = common.string.EMPTY_STR; + if (isSource && !element.isMsm) { + content = element.contentInfo + element.content; + } else { + content = element.content; + } + let actionData = { + content: content, + mmsSource: element.mms, + msgUriPath: element.msgUriPath + }; + this.delayTransmitSend(actionData, element.isMsm); + } + }, + mmsTransmitSend() { + let mmsSource = this.$app.$def.mmsSource; + let content = this.$app.$def.transmitContent; + let actionData = { + mmsSource: mmsSource, + content: content, + msgUriPath: common.string.EMPTY_STR + }; + this.delayTransmitSend(actionData, this.isEditMms); + }, + delayTransmitSend(element, isMms) { + setTimeout(() => { + this.sendSms(element.content, element.msgUriPath, isMms, element.mmsSource); + }, 500); + }, + // 判断联系人是否存在 + judgeContactExists() { + let telephones = [this.strContactsNumber]; + let actionData = { + telephones: telephones, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + }; + conversationService.judgeContactExists(actionData, result => { + this.hasExitContract = result; + }); + if (this.strContactsName == common.string.EMPTY_STR) { + this.hasExitContract = false; + } else { + this.hasExitContract = true; + } + }, + // 查询信息会话列表 + queryMessageDetail(telephone, threadId) { + mmsLog.info('JS_conversation: queryMessageDetail,start'); + let actionData = {}; + if (telephone != common.string.EMPTY) { + actionData.telephone = telephone; + } + if (threadId != common.string.EMPTY) { + actionData.threadId = threadId; + } + actionData.featureAbility = this.$app.$def.featureAbility; + actionData.ohosDataAbility = this.$app.$def.ohosDataAbility; + actionData.contactsNum = this.contactsNum; + conversationService.queryMessageDetail(actionData, result => { + if (result.code == common.int.SUCCESS) { + this.dealMessageDetailTime(result); + this.dealMessageDetailContent(result); + if (this.mmsList.length == 0 && this.isDraft) { + this.isNewMsg = true; + } + } else { + mmsLog.info('JS_conversation: queryMessageDetail(), ' + 'Error: queryAllMessages() failed !!!'); + } + this.deleteDraftData(); + }); + }, + dealItemContent(showType, content, mmsSource) { + let strContent = content; + if (showType == common.MESSAGE_SHOW_TYPE.THEME_NO_IMAGE || showType == common.MESSAGE_SHOW_TYPE.THEME_IMAGE) { + if (content !== common.string.EMPTY_STR) { + strContent = this.$t('strings.msg_theme') + ': ' + content; + } + } else if (showType == common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE) { + strContent = (content == common.string.EMPTY_STR) ? this.$t('strings.msg_slide') : content; + } else if (showType == common.MESSAGE_SHOW_TYPE.PPT_IMAGE) { + if (mmsSource[0].msgType == common.MSG_ITEM_TYPE.THEME && content !== common.string.EMPTY_STR) { + strContent = this.$t('strings.msg_theme') + ': ' + content; + } else { + strContent = (content == common.string.EMPTY_STR) ? this.$t('strings.msg_slide') : content; + } + } + return strContent; + }, + dealMessageDetailContent(result) { + for (let item of result.response) { + item.content = this.dealItemContent(item.msgShowType, item.content, item.mms); + } + }, + getMmsDataSource(mmsSource, first) { + this.pptTotalCount = (first.msgType == common.MSG_ITEM_TYPE.THEME) ? -1 : 0; + let mms = []; + let textareas = []; + mmsSource.forEach((source, index) => { + this.pptTotalCount ++; + let mmsObj = null; + if (source.msgType == common.MSG_ITEM_TYPE.AUDIO || + source.msgType == common.MSG_ITEM_TYPE.IMAGE || + source.msgType == common.MSG_ITEM_TYPE.VIDEO) { + mmsObj = { + type: source.msgType, + uriPath: source.msgUriPath, + time: source.time, + index: this.pptTotalCount, + fileSize: first.fileSize + }; + mms.push(mmsObj); + } + let placeholder = this.$t('strings.enter_text'); + if (source.msgType == common.MSG_ITEM_TYPE.THEME) { + placeholder = this.$t('strings.msg_theme'); + } else if (mmsSource[0].msgType == common.MSG_ITEM_TYPE.THEME && mmsSource.length == 2) { + if (mmsObj) { + placeholder = this.$t('strings.msg_note_mms2'); + } else { + placeholder = this.$t('strings.msg_note_mms'); + } + this.pptTotalCount = 0; + } + let obj = { + textValue: source.content, + placeholder: placeholder, + pptIndex: this.pptTotalCount, + mms: mmsObj + }; + textareas.push(obj); + }); + this.mmsEditList = mms; + this.textareaDatasource = textareas; + }, + setMmsDataSource(mmsSource) { + this.mmsEditList = []; + this.textareaDatasource = []; + let first = mmsSource[0]; + this.messageType = first.messageType; + if (this.messageType == common.MESSAGE_TYPE.NORMAL) { + let arr = []; + mmsSource.forEach(item => { + let obj = { + type: item.msgType, + uriPath: item.msgUriPath, + time: item.time, + fileSize: item.fileSize + } + arr.push(obj); + }); + this.mmsEditList = arr; + } else { + this.getMmsDataSource(mmsSource, first); + } + }, + dealMessageDetailTime(result) { + if(result.response && result.response.length > 0) { + let dateUtil = this.$app.$def.dateUtil; + let resultList = []; + for (let item of result.response) { + item.timeMillisecond = parseInt(item.timeMillisecond); + dateUtil.convertTimeStampToDateWeek(item, false, this); + dateUtil.convertDateFormatForItem(item, false, this); + if(item.sendStatus == common.int.SEND_DRAFT) { + this.dealDraftData(item); + } else { + resultList.push(item); + } + } + this.mmsList = resultList; + } + }, + dealDraftData(item) { + this.isDraft = true; + this.draftContent = item.content; + this.draftGroupId = item.groupId; + this.setDraft(); + if (item.isMsm) { + this.isEditMms = true; + this.setMmsDataSource(item.mms); + } else { + this.messageType = common.MESSAGE_TYPE.NORMAL; + } + }, + // 设置发送状态 + setCanSendMsgStatus() { + if (this.receiveContactValue == common.string.EMPTY && this.selectContacts && this.selectContacts.length == 0) { + this.canSendMessage = false; + } + }, + initSendTip() { + if (this.isEditMms) { + // 彩信 + this.getCurEdtFileSize(); + this.canSendMessage = true; + // 新建页面 收件人是否未空 + if (this.isNewMsg) { + this.setCanSendMsgStatus(); + } + this.msgSendTip = this.curEdtFileSize + COMMON_FILE_SIZE_STRING; + return; + } + this.setSmsTip(this.textValue); + }, + setSmsTip(str) { + // 设置短信提示信息 + let len = str.length; + let msgSize; + let curCanInputSize; + if (len == 0) { + this.canSendMessage = false; + this.msgSendTip = common.string.EMPTY_STR; + return; + } else { + this.canSendMessage = this.haveSimCard && !this.isFlightMode; + mmsLog.info('setSmsTip, canSendMessage:' + this.canSendMessage + 'haveSimCard:' + this.haveSimCard); + } + if (this.isNewMsg) { + this.setCanSendMsgStatus(); + } + if (this.checkChinese(str)) { + msgSize = Math.ceil(len / 70); + curCanInputSize = len % 70 == 0 ? 0 : 70 - len % 70; + } else { + msgSize = Math.ceil(len / 160); + curCanInputSize = len % 160 == 0 ? 0 : 160 - len % 160; + } + this.msgSendTip = curCanInputSize + '/' + msgSize; + }, + // 获取当前彩信编辑的文件大小 + getCurEdtFileSize() { + this.curEdtFileSize = 0; + if (!this.isEditMms || this.mmsEditList.length == 0) { + return; + } + for (let element of this.mmsEditList) { + this.curEdtFileSize += element.fileSize; + } + }, + // 判断字符串是否包含中文 + checkChinese(str) { + return escape(str).indexOf('%u') != -1; + }, + onBackPress() { + // 系统返回键,true代表拦截 + if (this.tabSlideStatus != 0) { + // tab全屏 + this.restoreTabSlideStatus(); + return true; + } + if (this.isShowMoreOperation) { + // tab显示状态 + this.setTabOperationStatus(false); + this.distanceBottomFlag = false; + return true; + } + if (this.isSelectStatus) { + // 多选状态 + this.isSelectStatus = false; + this.cancleCheckedAll(); + return true; + } + let source = this.getMmsSource(); + // 不存在草稿或者需要更新草稿的操作 + this.insertAndUpdateSessionDraft(source); + // 存在草稿的情况下,需要做下面的操作 + this.dealSessionDraft(source); + return false; + }, + titleBarBack() { + if (this.tabSlideStatus != 0) { + // tab全屏 + this.restoreTabSlideStatus(); + return; + } + if (this.isShowMoreOperation) { + // tab显示状态 + this.setTabOperationStatus(false); + this.distanceBottomFlag = false; + return; + } + if (this.isSelectStatus) { + // 多选状态 + this.isSelectStatus = false; + this.cancleCheckedAll(); + return; + } + let source = this.getMmsSource(); + // 不存在草稿或者需要更新草稿的操作 + this.insertAndUpdateSessionDraft(source); + // 存在草稿的情况下,需要做下面的操作 + this.dealSessionDraft(source); + router.back(); + }, + insertAndUpdateSessionDraft(source) { + let preferences = this.$app.$def.preferences; + let hasReport = settingService.judgeIsDeliveryReport(preferences, this.isEditMms); + let hasAttachment = commonService.judgeIsAttachment(source); + let actionData = { + receiveContactValue: common.string.EMPTY_STR, + selectContacts: [], + content: this.textValue, + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + isReceive: false, + ownNumber: common.string.EMPTY_STR, + isSender: 0, + hasDraft: 1, + hasReport: hasReport, + isMms : this.isEditMms, + mmsSource: source, + ohosDataAbility: this.$app.$def.ohosDataAbility, + groupId: this.draftGroupId, + messageType: this.messageType, + hasAttachment: hasAttachment + } + let conversationListService = this.$app.$def.conversationListService; + // 新建页面 草稿数据,需要进行保存 + if (this.isNewMsg && (this.textValue != common.string.EMPTY_STR || source.length !== 0)) { + actionData.isNewMsg = true; + // 如果选择联系人不为空 + if (this.selectContacts.length > 0) { + actionData.selectContacts = this.selectContacts; + conversationListService.insertSessionDraft(actionData); + } + // 如果收件人输入栏不为空 + else if (this.receiveContactValue != common.string.EMPTY_STR) { + actionData.receiveContactValue = this.receiveContactValue; + conversationListService.insertSessionDraft(actionData); + } + } + // 这里不是新建的场景 + else if (this.textValue != common.string.EMPTY_STR || source.length !== 0) { + actionData.isNewMsg = false; + actionData.telephone = this.strContactsNumber; + conversationListService.insertSessionDraft(actionData); + } + }, + dealSessionDraft(source) { + // 新建存在草稿,只要选择的联系人或者内容为空,就要将草稿删除 + if (this.isNewMsg && this.isDraft) { + if ((this.selectContacts.length == 0 && this.receiveContactValue == common.string.EMPTY_STR) + || (this.textValue == common.string.EMPTY_STR && source.length == 0)) { + let conversationListService = this.$app.$def.conversationListService; + let rdbStore = this.$app.$def.rdbStore; + let threadIds = [this.threadId]; + conversationListService.deleteMessageBySessionId(rdbStore, threadIds); + this.deleteDraftData(); + } + } + + // 设置草稿逻辑,文本内容为空,并且不是新建页面,需要更新会话列表数据 + if (!this.isNewMsg && this.isDraft && (this.textValue == common.string.EMPTY_STR && source.length == 0)) { + // 先查询出列表中最后一个内容 + let length = this.mmsList.length; + let item = this.mmsList[length - 1]; + // 在更新列表数据 + let threadIds = [this.threadId]; + let time = new Date(); + let content = item.content; + let hasAttachment = false; + if(item.isMsm) { + content = commonService.getMmsContent(item.mms); + hasAttachment = commonService.judgeIsAttachment(source); + } + let valueBucket = { + 'content': item.content, + 'has_draft': 0, + 'time': time.getTime(), + 'has_mms': item.isMsm ? 1 : 0, + 'has_attachment': hasAttachment ? 1 : 0 + } + let conversationListService = this.$app.$def.conversationListService; + let rdbStore = this.$app.$def.rdbStore; + conversationListService.updateById(rdbStore, threadIds, valueBucket); + this.deleteDraftData(); + this.isDraft = false; + } + }, + // 点击联系人头像,跳转至联系人详情 + titleBarAvatar() { + var actionData = { + phoneNumber: this.strContactsNumber, + pageFlag: common.contractPage.PAGE_FLAG_CONTACT_DETAILS + }; + this.jumpToContract(actionData); + }, + mmsListLongPress(index) { + if (this.isSelectStatus) { + this.mmsList[index].isCbChecked = !this.mmsList[index].isCbChecked; + this.setMessageCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + return; + } + this.hasContent = false; + this.hasImage = false; + let item = this.mmsList[index]; + let menuId = common.string.EMPTY_STR; + if (item.isMsm) { + this.setGroupMoreMenu(item); + menuId = 'menu_long_press_mms'; + } else { + menuId = 'menu_long_press'; + } + this.mmsIndex = index; + setTimeout(() => { + this.$element(menuId).show({ + x: this.rawX, + y: this.rawY + }); + },100); + }, + msgSendBarMore() { + this.setTabOperationStatus(!this.isShowMoreOperation); + if (this.isShowMoreOperation) { + this.distanceBottomFlag = true; + if (this.tabIndex == 1) { + this.queryFromGallery(); + } + } else { + this.distanceBottomFlag = false; + } + this.$element('isInputMethod').focus({ + focus: false + }); + setTimeout(() => { + this.$element('conversationList').scrollBottom({ + smooth: false + }); + }, 200); + }, + touchStart(e) { + this.rawX = e.touches[0].globalX; + this.rawY = e.touches[0].globalY; + }, + changeValue(e) { + this.isInputMethod = true; + this.textValue = e.text; + if (e.text == null || e.text == common.string.EMPTY) { + if (this.mmsEditList.length != 0) { + this.canSendMessage = true; + } else { + this.canSendMessage = false; + } + return; + } + // 是否显示全屏 + if (this.isEditMms || e.lines < 4) { + this.isShowFullScreen = false; + } else { + this.isShowFullScreen = true; + } + if (this.isNewMsg) { + if (this.receiveContactValue == '' && this.selectContacts.length == 0) { + this.canSendMessage = false; + return; + } + } + // 设置短信的提示 + this.setSmsTip(this.textValue); + }, + touchChange() { + // 点击输入栏后 更多栏关闭 + this.setTabOperationStatus(false); + this.distanceBottomFlag = false; + }, + setTabOperationStatus(flag) { + this.isShowMoreOperation = flag; + // 数值类,hml页面才会刷新 + if (flag) { + this.sendBarMarginBottom = common.int.TAB_HEIGHT; + } else { + this.sendBarMarginBottom = 0; + } + }, + isPhoneNumber(str) { + // 判断是否是数字 + let reg = /^\d{1,}$/; + let pattern = new RegExp(reg); + return pattern.test(str); + }, + send() { + mmsLog.info('JS_conversation: send button action'); + // 发送按钮置灰,不可发送信息 + if (!this.canSendMessage) { + return; + } + // 新建状态切换到会话状态 + if (this.isNewMsg) { + this.newSend(); + } + this.isSendStatus = true; + // 发送文本 + if (this.textValue != common.string.EMPTY || this.mmsEditList.length != 0 || + this.textareaDatasource.length != 0) { + this.initSendItem(); + } + let actionData = { + slotId: this.slotId, + destinationHost: this.strContactsNumber, + content: this.textValue, + isEditMms: this.isEditMms + }; + // 真实的发送短信 + this.sendInterval(actionData, this.mmsList); + this.textValue = common.string.EMPTY_STR; + this.canSendMessage = false; + this.isShowFullScreen = false; + this.clearMsm(); + this.resetMmsSource(); + this.setTabOperationStatus(false); + this.distanceBottomFlag = false; + this.receiveContactValue = common.string.EMPTY_STR; + this.selectContacts = []; + }, + resetMmsSource() { + this.textareaDatasource = []; + this.mmsEditList = []; + this.pptTotalCount = 0; + this.messageType = common.MESSAGE_TYPE.NORMAL; + this.selectedTextareaIdx = -1; + }, + deleteDraftData() { + if (this.isDraft && this.draftGroupId > 0) { + let groupIds = [this.draftGroupId]; + this.deleteMessageByGroupIds(groupIds); + this.draftGroupId = 0; + } + }, + getThemeContent() { + this.isEditMms = true; + let content = ''; + let first = this.textareaDatasource[0].textValue; + let text = this.textareaDatasource[1].textValue; + if (first !== common.string.EMPTY_STR) { + content = this.$t('strings.msg_theme') + ': ' + first; + } + if (text !== common.string.EMPTY_STR) { + if (content === common.string.EMPTY_STR) { + content = text; + } else { + content = content + '\n' + text; + } + } + return content; + }, + getPPTType() { + let type = common.MESSAGE_SHOW_TYPE.NORMAL; + if (this.messageType === common.MESSAGE_TYPE.NORMAL && this.mmsEditList.length > 0) { + type = common.MESSAGE_SHOW_TYPE.PPT_IMAGE; + } else { + let firstMms = null; + if (this.messageType === common.MESSAGE_TYPE.THEME && this.mmsEditList.length > 1) { + firstMms = this.mmsEditList[0]; + } else if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) { + firstMms = this.textareaDatasource[1].mms; + } else { + firstMms = this.textareaDatasource[0].mms; + } + if (this.mmsEditList.length >= 1 && firstMms && + (firstMms.type === common.MSG_ITEM_TYPE.IMAGE || firstMms.type === common.MSG_ITEM_TYPE.VIDEO)) { + type = common.MESSAGE_SHOW_TYPE.PPT_IMAGE; + } else { + type = common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE; + } + } + return type; + }, + getMsgShowType(item) { + let type = common.MESSAGE_SHOW_TYPE.NORMAL; + let slideString = this.$t('strings.msg_slide'); + if (this.messageType === common.MESSAGE_TYPE.NORMAL && this.mmsEditList.length <= 1) { + type = common.MESSAGE_SHOW_TYPE.NORMAL; + item.content = this.textValue; + } else if (this.messageType === common.MESSAGE_TYPE.THEME && this.mmsEditList.length === 1) { + type = common.MESSAGE_SHOW_TYPE.THEME_IMAGE; + item.content = this.getThemeContent(); + } else { + type = this.getgetMsgShowTypePpt(item, slideString); + } + if (type == common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE || type == common.MESSAGE_SHOW_TYPE.PPT_IMAGE) { + if (item.content == common.string.EMPTY_STR) { + item.content = slideString; + } + } + return type; + }, + getgetMsgShowTypePpt(item, slideString) { + let type = common.MESSAGE_SHOW_TYPE.NORMAL; + let hasSource = this.textareaDatasource.length > 0 ? true : false; + let firstStr = hasSource ? this.textareaDatasource[0].textValue : common.string.EMPTY_STR; + if (this.mmsEditList.length === 0) { + type = common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE; + if (this.messageType === common.MESSAGE_TYPE.THEME || + this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) { + item.content = this.getThemeContent(); + } else { + item.content = (firstStr == common.string.EMPTY_STR) ? slideString : firstStr; + } + } else { + type = this.getPPTType(); + this.getgetMsgShowTypeContent(item, firstStr, slideString); + } + return type; + }, + getgetMsgShowTypeContent(item, firstStr, slideString) { + if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT || + this.messageType === common.MESSAGE_TYPE.THEME) { + item.content = this.getThemeContent(); + } else { + let content = common.string.EMPTY_STR; + if (this.messageType === common.MESSAGE_TYPE.NORMAL) { + content = (this.textValue == common.string.EMPTY_STR) ? slideString : this.textValue; + } else { + content = (firstStr == common.string.EMPTY_STR) ? slideString : firstStr; + } + item.content = content; + } + }, + getMmsSourceByTheme(sources, item, mms) { + if (this.mmsEditList.length === 1) { + let first = this.mmsEditList[0]; + sources.unshift({ + msgType: first.type, + msgUriPath: first.uriPath, + content: item.textValue, + time: first.time, + fileSize: first.fileSize + }); + } else { + this.getMmsSourceByItem(sources, mms); + } + let arr = JSON.parse(JSON.stringify(sources)); + return arr; + }, + getMmsSourceByItem(sources, mms) { + this.mmsEditList.forEach((list, i) => { + if (i === 0) { + mms.msgType = list.type; + mms.msgUriPath = list.uriPath; + mms.time = list.time; + mms.fileSize = list.fileSize; + } else { + let mmsObj = { + msgType: list.type, + msgUriPath: list.uriPath, + content: common.string.EMPTY_STR, + time: list.time, + fileSize: list.fileSize + }; + sources.push(mmsObj); + } + }); + }, + getMmsSourceFromDataSource() { + let sources = []; + this.textareaDatasource.forEach((item, index) => { + let mms = { + msgType: common.MSG_ITEM_TYPE.TEXT, + msgUriPath: '', + content: item.textValue, + time: '', + fileSize: 0 + }; + if (index === 0 && (this.messageType === common.MESSAGE_TYPE.THEME || + this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT)) { + mms.msgType = common.MSG_ITEM_TYPE.THEME; + sources.push(mms); + } else if (this.messageType === common.MESSAGE_TYPE.THEME) { + sources.push(mms); + sources = this.getMmsSourceByTheme(sources, item, mms); + } else { + if (item.mms) { + mms.msgType = item.mms.type; + mms.msgUriPath = item.mms.uriPath; + mms.time = item.mms.time; + mms.fileSize = item.mms.fileSize; + } + sources.push(mms); + } + }); + return sources; + }, + dealTextareaDataSource() { + if (this.messageType == common.MESSAGE_TYPE.THEME) { + let first = this.textareaDatasource[0]; + if (first.textValue == common.string.EMPTY_STR) { + this.messageType = common.MESSAGE_TYPE.NORMAL; + this.textValue = this.textareaDatasource[1].textValue; + this.textareaDatasource = []; + } + } + }, + getMmsSource() { + let sources = []; + this.dealTextareaDataSource(); + if (this.messageType === common.MESSAGE_TYPE.NORMAL) { + sources = this.dealMmsEditList(); + } else { + sources = this.getMmsSourceFromDataSource(); + } + return sources; + }, + dealMmsEditList() { + let sources = []; + if (this.mmsEditList.length != 0) { + this.mmsEditList.forEach((item, index) => { + let mms = { + msgType: item.type, + msgUriPath: item.uriPath, + content: common.string.EMPTY_STR, + time: item.time, + fileSize: item.fileSize + } + if (index === 0) { + mms.content = this.textValue; + } + sources.push(mms); + }); + } + return sources; + }, + initSendItem(){ + // 获取当天是星期几 + let item = {}; + let dataUtil = this.$app.$def.dateUtil; + item.date = common.string.EMPTY_STR; + item.time = this.$t('strings.just_now'); + item.timeMillisecond = new Date().getTime(); + dataUtil.convertTimeStampToDateWeek(item, false, this); + item.content = this.textValue; + item.msgType = this.mmsEditList.length != 0 ? this.mmsEditList[0].type : common.MSG_ITEM_TYPE.TEXT; + item.isFullScreenImg = false; + item.msgUriPath = this.mmsEditList.length != 0 ? this.mmsEditList[0].uriPath : common.string.EMPTY_STR; + let time = (this.mmsEditList.length != 0 && (this.mmsEditList[0].type == 3 || this.mmsEditList[0].type == 5)) ? + this.mmsEditList[0].time : common.string.SUCCESS; + item.audioTime = time; + item.isCbChecked = false; + item.isLock = false; + item.isStared = false; + item.isReceive = false; + item.sendStatus = 1; + item.cancelTimeCount = common.int.CANCEL_TIME_COUNT; + item.subId = this.slotId; + item.mmsEditListTemp = this.mmsEditList; + if (this.contactsNum > 1) { + item.completeNumber = 0; + item.failuresNumber = 0; + } + let preferences = this.$app.$def.preferences; + item.hasReport = settingService.judgeIsDeliveryReport(preferences, item.isMsm); + item.msgShowType = this.getMsgShowType(item); + item.mmsSource = this.getMmsSource(); + item.isMsm = this.isEditMms; + this.mmsList.push(item); + }, + clearMsm() { + if (this.isEditMms) { + this.isEditMms = false; + } + // 删除彩信发送时候的预览图片 + if (this.mmsEditList.length != 0) { + for (let index in this.mmsEditList) { + this.updatePreview(index); + } + this.mmsEditList = []; + } + }, + deletePreview(index) { + this.updatePreview(index); + let deleteObj = this.mmsEditList[index]; + this.textareaDatasource = this.textareaDatasource.filter(item => { + if (item.mms && item.mms.index === deleteObj.index) { + item.mms = null; + } + return item; + }); + this.mmsEditList.splice(index, 1); + if (this.mmsEditList.length == 0) { + this.judgeFullScreenSend(this.textValue); + if (this.textValue == common.string.EMPTY && this.textareaDatasource.length == 0) { + this.canSendMessage = false; + } + if (this.textareaDatasource.length == 0) { + this.convertingSms(); + } + } + }, + sendInterval(actionData, mmsList) { + // 发送定时器 + let item = mmsList[mmsList.length - 1]; + if (this.recallMessagesFlag) { + item.intervalSendStatus = true; + // 点击发送按钮后,秒数倒计时定时器 + item.sendIntervalId = setInterval(function () { + item.cancelTimeCount--; + }, 1000); + // 发送定时器,超过6s发送 + item.sendTimeoutId = setTimeout(() => { + item.cancelTimeCount = 0; + // 清除定时器 + clearTimeout(item.sendTimeoutId); + clearInterval(item.sendIntervalId); + this.handleWithSend(actionData, item); + }, 6000); + } else { + this.handleWithSend(actionData, item); + } + }, + handleWithSend(actionData, item) { + // 发送请求处理 + let host = actionData.destinationHost; + let index = host.indexOf(','); + let hosts = []; + if (index == -1) { + // 单发 + hosts.push(actionData.destinationHost); + } else { + // 群发 + hosts = actionData.destinationHost.split(','); + } + this.sendMassMessage(actionData.content, item, hosts); + }, + sendMassMessage(content, item, hosts) { + let sendNumber = hosts; + this.insertInitData(sendNumber, content, item, result => { + mmsLog.info('sendMassMessage, insertInitData:' + result); + // 处理发送的结果 + this.threadId = result.rowId; + item.groupId = result.groupId; + item.id = result.initDatas[0].id; + // 发送及处理发送结果 + this.dealSendResult(sendNumber, content, item, result.initDatas); + }); + }, + insertInitData(sendNumber, content, item, callback) { + let insertSendResults = []; + for (let i = 0; i < sendNumber.length; i++) { + let sendResult = { + telephone: sendNumber[i], + content: content, + sendStatus: 1 + } + if(item.isMsm) { + let commonService = this.$app.$def.commonService; + sendResult.content = commonService.getMmsContent(item.mmsSource); + } + insertSendResults.push(sendResult); + } + let preferences = this.$app.$def.preferences; + let hasReport = settingService.judgeIsDeliveryReport(preferences, item.isMsm) ? 1 : 0; + let hasAttachment = commonService.judgeIsAttachment(item.mmsSource); + let actionData = { + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + sendResults: insertSendResults, + isReceive: false, + ownNumber: common.string.EMPTY_STR, + isSender: 0, + hasDraft: this.isDraft, + hasReport: hasReport, + isMms : item.isMsm, + mmsSource: item.mmsSource, + hasAttachment: hasAttachment + } + conversationService.insertSessionAndDetail(actionData, callback); + }, + dealSendResult(sendNumber, content, item, initDatas) { + // 添加发送信息到list中 + for (let i = 0; i < sendNumber.length; i++) { + let params = { + slotId: this.slotId, + destinationHost: sendNumber[i], + content: content, + }; + let id = this.getSendMessageId(initDatas, sendNumber[i]); + let sendResult = { + id: id, + telephone: sendNumber[i], + content: content, + } + let sendMsgService = this.$app.$def.sendMsgService; + let count = 0; + if(!item.isMsm) { + this.dealSmsSendResult(params, item, sendResult); + } else { + this.dealMmsSendResult(sendNumber, item, sendResult); + } + } + }, + dealSmsSendResult(params, item, sendResult) { + let sendMsgService = this.$app.$def.sendMsgService; + sendMsgService.sendMessage(params, (sendStatus) => { + mmsLog.info('sendMessage, sendStatus:' + sendStatus); + item.sendStatus = sendStatus; + if (sendStatus === common.int.SEND_MESSAGE_FAILED) { + item.failuresNumber = item.failuresNumber + 1; + } + item.completeNumber = item.completeNumber + 1; + sendResult.sendStatus = sendStatus; + // 更新发送的状态 + this.updateDetail(this.threadId, sendResult); + }); + }, + dealMmsSendResult(sendNumber, item, sendResult) { + // 彩信发送 + sendResult.sendStatus = common.int.SEND_MESSAGE_SUCCESS; + item.sendStatus = common.int.SEND_MESSAGE_SUCCESS; + this.updateDetail(this.threadId, sendResult); + // 这里会发送下彩信,用于接收使用 + if(sendNumber.length == 1 && sendResult.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { + setTimeout(() => { + this.publishData(sendResult.telephone, item.mmsSource); + }, 1000); + } + let sendMsgService = this.$app.$def.sendMsgService; + let params = { + mmsSource: item.mmsSource + }; + sendMsgService.sendMmsMessage(params, (sendStatus) => {}); + }, + publishData(telephone, mmsSource) { + let actionData = {}; + actionData.telephone = telephone; + actionData.mmsSource = mmsSource; + // 发布给谁 notification 弹窗 发出去后应用是否能接收 + mmsLog.log('conversation.js ---> receive_message.publishData start:' + actionData); + commonEvent.publish(common.string.MMS_SUBSCRIBER_EVENT, { + bundleName: common.string.BUNDLE_NAME, + isOrdered: false, + data: JSON.stringify(actionData) + }, (res) => { + mmsLog.log('receive_message.publish callback res: ' + JSON.stringify(res)); + }); + }, + updateDetail(threadId, sendResult) { + let sendResults = []; + sendResults.push(sendResult); + let actionData = { + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + sendResults: sendResults, + threadId: threadId + } + conversationService.updateSessionAndDetail(actionData); + }, + getSendMessageId(initDatas, telephone) { + for (let initData of initDatas) { + if (initData.telephone == telephone) { + return initData.id; + } + } + }, + newSend() { + mmsLog.info('newSend,selectContacts,size:' + this.selectContacts.length); + // 先校验输入的内容是否有值 + if (this.receiveContactValue != common.string.EMPTY_STR) { + if (!this.isPhoneNumber(this.receiveContactValue)) { + // 无效收件人 + this.showToast(this.$t('strings.invalid_receive', { + str: this.receiveContactValue + })); + return; + } + } + if(this.selectContacts.length > 0 && this.receiveContactValue != common.string.EMPTY_STR) { + let selectContact = { + telephone : this.receiveContactValue, + telephoneFormat: this.receiveContactValue, + contactName: common.string.EMPTY_STR + } + let selectContacts = this.selectContacts; + selectContacts.push(selectContact); + this.initNewSelectContacts(selectContacts); + } else if (this.selectContacts.length > 0) { + this.initNewSelectContacts(this.selectContacts); + } else if (this.receiveContactValue != common.string.EMPTY_STR) { + this.contactsNum = 1; + this.strContactsNumber = this.receiveContactValue; + this.strContactsNumberFormat = this.receiveContactValue; + } else { + return; + } + this.isNewMsg = false; + // 如果设置取消发送,直接设置为true + if (this.recallMessagesFlag) { + this.isNewRecallMessagesFlag = true; + this.paramContact.isNewRecallMessagesFlag = true; + } + // 当新建页面全屏跳转过来,需要获取下列表数据 + if (this.$app.$def.sendFlag) { + this.queryOldMessageList(this.strContactsNumber); + } + }, + initNewSelectContacts(selectContacts) { + let contactsNumber = common.string.EMPTY_STR; + let contactsName = common.string.EMPTY_STR; + let contactsNumberFormat = common.string.EMPTY_STR; + let contacts = telephoneUtil.dealSelectContactsSort(selectContacts); + let length = contacts.length; + for (let index in contacts) { + let item = contacts[index]; + contactsNumber = contactsNumber + item.telephone + common.string.COMMA; + contactsNumberFormat = contactsNumberFormat + item.telephoneFormat + common.string.COMMA; + if (item.contactName != common.string.EMPTY_STR) { + contactsName += (item.contactName + common.string.COMMA); + } else { + contactsName += (item.telephone + common.string.COMMA); + } + } + this.strContactsNumber = contactsNumber.substring(0, contactsNumber.length - 1); + this.strContactsName = contactsName.substring(0, contactsName.length - 1); + this.strContactsNumberFormat = contactsNumberFormat.substring(0, contactsNumberFormat.length - 1); + this.contactsNum = length; + }, + changeTabs(e) { + this.tabIndex = e.index; + this.setTabTitleText(); + if (this.tabIndex == common.MESSAGE_TAB_INDEX.TAB_AUDIO) { + this.setRecordingStatus(false); + } else if (this.tabIndex == common.MESSAGE_TAB_INDEX.TAB_PICTURE) { + this.queryFromGallery(); + } + }, + setRecordingStatus(flag) { + this.isRecordingStatus = flag; + }, + // 双击取消发送或者进入选择文本 + intentTextSelect(index) { + let element = this.mmsList[index]; + // 双击取消发送 + if (this.recallMessagesFlag && element.cancelTimeCount > 0) { + if (!this.doubleClickStatus) { + this.doubleClickStatus = true; + setTimeout(() => { + this.doubleClickStatus = false; + }, 500); + return; + } else { + this.textValue = element.content; + if (this.textValue != common.string.EMPTY && !element.isMsm) { + this.judgeFullScreenSend(this.textValue); + } + this.mmsList.splice(index, 1); + // 如果列表数据为空,并且是从新建页面传递过来的,返回新建页面 + this.dealNewRecallMessagesFlag(this.mmsList); + // 将彩信的数据进行展示 + if (element.isMsm) { + // 在这里进行数据填充 + this.setMmsDataSource(element.mmsSource); + this.isEditMms = true; + } + // 清除定时器 + clearTimeout(element.sendTimeoutId); + clearInterval(element.sendIntervalId); + this.judgeSendBtnCanClicked(); + } + } + if (this.isSelectStatus) { + this.mmsList[index].isCbChecked = !this.mmsList[index].isCbChecked; + this.setMessageCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + return; + } + if (!this.isClickStatus) { + this.isClickStatus = true + setTimeout(() => { + this.isClickStatus = false; + }, 500); + return; + } + router.push({ + uri: 'pages/text_select/text_select', + params: this.mmsList[index] + }) + }, + setSelectStatus(isSelect) { + this.isSelectStatus = isSelect; + }, + copyText() { + commonPasteboard.setPasteboard(this.mmsList[this.mmsIndex].content); + }, + gotoTextSelect(idx) { + router.push({ + uri: 'pages/text_select/text_select', + params: this.mmsList[idx] + }) + }, + longPressSelected(e) { + var index = parseInt(e.value); + switch (index) { + case 0: + // 复制 + this.copyText(); + break; + case 1: + // 转发 + this.transmitMsgSingle(); + break; + case 2: + // 删除 + this.deleteDialogShow(); + break; + case 3: + // 选择文本 + this.gotoTextSelect(this.mmsIndex); + break; + case 4: + // 更多 + this.more(); + break; + case 5: + // 保存 + this.saveImage(); + break; + default: + break; + } + }, + saveImage() { + var actionData = {}; + actionData.threadId = this.mmsList[this.mmsIndex].threadId; + actionData.pduId = this.mmsList[this.mmsIndex].pduId; + conversationService.saveImage(actionData, result => { + this.showToast(result); + }); + }, + // 单条转发 + transmitMsgSingle() { + // 单条信息转发 + let item = this.mmsList[this.mmsIndex]; + let transmitObj = {}; + let contactsName = common.string.EMPTY_STR; + if (this.strContactsName && this.strContactsName != common.string.EMPTY_STR) { + contactsName = this.$t('strings.transmitContentReceive', { + name: this.strContactsName + }); + } else { + contactsName = this.$t('strings.transmitContentReceive', { + name: this.strContactsNumberFormat + }); + } + transmitObj.contactsName = contactsName; + transmitObj.isMsm = item.isMsm; + transmitObj.msgShowType = item.msgShowType; + transmitObj.mms = item.mms; + transmitObj.content = item.content; + transmitObj.msgUriPath = item.msgUriPath ? item.msgUriPath : common.string.EMPTY_STR; + transmitObj.contentInfo = common.string.EMPTY_STR; + transmitObj.msgType = item.msgType; + let transmitContentList = []; + transmitContentList.push(transmitObj); + let transmitContent = item.isReceive ? contactsName : this.$t('strings.transmitContent'); + this.jumpTransmitMsg(transmitContent, transmitContentList, item.isMsm); + }, + // 多条信息转发 + transmitMsg() { + let contactsName = common.string.EMPTY_STR; + let transmitContent = common.string.EMPTY_STR; + if (this.strContactsName && this.strContactsName != common.string.EMPTY_STR) { + contactsName = this.$t('strings.transmitContentReceive', { + name: this.strContactsName + }); + transmitContent = this.$t('strings.transmitContentMulti', { + name: this.strContactsName + }); + } else { + contactsName = this.$t('strings.transmitContentReceive', { + name: this.strContactsNumberFormat + }); + transmitContent = this.$t('strings.transmitContentMulti', { + name: this.strContactsNumberFormat + }); + } + let transmitResult = this.getTransmitContentList(contactsName); + + if (this.isMessageCheckAll) { + this.isMessageCheckAll = false; + } + this.jumpTransmitMsg(transmitContent, transmitResult.transmitContentList, transmitResult.isMms); + }, + getTransmitContentList(contactsName) { + let result = {}; + let transmitContentList = []; + let today = this.$t('strings.today'); + let yesterday = this.$t('strings.yesterday'); + for (let element of this.mmsList) { + let transmitContentArray = {}; + if (element.isCbChecked) { + let date = element.date.substring(0, element.date.length - 3); + if (date == today || date == yesterday) { + let time = element.timeMillisecond; + date = this.getTime(time); + } + transmitContentArray.msgUriPath = element.msgUriPath ? element.msgUriPath : common.string.EMPTY_STR; + transmitContentArray.date = date; + transmitContentArray.content = element.content; + if (element.isReceive) { + transmitContentArray.contactsName = contactsName; + } else { + transmitContentArray.contactsName = this.$t('strings.transmitContentMe'); + } + transmitContentArray.mms = element.mms; + transmitContentArray.msgShowType = element.msgShowType; + transmitContentArray.time = element.time; + transmitContentArray.isMsm = element.isMsm; + transmitContentArray.contentInfo = common.string.EMPTY_STR; + transmitContentArray.msgType = element.msgType; + transmitContentArray.audioTime = element.audioTime + transmitContentList.push(transmitContentArray); + } + } + result.transmitContentList = transmitContentList; + return result; + }, + jumpTransmitMsg(transmitContent, transmitContentList, isMms) { + router.push({ + uri: 'pages/transmit_msg/transmit_msg', + params: { + doubleCard: this.cardImage, + transmitContent: transmitContent, + transmitContentList: transmitContentList, + isMulti: true, + isMms: isMms, + isMyStartPage: false + } + }); + }, + // 删除弹框提示 + deleteDialogShow() { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip1'); + this.hasLockMsg = this.mmsList[this.mmsIndex].isLock; + this.$element('delete_dialog').show(); + }, + // 更多 + more() { + this.setTabOperationStatus(false); + this.distanceBottomFlag = false; + let item = this.mmsList[this.mmsIndex]; + item.isCbChecked = !item.isCbChecked; + this.setSelectStatus(true); + this.hasDetailDelete = false; + this.setMessageCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + this.hasReport = item.hasReport; + this.setGroupMoreMenu(item); + }, + setGroupMoreMenu(item) { + if(!item.isMsm) { + this.hasContent = true; + return; + } + let commonService = this.$app.$def.commonService; + this.hasContent = commonService.judgeIsSelectText(item.mms); + this.hasImage = commonService.judgeIsImage(item.mms); + if(item.isMsm && item.mms.length == 1 && item.mms[0].type == common.MSG_ITEM_TYPE.CARD) { + this.hasVcard = true; + } else { + this.hasVcard = false; + } + }, + longPressMore(e) { + var index = parseInt(e.value); + switch (index) { + case 0: + // 删除 + this.deleteDetail(); + break; + case 1: + // 新建联系人 + this.createNewContract(this.strContactsNumber); + break; + case 2: + // 保存至已有联系人 + this.existingContact(this.strContactsNumber); + break; + case 3: + // 呼叫前编辑 + this.callEditor(this.strContactsNumber); + break; + case 4: + // 加入黑名单 + this.callEditor(this.strContactsNumber); + break; + case 5: + // 查看联系人 + this.titleBarAvatar(); + break; + default: + break; + } + }, + longPressGroupMore(e) { + var index = parseInt(e.value); + switch (index) { + case 0: + // 删除 + this.deleteDetail(); + break; + case 1: + // 跳转至收件人页面 + router.push({ + uri: 'pages/group_detail/group_detail', + params: { + contactsNum: this.contactsNum, + threadId: this.threadId + } + }); + break; + default: + break; + } + }, + // 删除 + deleteDetail() { + if (this.mmsList.length == 1) { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip3'); + this.$element('delete_dialog').show(); + } else { + this.hasDetailDelete = true; + this.isSelectStatus = true; + } + }, + // 新建联系人 + createNewContract(number) { + var actionData = {}; + actionData.phoneNumber = number; + actionData.pageFlag = common.contractPage.PAGE_FLAG_SAVE_CONTACT; + this.jumpToContract(actionData); + }, + // 呼叫前编辑 + callEditor(number) { + var actionData = {}; + actionData.phoneNumber = number; + actionData.pageFlag = common.contractPage.PAGE_FLAG_EDIT_BEFORE_CALLING; + this.jumpToContract(actionData); + }, + // 保存联系人 + existingContact(number) { + var actionData = {}; + actionData.phoneNumber = number; + actionData.pageFlag = common.contractPage.PAGE_FLAG_SAVE_EXIST_CONTACT; + this.jumpToContract(actionData); + }, + jumpGroupDetail(index) { + router.push({ + uri: 'pages/group_detail/group_detail', + params: { + contactsNum: this.contactsNum, + threadId: this.threadId, + groupId: this.mmsList[index].groupId, + time: this.mmsList[index].time, + isDetail: this.isDetail, + content: this.mmsList[index].content, + slotId: this.slotId + } + }); + }, + // 在选择状态下,点击'更多'后弹出menu,然后选择 + moreSelected(e) { + switch (e.value) { + case '0': + // 复制 + this.copyText(); + break; + case '1': + // 分享 + this.share(); + break; + case '2': + // 选择文本 + this.gotoTextSelect(this.mmsIndex); + break; + case '3': + // 锁定 + this.lock(); + break; + case '4': + // 显示详情 + this.showDetails(); + break; + case '5': + // 取消锁定 + this.unlock(); + break; + case '6': + // 查看报告 + this.showReport(this.mmsIndex); + break; + case '7': + // 保存附件 + this.saveImage(); + break; + case '8': + // 查询vCard详情 + this.showVcarDetail(this.mmsIndex); + break; + default: + break; + } + // 退出多选模式 + this.exitMultiselect(); + }, + share() { + for (let i = 0; i < this.mmsList.length; i++) { + if (this.mmsList[i].isCbChecked == true) { + var actionData = {}; + actionData.content = this.mmsList[i].content; + conversationService.gotoShare(actionData, function (data) { + mmsLog.info('JS_conversation: ' + 'sendMessage......titleBarAvatar'); + }); + } + } + }, + lock() { + this.updateLock(true); + }, + unlock() { + this.updateLock(false); + }, + updateLock(isLock) { + // 选择内容锁定 + let groupIds = []; + for (let element of this.mmsList) { + if (element.isCbChecked) { + element.isLock = isLock; + groupIds.push(element.groupId); + } + } + let hasLock = isLock ? 1 : 0; + let actionData = { + groupIds: groupIds, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + hasLock: hasLock + }; + let that = this; + conversationService.updateLock(actionData, function (result) { + if (result.code == common.int.SUCCESS) { + // 多选状态关闭 + that.isSelectStatus = false; + that.cancleCheckedAll(); + mmsLog.info('Success: updateLock()'); + } else { + mmsLog.info('Error: updateLock(() failed !!!'); + } + }); + // 更新锁定状态 + this.updateSessionLock(isLock); + }, + // 更新会话列表的锁状态 + updateSessionLock(isLock) { + let threadIds = [this.threadId]; + let hasLock = isLock ? 1 : 0; + let valueBucket = { + 'has_lock': hasLock, + } + if (!isLock) { + // 如果是取消锁定,必须是全部取消锁定,才可以将状态进行解锁 + let unlockCount = 0; + for (let element of this.mmsList) { + if (!element.isLock) { + unlockCount++; + } + } + if (unlockCount != this.mmsList.length) { + mmsLog.log('updateSessionLock, it is not all select unlock'); + return; + } + } + // 如果是锁定,将状态更新为锁定 + let rdbStore = this.$app.$def.rdbStore; + let conversationListService = this.$app.$def.conversationListService; + conversationListService.updateById(rdbStore, threadIds, valueBucket); + }, + showDetails() { + for (let index = 0; index < this.mmsList.length; index++) { + if (this.mmsList[index].isCbChecked == true) { + var time = this.mmsList[index].timeMillisecond; + var timeStash = this.getTime(time); + this.mmsTime = timeStash + this.mmsList[index].time; + if (this.mmsList[index].msgType == 0) { + this.isMmsType = this.$t('strings.sms'); + } else { + this.isMmsType = this.$t('strings.mms'); + } + + if (this.mmsList[index].isReceive) { + this.isSendRecipient = true; + } else { + this.isSendRecipient = false; + } + } + } + this.$element('mms_details_dialog').show(); + }, + showReport(mmsIndex) { + // 查看报告 + let item = this.mmsList[mmsIndex]; + router.push({ + uri: 'pages/query_report/query_report', + params: { + isMsm: item.isMsm, + telephone: this.strContactsNumber, + sendStatus: item.sendStatus, + timeMillisecond: item.timeMillisecond + }, + }); + }, + showVcarDetail(mmsIndex) { + + }, + exitMultiselect() { + // 退出多选状态 + this.isSelectStatus = false; + this.cancleCheckedAll(); + }, + titleBarCancel() { + // 取消按钮 + this.cancleCheckedAll(); + this.setSelectStatus(false); + }, + listCheckBoxChange(index, e) { + mmsLog.info('JS_conversation: ' + 'listCheckBoxChange index:' + index); + let item = this.mmsList[index]; + item.isCbChecked = e.checked; + this.mmsIndex = index; + this.hasReport = item.hasReport; + this.setMessageCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + if(this.selectDeleteMsgCount == 1) { + let item; + for (let element of this.mmsList) { + if (element.isCbChecked) { + item = element; + break; + } + } + if(item != null) { + this.setGroupMoreMenu(item); + } + } + }, + clickGroupDelete() { + if (this.selectDeleteMsgCount == 0) { + return; + } + if (this.selectDeleteMsgCount == 1) { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip1'); + } else if (this.selectDeleteMsgCount == this.mmsList.length) { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip3'); + } else { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip2', { + number: this.selectDeleteMsgCount + }); + } + this.hasLockMsg = (this.mmsList.some((element, index) => element.isCbChecked && element.isLock)); + this.$element('delete_dialog').show(); + }, + clickGroupTransmit() { + if (this.selectDeleteMsgCount == 0) { + return; + } + this.transmitMsg(); + this.setSelectStatus(false); + }, + clickGroupStar() { + if (this.selectDeleteMsgCount == 0) { + return; + } + // 被收藏的数量 + let selectMsgCount = 0; + // 被选中的数量 + let staredMsgCount = 0; + // 被收藏的IDs + let groupIds = []; + for (let element of this.mmsList) { + if (element.isCbChecked) { + selectMsgCount++; + if (element.isStared) { + staredMsgCount++; + } else { + element.isStared = !element.isStared; + groupIds.push(element.groupId); + } + element.isCbChecked = !element.isCbChecked; + } + } + if (selectMsgCount == staredMsgCount) { + Prompt.showToast({ + message: this.$t('strings.info_is_stared'), + duration: 2000, + bottom: '150px' + }); + this.isSelectStatus = false; + this.cancleCheckedAll(); + return; + } + if (groupIds.length > 0) { + // 收藏 + this.setSelectStatus(false); + // 设置收藏标志位 + let actionData = { + groupIds: groupIds, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + hasCollect: 1 + }; + conversationService.updateCollect(actionData, function (result) { + if (result.code == common.int.SUCCESS) { + mmsLog.info('Success: updateCollect()'); + } else { + mmsLog.info('Error: updateCollect() failed !!!'); + } + }); + } + }, + clickGroupCheckAll() { + for (let element of this.mmsList) { + element.isCbChecked = !this.isMessageCheckAll; + } + if (this.isMessageCheckAll) { + this.setMessageCheckAll(common.int.CHECKBOX_SELECT_NONE); + } else { + this.setMessageCheckAll(common.int.CHECKBOX_SELECT_ALL); + } + }, + // 跳转全屏页面 + jumpFullScreen() { + router.push({ + uri: 'pages/full_screen_input/full_screen_input', + params: { + inputDetail: this.textValue, + telephone: this.strContactsNumber, + slotId: this.slotId, + haveSimCard: this.haveSimCard + }, + }); + this.$app.$def.isFromFullScreen = true; + }, + jumpEmoji() { + // 跳转笑脸 + }, + deleteDialogCancel() { + // 取消弹出 + this.$element('delete_dialog').close(); + this.isSelectLockMsg = false; + }, + tipDialogCancel() { + // 取消tip + this.$element('tip_dialog').close(); + this.mmsAddType = common.MSG_ITEM_TYPE.TEXT; + }, + tipDialogConfirm() { + if (this.mmsAddType == common.MSG_ITEM_TYPE.CARD) { + this.deleteAllPreview(); + this.mmsEditList = []; + this.clickToSelectVcard(); + } else if (this.mmsAddType == common.MSG_ITEM_TYPE.AUDIO) { + this.isVCard = false; + this.mmsEditList = []; + this.addRecordAudio(); + } else if (this.mmsAddType == common.MSG_ITEM_TYPE.IMAGE || common.MSG_ITEM_TYPE.VIDEO) { + this.isVCard = false; + this.mmsEditList = []; + this.pictureItemCheckboxOnchange(this.picItemSelectedIndex); + } + this.tipDialogCancel(); + }, + deleteDialogConfirm() { + let groupIds = []; + if (this.isSelectStatus) { + let mmsListCopy = []; + // 通过filter删除选中的item + for (let element of this.mmsList) { + if (!element.isCbChecked || (element.isLock && !this.isSelectLockMsg)) { + mmsListCopy.push(element); + } else { + groupIds.push(element.groupId); + } + } + // 设置为非多选状态 + this.setSelectStatus(false); + this.mmsList = mmsListCopy; + } else if (!this.mmsList[this.mmsIndex].isLock || this.isSelectLockMsg) { + let item = this.mmsList[this.mmsIndex]; + this.mmsList.splice(this.mmsIndex, 1); + groupIds.push(item.groupId); + } + this.isSelectLockMsg = false; + this.cancleCheckedAll(); + if (groupIds.length > 0) { + this.deleteMessageByGroupIds(groupIds); + // 判断删除后list长度是否为0 + if (this.mmsList.length === 0 && this.textValue === common.string.EMPTY_STR) { + router.back(); + this.deleteMessageById(this.threadId); + } else { + this.updateSessionLock(false); + this.updateLastItemContent(); + } + } + // 删除完成之后,需要判断数据是否全部删除 + this.$element('delete_dialog').close(); + }, + updateLastItemContent() { + let actionData = { + mmsList: this.mmsList, + threadId: this.threadId, + rdbStore: this.$app.$def.rdbStore, + isMessageDetail: true + }; + let conversationListService = this.$app.$def.conversationListService; + conversationListService.updateLastItemContent(actionData); + }, + deleteMessageByGroupIds(groupIds) { + let actionData = { + groupIds: groupIds, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + // 这里调用数据库的删除方法 + conversationService.deleteMessageByGroupIds(actionData); + }, + deleteMessageById(threadId) { + let threadIds = [threadId]; + // 删除数据库数据 + let actionData = { + rdbStore: this.$app.$def.rdbStore, + threadIds: threadIds, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + }; + let conversationListService = this.$app.$def.conversationListService; + conversationListService.deleteMessageById(actionData); + }, + setSelectLockStatus() { + // 删除锁定CheckBox勾选事件 + if (this.isSelectLockMsg == true) { + this.isSelectLockMsg = false; + } else { + this.isSelectLockMsg = true; + } + }, + cancleCheckedAll() { + for (let element of this.mmsList) { + element.isCbChecked = false; + } + }, + setMessageCheckAll(type) { + if (!this.isSelectStatus) { + return; + } + if (type == common.int.CHECKBOX_SELECT_ALL) { + this.selectDeleteMsgCount = this.mmsList.length; + this.isMessageCheckAll = true; + this.hasReport = false; + let countLock = 0; + // 判断一下是不是全部都被锁定 + for (let element of this.mmsList) { + if (element.isCbChecked && element.isLock) { + countLock++; + } + } + if (this.selectDeleteMsgCount == countLock) { + this.hasLock = true; + } + } else if (type == common.int.CHECKBOX_SELECT_NONE) { + this.selectDeleteMsgCount = 0; + this.isMessageCheckAll = false; + this.hasLock = false; + this.hasReport = false; + } else { + // 默认为 CHECKBOX_SELECT_UNKNOWN,判断是否有未选中 + this.checkBoxSelectUnknow(); + } + }, + checkBoxSelectUnknow() { + // 默认为 CHECKBOX_SELECT_UNKNOWN,判断是否有未选中 + this.isMessageCheckAll = true; + this.selectDeleteMsgCount = 0; + let countLock = 0; + let countReport = 0; + for (let element of this.mmsList) { + if (element.isCbChecked) { + this.selectDeleteMsgCount++; + } else if (this.isMessageCheckAll) { + this.isMessageCheckAll = false; + } + if (element.isCbChecked && element.isLock) { + countLock++; + } + if (element.isCbChecked && element.hasReport) { + countReport++; + } + } + // 如果选择的是一个,并且存在锁 + if (this.selectDeleteMsgCount == 1 && countLock > 0) { + this.hasLock = true; + } else { + this.hasLock = false; + } + // 如果全部选中了,并且全部锁定了 + if (this.selectDeleteMsgCount == countLock) { + this.hasLock = true; + } + if (countReport == 1) { + this.hasReport = true; + } else { + this.hasReport = false; + } + }, + updatePreview(idx) { + // 删除预览 + mmsLog.info('JS_conversation: ' + 'updatePreview idx :' + idx); + // 如果预览这里删除的不是音频(图片或视频),还需要改变图库缩略图中checkbox的值 + if (this.mmsEditList[idx].type != common.MSG_ITEM_TYPE.AUDIO) { + let that = this; + this.pictureListFromGallery.forEach(function (item) { + if (item.path == that.mmsEditList[idx].uriPath) { + item.checkedValue = false; + that.curEdtFileSize -= that.mmsEditList[idx].fileSize; + that.msgSendTip = Math.ceil(that.curEdtFileSize) + COMMON_FILE_SIZE_STRING; + } + }); + } + this.isOnlyAudio = !this.mmsEditList.some((item, index) => item.type != common.MSG_ITEM_TYPE.AUDIO); + if (this.mmsEditList.length == 0) { + this.convertingSms(); + } + }, + deleteAllPreview() { + this.mmsEditList.forEach(mmsItem => { + if (mmsItem.type != common.MSG_ITEM_TYPE.AUDIO) { + this.dealPictureListFromGallery(mmsItem); + } + }); + }, + dealPictureListFromGallery(mmsItem) { + this.pictureListFromGallery.forEach((item) => { + if (item.path == mmsItem.uriPath) { + item.checkedValue = false; + } + }); + }, + showMsgImage(index) { + let that = this; + let item = that.mmsList[index]; + // 双击取消发送 + if (that.recallMessagesFlag && item.cancelTimeCount > 0) { + if (!that.doubleClickStatus) { + that.doubleClickStatus = true; + setTimeout(function () { + that.doubleClickStatus = false; + }, 500); + } else { + if (item.content) { + that.textValue = item.content; + } + that.mmsList.splice(index, 1); + // 如果列表数据为空,并且是从新建页面传递过来的,返回新建页面 + this.dealNewRecallMessagesFlag(that.mmsList); + // 将彩信的数据进行展示 + this.setMmsDataSource(item.mmsSource); + that.isEditMms = true; + clearTimeout(item.sendTimeoutId); + clearInterval(item.sendIntervalId); + // 判断发送按钮是否高亮 + that.judgeSendBtnCanClicked(); + } + } + }, + showEdtImage(type, idx) { + if (type != common.MSG_ITEM_TYPE.IMAGE) { + return; + } + // 跳转图库,查看图片 + mmsLog.info('JS_conversation: ' + 'go to URL map depot'); + }, + playAudio(idx) { + // 播放音频 + let curAudio = this.mmsEditList[idx]; + mmsLog.info('JS_conversation: ' + 'playAudio idx :' + idx); + }, + deletePreCard() { + this.isVCard = false; + this.mmsEditList = []; + this.convertingSms(); + mmsLog.info('JS_conversation: ' + 'deletePreCard isVCard :' + this.isVCard); + }, + clickToJumpToGallery() { + // 跳转到图库以选择图片 + }, + getPicturesFromGallery() { + // 从图库里获取所有图片 + }, + clickToSelectPictureOnFullScreen(index) { + if (this.isPicCheckboxClicked) { + setTimeout(() => { + this.isPicCheckboxClicked = false; + }, 200) + return; + } + // 全屏查看图片 + this.getCurEdtFileSize(); + router.push({ + uri: 'pages/full_screen_show_picture/full_screen_show_picture', + params: { + which: index + 1, + total: this.pictureListFromGallery.length, + checkedValue: this.pictureListFromGallery[index].checkedValue, + path: this.pictureListFromGallery[index].path, + type: this.pictureListFromGallery[index].type, + totalFileSize: this.curEdtFileSize, + fileSize: this.pictureListFromGallery[index].fileSize + } + }) + }, + addMmsToPpt(mmsObj) { + this.pptTotalCount ++; + let newObj = this.getPptObj(); + mmsObj.index = newObj.pptIndex; + newObj.mms = mmsObj; + this.textareaDatasource.push(newObj); + }, + resetMmsEditListFromDatasource() { + let list = []; + this.textareaDatasource.forEach((item) => { + if (item.mms) { + list.push(item.mms); + } + }); + this.mmsEditList = list; + }, + dealPptMms(mmsObj) { + if (this.selectedTextareaIdx === -1) { + this.addMmsToPpt(mmsObj); + } else { + let length = this.selectedTextareaIdx; + if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) { + if (this.selectedTextareaIdx === 0) { + length = 1; + } + } + let isFind = false; + for(let i = length; i < this.textareaDatasource.length; i++) { + let item = this.textareaDatasource[i]; + if (!item.mms) { + this.selectedTextareaIdx = i; + mmsObj.index = item.pptIndex; + item.mms = mmsObj; + isFind = true; + break; + } + } + if (!isFind) { + this.addMmsToPpt(mmsObj); + this.selectedTextareaIdx = this.textareaDatasource.length - 1; + } + } + this.resetMmsEditListFromDatasource(); + }, + addMmsObj(mmsObj) { + if (this.messageType === common.MESSAGE_TYPE.NORMAL) { + this.mmsEditList.push(mmsObj); + } else if (this.messageType === common.MESSAGE_TYPE.THEME) { + let obj = this.textareaDatasource[1]; + obj.placeholder = this.$t('strings.msg_note_mms2'); + this.mmsEditList.push(mmsObj); + } else { + this.dealPptMms(mmsObj); + } + }, + deletePictures(index) { + this.pictureListFromGallery[index].checkedValue = false; + let obj = null; + this.mmsEditList = this.mmsEditList.filter(item => { + if (item.uriPath == this.pictureListFromGallery[index].path) { + obj = item; + } + return item.uriPath != this.pictureListFromGallery[index].path; + }); + this.textareaDatasource = this.textareaDatasource.filter(item => { + if (item.mms && item.mms.index === obj.index) { + item.mms = null; + } + return item; + }); + this.curEdtFileSize -= this.pictureListFromGallery[index].fileSize; + this.msgSendTip = Math.ceil(this.curEdtFileSize) + COMMON_FILE_SIZE_STRING; + if (this.textareaDatasource.length == 0 && this.mmsEditList.length ==0) { + this.convertingSms(); + } + }, + dealMms() { + if (this.mmsEditList.length == 1) { + if (this.textareaDatasource.length == 0) { + this.convertingMms(); + } else if (this.messageType == common.MESSAGE_TYPE.THEME) { + let hasContent = this.getHasContent(); + if (!hasContent) { + this.convertingMms(); + } + } + } + }, + getHasContent() { + let hasContent = false; + this.textareaDatasource.forEach((item) => { + if (item.textValue != common.string.EMPTY_STR) { + hasContent = true; + } + }); + return hasContent; + }, + pictureItemCheckboxOnchange(index) { + if (this.isVCard) { + this.mmsAddType = common.MSG_ITEM_TYPE.IMAGE; + this.picItemSelectedIndex = index; + this.$element('tip_dialog').show(); + return; + } + this.isPicCheckboxClicked = true; + // 点击图片上的checkbox,在输入框下的图片中 + this.getCurEdtFileSize(); + if (!this.pictureListFromGallery[index].checkedValue) { + if (this.curEdtFileSize + this.pictureListFromGallery[index].fileSize > COMMON_FILE_SIZE) { + this.showToast(this.$t('strings.attachment_failed')); + return; + } + this.pictureListFromGallery[index].checkedValue = true; + // 添加 + let mmsObj = { + type: this.pictureListFromGallery[index].type, + uriPath: this.pictureListFromGallery[index].path, + fileSize: this.pictureListFromGallery[index].fileSize, + time: '', + index: -1 + }; + this.addMmsObj(mmsObj); + this.curEdtFileSize += this.pictureListFromGallery[index].fileSize; + this.msgSendTip = Math.ceil(this.curEdtFileSize) + COMMON_FILE_SIZE_STRING; + this.dealMms(); + } else { + // 删除 + this.deletePictures(index); + } + if (this.mmsEditList.length != 0) { + if (this.textValue.length > common.int.FULL_SCREEN_SEND_LENGTH) { + this.isShowFullScreen = false; + } + } + // 全局选择的tabTitleText + this.setTabTitleText(); + this.isOnlyAudio = !this.mmsEditList.some((item, index) => item.type !=common.MSG_ITEM_TYPE.AUDIO); + }, + setTabTitleText() { + // 全局选择的tabTitleText + if (this.tabIndex != 1) { + // 非图片页 + this.tabTitleText = this.tabTextList[this.tabIndex]; + return; + } + // 图片选择页,显示选择个数size + let size = 0; + for (let element of this.pictureListFromGallery) { + if (element.checkedValue) { + size++; + } + } + this.tabTitleText = size == 0 ? this.$t('strings.msg_unselected_tip') : this.$t('strings.msg_selected_tip', { + number: size + }); + }, + drawRecordingEffect() { + this.recordingAnimation = this.$element('recording').animate(this.animationFrames, this.animationOptions); + this.recordingAnimation.play(); + let beforeTime = this.startRecordTime; + let that = this; + this.drawRecordingTaskId = setInterval(() => { + let curTime = new Date().getTime(); + if (curTime - beforeTime >= 1000) { + that.setCurRecordingTime(curTime); + beforeTime = curTime; + } + }, 30); + }, + setCurRecordingTime(curTime) { + let duration = curTime - this.startRecordTime; + this.curSize = duration * 1.7 / 1000; + if (this.curEdtFileSize + this.curSize > COMMON_FILE_SIZE) { + this.setRecordingStatus(false); + clearInterval(this.drawRecordingTaskId); + this.drawRecordingTaskId = null; + this.recordingAnimation.cancel(); + this.recordingAnimation = null; + this.showToast(this.$t('strings.attachment_failed')); + return; + } + let date = new Date(duration); + this.curRecordingTime = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'; + this.curRecordingTime += date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); + }, + recordingStart() { + this.setRecordingStatus(true); + this.curRecordingTime = '00:00'; + this.startRecordTime = new Date().getTime(); + // js绘制录音效果 + this.drawRecordingEffect(); + }, + addRecordAudio() { + this.setCurRecordingTime(new Date().getTime()); + this.curEdtFileSize += this.curSize; + this.msgSendTip = Math.ceil(this.curEdtFileSize) + COMMON_FILE_SIZE_STRING; + // 插入Json + let mmsObj = { + type: common.MSG_ITEM_TYPE.AUDIO, + uriPath: '', + fileSize: this.curSize, + time: this.curRecordingTime, + index: -1 + }; + this.addMmsObj(mmsObj); + this.isOnlyAudio = !this.mmsEditList.some((item, index) => item.type != common.MSG_ITEM_TYPE.AUDIO); + let idx = this.mmsEditList.length - 1; + this.$element('mms_edt_list').scrollTo({ + index: idx + }); + this.dealMms(); + if (this.tabSlideStatus != 0) { + this.restoreTabSlideStatus(); + } + this.setTabOperationStatus(false); + // 重新请求输入框光标 + this.$element('isInputMethod').focus({ + focus: true + }); + }, + convertingMms() { + // 转化为彩信 + this.isEditMms = true; + if (this.haveSimCard) { + this.canSendMessage = true; + } + if (this.isNewMsg) { + if (this.paramContact.transmitContracts != null && this.paramContact.transmitContracts.length > 0) { + for (let element of this.paramContact.transmitContracts) { + this.dealSelectContacts(element); + } + } + this.setCanSendMsgStatus(); + } + this.showToast(this.$t('strings.converting_mms')); + }, + dealSelectContacts(element) { + let again = true; + for (let contact of this.selectContacts) { + if (element.telephone == contact.telephone) { + again = false; + break; + } + } + if (again) { + this.selectContacts.push({ + headImage: element.headImage, + contactName: element.contactName, + telephone: element.telephone, + telephoneFormat: element.telephoneFormat, + select: false + }); + } + }, + convertingSms() { + // 转化为短信 + this.isEditMms = false; + this.setSmsTip(this.textValue); + this.showToast(this.$t('strings.converting_sms')); + }, + recordingEnd() { + this.setRecordingStatus(false); + clearInterval(this.drawRecordingTaskId); + this.recordingAnimation.cancel(); + this.recordingAnimation = null; + // 判断时长 + if (this.curRecordingTime == this.timeFormat) { + // 录音太短 + this.showToast(this.$t('strings.msg_record_short')); + return; + } + // 结束录音 + if (this.isVCard) { + // 提示已有内容替换 + this.mmsAddType = common.MSG_ITEM_TYPE.AUDIO; + this.$element('tip_dialog').show(); + return; + } + this.addRecordAudio(); + }, + showVideoOperation(index) { + // 跳转视频操作页面 后期添加带参跳转 + router.push({ + uri: 'pages/video_operation/video_operation' + }) + }, + playMsgAudio(index) { + let uriPath = this.mmsList[index]; + // 跳转播放音频 + }, + seTabHeightAnimation(isUpDirection, toHeight) { + // 自定义动画 + let that = this; + that.isTabHeightAnimation = true; + let tabHeightTaskId = setInterval(() => { + if (isUpDirection) { + that.tabHeight += 6; + if (that.tabHeight > common.int.FULL_HEIGHT - 200) { + that.tabSlideStatus = 2; + } + if (that.tabHeight >= toHeight) { + that.tabHeight = toHeight; + that.tabSlideStatus = 2; + clearInterval(tabHeightTaskId); + that.isTabHeightAnimation = false; + } + } else { + that.tabHeight -= 6; + if (that.tabHeight < common.int.FULL_HEIGHT - 200) { + that.tabSlideStatus = 1; + } + if (that.tabHeight <= toHeight) { + that.tabHeight = toHeight; + that.tabSlideStatus = 0; + clearInterval(tabHeightTaskId); + that.isTabHeightAnimation = false; + } + } + }, 20); + }, + tabSlideStart(e) { + this.slideStartPoint.x = e.touches[0].localX; + this.slideStartPoint.y = e.touches[0].localY; + }, + tabSlideMove(e) { + // 避免误触 + const FALSE_DISTANCE = 10; + let x = e.touches[0].localX; + let y = e.touches[0].localY; + let distanceY = Math.abs(y - this.slideStartPoint.y); + if (distanceY < FALSE_DISTANCE) { + return; + } + if (Math.abs(x - this.slideStartPoint.x) > distanceY) { + return; + } + this.slideDistance = distanceY - FALSE_DISTANCE; + this.isTabSlideUp = this.slideStartPoint.y > y; + this.tabSlideStatus = 1; + if (this.isTabSlideUp) { + this.tabHeight = common.int.TAB_HEIGHT + this.slideDistance; + if (this.tabHeight > common.int.FULL_HEIGHT) { + this.tabHeight = common.int.FULL_HEIGHT; + } + if (this.tabHeight > common.int.FULL_HEIGHT - 200) { + this.tabSlideStatus = 2; + } + } else { + this.tabHeight = common.int.FULL_HEIGHT - this.slideDistance; + if (this.tabHeight < common.int.FULL_HEIGHT - 200) { + this.tabSlideStatus = 1; + } + if (this.tabHeight < common.int.TAB_HEIGHT) { + this.tabHeight = common.int.TAB_HEIGHT; + } + } + }, + tabSlideEnd() { + if (this.tabSlideStatus == 0) { + return; + } + let that = this; + if (that.isTabSlideUp) { + // 上滑动 + if (that.slideDistance > 400) { + // 上动画 + that.seTabHeightAnimation(true, common.int.FULL_HEIGHT); + } else { + // 延迟还原 + that.seTabHeightAnimation(false, common.int.TAB_HEIGHT); + } + return; + } + // 下滑动 + if (that.slideDistance > 150) { + // 下动画 + that.seTabHeightAnimation(false, common.int.TAB_HEIGHT); + } else { + // 延迟还原 + that.seTabHeightAnimation(true, common.int.FULL_HEIGHT); + } + }, + tabSwipe(e) { + // 快速滑动后触发 + if (this.isTabHeightAnimation) { + return + } + if (e.direction == 'up') { + this.seTabHeightAnimation(true, common.int.FULL_HEIGHT); + } else if (e.direction == 'down') { + this.seTabHeightAnimation(false, common.int.TAB_HEIGHT); + } + }, + restoreTabSlideStatus() { + // 恢复选项卡状态 + this.tabSlideStatus = 0; + this.tabHeight = common.int.TAB_HEIGHT; + }, + clickCall() { + this.call(this.strContactsNumber); + }, + call(telephone) { + // 打电话 + let param = { + telephone: telephone + }; + callService.call(param, result => { + if (result.code == common.int.SUCCESS) { + mmsLog.info('JS_conversation: call success'); + } else { + mmsLog.info('JS_conversation: call error'); + } + }); + }, + clickToSelectContact() { + let actionData = {}; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CHOOSE_CONTACTS; + this.jumpToContractForResult(actionData); + }, + async jumpToContractForResult(actionData) { + let commonService = this.$app.$def.commonService; + let featureAbility = this.$app.$def.featureAbility; + let str = commonService.commonContractParam(actionData); + let data = await featureAbility.startAbilityForResult(str); + if (data.resultCode === 0) { + this.contactListFromContactApp = []; + this.dealContractParams(data.want.parameters.contactObjects); + if (this.contactListFromContactApp.length === 1) { + router.push({ + uri: 'pages/contact_item_pick/contact_item_pick', + params: { + iconFromConvPage: this.contactListFromContactApp[0].icon, + nameFromConvPage: this.contactListFromContactApp[0].name, + telephoneNumFromConvPage: this.contactListFromContactApp[0].telephoneNum + } + }); + } else { + this.$element('select_text_or_vcard_to_send_dialog').show(); + } + } + }, + dealContractParams(contactObjects) { + let params = JSON.parse(contactObjects); + for (let element of params) { + let contact = {}; + contact.icon = '/common/icon/user_avatar_full_fill.svg'; + contact.name = element.contactName; + let item = { + telephone: element.telephone, + checked: false + }; + contact.telephoneNum = [item]; + this.contactListFromContactApp.push(contact); + } + }, + clickToSelectText() { + // 发送联系人附件时,选择以文本形式发送 + let varTextValue = common.string.EMPTY_STR; + for (let i = 0; i < this.contactListFromContactApp.length; i++) { + varTextValue += this.$t('strings.name1') + this.contactListFromContactApp[i].name; + for (let j = 0; j < this.contactListFromContactApp[i].telephoneNum.length; j++) { + if (this.contactListFromContactApp[i].telephoneNum[j]) { + varTextValue += '\n' + this.$t('strings.mobile3') + + this.contactListFromContactApp[i].telephoneNum[j].telephone; + } + } + if (i != this.contactListFromContactApp.length - 1) { + varTextValue += '\n---\n'; + } + } + this.textValue = varTextValue; + this.clickToCloseVcardDialog(); + this.setTabOperationStatus(false); + this.$refs.textArea.focus({ + focus: true + }); + }, + clickToSelectVcard() { + // 发送联系人附件时,选择以vCard形式发送 + this.isVCard = true; + if (this.contactListFromContactApp.length == 1) { + this.vCard.name = this.contactListFromContactApp[0].name; + this.vCard.number = this.contactListFromContactApp[0].telephoneNum[0].telephone; + } else { + this.vCard.name = common.string.EMPTY_STR; + this.vCard.number = common.string.EMPTY_STR; + this.contactListFromContactApp.forEach((item, index) => { + if (index == 0) { + this.vCard.name = item.name; + } else { + this.vCard.name = this.vCard.name + ',' + item.name; + } + }); + } + if (this.mmsEditList.length > 0) { + this.mmsAddType = common.MSG_ITEM_TYPE.CARD; + this.$element('tip_dialog').show(); + } else { + let obj = { + type: common.MSG_ITEM_TYPE.CARD, + uriPath: this.vCard.name, + time: this.vCard.number, + fileSize: 0 + } + this.mmsEditList.push(obj); + this.contactListFromContactApp = []; + if (this.textareaDatasource.length == 0 && this.mmsEditList.length == 1) { + this.convertingMms(); + } + } + + this.clickToCloseVcardDialog(); + }, + clickToCloseVcardDialog() { + this.$element('select_text_or_vcard_to_send_dialog').close(); + }, + cliclToSelectSubject() { + // 在输入框下方的'更多'里点击'主题' + if (this.messageType === common.MESSAGE_TYPE.THEME) { + this.textareaDatasource = []; + this.messageType = common.MESSAGE_TYPE.NORMAL; + this.isEditMms = false; + return; + } else if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) { + this.textareaDatasource.shift(); + this.messageType = common.MESSAGE_TYPE.PPT; + return; + } + let themeObj = { + textValue: '', + placeholder: this.$t('strings.msg_theme'), + pptIndex: 0, + mms: null + } + if (this.messageType === common.MESSAGE_TYPE.NORMAL) { + let placeholder = this.$t('strings.msg_note_mms'); + if (this.mmsEditList.length > 0) { + placeholder = this.$t('strings.msg_note_mms2'); + } + let normal = { + textValue: this.textValue, + placeholder: placeholder, + pptIndex: 0, + mms: null + } + this.textareaDatasource.push(themeObj); + this.textareaDatasource.push(normal); + this.messageType = common.MESSAGE_TYPE.THEME; + } else if (this.messageType === common.MESSAGE_TYPE.PPT) { + this.textareaDatasource.unshift(themeObj); + this.messageType = common.MESSAGE_TYPE.THEME_AND_PPT; + } + }, + cliclToSelectSlide() { + // 在输入框下方的'更多'里点击'幻灯片' + this.$element('slide_dialog').show(); + }, + clickToCloseSlideDialog() { + this.$element('slide_dialog').close(); + }, + getPptObj() { + let obj = { + textValue: common.string.EMPTY_STR, + placeholder: this.$t('strings.enter_text'), + pptIndex: this.pptTotalCount, + mms: null + } + return obj; + }, + addPptObj() { + this.pptTotalCount ++; + let pptObj = this.getPptObj(); + this.textareaDatasource.push(pptObj); + }, + addSlideFromThemeType() { + let msgObj = this.textareaDatasource[this.textareaDatasource.length - 1]; + msgObj.pptIndex = 1; + msgObj.placeholder = this.$t('strings.enter_text'); + msgObj.textValue = this.textValue; + if (this.mmsEditList.length !== 0) { + this.mmsEditList.forEach((item, index) => { + if (index === 0) { + item.index = 1; + msgObj.mms = item; + } else { + this.pptTotalCount ++; + let pptObj = this.getPptObj(); + item.index = pptObj.pptIndex; + pptObj.mms = item; + this.textareaDatasource.push(pptObj); + } + }); + this.addPptObj(); + } else { + this.addPptObj(); + } + }, + addSlideFromNormalType() { + if (this.mmsEditList.length === 0) { + let pptObj1 = this.getPptObj(); + pptObj1.textValue = this.textValue; + this.textareaDatasource.push(pptObj1); + this.pptTotalCount ++; + let pptObj2 = this.getPptObj(); + this.textareaDatasource.push(pptObj2); + } else { + this.mmsEditList.forEach((item, index) => { + if (index !== 0) { + this.pptTotalCount ++; + } + let pptObj = this.getPptObj(); + item.index = pptObj.pptIndex; + pptObj.mms = item; + this.textareaDatasource.push(pptObj); + }); + this.addPptObj(); + } + }, + clickToAddSlide() { + // 在弹出的幻灯片dialog里选择'添加幻灯片' + if (this.pptTotalCount === 0) { + this.pptTotalCount ++; + if (this.messageType === common.MESSAGE_TYPE.THEME) { + this.addSlideFromThemeType(); + this.messageType = common.MESSAGE_TYPE.THEME_AND_PPT; + } else if (this.messageType === common.MESSAGE_TYPE.NORMAL) { + this.addSlideFromNormalType(); + this.messageType = common.MESSAGE_TYPE.PPT; + } + this.showConvertingMms(); + } else { + this.pptTotalCount ++; + this.clickToAddMoreSlide(); + } + this.clickToCloseSlideDialog(); + }, + clickToAddMoreSlide() { + let obj = this.getPptObj(); + if (this.selectedTextareaIdx === -1) { + this.textareaDatasource.push(obj); + } else { + this.textareaDatasource.splice(this.selectedTextareaIdx + 1, 0, obj); + if (this.messageType === common.MESSAGE_TYPE.PPT) { + this.textareaDatasource.forEach((item, index) => { + item.pptIndex = index + 1; + }); + } else if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) { + this.textareaDatasource.forEach((item, index) => { + item.pptIndex = index; + }); + } + let dataSource = JSON.parse(JSON.stringify(this.textareaDatasource)); + setTimeout(() => { + this.textareaDatasource.forEach((item, index) => { + item.textValue = dataSource[index].textValue; + }); + }, 200); + } + }, + showConvertingMms() { + if(this.mmsEditList.length == 0) { + if(this.textareaDatasource.length == 2 && this.messageType == common.MESSAGE_TYPE.PPT) { + this.convertingMms(); + } + if(this.messageType == common.MESSAGE_TYPE.THEME_AND_PPT && this.textareaDatasource.length == 3 + && this.textareaDatasource[0].content != common.string.EMPTY_STR) { + this.convertingMms(); + } + } + }, + focus(item, idx) { + this.selectedTextareaIdx = idx; + }, + blur() { + this.selectedTextareaIdx = -1; + }, + setMessageStateToNormal() { + this.textareaDatasource = []; + this.messageType = common.MESSAGE_TYPE.NORMAL; + this.pptTotalCount = 0; + this.selectedTextareaIdx = -1; + }, + setMessageStateToTheme() { + this.messageType = common.MESSAGE_TYPE.THEME; + let obj = this.textareaDatasource[1]; + let placeholder = this.$t('strings.msg_note_mms'); + if (this.mmsEditList.length > 0) { + placeholder = this.$t('strings.msg_note_mms2'); + } + obj.placeholder = placeholder; + obj.pptIndex = 0; + obj.mms = null; + this.pptTotalCount = 0; + this.selectedTextareaIdx = -1; + }, + deleteSlideFromPptType() { + if (this.selectedTextareaIdx === -1) { + this.textareaDatasource.splice(this.textareaDatasource.length - 1, 1); + } else if (this.textareaDatasource.length > this.selectedTextareaIdx) { + this.textareaDatasource.splice(this.selectedTextareaIdx, 1); + } + if (this.selectedTextareaIdx === this.textareaDatasource.length) { + this.selectedTextareaIdx = this.selectedTextareaIdx - 1; + } + this.pptTotalCount--; + if (this.textareaDatasource.length === 1) { + this.setMessageStateToNormal(); + } + if (this.textareaDatasource.length > 0) { + this.textareaDatasource.forEach((item, index) => { + item.pptIndex = index + 1; + }); + } + }, + deleteSlideFromThemeAndPptType() { + if (this.selectedTextareaIdx === -1 && this.selectedTextareaIdx === 0) { + this.textareaDatasource.splice(this.textareaDatasource.length - 1, 1); + } else if (this.textareaDatasource.length > this.selectedTextareaIdx) { + this.textareaDatasource.splice(this.selectedTextareaIdx, 1); + } + this.pptTotalCount--; + if (this.textareaDatasource.length === 2) { + this.setMessageStateToTheme(); + } else if (this.textareaDatasource.length > 2) { + this.textareaDatasource.forEach((item, index) => { + item.pptIndex = index; + }); + if (this.selectedTextareaIdx === this.textareaDatasource.length) { + this.selectedTextareaIdx = this.selectedTextareaIdx - 1; + } + } + }, + changeMmsOriginDataStatus() { + if (this.mmsEditList.length === 0) { + this.pictureListFromGallery.forEach((item) => { + item.checkedValue = false; + }); + return; + } + let paths = []; + for(let mms of this.mmsEditList) { + paths.push(mms.uriPath); + } + for (let pic of this.pictureListFromGallery) { + if (paths.indexOf(pic.path) > -1) { + pic.checkedValue = true; + } else { + pic.checkedValue = false; + } + } + }, + clickToDeleteSlide() { + if (this.messageType === common.MESSAGE_TYPE.PPT) { + this.deleteSlideFromPptType(); + } else if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) { + this.deleteSlideFromThemeAndPptType(); + } + if (this.messageType === common.MESSAGE_TYPE.NORMAL || this.messageType === common.MESSAGE_TYPE.THEME) { + if(this.mmsEditList.length > 0) { + let obj = this.mmsEditList[0]; + obj.index = -1; + this.mmsEditList.splice(1, this.mmsEditList.length - 1); + } + } else { + this.resetMmsEditListFromDatasource(); + } + this.changeMmsOriginDataStatus(); + this.clickToCloseSlideDialog(); + if((this.textareaDatasource.length == 0 || (this.textareaDatasource.length == 2 + && this.messageType == common.MESSAGE_TYPE.THEME)) && this.mmsEditList.length == 0) { + this.convertingSms(); + } + }, + changeMmsValue(e) { + let item = this.textareaDatasource[this.selectedTextareaIdx]; + item.textValue = e.text; + if(this.textareaDatasource.length == 2 && this.mmsEditList.length == 0 && e.text != common.string.EMPTY_STR + && this.messageType == common.MESSAGE_TYPE.THEME) { + this.convertingMms(); + } + if(this.textareaDatasource.length == 0 && this.mmsEditList.length == 0 && e.text == common.string.EMPTY_STR + && this.messageType == common.MESSAGE_TYPE.THEME) { + this.convertingSms(); + } + }, + clickToPreviewSlide() { + let item = {}; + let mmsSource = this.getMmsSource(); + item.mms = mmsSource; + this.clickMms(item, false); + }, + clickMms(item, isShow) { + router.push({ + uri: 'pages/slide_detail/slide_detail', + params: { + mms: item, + threadId: this.threadId, + isShowBottom: isShow + } + }); + }, + clickToShowDurationDialog() { + this.$element('slideDurationDialog').show(); + }, + chooseSlideDuration(item) { + this.slideDuration = item; + this.$element('slideDurationDialog').close(); + }, + // 订阅公共事件 + subscribeDetail() { + mmsLog.info('JS_conversation: subscribe()'); + let events = [common.string.RECEIVE_TRANSMIT_EVENT] + let commonEventSubscribeInfo = { + events: events + }; + // 创建订阅信息 + commonEvent.createSubscriber(commonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); + }, + createSubscriberCallBack(err, data) { + this.commonEventData = data; + // 接收到订阅 + commonEvent.subscribe(this.commonEventData, this.subscriberCallBack.bind(this)); + }, + subscriberCallBack(err, data) { + mmsLog.info('JS_conversation: eventData'); + // 接收短信更新 + setTimeout(() => { + this.queryMessageDetail(this.strContactsNumber, this.threadId); + let valueBucket = { + 'unread_count': 0, + }; + let actionData = { + threadIds: [this.threadId], + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + hasRead: 0, + valueBucket: valueBucket + }; + notificationService.cancelMessageNotify(actionData, res => { + actionData.hasRead = 1; + conversationListService.markAllAsRead(actionData); + }); + }, 500); + }, + // 取消订阅 + unSubscribeDetail() { + commonEvent.unsubscribe(this.commonEventData, () => { + mmsLog.info('conversation unsubscribe'); + }); + }, + // 新建页面,返回的联系人数据 + setReceiveContactValue(e) { + let receiveContactValue = e.detail.contactValue; + let selectContacts = e.detail.selectContacts; + let hasBlur = e.detail.hasBlur; + let telephone = common.string.EMPTY_STR; + this.setCanSendMessage(selectContacts, receiveContactValue); + if (hasBlur && receiveContactValue != common.string.EMPTY_STR) { + let index = -1; + for(let i in selectContacts) { + let contact = selectContacts[i]; + if(contact.telephone == receiveContactValue) { + index = i; + break; + } + } + if(index >= 0) { + selectContacts.splice(index, 1); + } + } + if(receiveContactValue != common.string.EMPTY_STR) { + this.receiveContactValue = receiveContactValue; + } else { + this.receiveContactValue = common.string.EMPTY_STR; + } + if(selectContacts.length > 0) { + this.selectContacts = selectContacts; + } else { + this.selectContacts = []; + } + if (this.selectContacts.length > 0) { + for (let element of this.selectContacts) { + telephone = telephone + element.telephone + common.string.COMMA; + } + } + if(this.receiveContactValue != common.string.EMPTY_STR) { + telephone = telephone + this.receiveContactValue + common.string.COMMA; + } + if (telephone != common.string.EMPTY) { + telephone = telephone.substring(0, telephone.length - 1); + } + this.initSendTip(); + this.queryOldMessageList(telephone); + }, + setCanSendMessage(selectContacts, receiveContactValue) { + if (this.textValue != common.string.EMPTY_STR || this.isEditMms) { + if (this.canSendMessage) { + if (selectContacts.length == 0 && receiveContactValue == common.string.EMPTY_STR) { + this.canSendMessage = false; + } + } else if ((selectContacts.length != 0 || receiveContactValue != common.string.EMPTY_STR) + && this.haveSimCard) { + this.canSendMessage = true; + } + } + }, + queryOldMessageList(telephone) { + if(telephone == common.string.EMPTY_STR) { + return; + } + let conversationListService = this.$app.$def.conversationListService; + let rdbStore = this.$app.$def.rdbStore; + let number = telephoneUtil.dealTelephoneSort(telephone); + conversationListService.querySessionByTelephone(rdbStore, number, res => { + if (res.code == common.int.SUCCESS && res.response.id > 0) { + this.threadId = res.response.id; + this.queryMessageDetail(telephone, res.response.id); + } else { + this.threadId = 0; + this.mmsList = []; + } + }); + }, + cardSelect(e) { + this.slotId = e.value; + }, + mmsDetailsCancel() { + // 取消短信弹窗 + this.$element('mms_details_dialog').close(); + }, + getTime(nS) { + var date = new Date(parseInt(nS)); + var year = date.getFullYear(); + var mon = date.getMonth() + 1; + var day = date.getDate(); + return year + this.$t('strings.year') + mon + this.$t('strings.month') + day + this.$t('strings.day'); + }, + queryFromGallery() { + // 从图库中获取图片和视频 + if (this.pictureListFromGallery.length != 0) { + return; + } + let that = this; + conversationService.queryFromGallery({}, function (result) { + if (result.code == common.int.SUCCESS) { + that.pictureListFromGallery = result.pictureListFromGallery; + } else { + mmsLog.info('JS_conversation: ' + 'Error: queryFromGallery() failed !!!'); + } + }); + }, + sendSms(content, msgUriPath, isMms, mmsSource) { + mmsLog.info('JS_conversation , sendSms start'); + // 全屏页面发送短信 + this.isSendStatus = true; + // 初始化需要发送的数据 + this.initSendSms(content, msgUriPath, isMms, mmsSource); + let actionData = { + slotId: this.slotId, + destinationHost: this.strContactsNumber, + content: content, + isEditMms: isMms + }; + this.dealNewRecallMessagesFlag(this.mmsList); + mmsLog.info('JS_conversation , sendSms send start'); + // 取消发送及正常发送方法 + this.sendInterval(actionData, this.mmsList); + mmsLog.info('JS_conversation , sendSms send end'); + if (this.isEditMms) { + this.isEditMms = false; + } + if (this.$app.$def.sendFlag) { + this.$app.$def.sendFlag = false; + this.$app.$def.textValueOther = common.string.EMPTY_STR; + } + if (this.$app.$def.transmitFlag) { + this.$app.$def.transmitFlag = false; + } + }, + initSendSms(content, msgUriPath, isMms, mmsSource) { + // 获取当天是星期几 + let item = {}; + item.date = common.string.EMPTY_STR; + item.time = this.$t('strings.just'); + item.timeMillisecond = new Date().getTime(); + let dataUtil = this.$app.$def.dateUtil; + dataUtil.convertTimeStampToDateWeek(item, false, this); + item.content = content; + if (isMms) { + item.msgType = common.MSG_ITEM_TYPE.IMAGE; + item.msgUriPath = msgUriPath; + } + item.isFullScreenImg = false; + let time = (this.mmsEditList.length != 0 && (this.mmsEditList[0].type == 3 || this.mmsEditList[0].type == 5)) ? + this.mmsEditList[0].time : common.string.SUCCESS; + item.audioTime = time; + item.isCbChecked = false; + item.isLock = false; + item.isStared = false; + item.isReceive = false; + item.sendStatus = 1; + item.subId = this.slotId; + item.isMsm = isMms; + this.contactsNum = this.strContactsNumber.split(',').length; + item.contactsNum = this.contactsNum; + item.cancelTimeCount = common.int.CANCEL_TIME_COUNT; + item.mmsEditListTemp = this.fillmmsEditListTemp(msgUriPath, isMms); + if (this.contactsNum > 1) { + item.completeNumber = 0; + item.failuresNumber = 0; + } + let preferences = this.$app.$def.preferences; + item.hasReport = settingService.judgeIsDeliveryReport(preferences, item.isMsm); + item.mmsSource = mmsSource; + if (this.isEditMms || isMms) { + item.msgShowType = commonService.getDisplay(mmsSource); + commonService.setItemMmsContent(item, mmsSource); + item.content = this.dealItemContent(item.msgShowType, item.content, mmsSource); + } else { + item.msgShowType = common.MESSAGE_SHOW_TYPE.NORMAL; + } + this.mmsList.push(item); + }, + cancelResend() { + // 发送按钮点击取消按钮取消对话框 + this.$element('mms_fail_dialog').close(); + this.reSendIndex = 0; + }, + resend() { + // 需要删除的item + let deleteItem = this.mmsList[this.reSendIndex]; + if(this.reSendIndex == 0) { + this.mmsDateSet.clear(); + } + // 删除当前的item + this.mmsList.splice(this.reSendIndex, 1); + // 删除数据库的数据 + let groupIds = [deleteItem.groupId]; + this.deleteMessageByGroupIds(groupIds); + let item = this.initReSendItem(deleteItem); + // 如果设置取消发送,直接设置为true + this.dealNewRecallMessagesFlag(this.mmsList); + this.$element('mms_fail_dialog').close(); + this.resendSms(this.strContactsNumber, item.content, item.isMsm, this.mmsList); + }, + initReSendItem(deleteItem) { + let item = {}; + item.content = deleteItem.content; + item.msgType = deleteItem.msgType; + item.isFullScreenImg = deleteItem.isFullScreenImg; + item.msgUriPath = deleteItem.msgUriPath; + item.audioTime = deleteItem.audioTime; + item.isCbChecked = deleteItem.isCbChecked; + item.isLock = deleteItem.isLock; + item.isStared = deleteItem.isStared; + item.isReceive = false; + item.subId = this.slotId; + item.groupId = deleteItem.groupId; + item.isMsm = deleteItem.isMsm; + item.failuresTelephone = deleteItem.failuresTelephone; + item.completeNumber = deleteItem.completeNumber; + item.failuresNumber = deleteItem.failuresNumber; + // 取消发送数量 + if (this.contactsNum > common.int.MESSAGE_CODE_ONE) { + item.cancelTimeCount = common.int.MESSAGE_CODE_ZERO; + } else { + item.cancelTimeCount = common.int.CANCEL_TIME_COUNT; + } + // 获取当天是星期几 + item.date = common.string.EMPTY_STR; + item.time = this.$t('strings.just'); + item.timeMillisecond = new Date().getTime(); + let dataUtil = this.$app.$def.dateUtil; + dataUtil.convertTimeStampToDateWeek(item, false, this); + // 发送状态 + item.sendStatus = 1; + if (this.contactsNum > 1 && !item.isMsm) { + item.completeNumber = this.contactsNum - item.failuresNumber; + item.failuresNumber = 0; + } + // 填充图片,用于取消发送使用 + item.mmsEditListTemp = this.fillmmsEditListTemp(item.msgUriPath, item.isMsm); + let preferences = this.$app.$def.preferences; + item.hasReport = settingService.judgeIsDeliveryReport(preferences, item.isMsm); + item.msgShowType = deleteItem.msgShowType; + if (deleteItem.mms != null) { + item.mmsSource = deleteItem.mms; + } + if (deleteItem.mmsSource != null) { + item.mmsSource = deleteItem.mmsSource; + } + this.mmsList.push(item); + return item; + }, + resendSms(destinationHost, content, isMsm, mmsList) { + let actionData = { + slotId: this.slotId, + destinationHost: destinationHost, + content: content, + isEditMms: isMsm + }; + if (this.contactsNum > common.int.MESSAGE_CODE_ONE) { + // 判断当前的重新发送是在'群组'中,则不能双击取消发送 + this.handleWithSend(actionData, mmsList[mmsList.length - 1]); + } else { + // 若发送的是'个人',则可以双击取消 + this.sendInterval(actionData, mmsList); + } + }, + dealNewRecallMessagesFlag(mmsList) { + let count = common.int.MESSAGE_CODE_ZERO; + for (let index in mmsList) { + let item = mmsList[index]; + if (!item.isDraft) { + count++; + } + } + if (count == common.int.MESSAGE_CODE_ONE) { + this.isNewRecallMessagesFlag = true; + this.paramContact.isNewRecallMessagesFlag = true; + } + if (count == common.int.MESSAGE_CODE_ZERO && this.isNewRecallMessagesFlag) { + this.isNewMsg = true; + this.isNewRecallMessagesFlag = false; + } + }, + fillmmsEditListTemp(msgUriPath, isMsm) { + let mmsEditListTemp = []; + if (this.recallMessagesFlag && isMsm) { + let item = {}; + item.type = common.MSG_ITEM_TYPE.IMAGE; + item.uriPath = msgUriPath; + mmsEditListTemp.push(item); + } + return mmsEditListTemp; + }, + resendOpen(index) { + // 点击失败图片,唤起dialog + this.$element('mms_fail_dialog').show(); + this.reSendIndex = index; + }, + jumpToContactsCallingCard() { + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + contactService.judgeIsExitProfile(actionData, flag => { + if (flag) { + let jumpData = { + pageFlag: common.contractPage.PAGE_FLAG_CALLING_CARD + } + this.jumpToContract(jumpData); + } else { + mmsLog.info('jumpToCard is error'); + } + }) + }, + // 检测发送图标是否可以高亮 + judgeSendBtnCanClicked() { + if (this.haveSimCard && + (this.mmsEditList.length != 0 || + this.textValue != common.string.EMPTY_STR || + this.textareaDatasource.length !== 0)) { + if (this.isNewMsg) { + if ((this.receiveContactValue !== '' && this.isPhoneNumber(this.receiveContactValue)) + || this.selectContacts.length !== 0) { + this.canSendMessage = true; + } + } else { + this.canSendMessage = true; + } + } + }, + // 获取整合通知信息和显示联系人头像的开关值 + getSettingFlagForConvListPage() { + let preferences = this.$app.$def.preferences; + let result = settingService.getSettingFlagForConvListPage(preferences); + if (result) { + this.recallMessagesFlag = result.recallMessagesFlag; + } else { + mmsLog.info('getSettingFlagForConvListPage(): result is null'); + } + }, + // 分享输入框输入的文本内容 + shareTextAtTextarea(e) { + if (e.value == common.string.EMPTY_STR) { + return; + } + let actionData = {}; + actionData.content = e.value; + }, + // 搜索输入框输入的文本内容,需要跳转至'浏览器'app + searchTextAtTextarea(e) { + if (e.value == '') { + return; + } + let messageCode = common.route.MESSAGE_CODE_JUMP_TO_BROWSER_TO_SEARCH; + let actionData = {}; + actionData.content = e.value; + // 跳转到 '浏览器'app + }, + cutCamera() { + // 切换前后置摄像头 + if (this.cameraPattern == 'back') { + this.cameraPattern = 'front'; + this.pattern = this.$t('strings.camera_front'); + } else { + this.cameraPattern = 'back'; + this.pattern = this.$t('strings.camera_post'); + } + }, + shootButton() { + mmsLog.log('camera success: ..............'); + // 相机拍摄按钮 + this.$element('cameraApp').takePhoto({ + quality: 'low', + success: function (data) { + mmsLog.log('camera .get success: ' + data); + }, + fail: function (data, code) { + mmsLog.log('camera get fail, code: ' + code + ', data: ' + data); + }, + complete: function () { + mmsLog.log('camera complete'); + } + }); + }, + clickHighlights(obj) { + let type = obj.detail.type; + this.highlightsType = type; + this.highlightsText = obj.detail.value; + this.$element('highlightDialog').show(); + }, + cancelHighlightDialog() { + this.$element('highlightDialog').close(); + }, + clickHighlightsDialogCell(obj) { + let index = obj.detail; + if (this.highlightsType === common.HIGHLIGHT_TYPE.TEL) { + // 电话 + this.clickTelCellAction(index); + } else if (this.highlightsType === common.HIGHLIGHT_TYPE.EMAIL) { + // 邮箱 + this.clickEmailCellAction(index); + } else if (this.highlightsType === common.HIGHLIGHT_TYPE.DATE) { + // 时间 + this.clickDateCellAction(index); + } + this.cancelHighlightDialog(); + }, + clickTelCellAction(index) { + switch (index) { + case 0: + // 呼叫 + this.call(this.highlightsText); + break; + case 1: + // 呼叫前编辑 + this.callEditor(this.highlightsText); + break; + case 2: + // 发送信息 + this.jumpToConversationPage(this.highlightsText); + break; + case 3: + // 复制到剪贴板 + commonPasteboard.setPasteboard(this.highlightsText); + break; + case 4: + // 新建联系人 + this.createNewContract(this.highlightsText); + break; + case 5: + // 保存至已有联系人 + this.existingContact(this.highlightsText); + break; + default: + mmsLog.info('clickTelCellAction, code is not exit'); + } + }, + clickEmailCellAction(index) { + switch (index) { + case 0: + // 发送信息 + this.jumpToConversationPage(this.highlightsText); + break; + case 1: + // 发送邮件 + break; + case 2: + // 复制到剪贴板 + commonPasteboard.setPasteboard(this.highlightsText); + break; + case 3: + // 新建联系人 + this.createNewContract(this.highlightsText); + break; + case 4: + // 保存至已有联系人 + this.existingContact(this.highlightsText); + break; + default: + mmsLog.info('clickEmailCellAction, code is not exit'); + } + }, + clickDateCellAction(index) { + if (index === 0) { + // 新建日期提醒 + } else { + // 复制到剪贴板 + commonPasteboard.setPasteboard(this.highlightsText); + } + }, + jumpToConversationPage(tel) { + this.strContactsNumber = tel; + this.contactsNum = 1; + }, + showToast(msg) { + Prompt.showToast({ + message: msg, + duration: 2000, + }); + }, + // 跳转联系人app + jumpToContract(actionData) { + let commonService = this.$app.$def.commonService; + let str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info('Js_conversation jumpToContract Data'); + }).catch((error) => { + mmsLog.error('Js_conversation jumpToContract failed. Cause: ' + JSON.stringify(error)); + }) + }, +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/conversation_list/conversation_list.css b/entry/src/main/js/default/pages/conversation_list/conversation_list.css new file mode 100644 index 0000000..81cc92e --- /dev/null +++ b/entry/src/main/js/default/pages/conversation_list/conversation_list.css @@ -0,0 +1,617 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* 信息列表 */ +.container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +/*短信列表头部*/ +.conversation-hand { + width: 100%; +} + +/*多选栏*/ +.conversation-checkbox { + width: 100%; + height: 360px; + flex-direction: column; + opacity: 1; +} + +/*短信首页通知栏*/ +.conversation-inform { + width: 100%; + flex-direction: column; + opacity: 1; +} + +.app-bar { + align-items: center; + height: 100px; + justify-content: flex-end; +} + +.app-bar-messaging { + font-size: 40px; + font-weight: bold; + padding-right: 12px; +} + +.app-bar-unread-count { + border-radius: 20px; + background-color: #1e90ff; + color: #fff; + font-size: 20px; + text-align: center; + height: 36px; + padding-left: 15px; + padding-right: 15px; +} + +.app-bar-left { + width: 50%; + height: 100%; + align-items: center; + justify-content: flex-start; +} + +.app-bar-right { + height: 100%; + align-items: center; + justify-content: flex-end; +} +.more-image-div { + height: 80px; + width: 100%; +} +.more-image-empty { + width: 92%; +} +.more-image { + margin-right: 20px; + margin-top: 5px; + width: 8%; + height: 60px; +} +.list-div { + height: 80%; + width: 100%; +} +.message-list { + columns: 1; +} +.messaging-title { + height: 120px; +} +.messaging-title { + width: 100%; + align-items: center; + padding-left: 30px; + padding-right: 30px; + font-size: 60px; + font-weight: 500; +} + +.messaging-title-text { + margin-top: 50px; + width: 100%; + height: 80px; + padding-left: 30px; + padding-right: 30px; + font-size: 60px; + font-weight: 500; +} + +.unread { + width: 100%; + height: 40px; + padding-left: 30px; + padding-right: 30px; + font-size: 20px; + color: grey; +} + +.search-div { + flex-direction: row; + height: 130px; + align-items: center; + padding-left: 40px; + padding-right: 40px; +} + +.search { + width: 700px; + height: 80px; + align-items: center; + background-color: #F2F2F2; +} + +/*搜索返回按钮*/ +.search-div-back { + width: 140px; + height: 80px; + padding-top: 10px; + padding-bottom: 10px; + padding-left: 30px; + padding-right: 30px; +} + + +.search-div-back:active { + background-color: lightgray; +} + +.messaging-body { + width: 100%; + height: 150px; + flex-direction: row; + align-items: center; +} + +.messaging-body-item { + top: 0; + left: 0; + height: 100%; + width: 100%; +} + +.item-delete { + top: 0; + height: 100%; + flex-direction: row; + align-items: center; + justify-content: center; + background-color: #F2F2F2; +} + +.item-delete-image-one { + width: 80px; + height: 80px; + margin-right: 10px; +} + +.item-delete-image-two { + width: 80px; + height: 80px; +} + +.item-one-btn { + width: 145px; + margin-right: -145px; +} + +.item-two-btn { + width: 230px; + margin-right: -230px; +} + +.item-info { + top: 0; + height: 100%; + width: 145px; + margin-right: -145px; + flex-direction: row; + align-items: center; + justify-content: center; + background-color: #F2F2F2; +} + +.searchCoverage { + width: 100%; + height: 100%; + position: absolute; + background-color: #000; + opacity: .2; +} + +.unread-flag-div { + width: 8%; + height: 100%; + align-items: center; + justify-content: center; +} + +.unread-flag { + radius: 8px; + background-color: #1e90ff; +} + +.unread-flag-no-unread { + radius: 10px; + background-color: #fff; +} + +.head-image-div { + width: 15%; + height: 100%; + justify-content: center; + align-items: center; + margin-right: 20px; +} + +.head-image-div-single { + flex-direction: row; + align-items: center; + justify-content: center; +} + +.head-image-div-double { + flex-direction: row; + align-items: center; + justify-content: center; +} + +.head-image-div-all { + flex-direction: column; + align-items: center; + justify-content: center; +} + +.head-image-all-one { + flex-direction: row; + align-items: center; + justify-content: center; + margin-bottom: -2px; +} + +.head-image-all-two { + flex-direction: row; + align-items: center; + justify-content: center; +} + +.head-image { + width: 80px; + height: 80px; +} + +.head-image-multi { + width: 38px; + height: 38px; + margin: 1px; +} + +.head-image-pin { + width: 24px; + height: 24px; +} + +.body { + height: 100%; + width: 78%; + flex-direction: column; + align-items: center; +} + +.body-no-head { + height: 100%; + width: 95%; + flex-direction: column; + align-items: center; +} + +.body-up-left { + height: 100%; + width: 50%; + flex: 1; + margin-bottom: 2px; + align-items: flex-end; +} + +.body-up-left-notice-text { + font-size: 40px; + font-weight: 500; +} + +.body-up-left-text { + font-size: 36px; + text-overflow: ellipsis; + color: #191919; + max-lines: 1; +} + +.body-up-right-date { + color: grey; +} + +.body-up-right { + height: 100%; + justify-content: flex-end; + padding-right: 30px; + align-items: flex-end; +} + +.body-half { + height: 50%; + width: 100%; + flex-direction: row; +} + +.divider-list { + width: 100%; + height: 5px; + background-color: #CBE6E6FA; +} + +.body-down-left { + width: 100%; + height: 50%; + align-items: flex-start; + margin-top: 10px; + margin-right: 30px; +} + +.body-down-right { + width: 10%; + height: 100%; + align-items: center; + padding-right: 30px; +} + +.red-exception { + font-size: 30px; + color: #f00; +} + +.draft { + font-size: 25px; +} + +.message-detail { + font-size: 30px; + max-lines: 1; + text-overflow: ellipsis; + color: #666; +} + +.new-message-button-container { + position: absolute; + right: 30px; + bottom: 10px; + width: 100px; + height: 100px; + padding: 10px; +} + +.new-message-button { + width: 80px; + height: 80px; + border-radius: 40px; +} + +.messaging-title-fontSizeChange { + animation-name: FontSizeChange; + animation-timing-function: smooth; + animation-duration: 20s; + transform: translateY(-80px); + animation-fill-mode: none; +} + +.unread-fontOpacityChange { + animation-name: FontOpacityChange; + animation-timing-function: smooth; + animation-duration: 20s; + transform: translateY(-80px); + animation-fill-mode: none; +} + +.conversation-item-input { + width: 100px; + height: 100px; +} + +/*会话列表底部,长按菜单选项*/ +.conversation-menu { + width: 100%; + height: 140px; + align-items: center; + padding-left: 180px; + padding-right: 180px; + flex-direction: row; +} + +.conversation-menu-item { + flex-direction: column; + justify-content: center; + align-items: center; + width: 50%; +} + +.conversation-menu-item-image { + width: 48px; + height: 48px; +} + +.conversation-menu-item-text { + font-size: 20px; +} + +/*退出多选按钮*/ +.conversation-select-exit { + height: 50px; + width: 50px; + margin-left: 30px; + margin-top: 30px; +} + +/*删除弹窗布局*/ +.delete-dialog-div { + flex-direction: column; + margin-bottom: 110px; +} + +/*删除弹窗布局*/ +.no-delete-dialog-div { + flex-direction: column; + margin-bottom: 20px; +} + +/*删除里面布局*/ +.delete-dialog-inner { + display: flex; + width: 100%; + flex-direction: column; + padding: 20px; +} + +/*删除信息*/ +.dialog-inner-text1 { + width: 100%; + margin-top: 40px; + margin-bottom: 20px; + text-align: center; +} + +.dialog-inner-text2 { + width: 100%; + margin-top: 40px; + margin-bottom: 5px; + text-align: left; + margin-left: 30px; +} + +/*删除执行逻辑div*/ +.dialog-inner-logic { + width: 100%; + height: 60px; + flex-direction: row; + justify-content: center; + margin-top: 10px; +} + +.dialog-inner-cb { + width: 100%; + height: 80px; + flex-direction: row; + align-items: center; +} + +.dialog-inner-cb-text { + height: 100%; + justify-content: center; +} + +/*竖线*/ +.dialog-inner-logic-vertical { + width: 2px; + height: 50px; + background-color: darkgrey; +} + +/*取消字体*/ +.dialog-inner-logic-cancel { + flex: 1; + text-align: center; + color: #0000ff; +} + +/*删除字体*/ +.dialog-inner-logic-confirm { + flex: 1; + text-align: center; + color: #f00; +} + +.search-conversation-item-title { + padding-left: 48px; + height: 80px; +} + +.search-conversation { + width: 100%; + height: 144px; + flex-direction: row; + padding-left: 48px; + padding-right: 48px; + align-items: center; +} + +.search-conversation-image-div { + width: 100px; + height: 80px; +} + +.search-conversation-image { + width: 80px; + height: 80px; +} + +.search-conversation-right { + left: 24px; + width: 100%; + height: 100px; + flex-direction: column; + justify-content: center; +} + +.search-conversation-right-top { + flex-direction: row; + height: 50px; +} + +.search-conversation-right-top-name { + width: 100%; + max-lines: 1; +} + +.search-conversation-right-top-time { + text-align: right; + width: 220px; +} + +.search-conversation-right-bottom-details { + align-items: center; + max-lines: 1; + text-overflow: ellipsis; +} + +.chat-list-empty { + width: 100px; + height: 100px; +} + +.search-interval { + width: 100%; + height: 12px; + background-color: #e5e5e5; +} + + +.search-sms-title { + padding-left: 48px; + height: 80px; +} + +@keyframes FontSizeChange { + from { + font-size: 50px; + } + + to { + font-size: 40px; + } +} +@keyframes FontOpacityChange { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/conversation_list/conversation_list.hml b/entry/src/main/js/default/pages/conversation_list/conversation_list.hml new file mode 100644 index 0000000..de45e60 --- /dev/null +++ b/entry/src/main/js/default/pages/conversation_list/conversation_list.hml @@ -0,0 +1,346 @@ + + + + +
+
+
+ + + + {{conversationSelectedNumber == 0 ? $t('strings.msg_unselected_tip') : + $t('strings.msg_selected_tip', {number : conversationSelectedNumber})}} +
+
+
+
+
+
+ +
+ + + + + + +
+ + +
+ {{$t('strings.messaging')}} +
+ + + {{unreadTotal}}{{$t('strings.unread')}} + +
+
+
+ + + + + + +
+ + +
+ + + + +
+
+
+ +
+
+ +
+
+
+ {{$t('strings.infoMessages')}} +
+
+ + + {{unreadTotalOfInfo}} {{$t('strings.greaterThanSign')}} + {{$t('strings.greaterThanSign')}} + +
+
+
+
+ +
+
+
+ + + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+
+ +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ + +
+ + {{($item.name) ? ($item.name) : ($item.telephoneFormat)}} +
+ + +
+ {{$item.time}} +
+
+ + +
+ + + [{{$t('strings.draft')}}] + {{$item.content}} + + + {{$t('strings.messageSendFailed')}} + + + + + {{$item.countOfUnread}} {{$t('strings.multiUnread')}} + + + {{$item.content}} + +
+
+
+
+ + + +
+
+ +
+ + + + + {{$t('strings.msg_find')}}{{searchResultList.sessionList.length}}{{$t('strings.msg_conversation_up')}} + + + + + +
+ + +
+ +
+ + +
+ + +
+
+ + +
+ {{$item.time}} + +
+ + + + {{$item.size}}{{$t('strings.msg_information')}} +
+
+
+ + + + + + + + {{ $t('strings.msg_find') }}{{searchResultList.contentList.length}}{{$t('strings.msg_information')}} + + + + + +
+ + +
+ +
+ + +
+ + +
+
+ + {{$item.name == null || $item.name === '' ? $item.telephoneFormat : $item.name}} + +
+ {{$item.time}} +
+ + + +
+
+
+ + + + + + + {{$t('strings.noMessages')}} + + {{$t('strings.there_is_no_match')}} + +
+ + +
+
+ + +
+ + +
+ + {{$t('strings.delete')}} +
+ + +
+ + {{strCheckBoxSelectTip}} +
+
+ + +
+ +
+ + + +
+ {{strMsgDeleteDialogTip}} +
+ + {{$t('strings.msg_delete_dialog_cb_tip')}} +
+
+ + {{ $t('strings.msg_delete_dialog_cancel')}} +
+ + {{$t('strings.delete')}} +
+
+
+
\ No newline at end of file diff --git a/entry/src/main/js/default/pages/conversation_list/conversation_list.js b/entry/src/main/js/default/pages/conversation_list/conversation_list.js new file mode 100644 index 0000000..f69ff15 --- /dev/null +++ b/entry/src/main/js/default/pages/conversation_list/conversation_list.js @@ -0,0 +1,1093 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// 信息列表Service +import messageService from '../../service/ConversationListService.js'; +// 获取设置开关 +import settingService from '../../service/SettingService.js'; +import notificationService from '../../service/NotificationService.js'; +// log 工具类 +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +import commonEvent from '@ohos.commonevent'; +import common from '../common_constants.js'; + +export default { + data: { + svgDelete: '', + strCheckBoxSelectTip: '', + strMsgDeleteDialogTip: '', + // 所有短信的总条数 + total: 0, + // 通知信息的总条数 + totalOfInfo: 0, + // 未读信息的总条数 + unreadTotal: 0, + // 未读的通知信息总条数 + unreadTotalOfInfo: 0, + // 已经选中的会话条数 + conversationSelectedNumber: 0, + // 是否处于多选状态*/ + isMultipleSelectState: false, + // 是否会话列表处于全选状态 + isConversationCheckAll: false, + // 信息列表页面搜索框输入的值 + inputValueOfSearch: '', + inputValueOfSearchTemp: '', + // 通知信息所在行隐藏的'标记为已读',当存在未读信息时,向左滑动屏幕才能看见该图标 + markAllAsReadForInfo: false, + // 标记为已读 + showMarkAllAsRead: false, + // 删除,在每条单独的消息那一行,向左滑动屏幕可见 + showDelete: false, + // 是否锁定 默认false不锁定 + hasLockMsg: false, + isSelectLockMsg: false, + // 动态设置删除弹窗高度 + dialogHeight: '', + // 通知信息内的数据 + messageListForInfo: [], + // 如果通知信息整合开关打开,则是非通知信息,如果没有打开,则是所有数据 + messageList: [], + // 搜索结果列表 + searchResultList: { + sessionList: [], + contentList: [] + }, + // 搜索结果队列 + searchResultListQueue: [], + // 搜索文本队列 + searchTextQueue: [], + // 队列启动标志位 + queueFlag: false, + // 队列定时器启动标志位 + setTimeOutQueueFlag: false, + // 搜索结果的个数 + countOfSearchResult: 0, + // 是否真正进行跳转,避免重复跳转 + isJumping: false, + // 通知信息整合开关'是否打开,该开关在设置里 + hasAggregate: false, + // 显示联系人头像 + isShowContactHeadIcon: false, + // 是否显示搜索返回按钮 默认不显示 + isShowSearchBack: false, + // 搜索的时候蒙层透明色展示 + isSearchCoverage: false, + // 是否展示查询全部信息 + isSearchStatus: true, + // 是否展示会话搜索 + isSearchConversation: false, + // 是否展示间隔线 + isSearchInterval: false, + // 是否展示单个信息搜索 + isSearchSms: false, + // 显示搜索状态 + showSearchStatus: '', + // 是否显示新建短信按钮 + isNewSms: true, + conversationName: '', + // 搜索时显示搜索框所在div + showInfoDivWhenSearchFlag: true, + // 左滑的开始位置 + startX: 0, + // 操作按钮的长度 + operateBtnW: 145, + // 当前触摸的数据索引 + itemTouchedIdx: -1, + // 通知信息的左边距 + infoLeft: 0, + // 列表分页,页数 + page: 0, + // 列表分页,数量 + limit: 100, + // 公共订阅数据 + commonEventData: {} + }, + onInit() { + this.svgDelete = this.$t('svg.delete'); + this.strCheckBoxSelectTip = this.$t('strings.msg_select_all'); + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip2', { + number: this.conversationSelectedNumber + }); + this.showSearchStatus = this.$t('strings.noMessages'); + }, + onShow() { + this.isJumping = false; + this.subscribe() + this.getSettingFlagForConvListPage(); + this.statisticalData(); + this.page = 0; + this.messageList = []; + this.requestItem(); + this.hasInfoMsg = this.$app.$def.globalData.hasInfoMsg; + if (!this.hasInfoMsg && this.messageList.length == 0) { + this.total = 0; + } + }, + onDestroy() { + mmsLog.info(common.TAG.MsgList + 'onDestroy()......'); + this.unSubscribe(); + }, + onBackPress() { + // 系统返回键,true代表拦截 + if (this.isMultipleSelectState) { + for (let element of this.messageList) { + element.isCbChecked = false; + } + this.isMultipleSelectState = false; + return true; + } + if (!this.isSearchStatus) { + this.backSearch(); + return true; + } + return false; + }, + // 分页获取列表数据 + requestItem() { + let count = this.page * this.limit; + if (this.page === 0) { + this.page++; + this.queryAllMessages(); + } else if (count < this.total && this.messageList.length > (this.page - 1) * this.limit) { + // 对messageList的限制,是防止初始化时多次刷新请求 + this.page++; + this.queryAllMessages(); + } + }, + // 获取整合通知信息和显示联系人头像的开关值 + getSettingFlagForConvListPage() { + let prefer = this.$app.$def.preferences; + let result = settingService.getSettingFlagForConvListPage(prefer); + if (result) { + this.hasAggregate = result.hasAggregate; + this.isShowContactHeadIcon = result.isShowContactHeadIcon; + } + }, + subscribe() { + let events = [common.string.RECEIVE_TRANSMIT_EVENT] + let commonEventSubscribeInfo = { + events: events + }; + commonEvent.createSubscriber(commonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); + }, + subscriberCallBack(err, data) { + this.page = 1; + this.queryAllMessages(); + // 统计未读的信息 + this.statisticalData(); + }, + // 取消订阅 + unSubscribe() { + commonEvent.unsubscribe(this.commonEventData, () => { + mmsLog.info('info_msg unsubscribe'); + }); + }, + createSubscriberCallBack(err, data) { + this.commonEventData = data; + // 接收到订阅 + commonEvent.subscribe(this.commonEventData, this.subscriberCallBack.bind(this)); + }, + // 统计数据 + statisticalData() { + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + let that = this; + messageService.statisticalData(actionData, function (result) { + if (result.code == common.int.SUCCESS) { + mmsLog.info(common.TAG.MsgList + 'statisticalData Success'); + // 列表的总数 + that.unreadTotal = result.response.totalListCount; + // 通知信息的未读数 + that.unreadTotalOfInfo = result.response.unreadTotalOfInfo; + } else { + mmsLog.info(common.TAG.MsgList + 'Error: statisticalData() failed !!!'); + } + }); + }, + // 点击打开屏幕右上角的按钮,里面有设置 + clickToSettings() { + this.$element('settingsMenu').show({ + x: common.int.MESSAGE_CODE_THREE_FOUR_ZERO, + y: common.int.MESSAGE_CODE_TWENTY_FIVE + }); + }, + // 打开屏幕右上角的按钮后,进行相应的操作 + onMenuSelected(e) { + switch (e.value) { + case '1': + this.isMultipleSelectState = true; + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + break; + case '2': + // 跳转到收藏页面 + this.jumpToFavoritesPage(); + break; + case '4': + // 将所有未读的信息标记为已读 + this.clickToMarkAllAsRead(); + break; + case '5': + // 跳转至'设置'页面 + this.jumpToSettingsPage(); + break; + default: + mmsLog.info('onMenuSelected, code is exit'); + } + }, + setConversationCheckAll(type) { + // 检查是否全选 + if (!this.isMultipleSelectState) { + return; + } + if (type == common.int.CHECKBOX_SELECT_ALL) { + this.conversationSelectedNumber = this.messageList.length; + this.isConversationCheckAll = true; + } else if (type == common.int.CHECKBOX_SELECT_NONE) { + this.conversationSelectedNumber = common.int.MESSAGE_CODE_ZERO; + this.isConversationCheckAll = false; + } else { + // 默认为 CHECKBOX_SELECT_UNKNOWN,判断是否有未选中 + this.isConversationCheckAll = true; + this.conversationSelectedNumber = 0; + this.messageList.forEach((element, index, array) => { + if (element.isCbChecked) { + this.conversationSelectedNumber++; + } else if (this.isConversationCheckAll) { + this.isConversationCheckAll = false; + } + }) + } + if (this.isConversationCheckAll) { + // 全选状态 + this.strCheckBoxSelectTip = this.$t('strings.msg_deselect_all'); + } else { + // 非全选状态 + this.strCheckBoxSelectTip = this.$t('strings.msg_select_all'); + } + }, + // 搜索 + clickToSearch(e) { + this.inputValueOfSearch = e.text; + this.search(e.text); + }, + clickToConversation(index) { + if (this.resetTouch()) { + return; + } + // 跳转至短信详情页面 + mmsLog.info(common.TAG.MsgList + 'clickToConversation isMultipleSelectState: ' + this.isMultipleSelectState); + // 如果处于多选状态,响应CheckBox + if (this.isMultipleSelectState) { + this.messageList[index].isCbChecked = !this.messageList[index].isCbChecked; + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + return; + } + if (this.isJumping) { + return; + } + this.isJumping = true; + this.jumpToConversationPage(this.messageList[index]); + // 如果该联系人下有未读的信息,还需要向后端PA发送消息,使该联系人的所有信息标记为已读 + if (this.messageList[index].countOfUnread > common.int.MESSAGE_CODE_ZERO) { + this.markAllAsReadByIndex(index); + } + }, + cancelMessageNotify(threadIds, callback) { + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + hasRead: 0, + threadIds: threadIds + }; + notificationService.cancelMessageNotify(actionData, res => { + mmsLog.info(common.TAG.MsgList + 'cancelMessageNotify success: ' + res); + callback(); + }); + }, + // 跳转至通知信息页面 + clickToInfoMessages() { + if (this.resetTouch()) { + return; + } + if (this.isMultipleSelectState) { + return; + } + router.push({ + uri: 'pages/info_msg/info_msg' + }) + }, + clickToMarkAllAsRead() { + // 把未读的标记为已读,这里处理的是信息列表中的值 + let threadIds = []; + for (let mms of this.messageList) { + if (mms.countOfUnread > common.int.MESSAGE_CODE_ZERO) { + threadIds.push(mms.threadId); + } + } + this.markAllAsRead(threadIds, this.messageList, false); + + // 把通知信息的标记为已读 + let actionData = { + hasRead: 1, + smsType: 1, + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + } + messageService.markAllToRead(actionData); + this.unreadTotalOfInfo = 0; + this.unreadTotal = 0; + + // 取消所有的通知 + notificationService.cancelAllNotify(); + }, + markAllAsReadByIndex(index) { + mmsLog.log(common.TAG.MsgList + 'markAllAsReadByIndex start !!!'); + let item = this.messageList[index]; + let threadIds = [item.threadId]; + this.cancelMessageNotify(threadIds, () => { + // 把联系人(参数类型为数组)的所有信息标记为已读 + this.markAllAsRead(threadIds, this.messageList, false); + // 信息item没有自动右滑 + this.setListItemTransX(0); + }); + }, + markAllAsRead(threadIds, messageList, isInfo) { + // 把联系人(参数类型为数组)的所有信息标记为已读 + let valueBucket = { + 'unread_count': 0, + }; + let actionData = { + threadIds: threadIds, + rdbStore: this.$app.$def.rdbStore, + valueBucket: valueBucket, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + hasRead : 1 + }; + let countOfUnread = 0; + for (let mms of messageList) { + if (threadIds.indexOf(mms.threadId) > common.int.FAILURE) { + countOfUnread += mms.countOfUnread; + // 控制列表的未读图标的显示 + mms.countOfUnread = common.int.MESSAGE_CODE_ZERO; + } + } + this.unreadTotal -= countOfUnread; + // 如果是通知信息 + if (isInfo) { + this.unreadTotalOfInfo -= countOfUnread; + } + // 将标记已读的数据更新为0 + messageService.markAllAsRead(actionData); + }, + // 跳转至新建信息页面 + clickToNewMessage() { + if (this.isJumping) { + return; + } + this.resetTouch(); + this.isJumping = true; + this.jumpToNewMessagePage(); + }, + jumpToNewMessagePage(){ + router.push({ + uri: 'pages/conversation/conversation', + params: { + isNewMsg: true + } + }); + }, + // 点击头像跳转至联系人详情页面或收件人列表页面 + clickToGroupDetail(index) { + if (this.isJumping) { + return; + } + this.isJumping = true; + // 判断跳转到联系人详情还是跳转到多个收件人的列表页面 + var contactsNum = this.messageList[index].contactsNum; + var telephone = this.messageList[index].telephone; + if (contactsNum > common.int.MESSAGE_CODE_ONE) { + let threadId = this.messageList[index].threadId; + let contactsNum = this.messageList[index].contactsNum; + this.jumpToGroupDetailList(threadId, contactsNum); + } else { + var actionData = {}; + actionData.phoneNumber = telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + this.jumpToContract(actionData); + } + }, + // 跳转联系人app + jumpToContract(actionData){ + let commonService = this.$app.$def.commonService; + let str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info(common.TAG.MsgList + 'jumpToContract,Data'); + }).catch((error) => { + mmsLog.error(common.TAG.MsgList + 'jumpToContract,failed,Cause: ' + JSON.stringify(error)); + }) + }, + // 查询所有的列表信息 + queryAllMessages() { + mmsLog.info('querySessions,start!!!!'); + let that = this; + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + }; + // 通知信息是否需要整合 + if(this.hasAggregate) { + // 只查询非通知信息 + actionData.numberType = 0; + } + actionData.page = this.page; + actionData.limit = this.limit; + let rdbStore = this.$app.$def.rdbStore; + let dateUtil = this.$app.$def.dateUtil; + messageService.querySessionList(rdbStore, actionData, result => { + if (result.code == common.int.SUCCESS) { + mmsLog.info('querySessionList,success'); + let res = []; + result.response.forEach(item => { + let obj = {}; + obj = item; + obj.isDelShow = false; + obj.itemLeft = 0; + // 时间转换 + dateUtil.convertDateFormatForItem(item, false, that); + // 处理彩信的内容展示 + this.dealMmsListContent(item); + res.push(obj); + }); + that.messageList = res; + that.total = result.total; + that.showInfoDivWhenSearchFlag = result.showInfoDivWhenSearchFlag; + } else { + mmsLog.info(common.TAG.MsgList + 'Error: queryAllMessages() failed !!!') + } + }); + }, + dealMmsListContent(item) { + if(item.hasMms && item.hasAttachment) { + if(item.content == common.string.EMPTY_STR) { + item.content = this.$t('strings.attachment_no_subject'); + } else { + item.content = this.$t('strings.attachment') + item.content; + } + } + if(item.hasMms && !item.hasAttachment && item.content == common.string.EMPTY_STR) { + item.content = this.$t('strings.no_subject'); + } + }, + search(text) { + // 在信息列表页面搜索 + let actionData = {} + actionData.inputValue = text + this.searchTextAsync(actionData); + }, + searchTextAsync(actionData) { + actionData.rdbStore = this.$app.$def.rdbStore; + actionData.ohosDataAbility = this.$app.$def.ohosDataAbility; + actionData.featureAbility = this.$app.$def.featureAbility; + messageService.searchMessageWithLike(actionData, result => { + if (result.code == common.int.SUCCESS) { + // 获取搜索返回的结果先做判空处理 + if (this.inputValueOfSearch !== common.string.EMPTY_STR) { + this.dealSearchResult(result); + } + } else { + this.searchResultListEmpty(); + } + }); + }, + searchResultListEmpty() { + this.searchResultList = { + contentList: [], + sessionList: [] + } + this.isSearchStatus = true; + this.showInfoDivWhenSearchFlag = true; + if (this.isShowSearchBack) { + this.isSearchCoverage = true; + } else { + this.isSearchCoverage = false; + } + }, + dealSearchResult(result) { + this.searchResultList = { + contentList: [], + sessionList: [] + } + this.showInfoDivWhenSearchFlag = false; + this.isSearchStatus = false; + this.isSearchCoverage = false; + this.buildSearchResult(result); + if (this.inputValueOfSearch === result.search) { + this.searchResultList = result.resultMap; + } + }, + buildSearchResult(result) { + let dateUtil = this.$app.$def.dateUtil; + if (result.resultMap.contentList) { + result.resultMap.contentList.forEach(content => { + content.timeMillisecond = parseInt(content.timeMillisecond); + dateUtil.convertDateFormatForItem(content, true, this); + if(content.isFavorite) { + content.name = this.$t('strings.message_in_favorites'); + } + }); + } + if (result.resultMap.sessionList) { + result.resultMap.sessionList.forEach(session => { + session.timeMillisecond = parseInt(session.timeMillisecond); + dateUtil.convertDateFormatForItem(session, true, this); + }); + } + }, + // 删除信息 + deleteMessage(telephoneArray){ + let actionData = {}; + actionData.telephoneNumbers = telephoneArray; + messageService.deleteMessage(actionData); + }, + // 跳转到详情页面 + jumpToConversationPage(item){ + router.push({ + uri: 'pages/conversation/conversation', + params: { + strContactsNumber: item.telephone, + strContactsNumberFormat: item.telephoneFormat, + strContactsName: item.name, + contactsNum: item.contactsNum, + threadId: item.threadId, + isDraft: item.isDraft, + draftContent: item.content, + } + }); + }, + // 跳转到组详情页面 + jumpToGroupDetailList(threadId, contactsNum){ + router.push({ + uri: 'pages/group_detail/group_detail', + params: { + threadId: threadId, + contactsNum: contactsNum + } + }); + }, + // 跳转到设置页面 + jumpToSettingsPage(){ + router.push({ + uri: 'pages/settings/settings', + params: { + pageFlag: 'settingsDetail', + } + }) + }, + // 跳转至收藏页面 + jumpToFavoritesPage(){ + router.push({ + uri: 'pages/my_star/my_star', + }); + }, + conversationCheckboxChange(index, e) { + this.messageList[index].isCbChecked = e.checked; + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + }, + // 长按单个列表,展示全选和删除 + conversationLongPress(index) { + // 是否有左滑删除按钮存在,存在则不可点击 + if (this.itemTouchedIdx >= 0 && this.messageList[this.itemTouchedIdx].isDelShow) { + return; + } + // 长按单个列表,展示全选和删除 + mmsLog.info(common.TAG.MsgList + 'conversationLongPress==>index:' + index); + if (this.isMultipleSelectState) { + this.messageList[index].isCbChecked = !this.messageList[index].isCbChecked; + } else { + this.isMultipleSelectState = true; + this.messageList[index].isCbChecked = true; + } + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + }, + clickConversationDelete() { + // 按钮删除 + if (this.conversationSelectedNumber == common.int.MESSAGE_CODE_ZERO) { + return; + } + // 删除一条 + if (this.conversationSelectedNumber == common.int.MESSAGE_CODE_ONE) { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip1'); + } else if (this.conversationSelectedNumber == this.messageList.length) { + // 删除全部 + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip3'); + } else { + // 删除多条 + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip2', { + number: this.conversationSelectedNumber + }); + } + // 是否被锁定 + this.hasLockMsg = this.judgehasLockMsg(); + this.$element('delete_dialog').show(); + }, + judgehasLockMsg() { + let hasLockMsg = false; + for (let element of this.messageList) { + if (element.isCbChecked && element.isLock) { + hasLockMsg = true; + break; + } + } + return hasLockMsg; + }, + clickConversationCheckAll() { + // 全选/取消全选 + if (this.isConversationCheckAll) { + for (let element of this.messageList) { + element.isCbChecked = false; + } + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_NONE); + } else { + // 非全选-->全选 + for (let element of this.messageList) { + element.isCbChecked = true; + } + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_ALL); + } + }, + exitConversationSelect() { + // 退出多选deleteDialogCancel + this.onBackPress(); + }, + deleteDialogCancel() { + // 取消弹出 + this.$element('delete_dialog').close(); + if (this.isSelectLockMsg) { + this.isSelectLockMsg = false; + } + }, + deleteDialogConfirm() { + let mmsList = []; + let threadIds = []; + let lockThreadIds = []; + let actionData = { + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + }; + for (let element of this.messageList) { + if (element.isCbChecked) { + if (element.isLock && !this.isSelectLockMsg) { + lockThreadIds.push(element.threadId); + mmsList.push(element); + } else { + threadIds.push(element.threadId); + } + } else { + mmsList.push(element); + } + } + // 设置为非多选状态 + this.isMultipleSelectState = false; + this.isSelectLockMsg = false; + this.messageList = mmsList; + this.total = this.messageList.length; + // 取消弹出 + this.$element('delete_dialog').close(); + this.deleteNotifyMessage(threadIds, lockThreadIds, actionData, () => { + this.deleteMessageByThreadIds(threadIds, lockThreadIds, actionData); + }); + this.setDelShow(); + }, + deleteNotifyMessage(threadIds, lockThreadIds, actionData, callback) { + let sessionIds = []; + if (threadIds.length > 0) { + sessionIds.push(threadIds); + } + if (lockThreadIds.length > 0) { + sessionIds.push(lockThreadIds); + } + actionData.threadIds = sessionIds; + actionData.hasRead = 0; + this.cancelMessageNotify(actionData, callback); + }, + deleteMessageByThreadIds(threadIds, lockThreadIds, actionData) { + if (threadIds.length > 0) { + actionData.threadIds = threadIds; + messageService.deleteMessageById(actionData); + } + if (lockThreadIds.length > 0) { + actionData.threadIds = lockThreadIds; + actionData.isMessageDetail = false; + messageService.dealMessageLockContent(actionData, res => { + actionData.hasLock = 0; + messageService.deleteMessageBySessionIdsAndLock(actionData); + }); + } + }, + setSelectLockChange(e) { + // 删除锁定CheckBox勾选事件 + this.isSelectLockMsg = e.checked; + }, + setDelShow() { + if (this.itemTouchedIdx >= 0) { + let item = this.messageList[this.itemTouchedIdx]; + this.setListItemTransX(0); + item.isDelShow = false; + } + }, + setSelectLock() { + this.isSelectLockMsg = !this.isSelectLockMsg; + }, + searchTouchStart(e) { + // 判断是否是多选状态 + if (this.isMultipleSelectState) { + return false; + } + let that = this + // 搜索区域touchStart监控x > 125 && x < 600) && (y < 70 && y > 20 + var x = e.touches[0].localX; + if (e.currentTarget.type === 'search' && x > 80 && x < 560) { + this.isShowSearchBack = true; + // 蒙层展示 + this.isSearchCoverage = true; + // 是否显示新建按钮 + this.isNewSms = false; + // 拉起输入法 + setTimeout(function () { + that.$element('searchBox').focus({ + focus: true + }) + }, common.int.MESSAGE_CODE_THREE_ZERO_ZERO) + } + this.resetTouch(); + return false; + }, + clickSearchBack() { + // 点击搜索返回按钮后 + this.backSearch(); + }, + searchCoverageClick() { + // 手指滑动蒙层退出搜索模式 + this.backSearch(); + }, + searchConversationClick(index) { + // 跳转到会话详情 + let isSearchConversation = 0; + this.searchMmsClicked(this.searchResultList.sessionList[index], isSearchConversation); + }, + searchSmsClick(index) { + // 点击单个信息 + let isSearchConversation = 1; + this.searchMmsClicked(this.searchResultList.contentList[index], isSearchConversation); + }, + searchConversationHeadClick(index) { + // 搜索会话头像点击 + this.headClickedListener(this.searchResultList.sessionList[index]); + }, + searchSmsHeadClick(index) { + // 单条信息头像点击跳转 判断跳转到联系人详情还是跳转到多个收件人的列表页面 + this.headClickedListener(this.searchResultList.contentList[index]); + }, + backSearch() { + this.isShowSearchBack = false; + this.isSearchCoverage = false; + this.$element('searchBox').focus({ + focus: false + }); + this.inputValueOfSearch = common.string.EMPTY_STR; + this.isSearchStatus = true; + this.isNewSms = true; + this.searchResultList.sessionList = []; + this.searchResultList.contentList = []; + }, + headClickedListener(item) { + // 点击头像跳转至联系人详情页面或收件人列表页面 + if (this.isJumping) { + return; + } + // 收藏数据,头像不需要跳转 + if(item.isFavorite != null && item.isFavorite) { + return; + } + this.isJumping = true; + // 判断跳转到联系人详情还是跳转到多个收件人的列表页面 + var contactsNum = item.contactsNum; + var telephone = item.telephone; + if (contactsNum > common.int.MESSAGE_CODE_ONE) { + let threadId = item.threadId; + let contactsNum = item.contactsNum; + this.jumpToGroupDetailList(threadId, contactsNum); + } else { + // 联系人提供js的跳转API + var actionData = {}; + actionData.phoneNumber = telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + this.jumpToContract(actionData); + } + }, + searchMmsClicked(item, isSearchConversation) { + if(item.isFavorite) { + this.jumpToMyStar(); + } else { + // 跳转到短信详情 + router.push({ + uri: 'pages/conversation/conversation', + params: { + strContactsNumber: item.telephone, + strContactsNumberFormat: item.telephoneFormat, + strContactsName: item.name, + contactsNum: item.contactsNum, + threadId: item.threadId, + isDraft: item.isDraft, + searchContent: this.inputValueOfSearch + } + }); + } + }, + jumpToMyStar() { + router.push({ + uri: 'pages/my_star/my_star', + params: { + searchContent: this.inputValueOfSearch + } + }); + }, + // 重置触摸事件,用于其他按钮点击时复位已左滑移动的item + resetTouch() { + if (this.itemTouchedIdx !== -1) { + let itemTouched = this.messageList[this.itemTouchedIdx]; + if (itemTouched.isDelShow) { + itemTouched.isDelShow = false; + this.setListItemTransX(0); + return true; + } + } else if (this.showMarkAllAsRead) { + this.showMarkAllAsRead = false; + this.setInfoItemTransX(0); + return true; + } + return false; + }, + // 重置上一个触摸事件,用于左滑item,定时器在此处是必须的,否则会响应到点击事件 + resetPreListItemTouch() { + let itemTouched = this.messageList[this.itemTouchedIdx]; + if (itemTouched.isDelShow) { + this.setListItemTransX(0); + setTimeout(function () { + itemTouched.isDelShow = false; + }, 200); + } + }, + getTouchIndex(ele) { + let itemIndex = -1; + if (ele.classList[0] === 'messaging-body-item') { + if (itemIndex === -1) { + itemIndex = ele.classList[1].substring(5); + } + } + return parseInt(itemIndex); + }, + // 信息列表的触摸事件 + touchStart(event) { + if (this.isMultipleSelectState) { + return; + } + if (this.showMarkAllAsRead) { + // 上一个触控的是通知item,则将通知item复位 + this.setInfoItemTransX(0); + setTimeout(() => { + this.showMarkAllAsRead = false; + }, 200); + } else { + // 查看当前触控的item是否是跟上一个触控的是同一个,若不是,将上一个复位 + let touchIdx = this.getTouchIndex(event.currentTarget); + if (this.itemTouchedIdx !== -1 && touchIdx !== this.itemTouchedIdx) { + this.resetPreListItemTouch(); + } + } + this.startX = event.touches[0].globalX; + }, + touchMove(event) { + if (this.isMultipleSelectState) { + return; + } + let moveX = event.touches[0].globalX; + let disX = this.startX - moveX; + // 位移小于2,视为没有滑动 + if (Math.abs(disX) <= 2) { + return; + } + let ele = event.currentTarget; + this.itemTouchedIdx = this.getTouchIndex(ele); + let itemTouched = this.messageList[this.itemTouchedIdx]; + if (itemTouched.countOfUnread > 0) { + this.operateBtnW = common.int.OPERATE_UNREAD_WIDTH; + } else { + this.operateBtnW = common.int.OPERATE_DELETE_WIDTH; + } + if (disX > 0) { + if (itemTouched.isDelShow) { + return; + } + let transX = disX; + if (disX >= this.operateBtnW) { + // 左滑到最大宽度 + transX = this.operateBtnW; + itemTouched.isDelShow = true; + } + this.setListItemTransX(transX); + } else if (disX < 0) { + if (!itemTouched.isDelShow) { + return; + } + if (disX > -this.operateBtnW) { + this.setListItemTransX(disX); + } else { + itemTouched.isDelShow = false; + this.setListItemTransX(0); + } + } + }, + touchEnd(event) { + if (this.isMultipleSelectState) { + return; + } + let endX = event.changedTouches[0].globalX; + let disX = this.startX - endX; + // 位移小于2,视为没有滑动 + if (Math.abs(disX) <= 2) { + return; + } + let itemTouched = this.messageList[this.itemTouchedIdx]; + if (disX < (this.operateBtnW / 2)) { + // 小于一半 回原位置 + this.setListItemTransX(0); + itemTouched.isDelShow = false; + } else { + // 大于一半 滑动到最大值 + this.setListItemTransX(this.operateBtnW); + itemTouched.isDelShow = true; + } + }, + setListItemTransX(disX) { + let itemTouched = this.messageList[this.itemTouchedIdx]; + if (itemTouched) { + if (disX >= 0) { + itemTouched.itemLeft = -disX; + } else { + itemTouched.itemLeft = -this.operateBtnW - disX; + } + } + }, + deleteAction(idx) { + let item = this.messageList[idx]; + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip1'); + item.isCbChecked = true; + this.hasLockMsg = this.judgehasLockMsg(); + this.$element('delete_dialog').show(); + }, + // 通知信息item的触摸事件 + touchInfoStart(event) { + if (this.isMultipleSelectState || this.unreadTotalOfInfo === 0) { + return; + } + // 上一个触控的若是信息列表item,则将其复位 + if (this.itemTouchedIdx >= 0 && this.messageList.length > this.itemTouchedIdx) { + this.resetPreListItemTouch(); + } + this.startX = event.touches[0].globalX; + }, + touchInfoMove(event) { + if (this.isMultipleSelectState || this.unreadTotalOfInfo === 0) { + return; + } + let moveX = event.touches[0].globalX; + let disX = this.startX - moveX; + // 位移小于2,视为没有滑动 + if (Math.abs(disX) <= 2) { + return; + } + this.operateBtnW = common.int.OPERATE_DELETE_WIDTH; + if (disX > 0) { + if (this.showMarkAllAsRead) { + return; + } + let transX = disX; + if (disX >= this.operateBtnW) { + // 左滑到最大宽度 + transX = this.operateBtnW; + this.showMarkAllAsRead = true; + this.itemTouchedIdx = -1; + } + this.setInfoItemTransX(transX); + } else if (disX < 0) { + if (!this.showMarkAllAsRead) { + return; + } + if (disX > -this.operateBtnW) { + this.setInfoItemTransX(disX); + } else { + this.showMarkAllAsRead = false; + this.setInfoItemTransX(0); + } + } + }, + touchInfoEnd(event) { + if (this.isMultipleSelectState || this.unreadTotalOfInfo === 0) { + return; + } + let endX = event.changedTouches[0].globalX; + let disX = this.startX - endX; + // 位移小于2,视为没有滑动 + if (Math.abs(disX) <= 2) { + return; + } + if (disX < (this.operateBtnW / 2)) { + // 小于一半 回原位置 + this.setInfoItemTransX(0); + this.showMarkAllAsRead = false; + } else { + // 大于一半 滑动到最大值 + this.setInfoItemTransX(this.operateBtnW); + this.showMarkAllAsRead = true; + this.itemTouchedIdx = -1; + } + }, + setInfoItemTransX(disX) { + if (disX >= 0) { + this.infoLeft = -disX; + } else { + this.infoLeft = -this.operateBtnW - disX; + } + }, + markInfoAsRead() { + this.unreadTotalOfInfo = 0; + this.showMarkAllAsRead = false; + this.setInfoItemTransX(0); + }, + jumpToCamera() { + router.push({ + uri: 'pages/test_camera/test_camera' + }) + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/full_screen_input/full_screen_input.css b/entry/src/main/js/default/pages/full_screen_input/full_screen_input.css new file mode 100644 index 0000000..4a1dadf --- /dev/null +++ b/entry/src/main/js/default/pages/full_screen_input/full_screen_input.css @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*最大DIV样式*/ +.container { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + width: 100%; + height: 100%; +} + +/*全屏输入表头*/ +.fullScreenTitle { + height: 10%; + margin-bottom: 10px; + margin-top: 20px; + flex-direction: row; + justify-content: center; +} + +/*返回按钮div*/ +.fullscreen_back { + width: 15%; + flex-direction: column; + justify-content: center; + align-items: center; +} + +/*返回按钮*/ +.single_back { + width: 48px; + height: 48px; + margin-left: 10px; + margin-top: 5px; +} + +/*文本信息div*/ +.title_div { + flex-direction: column; + justify-content: center; + width: 75%; +} + +/*文本信息*/ +.title { + font-size: 40px; + font-weight: 200; + justify-content: center; +} + +/*发送按钮和字数统计*/ +.send_button { + width: 10%; + margin-left: 10px; + margin-right: 30px; + flex-direction: column; + justify-content: center; + align-items: center; +} + +/*发送按钮*/ +.send-bar-send { + height: 60px; + width: 60px; +} + +/*发送文本字数统计*/ +.send-text-size { + font-size: 20px; +} + +/*输入框*/ +.input_text { + margin: 20px; + height: 90%; + flex-direction: column; +} + +.text_detail { + align-items: flex-start; + background-color: lightgray; +} + + + diff --git a/entry/src/main/js/default/pages/full_screen_input/full_screen_input.hml b/entry/src/main/js/default/pages/full_screen_input/full_screen_input.hml new file mode 100644 index 0000000..b6d21e9 --- /dev/null +++ b/entry/src/main/js/default/pages/full_screen_input/full_screen_input.hml @@ -0,0 +1,35 @@ + + +
+
+ +
+ +
+
+ {{$t('strings.fullScreenInput')}} +
+
+ + + + {{textPageSize}}/{{textPageNum}} +
+
+ +
+ +
+
diff --git a/entry/src/main/js/default/pages/full_screen_input/full_screen_input.js b/entry/src/main/js/default/pages/full_screen_input/full_screen_input.js new file mode 100644 index 0000000..866f44a --- /dev/null +++ b/entry/src/main/js/default/pages/full_screen_input/full_screen_input.js @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; + +const MESSAGE_CODE_STATUS_THREE = 3; +const MESSAGE_CODE_STATUS_SEVENTY = 70; + +export default { + data: { + // 文本内容 + textValue: '', + // 文本分页大小 + textPageSize: '', + // 文本分页数量 + textPageNum: '', + // 手机号 + telephone: '', + // 是否存在sim卡 + haveSimCard: false, + }, + onInit() { + mmsLog.info('textValue:' + this.inputDetail); + this.textValue = this.inputDetail; + }, + singleMsgBack() { + this.$app.$def.isShowFullScreen = false; + this.$app.$def.sendFlag = false; + router.back(); + }, + changeValue(e) { + if (e.text == null) { + return; + } + this.textValue = e.text; + this.$app.$def.textValueOther = this.textValue; + var n = Math.ceil(this.textValue.length / MESSAGE_CODE_STATUS_SEVENTY); + // 发送剩余编辑字数 + this.textPageSize = MESSAGE_CODE_STATUS_SEVENTY * n - this.textValue.length; + // 超过70个字符显示分发条数 + this.textPageNum = n; + // 是否显示全屏 + if (e.lines > MESSAGE_CODE_STATUS_THREE) { + this.isShowFullScreen = true; + this.styleFullScreenMore = 'full-screen-mores-true'; + } else { + this.isShowFullScreen = false; + this.styleFullScreenMore = 'full-screen-mores-false'; + } + }, + launchs() { + router.push({ + uri: 'pages/conversation/conversation', + }); + }, + send() { + this.$app.$def.sendFlag = true; + router.back(); + } +} diff --git a/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.css b/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.css new file mode 100644 index 0000000..eaa37c0 --- /dev/null +++ b/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.css @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.container { + display: flex; + width: 100%; + height: 100%; + background-color: #000; +} + +.title-bar { + width: 100%; + height: 100px; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding-left: 40px; + padding-right: 20px; + position: absolute; + left: 0; + top: 0; +} + +.chat-msg-back { + height: 48px; + width: 48px; +} + +.chat-msg-text { + color: #fff; + font-weight: 500; + font-size: 40px; + margin-left: 30px; +} +.checkbox { + width: 40px; + height: 40px; +} +.body { + width: 100%; + height: 100%; +} + +.body-image { + object-fit: none; +} + +.video-play-icon { + position: absolute; + left: 325px; + top: 655px; + width: 70px; + height: 70px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.hml b/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.hml new file mode 100644 index 0000000..3bda7b4 --- /dev/null +++ b/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.hml @@ -0,0 +1,29 @@ + + +
+
+
+ + {{which}}/{{total}} +
+ +
+
+ + +
+ +
diff --git a/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.js b/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.js new file mode 100644 index 0000000..6dd477c --- /dev/null +++ b/entry/src/main/js/default/pages/full_screen_show_picture/full_screen_show_picture.js @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import Router from '@system.router'; +import Prompt from '@system.prompt'; + +const MESSAGE_CODE_STATUS_TWO = 1; +export default { + data: { + // 哪一张图片 + which: 0, + // 总共图片数量 + total: 0, + // 是否被选中 + checkedValue: false, + // 图片或视频在SDK中的路径 + path: '', + // 图片 1 、视频 2 + type: 1, + // 所有选中的图片或视频的大小 + totalFileSize: 0.0, + // 当前这张图片或视频的大小 + fileSize: 0.0 + }, + onInit() { + this.$watch('checkedValue', 'saveCheckedValue') + }, + // 返回至'会话详情'页面 + clickToBack() { + Router.back() + }, + // 点击checkbox + onChangeOfCheckbox() { + if (!this.checkedValue && (this.totalFileSize + this.fileSize) > 300) { + Prompt.showToast({ + message: this.$t('strings.attachment_failed'), + duration: 2000, + }); + return; + } + this.checkedValue = !this.checkedValue; + }, + // 播放视频 + clickToPlayVideo() { + // 调用播放器播放视频 + }, + saveCheckedValue() { + this.$app.$def.indexInShowPicPage = this.which - MESSAGE_CODE_STATUS_TWO; + this.$app.$def.checkedValueInShowPicPage = this.checkedValue; + } +} diff --git a/entry/src/main/js/default/pages/group_detail/group_detail.css b/entry/src/main/js/default/pages/group_detail/group_detail.css new file mode 100644 index 0000000..b43382b --- /dev/null +++ b/entry/src/main/js/default/pages/group_detail/group_detail.css @@ -0,0 +1,294 @@ +/* +* Copyright (c) 2021 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/*最大的布局*/ +.chat-msg-page { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + justify-content: center;/*flex容器当前行的主轴对齐格式 项目位于容器的中心。*/ + align-items: center;/*flex容器当前行的交叉轴对齐格式 元素在交叉轴居中*/ + left: 0px; + top: 0px; + width: 100%; + height: 100%; +} + +/*上方TitleBar*/ +.title-bar { + align-items: center; + width: 100%; + height: 150px; + margin-left: 25px; + margin-right: 25px; +} + +.title-bar-text { + flex-direction: row; +} + +.chat-msg-back-div { + margin-left: 20px; + width: 100px; +} + +/*返回按钮*/ +.chat-msg-back { + height: 50px; + width: 60px; +} + +/*联系人Div*/ +.chat-msg-contact { + flex: 1; + height: 100%; + align-items: flex-start; + justify-content: center; + flex-direction: column; + margin-right: 30px; +} + +.chat-msg-contact-detail { + font-size: 50px; + color: #000000; + text-overflow: ellipsis; + flex-direction: row; + font-weight: 500; +} + +.chat-msg-contact-name { + font-size: 50px; + color: #000000; + text-overflow: ellipsis; + flex-direction: row; + font-weight: 500; +} + +.chat-msg-contact-number { + font-size: 28px; + color: #7a787d; + margin-top: 10px; + text-overflow: ellipsis; +} + +.contact-list { + width: 100%; + height: 100%; + flex-direction: column; + columns: 1; +} + +.contact-body { + width: 100%; + height: 110px; + flex-direction: row; + align-items: center; + padding-left: 20px; +} + +.head-image-div { + width: 20%; + height: 100%; + justify-content: center; + align-items: center; +} + +.head-image { + width: 80px; + height: 80px; +} + +.body-up { + flex-direction: row; + border-bottom: 1px; + border-bottom-color: #3B808080; + margin-right: 40px; + margin-left: 20px; + padding-bottom: 20px; + justify-content: center; +} + +.body-up-bottom { + flex-direction: row; + margin-right: 40px; + margin-left: 20px; +} + +.body-up-text-div { + flex-direction: column; + justify-content: center; + align-items: flex-start; + flex: 1; +} + +.body-up-text-div-double { + flex-direction: column; +} + +.body-up-text-div div { + flex-direction: column; +} + +.body-up-name { + text-overflow: ellipsis; + color: #000; + font-size: 32px; + font-weight: 500; + margin-bottom: 10px; +} + +.body-up-phone { + text-overflow: ellipsis; + color: grey; + font-size: 28px; +} + +.body-up-text-single { + text-overflow: ellipsis; + color: #000; + font-size: 30px; + font-weight: 500; +} + +.contact-body-right { + width: 70%; + flex-direction: row; + justify-content: center; + align-items: flex-end; +} + +.contact-body-right-common { + flex-direction: row; + justify-content: center; + align-items: flex-end; +} + +.contact-body-right-body { + flex-direction: column; + justify-content: center; + align-items: flex-end; + width: 80%; +} + +.contact-body-right-img { + flex-direction: column; + justify-content: center; + margin-bottom: 20px; + margin-left: 15px; + padding-left: 10px; + width: 100px; +} + +.contact-body-right-fail { + font-size: 30px; + color: red; +} + +.contact-body-right-time { + font-size: 28px; + color: grey; +} + +.contact-body-right-single { + flex-direction: row; + justify-content: flex-end; + align-items: center; + width: 80%; + height: 100%; +} + +.contact-body-right-send-text { + font-size: 28px; + color: grey; +} + +.image-sending-failed { + height: 45px; + width: 45px; +} + +.body-bottom { + position: absolute; + bottom: 0; + width: 100%; + height: 115px; + justify-content: center; + align-items: center; +} + +.body-bottom-content { + flex-direction: column; + justify-content: center; + align-items: center; +} + +.image-resend-all { + height: 50px; + width: 50px; +} + +.body-bottom-send-text { + font-size: 20px; + color: black; + margin-top: 10px; + font-weight: 500; +} + +/*重新发送弹框展示*/ +.fail_dialog { + flex-direction: column; + justify-content: center; + align-items: center; + padding-top: 40px; + padding-bottom: 40px; + padding-left: 10px; + padding-right: 10px; +} + +.fail_text { + margin-bottom: 20px; + margin-left: 45px; + margin-right: 45px; + flex-direction: row; + justify-content: center; + align-items: center; +} + +.fail_text_title { + font-size: 35px; +} + +.fail_button { + flex-direction: row; + height: 80px; + justify-content: center; + align-items: center; + margin-left: 10px; + margin-right: 10px; +} + +.btn_cancel_double { + color: #F30000FF; + width: 50%; +} + +.btn_restore_double { + color: #F30000FF; + width: 50%; +} + +.fail_divider { + stroke-width: 1px; + height: 50px; + color: #A1808080; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/group_detail/group_detail.hml b/entry/src/main/js/default/pages/group_detail/group_detail.hml new file mode 100644 index 0000000..6de7d2f --- /dev/null +++ b/entry/src/main/js/default/pages/group_detail/group_detail.hml @@ -0,0 +1,99 @@ + +
+ +
+ +
+ +
+ + +
+ {{ $t('strings.msg_detail_mms') }} +
+
+ {{ $t('strings.recipients') }} + {{$t('strings.members', {count: contactsNum})}} +
+
+ + + + + + +
+ +
+ + +
+
+
+ {{ $item.telephoneFormat }} +
+
+ {{ $item.contactName }} + {{ $item.telephoneFormat }} +
+
+
+
+
+ {{ $item.time }} + {{ $t('strings.messageSendFailed') }} +
+
+ +
+
+
+ {{ $t('strings.messageSending') }} +
+
+ {{ $item.time }} +
+
+
+
+
+ + +
+
+ + {{ $t('strings.msg_detail_resend_all') }} +
+
+ + + +
+ +
+ {{ $t('strings.msg_resend_prompt') }} +
+ +
+ + + +
+
+
+
diff --git a/entry/src/main/js/default/pages/group_detail/group_detail.js b/entry/src/main/js/default/pages/group_detail/group_detail.js new file mode 100644 index 0000000..a073fda --- /dev/null +++ b/entry/src/main/js/default/pages/group_detail/group_detail.js @@ -0,0 +1,250 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; + +// JS公共常量 +import common from '../common_constants.js'; + +// 相关接口的查询服务 +import groupDetailService from '../../service/GroupDetailService.js'; +import settingService from '../../service/SettingService.js'; +import conversationService from '../../service/ConversationService.js'; + +export default { + data: { + // 联系人数量 + contactsNum: 0, + // 会话列表ID + threadId: 0, + // 发送短信相关数据 + contactList: [], + // 是否真正进行跳转,避免重复跳转 + isJumping: false, + // 发送时间 + time: '', + // 是否重新发送 + isAllSendFail: false, + // 是否是详细信息 + isDetail: false, + // 组ID + groupId: 0, + // 重发的下标 + reSendIndex: 0, + // 重发的内容 + content: '', + // 卡1 + slotId: 0, + // 是否显示联系人头像 + isShowContactHeadIcon: true, + // 全部发送总数记录 + sendAllCount: 0 + }, + onInit() { + this.getSettingFlagForConvListPage(); + }, + onReady() { + mmsLog.info('JS_group_detail: ' + 'onReady()......'); + }, + onShow() { + mmsLog.info('JS_group_detail: ' + 'onShow()......'); + this.isJumping = false; + this.contactList = []; + this.queryContactSendDetail(); + }, + // 查询联系人列表或发送的信息详情 + queryContactSendDetail() { + let actionData = { + threadId: this.threadId, + groupId: this.groupId, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + rdbStore: this.$app.$def.rdbStore + }; + groupDetailService.queryContactSendDetail(this.isDetail, actionData, (result) => { + let code = result.code; + if (code == common.int.SUCCESS) { + mmsLog.info('JS_group_detail: ' + 'queryContactSendDetail Success:' + this.isDetail); + if (this.isDetail) { + this.converTime(result.contactList); + } + this.contactList = result.contactList; + if(this.isDetail) { + this.judgeIsAllSendFail(); + } + } else { + mmsLog.info('JS_group_detail: ' + 'Error: queryContactSendDetail() failed !!!'); + } + }); + }, + converTime(contactList) { + let dateUtil = this.$app.$def.dateUtil; + for(let item of contactList) { + item.timeMillisecond = parseInt(item.timeMillisecond); + dateUtil.convertTimeStampToDateWeek(item, true, this); + dateUtil.convertDateFormatForItem(item, true, this); + } + }, + // 统计发送失败的数量 + judgeIsAllSendFail() { + groupDetailService.judgeIsAllSendFail(this.contactList, (isAllSendFail) => { + this.isAllSendFail = isAllSendFail; + }); + }, + titleBarBack() { + router.back(); + }, + // 点击头像跳转至联系人详情页面 + clickToContactDetail(index) { + if (this.isJumping) { + return; + } + this.isJumping = true; + let actionData = {}; + actionData.phoneNumber = this.contactList[index].telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + // 跳转联系人详情页面 + this.jumpToContract(actionData); + }, + // 全部重新发送 + resendAll() { + let telephones = []; + let that = this; + let contractListTemp = []; + let contractListReal = []; + this.contactList.forEach(function (item) { + if (item.sendStatus == common.int.SEND_MESSAGE_FAILED) { + telephones.push(item.telephone); + item.sendStatus = common.int.SEND_MESSAGE_SENDING; + // 将状态更新为正在发送 + that.updataItemStatus(item.id, 2); + contractListTemp.push(item); + } else { + contractListReal.push(item); + } + }); + // 将正在发送的数据,放到列表的第一位 + contractListReal.forEach(function (item) { + contractListTemp.push(item); + }); + // 获取数据判断图标是否展示 + this.judgeIsAllSendFail(); + // 排序后的数据 + this.contactList = contractListTemp; + // 进行群组发送 + if (telephones && telephones.length > 0) { + for (let telephone of telephones) { + this.resendSms(telephone, that.content, telephones.length); + } + } + }, + // 发送按钮点击取消按钮取消对话框 + cancelResend() { + this.$element('mms_fail_dialog').close(); + this.reSendIndex = 0; + }, + // 点击重新发送按钮发送 + resend() { + this.contactList[this.reSendIndex].time = this.$t('strings.just'); + this.contactList[this.reSendIndex].sendStatus = 1; + let item = this.contactList[this.reSendIndex]; + let telephone = this.contactList[this.reSendIndex].telephone; + // 获取数据判断图标是否展示 + this.judgeIsAllSendFail(); + this.$element('mms_fail_dialog').close(); + // 将状态更新为正在发送 + this.updataItemStatus(item.id, 2); + this.resendSms(telephone, this.content, 1); + }, + resendSms(destinationHost, content, telephonesLength) { + mmsLog.info('resendSms,start'); + let params = { + slotId: this.slotId, + destinationHost: destinationHost, + content: content + }; + let sendMsgService = this.$app.$def.sendMsgService; + sendMsgService.sendMessage(params, (sendStatus) => { + // 处理发送的结果 + this.dealSendResult(sendStatus, params.destinationHost); + this.sendAllCount ++; + if (this.sendAllCount === telephonesLength) { + // 获取数据判断图标是否展示 + this.judgeIsAllSendFail(); + this.sendAllCount = 0; + } + }); + }, + // 点击失败图片,唤起dialog + resendOpen(index) { + this.$element('mms_fail_dialog').show(); + this.reSendIndex = index; + }, + dealSendResult(result, telephone) { + mmsLog.info('dealSendResult,result:' + result); + this.contactList.forEach((item) => { + if (item.telephone == telephone) { + item.sendStatus = result; + let sendStatus = result; + if(item.sendStatus == common.int.SEND_MESSAGE_FAILED) { + sendStatus = 1; + } else if(item.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { + sendStatus = 0; + } else { + sendStatus = 2; + } + this.updataItemStatus(item.id, sendStatus); + } + }); + }, + updataItemStatus(id, sendStatus) { + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + msgId: id, + sendStatus: sendStatus + } + conversationService.updateById(actionData, res => { + mmsLog.log('updateById,result:' + JSON.stringify(res)); + }); + }, + // 获取整合通知信息和显示联系人头像的开关值 + getSettingFlagForConvListPage() { + let preferences = this.$app.$def.preferences; + let result = settingService.getSettingFlagForConvListPage(preferences); + if (result) { + this.isShowContactHeadIcon = result.isShowContactHeadIcon; + } + }, + // 跳转联系人app + jumpToContract(actionData) { + var str = { + 'want': { + 'bundleName': common.string.CONTRACT_BUNDLE_NAME, + 'abilityName': common.string.CONTRACT_ABILITY_NAME, + 'parameters': actionData, + 'entities': [ + common.string.COMMON_ENTITIES + ] + }, + }; + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info('JS_group_detail jumpToContract Data' + data); + }).catch((error) => { + mmsLog.error('JS_group_detail jumpToContract failed: ' + JSON.stringify(error)); + }) + }, +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.css b/entry/src/main/js/default/pages/index/index.css new file mode 100644 index 0000000..eee7cc9 --- /dev/null +++ b/entry/src/main/js/default/pages/index/index.css @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.container { + display: flex; + justify-content: center; + align-items: center; + left: 0; + top: 0; + width: 454px; + height: 454px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.hml b/entry/src/main/js/default/pages/index/index.hml new file mode 100644 index 0000000..c6d0cca --- /dev/null +++ b/entry/src/main/js/default/pages/index/index.hml @@ -0,0 +1,17 @@ + +
+ +
diff --git a/entry/src/main/js/default/pages/index/index.js b/entry/src/main/js/default/pages/index/index.js new file mode 100644 index 0000000..709470e --- /dev/null +++ b/entry/src/main/js/default/pages/index/index.js @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import router from '@system.router'; + +// JS公共常量 +import common from '../common_constants.js'; +import mmsLog from '../../../default/utils/MmsLog.js'; +import contactService from '../../service/ContractService.js'; +import mmsTable from '../../pages/mms_table.js'; +import simCardService from '../../service/SimCardService.js'; + +const TAG = 'index.js --->'; + +export default { + data: { + uri: common.string.EMPTY_STR, + pageFlag: 'conversationList', + contractParams: null + }, + onInit() { + // 初始化数据库 + this.initRdb(); + }, + onShow() { + this.initStorage(); + this.getWant(); + }, + async initRdb() { + // 创建数据库表 + let rdbStore = this.$app.$def.rdbStore; + rdbStore.createRdbStore().then(async (ret) => { + mmsLog.log(' logMessage createRdbStore first done: ' + ret); + await rdbStore.createTable(mmsTable.table.session); + }).catch((err) => { + mmsLog.log(' logMessage error insert first done: ' + err); + }); + }, + initStorage() { + let preferences = this.$app.$def.preferences; + preferences.initDataStorage().then((ret) => { + mmsLog.log('initStorage first done:' + ret); + // 获取simCount + this.initSimCardNum(preferences); + // 获取卡的运营商 + this.simInfoProcessor(preferences); + }).catch((err) => { + mmsLog.log('initStorage first done:' + err); + }); + }, + initSimCardNum(preferences) { + simCardService.initSimCardNum(preferences); + }, + // 处理Sim卡相关的信息(sim卡的数量以及运营商的名字) + simInfoProcessor(preferences) { + simCardService.simInfoHandler(preferences); + }, + getWant() { + let featureAbility = this.$app.$def.featureAbility; + featureAbility.getWant().then((Want) => { + mmsLog.log('getWant,start'); + let parameters = Want.parameters; + if (parameters) { + if (parameters.pageFlag) { + this.pageFlag = parameters.pageFlag; + } + this.contractParams = contactService.dealContractParams(parameters.contactObjects); + } + if (Want.uri != common.string.EMPTY_STR) { + this.pageFlag = Want.uri; + } + // 页面跳转 + this.jump(); + }).catch((error) => { + mmsLog.error('Operation failed. Cause: ' + JSON.stringify(error)); + }) + }, + jump() { + let result = {}; + switch (this.pageFlag) { + case 'conversationList': + result.uri = 'pages/conversation_list/conversation_list'; + router.replace(result); + break; + case 'conversation': + result.uri = 'pages/conversation/conversation'; + if (this.contractParams) { + result.params = this.contractParams; + this.jumpIsNewPage(result); + } else { + router.replace(result); + } + break; + default: + result.uri = common.string.EMPTY_STR; + break; + } + }, + jumpIsNewPage(result) { + // 判断是否 + let conversationListService = this.$app.$def.conversationListService; + let rdbStore = this.$app.$def.rdbStore; + let sessionListPromise = new Promise((resolve) => { + let strContactsNumber = this.contractParams.strContactsNumber; + conversationListService.querySessionByTelephone(rdbStore, strContactsNumber, res => { + resolve(res); + }); + }); + Promise.all([sessionListPromise]).then(res => { + if (res[0].code == common.int.SUCCESS && res[0].response.id > 0) { + result.params.threadId = res[0].response.id; + } else { + result.params.isNewMsg = true; + } + mmsLog.log(TAG + 'jump,start'); + router.replace(result); + }).catch(err => { + mmsLog.log(TAG + 'jumpIsNewPage:' + err); + }); + } +} diff --git a/entry/src/main/js/default/pages/info_msg/info_msg.css b/entry/src/main/js/default/pages/info_msg/info_msg.css new file mode 100644 index 0000000..d6eabb8 --- /dev/null +++ b/entry/src/main/js/default/pages/info_msg/info_msg.css @@ -0,0 +1,135 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*通知信息*/ +@import '../conversation_list/conversation_list.css'; +.container { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; +} + +.app-bar-info { + width: 100%; + height: 130px; + flex-direction: row; + padding-top: 10px; + padding-left: 30px; + align-items: center; +} + +.search-div { + flex-direction: row; + height: 130px; + align-items: center; + padding-left: 40px; + padding-right: 40px; +} + +.app-bar-image { + width: 50px; + height: 50px; +} + +.app-bar-text { + padding-left: 20px; + font-size: 40px; + font-weight: bold; +} + +.tool-bar { + width: 100%; + height: 120px; + background-color: #d8d8d7; + align-items: center; + justify-content: space-evenly; +} + +.mark-all-as-read { + width: 50%; + height: 100%; + justify-content: flex-end; +} + +.more { + width: 50%; + height: 100%; + justify-content: flex-start; +} + +.half { + width: 30%; + height: 100%; + flex-direction: column; + justify-content: space-between; + align-items: center; +} + +.more-dialog { + display: flex; + flex-direction: column; + padding-left: 30px; + padding-right: 30px; +} + +.more-dialog-half { + height: 50%; + width: 100%; + align-items: center; +} + +.navigation-bar { + width: 100%; + height: 126px; + background-color: #F0F1F3; +} + +.messaging-body-item { + top: 0; + left: 0; + height: 100%; + width: 100%; +} + +.item-delete { + top: 0; + height: 100%; + flex-direction: row; + align-items: center; + justify-content: center; + background-color: #F2F2F2; +} + +.item-one-btn { + width: 145px; + margin-right: -145px; +} + +.item-two-btn { + width: 230px; + margin-right: -230px; +} + +.conversation-checkbox-div { + width: 100%; + height: 360px; + flex-direction: column; + opacity: 1; +} + +.conversation-checkbox-text { + height: 130px; + align-items: center; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/info_msg/info_msg.hml b/entry/src/main/js/default/pages/info_msg/info_msg.hml new file mode 100644 index 0000000..a9fbc05 --- /dev/null +++ b/entry/src/main/js/default/pages/info_msg/info_msg.hml @@ -0,0 +1,271 @@ + + + +
+
+ +
+ + {{conversationSelectedNumber==0 ? $t('strings.msg_unselected_tip') : + $t('strings.msg_selected_tip', {number:conversationSelectedNumber})}} +
+
+ +
+
+ + {{$t('strings.infoMessages')}} +
+
+ +
+ + + + +
+ + +
+ + + +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ +
+ + {{($item.name) ? ($item.name) : ($item.telephoneFormat)}} +
+ +
+ {{$item.time}} +
+
+ +
+ + + [{{$t('strings.draft')}}] + {{$item.content}} + + + {{$t('strings.messageSendFailed')}} + + + + + {{$item.countOfUnread}} {{$t('strings.multiUnread')}} + + {{$item.content}} + +
+
+
+
+ + +
+
+ +
+ + + + + {{$t('strings.msg_find')}}{{searchResultList.sessionList.length}}{{$t('strings.msg_conversation_up')}} + + + + + +
+ +
+ +
+ +
+ +
+
+ +
+ {{$item.time}} +
+ + + {{$item.size}}{{$t('strings.msg_information')}} +
+
+
+ + + + + + + + {{$t('strings.msg_find')}}{{searchResultList.contentList.length}}{{$t('strings.msg_information')}} + + + + + +
+ +
+ +
+ + +
+ +
+
+ + {{$item.name == null || $item.name === '' ? $item.telephoneFormat : $item.name}} + +
+ {{$item.time}} +
+ + +
+
+
+ + + + + {{$t('strings.noMessages')}} + + {{$t('strings.there_is_no_match')}} + +
+ +
+
+ + +
+ +
+ + {{$t('strings.delete')}} +
+ +
+ + + {{strCheckBoxSelectTip}} +
+
+ +
+
+ + {{ $t('strings.markAllAsRead') }} +
+
+ + {{ $t('strings.more') }} +
+ + + + +
+ + + + + +
+ {{strMsgDeleteDialogTip}} +
+ + {{$t('strings.msg_delete_dialog_cb_tip')}} +
+
+ + {{$t('strings.msg_delete_dialog_cancel')}} + +
+ + {{$t('strings.delete')}} + +
+
+
+
diff --git a/entry/src/main/js/default/pages/info_msg/info_msg.js b/entry/src/main/js/default/pages/info_msg/info_msg.js new file mode 100644 index 0000000..6eca5e0 --- /dev/null +++ b/entry/src/main/js/default/pages/info_msg/info_msg.js @@ -0,0 +1,859 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// 信息列表Service +import messageService from '../../service/ConversationListService.js'; +// 获取设置开关 +import settingService from '../../service/SettingService.js'; +import notificationService from '../../service/NotificationService.js'; +// log工具类 +import mmsLog from '../../../default/utils/MmsLog.js'; +// 通知信息 +import router from '@system.router'; +import common from '../common_constants.js'; +import commonEvent from '@ohos.commonevent'; + +export default { + data: { + total: 0, + svgDelete: '', + strCheckBoxSelectTip: '', + strMsgDeleteDialogTip: '', + // 已经选中的会话条数 + conversationSelectedNumber: 0, + // 是否处于多选状态 + isMultipleSelectState: false, + // 否会话列表处于全选状态 + isConversationCheckAll: false, + // 信息列表页面搜索框输入的值 + inputValueOfSearch: '', + // 是否锁定 默认false不锁定 + hasLockMsg: false, + isSelectLockMsg: false, + // 搜索结果列表 + searchResultList: { + sessionList: [], + contentList: [] + }, + // 搜索结果队列 + searchResultListQueue: [], + // 搜索文本队列 + searchTextQueue: [], + // 队列定时器启动标志位 + setTimeOutQueueFlag: false, + // 是否真正进行跳转,避免重复跳转 + isJumping: false, + // 是否显示搜索返回按钮 默认不显示 + isShowSearchBack: false, + // 搜索的时候蒙层透明色展示 + isSearchCoverage: false, + // 是否展示查询全部信息 + isSearchStatus: true, + // 是否展示会话搜索 + isSearchConversation: false, + // 是否展示间隔线 + isSearchInterval: false, + // 是否展示单个信息搜索 + isSearchSms: false, + // 搜索为空的时候展示短信 + isSearchNull: false, + // 队列启动标志位 + queueFlag: false, + // 显示搜索状态*/ + showSearchStatus: '', + conversationName: '', + // 未读的通知信息的条数 + unreadTotalOfInfo: 0, + messageList: [], + numberType: 1, + // 是否显示联系人头像 + isShowContactHeadIcon: null, + // 搜索结果的个数 + countOfSearchResult: 0, + // 是否显示导航栏 + isNavigationBar: false, + // 搜索状态,点击搜索框时进入搜索状态 + searchStatus: false, + // 是否显示toolbar,搜索状态时不显示 + showToolBar: true, + // 左滑的开始位置 + startX: 0, + // 操作按钮的长度 + operateBtnW: 145, + // 当前触摸的数据索引 + itemTouchedIdx: -1, + // 列表分页,数量 + limit: 1000, + // 列表分页,页数 + page: 0, + // 信息总数 + totalMessage: 0 + }, + onInit() { + this.svgDelete = this.$t('svg.delete'); + this.strCheckBoxSelectTip = this.$t('strings.msg_select_all'); + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip2', { + number: this.conversationSelectedNumber + }); + }, + onShow() { + this.isJumping = false; + this.getSettingFlagForConvListPage(); + this.page = 0; + this.requestItem(); + this.subscribeInfo(); + }, + onHide() { + this.unsubscribeInfo(); + }, + // 查询列表数据 + queryAllMessages() { + let actionData = { + page: this.page, + limit: this.limit, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + } + actionData.numberType = this.numberType; + let that = this; + let rdbStore = this.$app.$def.rdbStore; + messageService.querySessionList(rdbStore, actionData, result => { + if (result.code == common.int.SUCCESS) { + mmsLog.info(common.TAG.MsgInfo + 'queryAllMessages Success'); + let res = this.buildSessionList(result); + that.messageList = res; + that.totalMessage = result.total; + that.total = that.messageList.length; + if (that.totalMessage === that.total) { + that.countUnread(); + } + } else { + mmsLog.info(common.TAG.MsgInfo +'Error: queryAllMessages() failed !!!'); + } + }); + }, + dealMmsListContent(element) { + if (element.hasMms && element.hasAttachment) { + if (element.content == common.string.EMPTY_STR) { + element.content = this.$t('strings.attachment_no_subject'); + } else { + element.content = this.$t('strings.attachment') + element.content; + } + } + if (element.hasMms && !element.hasAttachment && element.content == common.string.EMPTY_STR) { + element.content = this.$t('strings.no_subject'); + } + }, + buildSessionList(result) { + let res = []; + let dateUtil = this.$app.$def.dateUtil; + let that = this; + result.response.forEach(item => { + let obj = {}; + obj = item; + obj.itemLeft = 0; + obj.isDelShow = false; + dateUtil.convertDateFormatForItem(item, true, that); + this.dealMmsListContent(obj); + res.push(obj); + }); + return res; + }, + requestItem() { + let count = this.page * this.limit; + if (this.page === 0) { + this.page++; + this.queryAllMessages(); + } else if (count < this.totalMessage && this.messageList.length > (this.page - 1) * this.limit) { + // 对messageList的限制,是防止初始化时多次刷新请求 + this.page++; + this.queryAllMessages(); + } + }, + // 返回信息列表页面 + back() { + router.back(); + }, + // 点击屏幕下方的更多 + clickMore() { + this.$element('moreDialog').show(); + }, + // 删除通知信息中的单条信息 + clickToDelete() { + + }, + clickSearchBack() { + // 点击搜索返回按钮后 + this.backSearch(); + }, + backSearch() { + let that = this; + that.isShowSearchBack = false; + that.isSearchCoverage = false; + that.$element('search').focus({ + focus: false + }); + that.inputValueOfSearch = common.string.EMPTY_STR; + that.isSearchStatus = true; + that.isSearchNull = false; + that.isNewSms = true; + that.searchStatus = false; + this.showToolBar = true; + }, + // 搜索 + clickToSearch(e) { + this.inputValueOfSearch = e.text; + this.search(e.text); + }, + // 在通知信息页面搜索 + search(text) { + let actionData = {}; + actionData.inputValue = text + this.searchTextAsync(actionData) + }, + searchTextAsync(actionData) { + actionData.rdbStore = this.$app.$def.rdbStore; + actionData.ohosDataAbility = this.$app.$def.ohosDataAbility; + actionData.featureAbility = this.$app.$def.featureAbility; + actionData.numberType = this.numberType; + messageService.searchMessageWithLike(actionData, result => { + if (result.code == common.int.SUCCESS) { + // 获取搜索返回的结果先做判空处理 + if (this.inputValueOfSearch !== common.string.EMPTY_STR) { + this.dealSearchResult(result); + } + } else { + this.searchResultListEmpty(); + } + }); + }, + dealSearchResult(result) { + this.searchResultList = { + contentList: [], + sessionList: [] + } + this.isSearchStatus = false; + this.showInfoDivWhenSearchFlag = false; + this.isSearchCoverage = false; + this.dealSearchResultTimeAndName(result); + if (this.inputValueOfSearch === result.search) { + this.searchResultList = result.resultMap; + } + }, + dealSearchResultTimeAndName(result) { + let dateUtil = this.$app.$def.dateUtil; + if (result.resultMap.sessionList) { + result.resultMap.sessionList.forEach(session => { + session.timeMillisecond = parseInt(session.timeMillisecond); + dateUtil.convertDateFormatForItem(session, true, this); + }); + } + if (result.resultMap.contentList) { + result.resultMap.contentList.forEach(content => { + content.timeMillisecond = parseInt(content.timeMillisecond); + dateUtil.convertDateFormatForItem(content, true, this); + if(content.isFavorite) { + content.name = this.$t('strings.message_in_favorites'); + } + }); + } + }, + searchResultListEmpty() { + this.searchResultList = { + contentList: [], + sessionList: [] + } + // 显示信息列表 + this.isSearchStatus = true; + if (this.isShowSearchBack) { + this.isSearchCoverage = true; + } else { + this.isSearchCoverage = false; + } + }, + // 判断是否是多选状态 + searchTouchStart(e) { + if (this.isMultipleSelectState) { + return false; + } + this.searchStatus = true; + this.showToolBar = false; + // 搜索区域touchStart监控x > 125 && x < 600) && (y < 70 && y > 20 + var x = e.touches[0].localX; + + if (e.currentTarget.type === 'search' && x > 80 && x < 560) { + // 是否显示新建按钮 + this.isNewSms = false; + this.isShowSearchBack = true; + // 蒙层展示 + this.isSearchCoverage = true; + // 拉起输入法 + setTimeout(() => { + this.$element('search').focus({ + focus: true + }); + }, common.int.MESSAGE_CODE_THREE_ZERO_ZERO); + } + this.resetTouch(); + return false; + }, + // 长按单个列表,展示全选和删除 + conversationLongPress(index) { + // 是否有左滑删除按钮存在,存在则不可点击 + if (this.itemTouchedIdx >= 0 && this.messageList[this.itemTouchedIdx].isDelShow) { + return; + } + // 长按单个列表,展示全选和删除 + this.showToolBar = false; + mmsLog.info(common.TAG.MsgInfo + 'conversationLongPress==>index:' + index); + if (this.isMultipleSelectState) { + this.messageList[index].isCbChecked = !this.messageList[index].isCbChecked; + } else { + this.messageList[index].isCbChecked = true; + this.isMultipleSelectState = true; + } + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + }, + // 检查是否全选 + setConversationCheckAll(type) { + if (!this.isMultipleSelectState) { + return; + } + if (type == common.int.CHECKBOX_SELECT_NONE) { + this.conversationSelectedNumber = common.int.MESSAGE_CODE_ZERO; + this.isConversationCheckAll = false; + } else if (type == common.int.CHECKBOX_SELECT_ALL) { + this.conversationSelectedNumber = this.messageList.length; + this.isConversationCheckAll = true; + } else { + // 默认为 CHECKBOX_SELECT_UNKNOWN,判断是否有未选中 + this.isConversationCheckAll = true; + this.conversationSelectedNumber = common.int.MESSAGE_CODE_ZERO; + this.messageList.forEach((item, index, array) => { + if (item.isCbChecked) { + this.conversationSelectedNumber++; + } else if (this.isConversationCheckAll) { + this.isConversationCheckAll = false; + } + }); + } + if (!this.isConversationCheckAll) { + // 非全选状态 + this.strCheckBoxSelectTip = this.$t('strings.msg_select_all'); + } else { + // 全选状态 + this.strCheckBoxSelectTip = this.$t('strings.msg_deselect_all'); + } + }, + // 跳转至短信详情页面 + clickInfoToConversation(index) { + if (this.resetTouch()) { + return; + } + // 如果处于多选状态,响应CheckBox + if (this.isMultipleSelectState) { + this.messageList[index].isCbChecked = !this.messageList[index].isCbChecked; + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + return; + } + if (this.isJumping) { + return; + } + this.isJumping = true; + // 如果该联系人下有未读的信息,还需要向后端PA发送消息,使该联系人的所有信息标记为已读 + if (this.messageList[index].countOfUnread > common.int.MESSAGE_CODE_ZERO) { + this.markAllAsReadByIndex(index); + } + this.jumpToConversationPage(this.messageList[index]); + }, + // 跳转至会话详情页面 + jumpToConversationPage(item) { + mmsLog.info('jumpToConversationPage item: ' + item); + router.push({ + uri: 'pages/conversation/conversation', + params: { + strContactsNumber: item.telephone, + strContactsNumberFormat: item.telephoneFormat, + strContactsName: item.name, + contactsNum: item.contactsNum, + threadId: item.threadId, + isDraft: item.isDraft, + draftContent: item.content, + searchContent: this.inputValueOfSearch + } + }); + }, + conversationCheckboxChange(index, e) { + this.messageList[index].isCbChecked = e.checked; + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + }, + // 搜索会话头像点击 + searchConversationHeadClick(index) { + this.headClickedListener(this.searchResultList.sessionList[index]); + }, + headClickedListener(item) { + // 点击头像跳转至联系人详情页面或收件人列表页面 + if (this.isJumping) { + return; + } + if(item.isFavorite != null && item.isFavorite) { + return; + } + var telephone = item.telephone; + var contactsNum = item.contactsNum; + this.isJumping = true; + if(contactsNum == common.int.MESSAGE_CODE_ONE) { + var actionData = {}; + actionData.phoneNumber = telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + this.jumpToContract(actionData); + } else { + let threadId = item.threadId; + let contactsNum = item.contactsNum; + this.jumpToGroupDetail(threadId, contactsNum); + } + }, + // 跳转多人头像列表页面 + jumpToGroupDetail(threadId, contactsNum) { + let actionData = { + uri: 'pages/group_detail/group_detail', + params: { + threadId: threadId, + contactsNum: contactsNum + } + }; + router.push(actionData); + }, + // 跳转到会话详情 + searchConversationClick(index) { + this.searchMmsClicked(this.searchResultList.sessionList[index]); + }, + // 跳转到短信详情 + searchMmsClicked(item) { + if(item.isFavorite) { + router.push({ + uri: 'pages/my_star/my_star', + params: { + searchContent: this.inputValueOfSearch + } + }); + } else { + this.jumpToConversationPage(item); + } + }, + // 单条信息头像点击跳转 判断跳转到联系人详情还是跳转到多个收件人的列表页面 + searchSmsHeadClick(index) { + this.headClickedListener(this.searchResultList.contentList[index]); + }, + // 点击跳转到会话详情页面 + searchSmsClick(index) { + this.searchMmsClicked(this.searchResultList.contentList[index]); + }, + // 手指滑动蒙层退出搜索模式 + searchCoverageClick() { + this.backSearch(); + }, + // 统计未读个数 + countUnread() { + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + let that = this; + messageService.statisticalData(actionData, function (result) { + if (result.code == common.int.SUCCESS) { + mmsLog.info(common.TAG.MsgInfo + 'countUnread Success'); + // 通知信息的未读数 + that.unreadTotalOfInfo = result.response.unreadTotalOfInfo; + } else { + mmsLog.info(common.TAG.MsgInfo + 'Error: countUnread() failed !!!'); + } + }); + }, + // 把通知信息中未读的都标记为已读 + clickToMarkAllAsReadForInfo() { + let actionData = { + hasRead: 1, + smsType: 1, + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + } + let threadIds = []; + for (let msg of this.messageList) { + msg.countOfUnread = common.int.MESSAGE_CODE_ZERO; + threadIds.push(msg.threadId); + } + this.cancelMessageInfoNotify(threadIds, () => { + messageService.markAllToRead(actionData); + this.unreadTotalOfInfo = 0; + }); + }, + markAllAsReadByIndex(index) { + let threadId = this.messageList[index].threadId; + let threadIds = [threadId]; + this.cancelMessageInfoNotify(threadIds, () => { + // 把联系人(参数类型为数组)的所有信息标记为已读 + this.markAllAsRead(threadIds, this.messageList); + this.setListItemTransX(0); + }); + }, + cancelMessageInfoNotify(threadIds, callback) { + let actionData = { + ohosDataAbility: this.$app.$def.ohosDataAbility, + featureAbility: this.$app.$def.featureAbility, + threadIds: threadIds, + hasRead: 0 + }; + notificationService.cancelMessageNotify(actionData, res => { + mmsLog.info(common.TAG.MsgInfo + 'cancelMessageInfoNotify success: ' + res); + callback(); + }); + }, + markAllAsRead(threadIds, messageList) { + // 把联系人(参数类型为数组)的所有信息标记为已读 + let valueBucket = { + 'unread_count': 0, + }; + let actionData = {}; + actionData.threadIds = threadIds; + actionData.rdbStore = this.$app.$def.rdbStore; + actionData.valueBucket = valueBucket; + actionData.featureAbility = this.$app.$def.featureAbility; + actionData.ohosDataAbility = this.$app.$def.ohosDataAbility; + actionData.hasRead = 1; + // 将标记已读的数据更新为0 + messageService.markAllAsRead(actionData); + for (let msg of messageList) { + if(threadIds.indexOf(msg.threadId) > common.int.FAILURE) { + // 控制列表的未读图标的显示 + msg.countOfUnread = common.int.MESSAGE_CODE_ZERO; + } + } + this.unreadTotalOfInfo = this.unreadTotalOfInfo - threadIds.length; + }, + selectInMoreMenu(e) { + if (e.value == '1') { + // 删除 + this.isMultipleSelectState = true; + this.showToolBar = false; + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); + } else { + // 跳转至骚扰拦截页面,该页面在'手机管家'app里 + } + }, + // 按钮删除 + clickConversationDelete() { + if (this.conversationSelectedNumber == common.int.MESSAGE_CODE_ZERO) { + return; + } + if (this.conversationSelectedNumber == common.int.MESSAGE_CODE_ONE) { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip1'); + } else if (this.conversationSelectedNumber == this.messageList.length) { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip3'); + this.$app.$def.globalData.hasInfoMsg = false; + } else { + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip2', { + number: this.conversationSelectedNumber + }); + } + this.hasLockMsg = (this.messageList.some((element, index) => element.isCbChecked && element.isLock)); + this.$element('delete_dialog').show(); + }, + // 取消弹出 + deleteDialogCancel() { + this.$element('delete_dialog').close(); + if (this.isSelectLockMsg) { + this.isSelectLockMsg = false; + } + }, + setSelectLock() { + this.isSelectLockMsg = !this.isSelectLockMsg; + }, + // 删除锁定CheckBox勾选事件 + setSelectLockChange(e) { + this.isSelectLockMsg = e.checked; + }, + deleteDialogConfirm() { + let mmsList = []; + let threadIds = []; + let lockSessionIds = []; + let actionData = { + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + }; + for (let item of this.messageList) { + if (item.isCbChecked) { + if (item.isLock && !this.isSelectLockMsg) { + lockSessionIds.push(item.threadId); + mmsList.push(item); + } else { + threadIds.push(item.threadId); + } + } else { + mmsList.push(item); + } + } + this.isMultipleSelectState = false; + this.showToolBar = true; + this.isSelectLockMsg = false; + this.$element('delete_dialog').close(); + this.messageList = mmsList; + this.total = mmsList.length; + if (this.total == 0) { + router.back(); + } + this.deleteNotifyMessageInfo(threadIds, lockSessionIds, actionData, () => { + this.deleteMessageInfoByThreadIds(threadIds, lockSessionIds, actionData); + }); + if (this.itemTouchedIdx >= 0) { + let item = this.messageList[this.itemTouchedIdx]; + this.setListItemTransX(0); + item.isDelShow = false; + } + }, + deleteNotifyMessageInfo(threadIds, lockSessionIds, actionData, callback) { + let sessionIds = []; + if (lockSessionIds.length > 0) { + sessionIds.push(lockSessionIds); + } + if (threadIds.length > 0) { + sessionIds.push(threadIds); + } + actionData.hasRead = 0; + actionData.threadIds = sessionIds; + this.cancelMessageInfoNotify(actionData, callback); + }, + deleteMessageInfoByThreadIds(threadIds, lockSessionIds, actionData) { + if (threadIds.length > 0) { + actionData.threadIds = threadIds; + messageService.deleteMessageById(actionData); + } + if (lockSessionIds.length > 0) { + actionData.threadIds = lockSessionIds; + messageService.dealMessageLockContent(actionData, res => { + actionData.hasLock = 0; + messageService.deleteMessageBySessionIdsAndLock(actionData); + }); + } + }, + // 全选/取消全选 + clickConversationCheckAll() { + if (this.isConversationCheckAll) { + // 全选-->取消全选 + for (let item of this.messageList) { + item.isCbChecked = false; + } + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_NONE); + } else { + // 非全选-->全选 + for (let item of this.messageList) { + item.isCbChecked = true; + } + this.setConversationCheckAll(common.int.CHECKBOX_SELECT_ALL); + } + }, + onBackPress() { + // 系统返回键,true代表拦截 + if (this.isMultipleSelectState) { + for (let element of this.messageList) { + element.isCbChecked = false; + } + this.isMultipleSelectState = false; + this.showToolBar = true; + return true; + } + return false; + }, + // 点击头像跳转至联系人详情页面或收件人列表页面 + clickToGroupDetail(index) { + if (this.isJumping) { + return; + } + this.isJumping = true; + // 判断跳转到联系人详情还是跳转到多个收件人的列表页面 + var contactsNum = this.messageList[index].contactsNum; + var telephone = this.messageList[index].telephone; + if (contactsNum == common.int.MESSAGE_CODE_ONE) { + var actionData = {}; + actionData.phoneNumber = telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + this.jumpToContract(actionData); + } else { + let threadId = this.messageList[index].threadId; + let contactsNum = this.messageList[index].contactsNum; + this.jumpToGroupDetail(threadId, contactsNum); + } + }, + exitConversationSelect() { + this.onBackPress(); + }, + touchStart(event) { + if (this.isMultipleSelectState) { + return; + } + // 查看当前触控的item是否是跟上一个触控的是同一个,若不是,将上一个复位 + let touchIdx = this.getTouchIndex(event.currentTarget); + if (this.itemTouchedIdx !== -1 && touchIdx !== this.itemTouchedIdx) { + let itemTouched = this.messageList[this.itemTouchedIdx]; + this.setListItemTransX(0); + setTimeout(function () { + itemTouched.isDelShow = false; + }, 200); + } + this.startX = event.touches[0].globalX; + }, + getTouchIndex(ele) { + let index = -1; + if (ele.classList[0] === 'messaging-body-item') { + if (index === -1) { + index = ele.classList[1].substring(5); + } + } + return parseInt(index); + }, + resetTouch() { + if (this.itemTouchedIdx !== -1) { + let item = this.messageList[this.itemTouchedIdx]; + if (item.isDelShow) { + item.isDelShow = false; + this.setListItemTransX(0); + return true; + } + } + return false; + }, + touchMove(event) { + if (this.isMultipleSelectState) { + return; + } + let disX = this.startX - event.touches[0].globalX; + if (Math.abs(disX) <= 2) { + return; + } + let ele = event.currentTarget; + this.itemTouchedIdx = this.getTouchIndex(ele); + let item = this.messageList[this.itemTouchedIdx]; + if (item.countOfUnread > 0) { + this.operateBtnW = common.int.OPERATE_UNREAD_WIDTH; + } else { + this.operateBtnW = common.int.OPERATE_DELETE_WIDTH; + } + if (disX > 0) { + if (item.isDelShow) { + return; + } + let transX = disX; + if (disX >= this.operateBtnW) { + // 左滑到最大宽度 + transX = this.operateBtnW; + item.isDelShow = true; + } + this.setListItemTransX(transX); + } else if (disX < 0) { + if (!item.isDelShow) { + return; + } + if (disX > -this.operateBtnW) { + this.setListItemTransX(disX); + } else { + item.isDelShow = false; + this.setListItemTransX(0); + } + } + }, + deleteAction(idx) { + let element = this.messageList[idx]; + this.strMsgDeleteDialogTip = this.$t('strings.msg_delete_dialog_tip1'); + element.isCbChecked = true; + this.hasLockMsg = (this.messageList.some((element, index) => element.isCbChecked && element.isLock)); + this.$element('delete_dialog').show(); + }, + touchEnd(event) { + if (this.isMultipleSelectState) { + return; + } + let disX = this.startX - event.changedTouches[0].globalX; + if (Math.abs(disX) <= 2) { + return; + } + let item = this.messageList[this.itemTouchedIdx]; + if (disX < (this.operateBtnW / 2)) { + // 小于一半 回原位置 + this.setListItemTransX(0); + item.isDelShow = false; + } else { + // 大于一半 滑动到最大值 + this.setListItemTransX(this.operateBtnW); + item.isDelShow = true; + } + }, + // 订阅接收到的新消息 + subscribeInfo(){ + mmsLog.info(common.TAG.MsgInfo + 'subscribe......'); + let events = [common.string.RECEIVE_TRANSMIT_EVENT] + let commonEventSubscribeInfo = { + events : events + }; + commonEvent.createSubscriber(commonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); + }, + setListItemTransX(disX) { + let item = this.messageList[this.itemTouchedIdx]; + if (item) { + if (disX >= 0) { + item.itemLeft = -disX; + } else { + item.itemLeft = -this.operateBtnW - disX; + } + } + }, + createSubscriberCallBack(err, data){ + this.commonEventData = data; + // 接收到订阅 + commonEvent.subscribe(this.commonEventData, this.subscriberCallBack.bind(this)); + }, + subscriberCallBack(err, data){ + let that = this; + mmsLog.info(common.TAG.MsgInfo + 'eventData is: ' + data); + this.page = 1; + that.queryAllMessages(); + }, + // 取消订阅 + unsubscribeInfo(){ + commonEvent.unsubscribe(this.commonEventData, () => { + mmsLog.info('info_msg unsubscribe'); + }); + }, + // 跳转联系人app + jumpToContract(actionData){ + let commonService = this.$app.$def.commonService; + var str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info(common.TAG.MsgInfo + 'jumpToContract,data: ' + data); + }).catch((error) => { + mmsLog.error(common.TAG.MsgInfo + 'jumpToContract,failed: ' + JSON.stringify(error)); + }) + }, + // 获取整合通知信息和显示联系人头像的开关值 + getSettingFlagForConvListPage() { + let preferences = this.$app.$def.preferences; + let result = settingService.getSettingFlagForConvListPage(preferences); + if (result) { + this.isShowContactHeadIcon = result.isShowContactHeadIcon; + } + }, +}; diff --git a/entry/src/main/js/default/pages/manage_sim/manage_sim.css b/entry/src/main/js/default/pages/manage_sim/manage_sim.css new file mode 100644 index 0000000..803cd01 --- /dev/null +++ b/entry/src/main/js/default/pages/manage_sim/manage_sim.css @@ -0,0 +1,422 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*最大DIV样式*/ +.container { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + width: 100%; + height: 100%; + padding: 5px; +} + +/*上方TitleBar*/ +.title-bar { + flex-direction: row; + justify-content: flex-start; + height: 100px; +} + +.single-back-div { + height: 100%; + width: 125px; + align-items: center; + padding: 20px; + padding-left: 40px; + padding-right: 15px; +} + +.star-title-div { + height: 100%; + width: 100%; + align-items: center; + padding: 20px; + padding-left: 15px; +} + +/*返回按钮*/ +.single-back { + width: 70px; + height: 60px; +} + +/*标题样式*/ +.title { + align-content: flex-start; + font-size: 36px; +} + +.content-body { + height: 100%; + padding-bottom: 10px; +} + +/*list*/ +.msg_star_list { + width: 100%; +} + +/*list-item*/ +.list-item { + padding-left: 25px; + border-radius: 20px; + padding-top: 10px; + padding-bottom: 10px; +} + +.image-detail { + flex-direction: row; +} + +/*头像背景*/ +.head-image-div { + justify-content: center; + align-items: flex-start; + padding-top: 25px; + padding-right: 20px; +} + +/*头像样式*/ +.head-image { + width: 85px; + height: 70px; +} + +/*body-star*/ +.body-star { + flex-direction: column; +} + +/*发件人*/ +.my-star-title { + font-size: 20px; + height: 40px; + justify-content: center; +} + +/*收藏详情和checkbox*/ +.mms-text { + flex-direction: row; + width: 100%; + justify-content: space-between; +} + +.mms-input { + justify-content: flex-end; +} + +/*文本信息*/ +.mms-describe { + flex-direction: column; + justify-content: center; + max-width: 500px; +} + +.mms-img-base { + border-top-right-radius: 20px; + border-bottom-right-radius: 20px; + border-top-left-radius: 20px; + border-bottom-left-radius: 20px; + height: 660px; + width: 380px; +} + +.mms-edit-area-audio { + width: 150px; +} + +.mms-item-margin { + margin-bottom: 10px; +} + +.mms-describe-text { + font-size: 30px; + padding: 15px; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; + border-top-right-radius: 20px; +} + +.mms-describe-receive-bg-color { + background-color: #F2F2F2; +} + +.mms-describe-send-bg-color { + background-color: #F0FFF0; +} + +/*发送/接收日期和发送/接收时间*/ +.date-time { + height: 40px; + align-items: center; + flex-direction: row; + align-content: flex-end; +} + +/*发送/接收日期*/ +.mms-date { + font-size: 20px; + padding-right: 10px; +} + +/*发送/接收时间*/ +.mms-time { + font-size: 20px; +} + +.search-status-image { + width: 128px; + height: 128px; + opacity: .5; +} + +.bottom-bar { + align-items: center; + background-color: #F7F7F7; +} + +.send-bar-details-more { + width: 100%; + height: 140px; + padding-top: 20px; + padding-left: 30px; + padding-right: 30px; + flex-direction: row; +} + +/*更多详情 dev*/ +.send-msg-detail { + flex-direction: column; + justify-content: center; + align-items: center; +} + +.send-msg-detail-one-width { + width: 25%; +} +.send-msg-detail-no-one-width { + width: 33%; +} + +/*更多栏目图片*/ +.send-bar-detail-image { + width: 48px; + height: 48px; +} + +.send-bar-detail-text { + font-size: 22px; +} + +.tip-details { + height: 120px; + align-items: center; + justify-content: center; +} + +.mms-details-title { + margin-left: 30px; +} + +.delete-dialog-div { + display: flex; + width: 100%; + flex-direction: column; + padding: 20px; +} + +.dialog-inner-cb { + width: 100%; + height: 80px; + flex-direction: row; + align-items: center; + justify-content: center; +} + +.dialog-inner-cb-text { + height: 100%; +} + +.dialog-inner-logic { + width: 100%; + height: 60px; + flex-direction: row; + justify-content: center; + margin-top: 10px; +} + +.dialog-inner-logic-cancel { + flex: 1; + text-align: center; + color: #00f; +} + +.dialog-inner-logic-vertical { + width: 2px; + height: 50px; + background-color: darkgrey; +} + +.dialog-inner-logic-delete { + flex: 1; + text-align: center; + color: #f00; +} + +.test-button { + background-color: #1e90ff; + width: 400px; + height: 60px; + font-size: 30px; +} +.delete-main { + width: 650px; + height: 15%; +} +.delete-div { + flex-direction: column; + align-items: center; + justify-content: flex-end; +} +.txt-v { + font-size: 30px; +} + +.delete-btn { + width: 100%; + height: 50%; + justify-content: space-around; + align-items: center; +} +.btn-txt { + font-size: 22px; +} +.min-progress { + width: 50px; + height: 50px; + animation: Go 1s infinite; + right: 50px; +} + +.share-dialog-main { + width: 650px; + margin-left: 25px; + margin-right: 25px; + margin-bottom: 25px; +} + +.share-dialog-div { + flex-direction: column; + align-items: center; + height: 450px; +} + +.share-inner-div { + width: 85%; + flex-direction: column; + align-items: flex-start; + justify-content: center; + height: 130px; +} + +.share-inner-txt { + font-size: 40px; + font-weight: bold; +} + +.first-dialog-inner-txt { + font-size: 40px; + font-weight: 600; +} + +.share-dialog-wraper { + width: 100%; + height: 60%; + columns: 1; +} + +.share-dialog-item { + height: 101px; + flex-direction: column; + columns: 1; + align-items: stretch; +} + +.share-dialog-content-div { + margin-left: 49px; + margin-right: 49px; + width: 85%; + height: 100%; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} + +.share-dialog-content-name { + width: 100%; + text-align: left; + font-size: 32px; +} + +.share-todo-divider { + margin-left: 49px; + margin-right: 49px; + line-cap: round; + stroke-width: 1px; + color: grey; +} + +.share-inner-btn { + margin-top: -30px; + width: 580px; + height: 120px; + justify-content: space-around; + align-items: center; +} + +.share-btn-div { + width: 100%; + height: 60px; + border-radius: 50px; + justify-content: center; + align-items: center; +} + +.share-btn-div:active { + background-color: #E7E6E6; +} + +.share-btn-cancel-txt { + color: #007DFE; +} + + +@keyframes Go { + from { + /* background-color: #f76160;*/ + transform: translate(100px) rotate(0deg) scale(1.0); + } + + /* 可以通过百分比指定动画运行的中间状态6+ */ + + 50% { + /* background-color: #f76160;*/ + transform: translate(100px) rotate(0deg) scale(1.0); + } + + to { + /* background-color: #09ba07;*/ + transform: translate(100px) rotate(360deg) scale(1.0); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/manage_sim/manage_sim.hml b/entry/src/main/js/default/pages/manage_sim/manage_sim.hml new file mode 100644 index 0000000..13a74a0 --- /dev/null +++ b/entry/src/main/js/default/pages/manage_sim/manage_sim.hml @@ -0,0 +1,233 @@ + + + +
+ +
+
+ + +
+
+
+ +
+
+ + +
+ +
+ + +
+ {{ + selectMsgCount == 0 ? $t('strings.msg_unselected_tip') : $t('strings.msg_selected_tip', { number : selectMsgCount }) + }} +
+
+
+ +
+ +
+ + +
+ {{ $t('strings.sim_msg_manage') }} +
+
+
+
+ + + + +
+ +
+ +
+ +
+ {{$item.address == null || $item.address == '' ? $t('strings.me') : $item.address}} + +
+
+ + + + + +
+ + {{$item.audioTime}} +
+ +
+ + +
+ + + +
+
+ +
+
+ + +
+ + + {{ $item.date }} + + + {{ $item.time }} +
+
+
+
+ + + {{$t('strings.noMessages')}} + +
+
+ +
+ + +
+ +
+ + {{$t('strings.copy_phone')}} + +
+ +
+ + {{ $t('strings.delete') }} + +
+ +
+ + + {{selectMsgCount === simMessageList.length ? $t('strings.msg_deselect_all') : $t('strings.msg_select_all')}} + +
+ +
+ + {{$t('strings.more')}} + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + {{ selectMsgCount == 1 ? $t('strings.msg_delete_dialog_tip1') : selectMsgCount > 1 ? $t('strings.msg_delete_dialog_tip2', { number : selectMsgCount }) : '' }} + +
+
+ + {{$t('strings.msg_delete_dialog_tip3')}} + +
+
+ + {{ $t('strings.msg_delete_dialog_cancel') }} + +
+ {{ $t('strings.delete') }} +
+
+
+ + + +
+ + The feature is not yet developed +
+
+ + +
diff --git a/entry/src/main/js/default/pages/manage_sim/manage_sim.js b/entry/src/main/js/default/pages/manage_sim/manage_sim.js new file mode 100644 index 0000000..9dd79ca --- /dev/null +++ b/entry/src/main/js/default/pages/manage_sim/manage_sim.js @@ -0,0 +1,390 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +// JS公共常量 +import common from '../common_constants.js'; +import cardService from '../../service/SimCardService.js'; +import Prompt from '@system.prompt'; +import settingService from '../../service/SettingService.js'; +import conversationService from '../../service/ConversationService.js'; + +const TAG = 'JS->manage.js->'; + +// 取消全选模式 +const CANCEL_ALL_CHECKED = 0; +// 全选模式 +const ALL_CHECKED = 1; +// 统计被选模式 +const COMPUTED_CHECKED = 2; + +export default { + data: { + // 内容 + content: '', + // sim卡号 + index: null, + // sim卡数量 + simCount: null, + // 选中信息数量 + selectMsgCount: 0, + // 被选中的数据 + mmCheckedList: [], + // 展示内容 + simMessageList: [], + hasCheckboxStatus: false, + allShow: false, + shareList: [], + searchContent: '' + }, + onInit() { + this.index = this.idx; + this.simCount = this.countOfSim; + }, + onShow() { + this.$element('reset').show(); + this.getMsgFromSimCard(); + this.shareList = [ + { + text: '新建联系人' + }, + { + text: '保存至已有联系人' + } + ]; + }, + // 获取SIM卡内的内容 + getMsgFromSimCard() { + mmsLog.info(TAG + 'getMsgInSimCard(): start'); + let actionData = {}; + actionData.simCount = this.simCount; + actionData.index = this.index; + let that = this; + let dateUtil = this.$app.$def.dateUtil; + cardService.queryMessageInSimCard(actionData, function (result) { + if (result.code == common.int.SUCCESS) { + mmsLog.info(TAG + 'getMsgInSimCard(): success'); + let simMessageList = []; + for (let item of result.abilityResult) { + dateUtil.convertTimeStampToDateWeek(item, true, that); + dateUtil.convertDateFormatForItem(item, true, that); + simMessageList.push(item); + } + that.simMessageList = simMessageList; + + mmsLog.info(TAG + 'getMsgInSimCard(): fail, simMessageList = ' + simMessageList); + that.$element('reset').close(); + } else { + mmsLog.info(TAG + 'getMsgInSimCard(): fail, abilityResult = ' + result.abilityResult); + } + }); + }, + onBackPress() { + if (this.hasCheckboxStatus) { + this.singleMsgCancelBack(); + return true; + } + return false; + }, + mmsListLongPress(index) { + if (this.hasCheckboxStatus) { + return; + } + this.longPressIndex = index; + let item = this.simMessageList[this.longPressIndex] + if (!item.isMsm) { + this.$element('menu_long_press').show({ + x: this.touchX, + y: this.touchY + }); + } else { + let msgType = item.msgType; + if (msgType.indexOf(0) == -1) { + this.$element('menu_long_press_mms').show({ + x: this.touchX, + y: this.touchY + }); + } else { + this.$element('menu_long_press_mms_sms').show({ + x: this.touchX, + y: this.touchY + }); + } + + } + }, + // 获取屏幕坐标 + touchStart(e) { + this.touchX = e.touches[0].globalX; + this.touchY = e.touches[0].globalY; + }, + // 长按工具栏选择 + longPressSelected(e) { + if (this.hasCheckboxStatus) { + return; + } + let value = e.value; + let element = this.simMessageList[this.longPressIndex]; + switch (value) { + case '0': + // 复制到手机 + element.isCbChecked = !element.isCbChecked; + this.copyToPhone(); + break; + case '1': + // 删除 + element.isCbChecked = !element.isCbChecked; + this.selectMsgCount = 1; + this.$element('delete_dialog').show(); + break; + case '2': + // 添加到联系人 + element.isCbChecked = !element.isCbChecked; + this.addContactsDialog(); + break; + case '3': + this.more(this.longPressIndex); + break; + default: + mmsLog.info(TAG + 'longPressSelected, code is exit'); + } + }, + clickGroupCopy() { + // 将数据复制到数据库中 + this.copyToPhone(); + this.hasCheckboxStatus = false; + }, + // 删除 + clickGroupDelete() { + if (this.selectMsgCount == 0) { + return; + } + this.$element('delete_dialog').show(); + }, + // 批量删除 + deleteDialogConfirm() { + let actionData = {}; + this.simMessageList.forEach(element => { + if (element.isCbChecked) { + actionData.index = this.index; + actionData.indexOnSim = element.indexOnSim; + cardService.delSimMessage(actionData); + } + }); + + for (let i = 0; i < this.selectMsgCount; i++) { + this.simMessageList.splice(this.simMessageList.findIndex(item => item.isCbChecked), 1); + } + this.$element('delete_dialog').close(); + this.singleMsgCancelBack(); + }, + deleteDialogCancel() { + this.$element('delete_dialog').close() + }, + // 复制至手机 + copyToPhone() { + // 选中SIM卡中的短信,复制到数据库中 + let simMessageMap = new Map(); + for (let element of this.simMessageList) { + if (element.isCbChecked) { + let sendResult = { + telephone: element.address, + content: element.content, + sendStatus: common.int.SEND_MESSAGE_SUCCESS, + time: element.timeMillisecond, + isMessageSim: true + } + if (simMessageMap.has(element.address)) { + let sendResults = simMessageMap.get(element.address); + sendResults.push(sendResult); + } else { + let sendResults = []; + sendResults.push(sendResult); + simMessageMap.set(element.address, sendResults); + } + } + } + let actionData = { + rdbStore: this.$app.$def.rdbStore, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + sendResults: [], + ownNumber: common.string.EMPTY_STR, + isSender: 1, + hasDraft: this.isDraft + } + // 分组之后入库 + let telephoneKeys = simMessageMap.keys(); + for (let key of telephoneKeys) { + let sendResults = simMessageMap.get(key); + actionData.sendResults = sendResults; + mmsLog.info('insertManageSimData, param:' + actionData); + conversationService.insertManageSimData(actionData, res => { + mmsLog.info('insertManageSimData, result:' + JSON.stringify(res)); + }); + } + Prompt.showToast({ + message: this.$t('strings.message_copied_to_phone'), + duration: 2000, + bottom: '150px' + }); + }, + more(longPressIndex) { + let item = this.simMessageList[longPressIndex]; + // 设置选中标记 + item.isCbChecked = !item.isCbChecked; + this.hasCheckboxStatus = true; + // 获取选中的列表 + this.computedCheckedMsgCount(COMPUTED_CHECKED); + }, + // 列表选择勾选 + listCheckBoxChange(index, e) { + this.simMessageList[index].isCbChecked = e.checked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + }, + singleMsgCancelBack() { + this.hasCheckboxStatus = false; + this.computedCheckedMsgCount(CANCEL_ALL_CHECKED); + }, + // 全选 + clickGroupCheckAll() { + mmsLog.info('computedCheckedMsgCount, code is exit') + if (this.selectMsgCount === this.simMessageList.length) { + this.computedCheckedMsgCount(CANCEL_ALL_CHECKED); + this.simMessageList.forEach((val, index) => { + val.isCbChecked = false; + }) + } else { + this.computedCheckedMsgCount(ALL_CHECKED) + } + }, + computedCheckedMsgCount(isSelect) { + switch (isSelect) { + case 0: + this.cancelAllSelect(); + break; + case 1: + this.allSelect(); + break; + case 2: + this.calculateChecked(false); + break; + default: + mmsLog.info(TAG + 'computedCheckedMsgCount, code is exit'); + } + }, + moreSelected(e) { + let value = e.value + switch (value) { + case '1': + this.addContactsDialog(); + break + default: + mmsLog.info('moreSelected, code is exit') + } + }, + + addContactsDialog() { + this.$element('shareDialog').show(); + }, + + shareCancelClick() { + this.$element('shareDialog').close(); + }, + + jumpClick(idx) { + let number = common.string.EMPTY_STR; + switch (idx) { + case 0: + this.shareCancelClick(); + number = this.simMessageList[this.longPressIndex].address; + this.createNewContract(number); + break; + case 1: + this.shareCancelClick(); + number = this.simMessageList[this.longPressIndex].address; + this.existingContact(number); + break; + default: + break; + } + }, + // 新建联系人 + createNewContract(number) { + var actionData = {}; + actionData.phoneNumber = number; + actionData.pageFlag = common.contractPage.PAGE_FLAG_SAVE_CONTACT; + this.jumpToContract(actionData); + }, + + // 保存联系人 + existingContact(number) { + var actionData = {}; + actionData.phoneNumber = number; + actionData.pageFlag = common.contractPage.PAGE_FLAG_SAVE_EXIST_CONTACT; + this.jumpToContract(actionData); + }, + + // 跳转联系人app + jumpToContract(actionData) { + let commonService = this.$app.$def.commonService; + let str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info('manage_sim.js --> Data: ' + data); + }).catch((error) => { + mmsLog.error('manage_sim.js --> failed: ' + JSON.stringify(error)); + }) + }, + + allSelect() { + for (let mms of this.simMessageList) { + mms.isCbChecked = true; + } + this.calculateChecked(true); + }, + // 取消全选 + cancelAllSelect() { + for (let mms of this.simMessageList) { + mms.isCbChecked = false; + } + this.selectMsgCount = 0; + this.mmCheckedList = []; + }, + // 计算被选中的值 + calculateChecked(isAllSelect) { + let result = settingService.calculateChecked(this.simMessageList, isAllSelect); + if (result) { + this.selectMsgCount = result.count; + this.mmCheckedList = result.checkedList; + if (result.count == 1) { + this.longPressIndex = this.simMessageList((val, index) => val.isCbChecked); + } + this.allShow = false; + if (this.selectMsgCount == this.simMessageList.length) { + this.allShow = true; + } + } + }, + resetBack() { + this.resetBack = false; + }, + back() { + router.back(); + }, + singleMsgBack() { + router.back(); + } +} diff --git a/entry/src/main/js/default/pages/mms_table.js b/entry/src/main/js/default/pages/mms_table.js new file mode 100644 index 0000000..6563a15 --- /dev/null +++ b/entry/src/main/js/default/pages/mms_table.js @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + table: { + // 会话表 + session: + 'CREATE TABLE IF NOT EXISTS session (' + + 'id INTEGER PRIMARY KEY AUTOINCREMENT, ' + + 'time INTEGER DEFAULT 0, ' + + 'telephone TEXT, ' + + 'content TEXT, ' + + 'contacts_num INTEGER DEFAULT 0, ' + + 'sms_type INTEGER DEFAULT 0, ' + + 'unread_count INTEGER DEFAULT 0, ' + + 'sending_status INTEGER DEFAULT 0, ' + + 'has_draft INTEGER DEFAULT 0,' + + 'has_lock INTEGER DEFAULT 0,' + + 'message_count INTEGER DEFAULT 0,' + + 'has_mms INTEGER DEFAULT 0,' + + 'has_attachment INTEGER DEFAULT 0' + + ');', + }, + // 会话列表对应的字段名称 + sessionField: { + id: 'id', + time: 'time', + telephone: 'telephone', + content: 'content', + contactsNum: 'contacts_num', + smsType: 'sms_type', + unreadCount: 'unread_count', + sendingStatus: 'sending_status', + hasDraft: 'has_draft', + hasLock: 'has_lock', + messageCount: 'message_count', + hasMms: 'has_mms', + hasAttachment: 'has_attachment' + }, + // 短信详情对应字段名称 + messageInfo: { + msgId: 'msg_id', + receiverNumber: 'receiver_number', + senderNumber: 'sender_number', + startTime: 'start_time', + endTime: 'end_time', + msgType: 'msg_type', + smsType: 'sms_type', + msgTitle: 'msg_title', + msgContent: 'msg_content', + msgState: 'msg_state', + operatorServiceNumber: 'operator_service_number', + msgCode: 'msg_code', + isLock: 'is_lock', + isRead: 'is_read', + isCollect: 'is_collect', + sessionType: 'session_type', + retryNumber: 'retry_number', + isSubsection: 'is_subsection', + sessionId: 'session_id', + groupId: 'group_id', + isSender: 'is_sender', + isSendReport: 'is_send_report' + }, + contactColumns: { + id: 'id', // raw_contact_表 id + displayName: 'display_name', // 显示名称 + contactedCount: 'contacted_count', // 联系次数 + lastestContactedTime: 'lastest_contacted_time', // 最近联系时间 + }, + contactDataColumns: { + id: 'id', // raw_contact_表 id + contactId: 'contact_id', // raw_contact_表 id + detailInfo: 'detail_info', + typeId: 'type_id', // raw_contact_表 id + contentType: 'content_type', // raw_contact_表 id + displayName: 'display_name', // 显示名称 + hasDelete: 'is_deleted' // 显示名称 + }, + searchContactView: { + searchName: 'search_name', + contactId: 'contact_id', + detailInfo: 'detail_info', + contentType: 'content_type', + displayName: 'display_name', // 显示名称 + hasDelete: 'is_deleted' // 显示名称 + }, + // 彩信数据保存 + mmsPart: { + msgId: 'msg_id', + groupId: 'group_id', // 群组ID + type: 'type', // 0主题、1图片、2视频、3音频、4文本、5名片 + locationPath: 'location_path', + content: 'content', + partSize: 'part_size', + partIndex: 'part_index', + recordingTime: 'recording_time', + encode: 'encode', + state: 'state' + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/my_star/my_star.css b/entry/src/main/js/default/pages/my_star/my_star.css new file mode 100644 index 0000000..d59162c --- /dev/null +++ b/entry/src/main/js/default/pages/my_star/my_star.css @@ -0,0 +1,353 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*最大DIV样式*/ +.container { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + width: 100%; + height: 100%; + padding: 5px; +} + +/*上方TitleBar*/ +.title-bar { + flex-direction: row; + justify-content: flex-start; + height: 100px; +} + +.single-back-div { + height: 100%; + width: 125px; + align-items: center; + padding: 20px; + padding-left: 40px; + padding-right: 15px; +} + +.star-title-div { + height: 100%; + width: 100%; + align-items: center; + padding: 20px; + padding-left: 15px; +} + +/*返回按钮*/ +.single-back { + width: 70px; + height: 60px; +} + +/*标题样式*/ +.title { + align-content: flex-start; + font-size: 36px; +} + +.content-body { + height: 100%; + padding-bottom: 10px; +} + +/*list*/ +.msg_star_list { + width: 100%; +} + +/*list-item*/ +.list-item { + padding-left: 25px; + border-radius: 20px; + padding-top: 10px; + padding-bottom: 10px; +} + +.image-detail { + flex-direction: row; +} + +/*头像背景*/ +.head-image-div { + justify-content: center; + align-items: flex-start; + padding-top: 25px; + padding-right: 20px; +} + +/*头像样式*/ +.head-image { + width: 85px; + height: 70px; +} + +/*body-star*/ +.body-star { + flex-direction: column; +} + +/*发件人*/ +.my-star-title { + font-size: 20px; + height: 40px; + justify-content: center; +} + +/*收藏详情和checkbox*/ +.mms-text { + flex-direction: row; + width: 100%; + justify-content: space-between; +} + +.star-image { + width: 80%; + height: 150px; +} + +.mms-input { + justify-content: flex-end; +} + +/*文本信息*/ +.mms-describe { + flex-direction: column; + justify-content: center; + max-width: 500px; +} + +.mms-img-base { + border-top-right-radius: 20px; + border-bottom-right-radius: 20px; + border-top-left-radius: 20px; + border-bottom-left-radius: 20px; + height: 660px; + width: 380px; +} + +.mms-edit-area-audio { + width: 150px; +} + +.mms-item-margin { + margin-bottom: 10px; +} + +.mms-describe-text { + font-size: 30px; + padding: 15px; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; + border-top-right-radius: 20px; +} + +.mms-describe-receive-bg-color { + background-color: #F2F2F2; +} + +.mms-describe-send-bg-color { + background-color: #F0FFF0; +} +.star-mms-send-text-left-row { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; + padding: 20px; + border-radius: 15px; + background-color: #F0FFF0; + border-top-left-radius: 0; +} +.star-ppt-image { + width: 64px; + height: 64px; + margin-right: 20px; +} + +.star-theme-text { + flex-direction: column; + align-items: flex-end; + justify-content: flex-start; +} + +.star-mms-left-slide { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + border-radius: 15px; + background-color: #F0FFF0; + border-top-left-radius: 0; + width: 60%; +} + +.star-mms-image { + width: 100%; + height: 150px; +} + +.star-mms-slide-text { + margin-top: 10px; + margin-left: 30px; + margin-bottom: 10px; +} + +.star-mms-edit-card { + display: flex; + height: 100px; + flex-direction: row; + background-color: #F0FFF0; + border-radius: 20px; + align-items: center; + justify-content: center; + margin-bottom: 10px; +} + +.star-edit-card-img { + width: 48px; + height: 48px; + margin-left: 10px; + margin-right: 10px; +} + +.star-mms-edit-card-item { + flex-direction: column; + padding: 5px; + margin-right: 40px; + align-items: center; + justify-content: center; +} + +.star-mms-edit-card-text { + height: 50px; + align-items: flex-start; +} + +/*发送/接收日期和发送/接收时间*/ +.date-time { + height: 40px; + align-items: center; + flex-direction: row; + align-content: flex-end; +} + +/*发送/接收日期*/ +.mms-date { + font-size: 20px; + padding-right: 10px; +} + +/*发送/接收时间*/ +.mms-time { + font-size: 20px; +} + +.search-status-image { + width: 128px; + height: 128px; + opacity: .5; +} + +.bottom-bar { + align-items: center; + background-color: #F7F7F7; +} + +.send-bar-details-more { + width: 100%; + height: 140px; + padding-left: 30px; + padding-right: 30px; + flex-direction: row; + padding-top: 20px; +} + +/*更多详情 dev*/ +.send-msg-detail { + flex-direction: column; + justify-content: center; + align-items: center; +} + +.send-msg-detail-one-width { + width: 20%; +} +.send-msg-detail-no-one-width { + width: 25%; +} + +/*更多栏目图片*/ +.send-bar-detail-image { + width: 48px; + height: 48px; +} + +.send-bar-detail-text { + font-size: 22px; +} + +.tip-details { + height: 120px; + align-items: center; + justify-content: center; +} + +.mms-details-title { + margin-left: 30px; +} + +.delete-dialog-div { + display: flex; + width: 100%; + flex-direction: column; + padding: 20px; +} + +.dialog-inner-cb { + width: 100%; + height: 80px; + flex-direction: row; + align-items: center; + justify-content: center; +} + +.dialog-inner-cb-text { + height: 100%; +} + +.dialog-inner-logic { + width: 100%; + height: 60px; + flex-direction: row; + justify-content: center; + margin-top: 10px; +} + +.dialog-inner-logic-cancel { + flex: 1; + text-align: center; + color: #00f; +} + +.dialog-inner-logic-vertical { + width: 2px; + height: 50px; + background-color: darkgrey; +} + +.dialog-inner-logic-delete { + flex: 1; + text-align: center; + color: #f00; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/my_star/my_star.hml b/entry/src/main/js/default/pages/my_star/my_star.hml new file mode 100644 index 0000000..4b1fd2b --- /dev/null +++ b/entry/src/main/js/default/pages/my_star/my_star.hml @@ -0,0 +1,228 @@ + + + +
+
+
+ + +
+ +
+ + +
+ {{ + selectMsgCount == 0 ? $t('strings.msg_unselected_tip') : $t('strings.msg_selected_tip', { number : selectMsgCount }) + }} +
+
+
+ +
+ +
+ + +
+ {{ $t('strings.my_msg_star') }} +
+
+
+
+ + + + +
+ +
+ +
+ +
+ {{$item.address == null || $item.address == '' ? $t('strings.me') : $item.address}} + +
+
+ + + +
+ + {{$item.audioTime}} +
+ +
+ + +
+
+ +
+ {{$item.msgUriPath}} + {{$item.audioTime}} +
+
+ + + +
+
+ +
+ + + +
+
+
+ + + + +
+
+ +
+
+ + +
+ + + {{ $item.date }} + + + {{ $item.time }} +
+
+
+
+ + + + {{$t('strings.no_star_info')}} + +
+
+
+ + +
+ + +
+ + {{ $t('strings.delete') }} + +
+ +
+ + {{$t('strings.msg_transmit')}} + +
+ +
+ + {{$t('strings.msg_copy')}} + +
+ +
+ + + {{selectMsgCount === mmsList.length ? $t('strings.msg_deselect_all') : $t('strings.msg_select_all')}} + +
+ +
+ + {{$t('strings.more')}} + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + {{ selectMsgCount == 1 ? $t('strings.msg_delete_dialog_tip1') : selectMsgCount > 1 ? $t('strings.msg_delete_dialog_tip2', { number : selectMsgCount }) : '' }} + +
+
+ + {{$t('strings.msg_delete_dialog_tip3')}} + +
+
+ + {{ $t('strings.msg_delete_dialog_cancel') }} + +
+ {{ $t('strings.delete') }} +
+
+
+ + + +
+ + The feature is not yet developed +
+
+
diff --git a/entry/src/main/js/default/pages/my_star/my_star.js b/entry/src/main/js/default/pages/my_star/my_star.js new file mode 100644 index 0000000..1b5be29 --- /dev/null +++ b/entry/src/main/js/default/pages/my_star/my_star.js @@ -0,0 +1,676 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +import prompt from '@system.prompt'; +import myStatService from '../../service/MyStarService.js'; +import cardService from '../../service/SimCardService.js'; +import conversationService from '../../service/ConversationService.js'; +import contactService from '../../service/ContractService.js'; +// JS公共常量 +import common from '../common_constants.js'; +// 取消全选模式 +const CANCEL_ALL_CHECKED = 0; +// 全选模式 +const ALL_CHECKED = 1; +// 统计被选模式 +const COMPUTED_CHECKED = 2; +const PRE_LOG = 'favorite page: '; + +export default { + data: { + // 数据回传标识 + hasDataEcho: false, + // 进入选中状态标识 + hasCheckboxStatus: false, + // 选中信息数量 + selectMsgCount: 0, + // 选中信息带有文本数量 + selectMsgTextCount: 0, + // 选中信息为彩信数量 + selectMsgMmsCount: 0, + // 信息列表 + mmsList: [], + // 是否是双卡 + hasDoubleCard: false, + // 被选中的数据 + mmCheckedList: [], + // 收藏信息被全部选中的状态 + allShow: false, + // 总数 + total: 0, + // 列表分页,页数 + page: 0, + // 列表分页,数量 + limit: 15, + // 是否展示选择文本 + hasSelectTextShow: false, + isCheckDeleted: false, + searchContent: '' + }, + onShow() { + // 获取电话卡信息 + this.getTelephoneCardInfo(); + }, + requestItem() { + let count = this.page * this.limit; + if (this.page === 0) { + this.page++; + this.queryFavoriteMessageList(); + } else if (count < this.total && this.contacts.length > (this.page - 1) * this.limit) { + // 对Contacts的限制,是防止初始化时多次刷新请求 + this.page++; + this.queryFavoriteMessageList(); + } + }, + // 获取收藏信息列表 + queryFavoriteMessageList() { + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + page: this.page, + limit: this.limit, + hasCollect: 1 + } + let that = this; + let dateUtil = this.$app.$def.dateUtil; + myStatService.queryFavoriteMessageList(actionData, function (result) { + if (result.code == common.int.SUCCESS) { + mmsLog.info('queryFavoriteMessageList,success'); + let res = []; + for (let item of result.response) { + item.timeMillisecond = parseInt(item.timeMillisecond); + dateUtil.convertDateFormatForItem(item, true, that); + that.dealMessageDetailContent(item); + res.push(item); + } + that.mmsList = that.mmsList.concat(res); + that.total = result.total; + } else { + mmsLog.info(PRE_LOG + 'Error: queryFavoriteMessageList() failed !!!'); + } + that.hasDataEcho = true; + }); + }, + dealMessageDetailContent(star) { + if (star.msgShowType === common.MESSAGE_SHOW_TYPE.THEME_NO_IMAGE || + star.msgShowType == common.MESSAGE_SHOW_TYPE.THEME_IMAGE) { + if (star.content !== common.string.EMPTY_STR) { + star.content = this.$t('strings.msg_theme') + ': ' + star.content; + } + } else if (star.msgShowType === common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE) { + star.content = (star.content == common.string.EMPTY_STR) ? this.$t('strings.msg_slide') : star.content; + } else if (star.msgShowType === common.MESSAGE_SHOW_TYPE.PPT_IMAGE) { + let mmsSource = star.mms; + if (mmsSource[0].msgType == common.MSG_ITEM_TYPE.THEME && star.content !== common.string.EMPTY_STR) { + star.content = this.$t('strings.msg_theme') + ': ' + star.content; + } else { + star.content = (star.content == common.string.EMPTY_STR) ? this.$t('strings.msg_slide') : star.content; + } + } + }, + // 获取电话卡信息 + getTelephoneCardInfo() { + let cardNumber = cardService.initSimCardNum(); + if (cardNumber == common.int.SIM_COUNT) { + this.hasDoubleCard = true; + } else { + this.hasDoubleCard = false; + } + }, + onBackPress() { + if (this.hasCheckboxStatus) { + this.singleMsgCancelBack(); + return true; + } + return false; + }, + // 获取屏幕坐标 + touchStart(e) { + this.touchX = e.touches[0].globalX; + this.touchY = e.touches[0].globalY; + }, + // 长按信息触发 + mmsListLongPress(index) { + if (this.hasCheckboxStatus) { + return; + } + this.longPressIndex = index; + let item = this.mmsList[this.longPressIndex]; + if (item.isMsm) { + // 判断彩信是否包含文本 + let commonService = this.$app.$def.commonService; + if (commonService.judgeIsSelectText(item.mms)) { + this.$element('menu_long_press_mms_sms').show({ + x: this.touchX, + y: this.touchY + }); + } else { + this.$element('menu_long_press_mms').show({ + x: this.touchX, + y: this.touchY + }); + } + } else { + this.$element('menu_long_press').show({ + x: this.touchX, + y: this.touchY + }); + } + }, + // 长按工具栏选择 + longPressSelected(e) { + let value = e.value; + let item = this.mmsList[this.longPressIndex]; + switch (value) { + case '0': + // 复制 + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + this.clickGroupCopy(); + break; + case '1': + // 转发 + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + this.clickGroupTransmit(); + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + break; + case '2': + // 删除 + this.isCheckDeleted = false; + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + this.clickGroupDelete(); + break; + case '3': + // 选择文本 + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + this.longIntentTextSelect(item); + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + break; + case '4': + // 更多 + this.more(this.longPressIndex); + break; + case '5': + // 保存图片 + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + try { + this.saveImage(); + } catch { + mmsLog.error(e); + } finally { + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + } + break; + default: + mmsLog.info('longPressSelected, code is exit'); + } + }, + moreSelected(e) { + let value = e.value + switch (value) { + case '1': + this.longTextSelect(); + break; + case '2': + this.favoriteShare(); + break; + default: + mmsLog.info('moreSelected, code is exit'); + } + }, + longTextSelect() { + this.computedCheckedMsgCount(COMPUTED_CHECKED); + let item = this.mmsList[this.longPressIndex]; + this.intentTextSelect(item); + }, + intentTextSelect(item) { + let param = JSON.parse(JSON.stringify(item)); + if(param.isMsm) { + let content = common.string.EMPTY_STR; + let count = 0; + let length = param.mms.length; + for(let item of param.mms) { + if(common.MSG_ITEM_TYPE.TEXT == item.msgType) { + content = content + item.content; + } else if(common.MSG_ITEM_TYPE.THEME == item.msgType) { + content = content + this.$t('strings.msg_theme')+': ' + item.content; + } else if((common.MSG_ITEM_TYPE.IMAGE == item.msgType || common.MSG_ITEM_TYPE.AUDIO == item.msgType + || common.MSG_ITEM_TYPE.VIDEO == item.msgType) && item.content !== common.string.EMPTY_STR) { + content = content + item.content; + } + count ++; + if(count < length) { + content = content + '\n'; + } + } + param.content = content; + } + this.jumpToTextSelect(param); + }, + // 列表选择勾选 + listCheckBoxChange(index, e) { + let item = this.mmsList[index]; + item.isCbChecked = e.checked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + this.setHasSelectTextShow(item); + if(!item.isCbChecked && this.mmCheckedList.length == 1) { + this.setHasSelectTextShow(this.mmCheckedList[0]); + } + }, + setHasSelectTextShow(item) { + if(item.isCbChecked && item.isMsm) { + let commonService = this.$app.$def.commonService; + this.hasSelectTextShow = commonService.judgeIsSelectText(item.mms); + } else if(!item.isMsm && item.isCbChecked) { + this.hasSelectTextShow = true; + } else { + this.hasSelectTextShow = false; + } + }, + singleMsgCancelBack() { + this.hasCheckboxStatus = false; + this.hasSelectTextShow = false; + this.computedCheckedMsgCount(CANCEL_ALL_CHECKED); + }, + computedCheckedMsgCount(status) { + switch (status) { + case 0: + this.cancelSelectAll(); + break; + case 1: + this.selectAll(); + break; + case 2: + this.calculateChecked(false); + break; + default: + mmsLog.info('computedCheckedMsgCount, code is exit') + } + + }, + selectAll() { + for (let mms of this.mmsList) { + mms.isCbChecked = true; + } + this.calculateChecked(true); + }, + // 取消全选 + cancelSelectAll() { + for (let mms of this.mmsList) { + mms.isCbChecked = false; + } + this.selectMsgCount = 0; + this.selectMsgTextCount = 0; + this.selectMsgMmsCount = 0; + this.mmCheckedList = []; + }, + // 计算被选中的值 + calculateChecked(isAllSelect) { + let result = myStatService.calculateChecked(this.mmsList, isAllSelect); + if (result) { + this.selectMsgCount = result.count; + this.selectMsgTextCount = result.textCount; + this.selectMsgMmsCount = result.mmsCount; + this.mmCheckedList = result.mmCheckedList; + if (result.count == 1) { + this.longPressIndex = this.mmsList.findIndex((val, index) => val.isCbChecked); + } + this.allShow = false; + if (this.selectMsgCount == this.mmsList.length) { + this.allShow = true; + } + } + }, + clickBottomDelete() { + this.isCheckDeleted = true; + this.clickGroupDelete(); + }, + // 删除 + clickGroupDelete() { + if (this.selectMsgCount == 0) { + this.isCheckDeleted = false; + return; + } + this.$element('delete_dialog').show(); + }, + // 批量删除 + deleteDialogConfirm() { + if (this.selectMsgCount == 0) { + return; + } + this.isCheckDeleted = false; + let groupIds = []; + for (let i = 0; i < this.selectMsgCount; i++) { + let index = this.mmsList.findIndex(item => item.isCbChecked); + let item = this.mmsList[index]; + this.mmsList.splice(index, 1); + groupIds.push(item.groupId); + } + // 设置收藏标志位 + let actionData = { + groupIds: groupIds, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + hasCollect: 0 + }; + conversationService.updateCollect(actionData, function (result) { + if (result.code == common.int.SUCCESS) { + mmsLog.info('Success: updateCollect()'); + } else { + mmsLog.info('Error: updateCollect() failed !!!'); + } + }); + this.$element('delete_dialog').close(); + this.singleMsgCancelBack(); + }, + deleteDialogCancel() { + this.$element('delete_dialog').close(); + if (!this.isCheckDeleted) { + let item = this.mmsList[this.longPressIndex]; + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + } + this.isCheckDeleted = false; + }, + // 复制 + clickGroupCopy() { + // 如果选中的值未选中,直接返回 + if (this.selectMsgCount == 0 || this.selectMsgTextCount == 0) { + return; + } + // 复制 + myStatService.textCopy(this.mmCheckedList); + // 取消全选 + this.singleMsgCancelBack(); + }, + // 全选 + clickGroupCheckAll() { + if (this.selectMsgCount === this.mmsList.length) { + this.computedCheckedMsgCount(CANCEL_ALL_CHECKED); + this.mmsList.forEach((val, index) => { + val.isCbChecked = false; + }) + } else { + this.computedCheckedMsgCount(ALL_CHECKED) + } + }, + // 转发 + clickGroupTransmit() { + if (this.mmCheckedList.length == 1) { + this.transmitMsgSingle(); + } else if (this.mmCheckedList.length > 1) { + this.transmitMsgMulti(); + } + }, + // 保存 + saveImage() { + let actionData = {} + actionData.threadId = '' + actionData.pduId = this.mmsList[this.longPressIndex].pduId + let that = this; + myStatService.saveImage(actionData, result => { + if (result.code == common.int.SUCCESS) { + let message = that.$t('strings.attachment_saved_to') + result.filePath + + that.$t('strings.please_keep_it_secure') + prompt.showToast({ // 图片保存完成 + message: message, + duration: 1000, + }); + } else { + mmsLog.info(PRE_LOG + 'saveImage error'); + } + }); + }, + more(longPressIndex) { + let item = this.mmsList[longPressIndex]; + // 设置选中标记 + item.isCbChecked = !item.isCbChecked; + // 获取选中的列表 + this.computedCheckedMsgCount(COMPUTED_CHECKED); + this.hasCheckboxStatus = true; + this.setHasSelectTextShow(item); + }, + singleMsgBack() { + router.back(); + }, + tip() { + this.$element('tip_details_dialog').show(); + }, + // 模拟双击事件 item 参数 + doubleClick(index, e) { + if (this.timeOutFlag != null) { + clearTimeout(this.timeOutFlag); + } + let ref = e.target.ref; + let that = this; + if (typeof this.doubleClickMap == 'undefined' || this.doubleClickMap[ref] == null) { + this.doubleClickMap = {}; + this.doubleClickMap[ref] = 0; + } + this.doubleClickMap[ref] = this.doubleClickMap[ref] + 1 + if (this.doubleClickMap[ref] == 2) { + this.longPressIndex = index; + let item = this.mmsList[this.longPressIndex]; + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + this.doubleIntentTextSelect(item); + item.isCbChecked = !item.isCbChecked; + this.computedCheckedMsgCount(COMPUTED_CHECKED); + } else if (this.doubleClickMap[ref] > 2) { + this.doubleClickMap = {}; + } + this.timeOutFlag = setTimeout(function () { + that.doubleClickMap = {}; + }, 300) + }, + doubleIntentTextSelect(item) { + let param = JSON.parse(JSON.stringify(item)); + if(param.isMsm) { + if(param.msgShowType != common.MESSAGE_SHOW_TYPE.NORMAL) { + return; + } + } + this.jumpToTextSelect(param); + }, + longIntentTextSelect(item) { + let param = JSON.parse(JSON.stringify(item)); + if(param.isMsm) { + let isContainText = myStatService.judgeIsContainText(param.mms); + if(isContainText) { + this.getIntentText(param); + } else { + return; + } + } + this.jumpToTextSelect(param); + }, + getIntentText(param) { + for(let item of param.mms) { + if(common.MSG_ITEM_TYPE.TEXT == item.msgType) { + param.content = item.content; + break; + } + if((common.MSG_ITEM_TYPE.IMAGE == item.msgType || common.MSG_ITEM_TYPE.AUDIO == item.msgType + || common.MSG_ITEM_TYPE.VIDEO == item.msgType) && item.content !== common.string.EMPTY_STR) { + param.content = item.content; + break; + } + } + }, + jumpToTextSelect(item) { + router.push({ + uri: 'pages/text_select/text_select', + params: item + }); + }, + // 单个数据转发 + jumpToTransmit(transmitContent, transmitContentList, isMms) { + router.push({ + uri: 'pages/transmit_msg/transmit_msg', + params: { + doubleCard: this.cardImage, + transmitContent: transmitContent, + transmitContentList: transmitContentList, + isMulti: true, + isMms: isMms, + isMyStartPage: true + } + }); + }, + transmitMsgSingle() { + let starObj = {}; + let item = this.mmCheckedList[0] + let contactsName = this.$t('strings.transmitContentReceive', { + name: item.address + }); + starObj.contactsName = contactsName; + starObj.isMsm = item.isMsm; + starObj.msgShowType = item.msgShowType; + starObj.mms = item.mms; + starObj.content = item.content; + starObj.msgUriPath = item.msgUriPath ? item.msgUriPath : common.string.EMPTY_STR; + starObj.contentInfo = common.string.EMPTY_STR; + starObj.msgType = item.msgType; + starObj.audioTime = item.audioTime; + let transmitContentList = []; + transmitContentList.push(starObj); + let transmitContent = item.isReceive ? contactsName : this.$t('strings.transmitContent'); + this.jumpToTransmit(transmitContent, transmitContentList, item.isMsm); + }, + // 多个数据转发 + transmitMsgMulti() { + mmsLog.info('transmitMsgMulti,start'); + let transmitContent = this.$t('strings.transmitContentMultiForFavorite'); + let item = this.mmCheckedList[0]; + let contactsName = this.$t('strings.transmitContentReceive', { + name: item.address + }); + let today = this.$t('strings.today'); + let yesterday = this.$t('strings.yesterday'); + let transmitContentMe = this.$t('strings.transmitContentMe'); + let transmitMsg = this.getTransmitMulti(this.mmCheckedList, contactsName, today, yesterday, transmitContentMe); + this.jumpToTransmit(transmitContent, transmitMsg.transmitContentList, true); + }, + getTransmitMulti(mmCheckedList, contactsName, today, yesterday, transmitContentMe) { + let result = {}; + let transmitList = []; + for (let element of mmCheckedList) { + let transmitContentArray = {} + if (element.isCbChecked) { + let date = element.date.substring(0, element.date.length - 3); + if (date == today || date == yesterday) { + let time = element.timeMillisecond; + date = this.getTime(time); + } + transmitContentArray.date = date; + transmitContentArray.time = element.time; + transmitContentArray.msgUriPath = element.msgUriPath ? element.msgUriPath : common.string.EMPTY_STR; + transmitContentArray.content = element.content; + if (element.isReceive) { + transmitContentArray.contactsName = contactsName; + } else { + transmitContentArray.contactsName = transmitContentMe; + } + transmitContentArray.mms = element.mms; + transmitContentArray.msgShowType = element.msgShowType; + transmitContentArray.isMsm = element.isMsm; + transmitContentArray.contentInfo = common.string.EMPTY_STR; + transmitContentArray.msgType = element.msgType; + transmitContentArray.audioTime = element.audioTime; + transmitList.push(transmitContentArray); + } + } + result.transmitContentList = transmitList; + return result; + }, + getTime(nS) { + var date = new Date(parseInt(nS)); + var year = date.getFullYear(); + var mon = date.getMonth() + 1; + var day = date.getDate(); + return year + this.$t('strings.year') + mon + this.$t('strings.month') + day + this.$t('strings.day'); + }, + favoriteShare() { + if (this.selectMsgCount == 0 || this.selectMsgTextCount != 1) { + return; + } + var actionData = {}; + let item = this.mmCheckedList[0]; + actionData.content = item.content; + myStatService.favoriteShare(actionData, function (data) { + mmsLog.info(PRE_LOG + 'favoriteShare: ' + data.success); + }); + }, + // 头像点击事件处理器 + avatarClickEventHandler(item) { + let i = item + let isReceive = i.isReceive; + if (isReceive) { + let telephone = i.receiverNumber; + if (telephone == null || telephone == common.string.EMPTY_STR) { + mmsLog.warn(PRE_LOG + 'avatarClickEventHandler: telephone is null') + return; + } + let actionData = {}; + actionData.phoneNumber = telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + this.jumpToContract(actionData); + } else { + // 跳转到联系人名片页面 + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + contactService.judgeIsExitProfile(actionData,flag => { + if(flag){ + let jumpData = { + pageFlag: common.contractPage.PAGE_FLAG_CALLING_CARD + } + this.jumpToContract(jumpData); + }else{ + mmsLog.info('jumpToCard is error'); + } + }) + } + }, + // 跳转联系人app + jumpToContract(actionData) { + let commonService = this.$app.$def.commonService; + let str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info('my_star.js ---> Data: ' + data); + }).catch((error) => { + mmsLog.error('my_star.js ---> Cause: ' + JSON.stringify(error)); + }) + }, + clickStarMms(item) { + router.push({ + uri: 'pages/slide_detail/slide_detail', + params: { + mms: item, + threadId: item.sessionId + } + }); + } +} diff --git a/entry/src/main/js/default/pages/query_report/query_report.css b/entry/src/main/js/default/pages/query_report/query_report.css new file mode 100644 index 0000000..6b5ba3f --- /dev/null +++ b/entry/src/main/js/default/pages/query_report/query_report.css @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*最大的布局*/ +.container { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + width: 100%; + height: 100%; +} + +.message-bar { + margin-top: 20px; + margin-bottom: 20px; +} + +.message-back { + width: 50px; + height: 50px; + margin-left: 50px; +} + +.message-text { + font-size: 48px; + margin-left: 30px; +} + +.content { + flex-direction: column; + margin-left: 12%; +} + +.receive-text { + font-size: 30px; + margin-bottom: 5%; +} + +.status-text { + font-size: 25px; + margin-bottom: 8%; +} + +.delivered-text { + font-size: 25px; +} diff --git a/entry/src/main/js/default/pages/query_report/query_report.hml b/entry/src/main/js/default/pages/query_report/query_report.hml new file mode 100644 index 0000000..8e0aab4 --- /dev/null +++ b/entry/src/main/js/default/pages/query_report/query_report.hml @@ -0,0 +1,31 @@ + + +
+ +
+ + + + {{$t('strings.send_reports')}} +
+
+ + {{$t('strings.putAddresser')}}{{telephone}} + + {{$t('strings.Status')}}{{sendStatusDesc}} + + {{$t('strings.Delivered')}}{{mmsTime}} +
+
diff --git a/entry/src/main/js/default/pages/query_report/query_report.js b/entry/src/main/js/default/pages/query_report/query_report.js new file mode 100644 index 0000000..c94fa00 --- /dev/null +++ b/entry/src/main/js/default/pages/query_report/query_report.js @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import common from '../common_constants.js'; +import dateUtil from '../DateUtil.js'; +import router from '@system.router'; + +export default { + data: { + // 是否是彩信 + isMsm: true, + // 发送状态描述 + sendStatusDesc: '', + // 发送状态 + sendStatus: 0, + // 时间 + mmsTime: '', + // 时间戳 + timeMillisecond: 0, + // 手机号 + telephone: '' + }, + onShow() { + // 状态转换成中文描述 + this.dealSendStatus(); + // 时间转换 + this.dealTime(); + }, + dealSendStatus() { + if (this.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { + this.sendStatusDesc = this.$t('strings.received'); + } else if (this.sendStatus == common.int.SEND_MESSAGE_FAILED) { + this.sendStatusDesc = this.isMsm ? this.$t('strings.refused') : this.$t('strings.failed'); + } else { + this.sendStatusDesc = this.$t('strings.rending'); + } + }, + dealTime() { + this.mmsTime = dateUtil.convertTimeStampDate(this.timeMillisecond, this); + }, + back() { + router.back(); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/settings/settings.css b/entry/src/main/js/default/pages/settings/settings.css new file mode 100644 index 0000000..c893879 --- /dev/null +++ b/entry/src/main/js/default/pages/settings/settings.css @@ -0,0 +1,193 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.settings { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + align-items: center;/*flex容器当前行的交叉轴对齐格式 元素在交叉轴居中*/ + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +/*设置标题栏*/ +.setting-bar { + align-items: center; + width: 100%; + height: 120px; + padding-left: 50px; + padding-right: 40px; + display: flex; +} + +/*返回按钮*/ +.setting-bar-back { + width: 40px; + height: 40px; +} + +/*设置字体*/ +.setting-bar-set { + margin-left: 30px; + font-size: 40px; + flex: 1; + padding-bottom: 5px; +} + +/*还原按钮*/ +.setting-bar-restore { + width: 48px; + height: 48px; + text-align: right; +} + +.popup { + width: 300px; + height: 100px; + background-color: #F2F0F8FF; + border-style: solid; +} + +.dialog { + width: 680px; + height: 240px; +} + +.setting-bar-restore-dialog { + flex-direction: column; + align-items: center; +} + +.setting-bar-text { + margin-left: 120px; +} + +.setting-bar-button { + width: 500px; + height: 120px; + justify-content: space-around; + align-items: center; + margin-top: 20px; +} + +.btn-cancel { + width: 200px; + height: 100px; + background-color: #f0f8ff; + text-color: #000; +} + +.btn-restore { + width: 200px; + height: 100px; + background-color: #f0f8ff; + text-color: #000; +} + +.setting-vertical-divider { + color: #ff0000ff; + width: 2px; + height: 80px; +} + +/*通知信息整合*/ +.setting-msg-integration { + width: 100%; + height: 120px; + padding-left: 50px; + padding-right: 50px; + flex-direction: row; + align-items: center; + display: flex; +} + +/*消息整合左侧列表*/ +.setting-msg-integration-div { + flex-direction: column; + justify-content: center; + flex: 1; + height: 80%; +} +.setting-right-button { + width: 80px; + height: 100px; +} + +/*设置标题通用字体*/ +.setting-title-typeface { + height: 60%; + align-items: center; + font-size: 30px; +} + +/*整合文字2*/ +.msg-integration-text2 { + color: #848484; + font-size: 21px; + height: 40%; + align-items: center; +} + +/*整合按钮*/ +.msg-integration-button { + width: 80px; + height: 100px; + line-height: 120px; + align-items: center; + margin-left: 20px; +} + +/*下划线*/ +.setting-underline { + width: 100%; + height: 2px; + background-color: #e6e6fa; + margin-left: 50px; + margin-right: 50px; +} + +/*分割线*/ +.setting-underlines { + width: 100%; + height: 10px; + background-color: #F2F2F2; +} + +/*信息铃声*/ +.setting-msg-voice { + width: 100%; + height: 100px; + padding-left: 50px; + padding-right: 50px; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +/*铃声文字*/ +.setting-msg-voice-text { + flex: 1; +} + +/*铃声更多箭头*/ +.setting-msg-voice-more { + width: 30px; + height: 30px; +} + +.setting-style { + margin-right: 20px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/settings/settings.hml b/entry/src/main/js/default/pages/settings/settings.hml new file mode 100644 index 0000000..c14a0a7 --- /dev/null +++ b/entry/src/main/js/default/pages/settings/settings.hml @@ -0,0 +1,86 @@ + + +
+ +
+ + + + {{$t('strings.settings')}} + + +
+ + + + + +
+ +
+ {{$t('strings.archive_info_messages')}} + {{$t('strings.archive_info_messages_hint')}} +
+ +
+ +
+
+ + + + +
+ +
+ {{$t('strings.malicious_website_identification')}} + {{$t('strings.malicious_website_identification_hint')}} +
+ +
+ +
+
+ + + + + +
+ {{$t('strings.message_tone')}} + +
+ + + + + +
+ {{$t('strings.show_contact_profile_pics')}} +
+ +
+
+ + + + + +
+ {{$t('strings.advanced')}} + +
+
diff --git a/entry/src/main/js/default/pages/settings/settings.js b/entry/src/main/js/default/pages/settings/settings.js new file mode 100644 index 0000000..1dd422c --- /dev/null +++ b/entry/src/main/js/default/pages/settings/settings.js @@ -0,0 +1,148 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +import prompt from '@system.prompt'; +// JS公共常量 +import common from '../common_constants.js'; +import settingService from '../../service/SettingService.js' + +const TAG = 'JS->setting.js->'; + +export default { + data: { + // 通知信息整合 + integrationSwitch: null, + // 恶意网站选择 + maliciousWebSwitch: null, + // 显示联系人头像 + showContactSwitch: null, + }, + onInit() { + mmsLog.info(TAG + 'onInit(): start'); + }, + onShow() { + this.getSettingPageSwitchValue(); + }, + // 初始化setting页面的开关 + getSettingPageSwitchValue() { + mmsLog.info(TAG + 'initializeSettingPage(): start'); + let preferences = this.$app.$def.preferences; + settingService.setOnSettingValueListener(preferences, this.initializeSettingData); + }, + // 初始化setting数据 + initializeSettingData(data) { + let that = this; + that.integrationSwitch = data.integrationSwitch; + that.maliciousWebSwitch = data.maliciousWebSwitch; + that.showContactSwitch = data.showContactSwitch; + }, + // 通知信息整合 + integration(e) { + let messageCode = common.route.MESSAGE_CODE_UPDATE_ARCHIVE_INFO_MESSAGES_VALUE; + let actionData = {}; + this.integrationSwitch = e.checked; + if(this.integrationSwitch) { + actionData.booleanValue = common.bool.TRUE; + } else { + actionData.booleanValue = common.bool.FALSE; + } + actionData.preferences = this.$app.$def.preferences; + this.updateSettingPageSwitchValue(messageCode, actionData); + }, + // 恶意网站选择 + maliciousWeb(e) { + mmsLog.info(TAG + 'maliciousWeb(): value = ' + e.checked); + let messageCode = common.route.MESSAGE_CODE_UPDATE_MALICIOUS_WEBSITE_IDENTIFICATION_VALUE; + let actionData = {}; + this.maliciousWebSwitch = e.checked; + if(this.maliciousWebSwitch) { + actionData.booleanValue = common.bool.TRUE; + } else { + actionData.booleanValue = common.bool.FALSE; + } + actionData.preferences = this.$app.$def.preferences; + this.updateSettingPageSwitchValue(messageCode, actionData); + }, + // 跳转至'信息铃声页面,在设置->声音和振动->信息铃声' + jumpToMessageTonePage() { + }, + // 显示联系人的头像 + showContact(e) { + mmsLog.info(TAG + 'showContact(): value = ' + e.checked); + let messageCode = common.route.MESSAGE_CODE_UPDATE_SHOW_CONTACT_PROFILE_PICS_VALUE; + let actionData = {}; + this.showContactSwitch = e.checked; + actionData.preferences = this.$app.$def.preferences; + if (this.showContactSwitch) { + actionData.booleanValue = common.bool.TRUE; + } else { + actionData.booleanValue = common.bool.FALSE; + } + this.updateSettingPageSwitchValue(messageCode, actionData); + }, + // 展示还原配置的弹框 + showDialog() { + let that = this; + prompt.showDialog({ + message: this.$t('strings.restore_all_default_settings'), + buttons: [ + {text: this.$t('strings.cancel'), color: '#007DFF'}, + {text: this.$t('strings.restore'), color: '#007DFF'} + ], + success: function (data) { + if (data.index == 1) { + that.restoreSettingsPageSwitchValue(); + } + } + }); + }, + // 还原设置页面的默认值 + restoreSettingsPageSwitchValue() { + let that = this; + let preferences = this.$app.$def.preferences; + settingService.restoreSwitchValue(preferences, function (result) { + if (result.code === common.int.SUCCESS) { + that.integrationSwitch = true; + that.maliciousWebSwitch = false; + that.showContactSwitch = true; + mmsLog.info(TAG + 'restoreSettingsPageSwitchValue(): success'); + } else { + mmsLog.info(TAG + 'restoreSettingsPageSwitchValue(): fail'); + } + }); + }, + // 返回按钮 + back() { + router.back(); + }, + // 高级 页目跳转 + advancedSetting() { + router.push({ + uri: 'pages/advanced_settings/advanced_settings' + }); + }, + // 更新开关值 + updateSettingPageSwitchValue(messageCode, actionData) { + mmsLog.info(TAG + 'updateSettingPageSwitchValue(): start, msgCode = ' + messageCode); + settingService.updateSettingValue(messageCode, actionData, function (result) { + if (result.code == common.int.SUCCESS) { + mmsLog.info(TAG + 'updateSettingPageSwitchValue(): success'); + } else { + mmsLog.info(TAG + 'updateSettingPageSwitchValue(): fail'); + } + }); + } +} diff --git a/entry/src/main/js/default/pages/slide_detail/slide_detail.css b/entry/src/main/js/default/pages/slide_detail/slide_detail.css new file mode 100644 index 0000000..a01ae1f --- /dev/null +++ b/entry/src/main/js/default/pages/slide_detail/slide_detail.css @@ -0,0 +1,172 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#slideDetail { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; +} +.title-bar { + align-items: center; + width: 100%; + height: 150px; + margin-left: 25px; + margin-right: 25px; +} +.mms-back { + height: 48px; + width: 48px; +} +.title-text { + font-size: 45px; + width: 100%; + margin-left: 20px; + weights: 500; +} +.item-container { + flex-direction: column; +} +.item { + flex-direction: row; + justify-content: center; + align-content: center; + padding: 15px 20px; + width: 100%; +} +.theme-item { + width: 100%; + text-align: left; +} +.image-item-container { + flex-direction: column; + width: 85%; + padding-left: 8%; + align-items: center; +} +.image-item { + width: 50%; + height: 200px; +} +.save-image-container { + flex-direction: row; + justify-content: center; + align-items: center; +} +.audio-item { + flex-direction: column; + justify-content: center; + align-items: center; +} +.image-container { + flex-direction: column; + width: 85%; + padding-left: 8%; + align-items: center; + margin-top: 20px; + margin-bottom: 20px; +} +.play-image { + width: 64px; + height: 64px; +} +.play-progress { + flex-direction: row; +} +.progress { + width: 60%; + margin-left: 20px; + margin-right: 20px; +} +.save-image { + width: 55px; + height: 55px; +} +.text-item { + width: 100%; + text-align: center; +} +.line { + display: flex; + flex-direction: row; + justify-content: center; +} +.divider { + height: 1px; + width: 45%; + margin-top: 15px; + background-color: lightgray; +} +.divider-text { + width: 70px; + text-align: center; +} +.mms-bottom { + width: 100%; + height: 160px; + flex-direction: row; + justify-content: center; + align-items: center; +} +.bottom-button { + width: 22%; + height: 100%; + flex-direction: column; + align-items: center; + padding-left: 20px; + padding-right: 20px; + padding-top: 20px; +} +.button-image { + width: 55px; + height: 55px; +} +.button-text { + font-size: 22px; +} +.delete-dialog-div { + display: flex; + width: 100%; + flex-direction: column; + padding: 20px; +} +.dialog-inner-logic { + width: 100%; + height: 60px; + flex-direction: row; + justify-content: center; + margin-top: 10px; +} +.dialog-inner-text { + width: 100%; + margin-top: 10px; + margin-bottom: 20px; + text-align: center; +} +.dialog-inner-logic-cancel { + flex: 1; + text-align: center; + color: #00f; +} +.dialog-inner-logic-delete { + flex: 1; + text-align: center; + color: #f00; +} +.dialog-inner-logic-vertical { + width: 2px; + height: 50px; + background-color: darkgrey; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/slide_detail/slide_detail.hml b/entry/src/main/js/default/pages/slide_detail/slide_detail.hml new file mode 100644 index 0000000..d7d4d35 --- /dev/null +++ b/entry/src/main/js/default/pages/slide_detail/slide_detail.hml @@ -0,0 +1,97 @@ + +
+
+ + {{$t('strings.mms')}} +
+ + +
+ + {{$t('strings.msg_theme')}}: {{$item.content}} + +
+
+
+ + {{$item.content}} +
+
+ +
+
+
+ {{audioName}} +
+
+ +
+
+ +
+
+
+ 00:00 + + {{$item.time}} +
+
+
+ + {{$item.content}} + +
+
+ + + {{$item.subscript}} + + +
+
+
+
+
+ + {{$t('strings.save_all')}} +
+
+ + {{$t('strings.msg_transmit')}} +
+
+ + {{lockText}} +
+
+ + {{$t('strings.delete')}} +
+
+ +
+ {{deleteText}} +
+ + {{$t('strings.msg_delete_dialog_cancel')}} + +
+ + {{$t('strings.delete')}} +
+
+
+
\ No newline at end of file diff --git a/entry/src/main/js/default/pages/slide_detail/slide_detail.js b/entry/src/main/js/default/pages/slide_detail/slide_detail.js new file mode 100644 index 0000000..45128e5 --- /dev/null +++ b/entry/src/main/js/default/pages/slide_detail/slide_detail.js @@ -0,0 +1,227 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import router from '@system.router'; +import common from '../common_constants.js'; +import conversationService from '../../service/ConversationService.js'; +import mmsLog from '../../../default/utils/MmsLog.js'; + +const TAG = 'slide_detail.js ---> '; + +export default { + data: { + mmsItem: null, + mmsSource: [], + isShowLine: true, + isNeedSave: false, + isLock: false, + lockIcon: '/common/icon/msg_lock_two.svg', + lockText: '', + deleteText: '', + threadId: 0, + audioName: '', + doubleClickStatus: false, + isShowBottom: true + }, + onInit() { + this.audioName = common.string.AUDIO_NAME; + this.mmsItem = this.mms; + this.mmsSource = this.mmsItem.mms; + if (this.mmsSource.length > 0) { + this.setLineStatus(); + this.setSlideSubscript(); + this.setSaveButtonStatus(); + } + if (this.isShowBottom) { + this.initLockStatus(); + } + }, + onShow() { + }, + onBackPress() { + }, + initLockStatus() { + this.isLock = this.mmsItem.isLock; + if(this.isLock) { + this.lockIcon = '/common/icon/msg_unlock.svg'; + this.lockText = this.$t('strings.unlock'); + this.deleteText = this.$t('strings.msg_delete_dialog_lock'); + } else { + this.lockIcon = '/common/icon/msg_lock_two.svg'; + this.lockText = this.$t('strings.lock'); + this.deleteText = this.$t('strings.msg_delete_dialog_tip1'); + } + }, + setLineStatus() { + if (this.mmsSource.length === 1) { + this.isShowLine = false; + } else if (this.mmsSource.length === 2) { + let first = this.mmsSource[0]; + let second = this.mmsSource[1]; + if (first.msgType == common.MSG_ITEM_TYPE.THEME && second.msgType == common.MSG_ITEM_TYPE.TEXT) { + this.isShowLine = false; + } + } + }, + setSlideSubscript() { + if (!this.isShowLine) { + return; + } + let first = this.mmsSource[0]; + this.mmsSource.forEach((item, index) => { + if (first.msgType == common.MSG_ITEM_TYPE.THEME) { + if (index === 0) { + item.subscript = common.string.EMPTY_STR; + } else { + item.subscript = index + '/' + (this.mmsSource.length - 1); + } + } else { + item.subscript = (index + 1) + '/' + this.mmsSource.length; + } + }); + }, + setSaveButtonStatus() { + for (let i = 0; i < this.mmsSource.length; i++) { + let item = this.mmsSource[i]; + if (item.msgType == common.MSG_ITEM_TYPE.VIDEO || + item.msgType == common.MSG_ITEM_TYPE.IMAGE || + item.msgType == common.MSG_ITEM_TYPE.AUDIO) { + this.isNeedSave = true; + break; + } + } + }, + back() { + router.back(); + }, + // 转发 + transferMms() { + router.push({ + uri: 'pages/transmit_msg/transmit_msg', + params: { + isSlideDetail: true, + mmsSource: this.mmsSource + } + }); + }, + // 锁定 + lockMms() { + if(this.isLock) { + this.isLock = false; + this.lockIcon = '/common/icon/msg_lock_two.svg'; + this.lockText = this.$t('strings.lock'); + this.deleteText = this.$t('strings.msg_delete_dialog_tip1'); + } else { + this.isLock = true; + this.lockIcon = '/common/icon/msg_unlock.svg'; + this.lockText = this.$t('strings.unlock'); + this.deleteText = this.$t('strings.msg_delete_dialog_lock'); + } + this.updateLock(this.isLock); + this.mmsItem.isLock = this.isLock; + }, + updateLock(isLock) { + // 选择内容锁定 + let groupIds = [this.mmsItem.groupId]; + let hasLock = isLock ? 1 : 0; + let actionData = { + groupIds: groupIds, + featureAbility: this.$app.$def.featureAbility, + hasLock: hasLock, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + conversationService.updateLock(actionData, result => { + mmsLog.info(TAG + 'updateLock success' + result); + }); + // 更新锁定状态 + this.updateSessionLock(isLock); + }, + updateSessionLock(isLock) { + let threadIds = [this.threadId]; + let hasLock = isLock ? 1 : 0; + let valueBucket = { + 'has_lock': hasLock, + } + let actionData = { + threadId: this.threadId, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + conversationService.queryMessageLockBySessionId(actionData, lockStatus => { + if (lockStatus.length > 0 && !isLock) { + let count = this.calculateLockCount(lockStatus); + if (count != lockStatus.length) { + mmsLog.log(TAG + 'updateSessionLock, it is not all select unlock'); + return; + } + } + let conversationListService = this.$app.$def.conversationListService; + let rdbStore = this.$app.$def.rdbStore; + conversationListService.updateById(rdbStore, threadIds, valueBucket); + }); + }, + calculateLockCount(lockStatus) { + let count = 0; + for (let element of lockStatus) { + if (!element.isLock) { + count ++; + } + } + return count; + }, + // 删除 + deleteMms() { + this.$element('delete_dialog').show(); + }, + deleteCancel() { + // 取消弹出 + this.$element('delete_dialog').close(); + }, + deleteConfirm() { + let groupIds = [this.mmsItem.groupId]; + let actionData = { + ohosDataAbility: this.$app.$def.ohosDataAbility, + groupIds: groupIds, + featureAbility: this.$app.$def.featureAbility, + }; + // 这里调用数据库的删除方法 + conversationService.deleteMessageByGroupIds(actionData); + router.back(); + }, + // 保存所有 + saveAllMms() { + + }, + doubleClick(content, hasTheme) { + if(hasTheme) { + content = this.$t('strings.msg_theme') + ': '+content; + } + if (!this.doubleClickStatus) { + this.doubleClickStatus = true; + setTimeout(() => { + this.doubleClickStatus = false; + }, 500); + } else { + this.jumpToTextSelect(content); + } + }, + jumpToTextSelect(content) { + router.push({ + uri: 'pages/text_select/text_select', + params: { + content: content + } + }); + }, +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/sms_center/sms_center.css b/entry/src/main/js/default/pages/sms_center/sms_center.css new file mode 100644 index 0000000..1940c3a --- /dev/null +++ b/entry/src/main/js/default/pages/sms_center/sms_center.css @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.message-centre { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + align-items: center;/*flex容器当前行的交叉轴对齐格式 元素在交叉轴居中*/ + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #fff; +} + +/*短信中心标题栏*/ +.message-bar { + align-items: center; + width: 100%; + height: 120px; + padding-left: 50px; + padding-right: 50px; + display: flex; +} + +/*返回按钮*/ +.message-back { + width: 48px; + height: 48px; +} + +/*短信中心字体*/ +.message-text { + margin-left: 30px; + font-size: 40px; + font-weight: 500; +} + +/*号码div*/ +.meassge-number-div { + width: 100%; + height: 100px; + padding-left: 50px; + padding-right: 50px; + align-items: center; +} + +/*号码*/ +.message-number { + flex: 1; +} + +/*选择箭头*/ +.message-image { + width: 30px; + height: 30px; +} + +/*短信中心号码提示*/ +.message-hint { + padding-left: 50px; + padding-right: 50px; + color: #f00; + font-size: 27px; +} + +.txt { + color: #000; + font-weight: bold; + font-size: 39px; +} + +.dialog-main { + width: 100%; + margin-left: 50px; + margin-right: 50px; + flex-direction: column; +} + +.dialog-title { + height: 100px; + width: 100%; + font-size: 40px; +} + +.dialog-input { + height: 100px; + width: 100%; + border-radius: 0; + padding-left: 0; + background-color: #fff; + border-bottom: 2px; + border-bottom-color: grey; +} + +.inner-txt { + width: 400px; + height: 160px; + flex-direction: column; + align-items: center; + justify-content: space-around; +} + +.inner-btn { + width: 100%; + height: 120px; + flex-direction: row; + justify-content: space-evenly; + align-items: center; +} + +.btn-txt { + width: 50%; + background-color: #fff; + text-color: #007DFF; +} + +.dialog-divider { + color: #585858; + height: 60px; +} + +.screen-height { + margin-bottom: 650px; +} + +.no-screen-height { + margin-bottom: 650px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/sms_center/sms_center.hml b/entry/src/main/js/default/pages/sms_center/sms_center.hml new file mode 100644 index 0000000..6002f12 --- /dev/null +++ b/entry/src/main/js/default/pages/sms_center/sms_center.hml @@ -0,0 +1,50 @@ + + +
+ +
+ + + + {{$t('strings.sms_center')}} + {{$t('strings.sim')}} {{index}} {{$t('strings.sms_center')}} +
+ +
+ {{number}} + +
+ + {{$t('strings.sms_center_hint')}} + + + +
+ {{$t('strings.change_sms_center_number')}} + +
+ +
+
+
+
diff --git a/entry/src/main/js/default/pages/sms_center/sms_center.js b/entry/src/main/js/default/pages/sms_center/sms_center.js new file mode 100644 index 0000000..8b6699c --- /dev/null +++ b/entry/src/main/js/default/pages/sms_center/sms_center.js @@ -0,0 +1,211 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +import cardService from '../../service/SimCardService.js'; +import settingService from '../../service/SettingService.js'; +import callService from '../../service/CallService.js'; + +// JS公共常量 +import common from '../common_constants.js'; + +const TAG = 'JS->sms_center.js->'; + +export default { + data: { + // sim卡的数量 + simCount: 0, + // 如果是2张卡,卡的索引 + index: 0, + // 短信中心号码 + number: '', + // dialog内输入的number + numberInDialog: null, + // 编辑短信中心号码时,如果只剩+号或没有内容时,确定按钮透明度变暗 + noneOrOnlyPlusStatus: null, + // 菜单选项列表 + menuOptionList: [] + }, + onInit() { + this.simCount = this.countOfSim; + this.index = this.idx; + this.getSmscNumber(); + }, + // 获取短信中心号码 + getSmscNumber() { + mmsLog.info(TAG + 'getSmscNumber(): start'); + let actionData = {}; + actionData.index = this.index; + actionData.preferences = this.$app.$def.preferences; + let that = this; + cardService.querySmscNumber(actionData, function (result) { + if (result.code === common.int.SUCCESS) { + mmsLog.info(TAG + 'getSmscNumber(): success'); + that.number = result.smsNumber; + that.numberInDialog = that.number; + } else { + mmsLog.info(TAG + 'getSmscNumber(): fail'); + } + }); + }, + onShow() { + let tempMenuOptionList = [ + { + icon: '/common/new_message.svg', + content: this.$t('strings.message') + }, + { + icon: '/common/call.svg', + content: this.$t('strings.phone') + }, + { + icon: '/common/new_contact.png', + content: this.$t('strings.new_contact') + } + ]; + this.menuOptionList = tempMenuOptionList; + this.$watch('number', 'autoHandleNumberChanged'); + this.$element('simpleDialog').focus(); + }, + // 当短信中心号码被修改后,由该方法处理 + autoHandleNumberChanged(newValue) { + mmsLog.info(TAG + 'autoHandleNumberChanged(): newV = ' + newValue); + let actionData = {}; + actionData.simCount = this.simCount; + actionData.index = this.index; + actionData.number = newValue; + settingService.updateSmscNumber(actionData); + }, + back() { + router.back(); + }, + // 显示dialog + showDialog() { + this.$element('simpleDialog').show() + }, + // 输入短信中心号码 + inputNumber(e) { + let tempText = this.numberInDialog; + if (this.judgeTextOnlyIncludeDigitAndPlus(e.text)) { + if (e.text == '' || e.text == '+') { + this.noneOrOnlyPlusStatus = true; + } else { + this.noneOrOnlyPlusStatus = false; + } + this.numberInDialog = e.text; + } else { + this.numberInDialog = e.text; + this.numberInDialog = ''; + this.numberInDialog = tempText; + } + }, + // 判断输入的内容只包含0~9和'+'号 + judgeTextOnlyIncludeDigitAndPlus(str) { + let reg = /^[+]?[0-9]*$/; + let result = reg.test(str); + return result; + }, + // 点击'取消',关闭dialog + cancelSchedule() { + this.numberInDialog = this.number; + this.$element('simpleDialog').close(); + }, + // 点击确定,并关闭dialog + setSchedule() { + if (this.noneOrOnlyPlusStatus) { + return; + } + this.number = this.numberInDialog; + this.$element('simpleDialog').close(); + this.autoHandleNumberChanged(this.number); + router.back(); + }, + // 分享短信中心dialog内选中的内容 + shareInSmsCenter(e) { + if (e.value == common.string.EMPTY_STR) { + return; + } + let actionData = {}; + actionData.content = e.value; + settingService.shareSmsEnterSelectedText(actionData); + }, + // 编辑短信中心dialog内选中的内容 + optionSelectInSmsCenter(e) { + if (e.value == '') { + return; + } + switch (e.index) { + case 0: + // 跳转至'新建信息'页面 + this.jumpToNewMessagePage(e.value); + break; + case 1: + // 打电话,即呼叫前编辑 + this.callSmscNumber(e.value); + break; + case 2: + // 添加为联系人(保存为已有联系人) + this.saveSmscNumberToExistingContact(e.value); + break; + default: + mmsLog.info(TAG + 'optionSelectInSmsCenter,code is not exit'); + } + }, + // 跳转至'新建信息'页面 + jumpToNewMessagePage(telephone) { + let actionData = {}; + actionData.content = telephone; + router.push({ + uri: 'pages/conversation/conversation', + params: { + isNewMsg: true, + telephone: telephone + } + }); + }, + // 将短信中心号码保存为已有联系人 + saveSmscNumberToExistingContact(telephone) { + let messageCode = common.contractPage.PAGE_FLAG_SAVE_EXIST_CONTACT; + let actionData = {}; + actionData.phoneNumber = telephone; + this.jumpToContactsApp(messageCode, actionData); + }, + // 呼叫短信中心号码 + callSmscNumber(telephone) { + // 打电话 + mmsLog.info('call action'); + let param = { + telephone: telephone + }; + callService.call(param, result => { + if (result.code == common.int.SUCCESS) { + mmsLog.info('call success'); + } else { + mmsLog.info('call error'); + } + }); + }, + // 跳转至联系人app + jumpToContactsApp(messageCode, actionData) { + let commonService = this.$app.$def.commonService; + let str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info(TAG + 'jumpToContactsApp successful' + data); + }).catch((error) => { + mmsLog.error(TAG + 'jumpToContactsApp failed,Cause: ' + JSON.stringify(error)); + }) + } +} diff --git a/entry/src/main/js/default/pages/text_select/text_select.css b/entry/src/main/js/default/pages/text_select/text_select.css new file mode 100644 index 0000000..3b795b1 --- /dev/null +++ b/entry/src/main/js/default/pages/text_select/text_select.css @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*最大DIV样式*/ +.container { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + display: flex;/*弹性布局*/ + width: 100%; + height: 100%; +} + +/*返回按钮*/ +.select-back { + width: 48px; + height: 48px; + margin-left: 20px; + margin-top: 50px; + align-items: center; + justify-content: center; +} + +/*选择区域*/ +.select-area { + height: 100%; + width: 100%; +} + +/* 信息文字 */ +.select-area-text { + position: absolute; + width: 100%; + padding-left: 50px; + padding-right: 50px; +} + +.more-menu { + position: absolute; + justify-content: center; + height: 170px; + left: 0; +} + +.more-menu-search { + height: 80px; + align-items: center; + flex-direction: row; +} + +.paste-menu { + position: absolute; + justify-content: center; + height: 90px; + left: 0; +} +.paste-menu-item { + display: flex; + height: 90px; + flex-direction: row; + align-items: center; + padding-left: 40px; + padding-right: 40px; + background-color: #FFF; + border-color: #7E000000; + border-radius: 45px; + border: 1px; +} + +.paste-menu-text { + font-size: 34px; + text-align: center; + margin-right: 20px; + text-color: #000; +} + +.paste-menu-image { + width: 60px; + height: 60px; +} + +/*画布区域*/ +.text-select-canvas { + height: 100%; + width: 100%; + margin-left: 50px; + margin-right: 50px; +} + +.text-select-image { + position: absolute; + width: 48px; + height: 48px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/text_select/text_select.hml b/entry/src/main/js/default/pages/text_select/text_select.hml new file mode 100644 index 0000000..989c1b1 --- /dev/null +++ b/entry/src/main/js/default/pages/text_select/text_select.hml @@ -0,0 +1,48 @@ + + +
+ + +
+ + {{content}} + + + + +
+ +
+
+ {{$t('strings.msg_copy')}} + {{$t('strings.msg_select_all')}} + {{$t('strings.share')}} + +
+
+ + + + + +
diff --git a/entry/src/main/js/default/pages/text_select/text_select.js b/entry/src/main/js/default/pages/text_select/text_select.js new file mode 100644 index 0000000..cf41033 --- /dev/null +++ b/entry/src/main/js/default/pages/text_select/text_select.js @@ -0,0 +1,387 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +// JS公共常量 +import common from '../common_constants.js' +import {commonPasteboard} from '../../utils/Pasteboard.js'; + +// 选中状态的文字颜色 +const COLOR_SELECT_BG = '#440023EB'; +// 画布宽度 +const EL_WIDTH = 620; +const IMG_CURSOR_WIDTH = 48; +// 状态值0 +const MESSAGE_CODE_STATUS_ZERO = 0; +// 状态值0 +const MESSAGE_CODE_STATUS_ONE = 1; +// 状态值2 +const MESSAGE_CODE_STATUS_TWO = 2; + +function MyCharacter(x, y, cw, idx, line, index, text) { + // 左上角坐标,相对于画布的 + this.x = x; + this.y = y; + // 宽度/位置/第几行/第几个/内容/是否选中 + this.charWidth = cw; + this.allIndex = idx; + this.line = line; + // 当前行第几个 + this.index = index; + this.text = text; +} + +// 定义对象 +function MyPoint(x, y) { + this.x = x; + this.y = y +} + +function LineChat(chats, idx, text) { + this.chats = chats; + // 第几行 + this.lineIndex = idx; + this.text = text; +} + +export default { + data: { + // 字体颜色 + fontFamily: 'sans-serif', + // 字体大小 + fontSize: 42, + // 42+13 行高=fontSize+行间距 + lineHeight: 55, + // CanvasRenderingContext2D + ctx: null, + // 文本内容 + content: '', + // 所有行的集合 + lineList: null, + // 重点文本 + textPoint: null, + // 选择文本的起点 + startPoint: null, + // 选择文本的终点 + endPoint: null, + // 水滴图片之前的位置 + beforeImg: null, + // 下标图片 + curImg: null, + // 起始字符 + startChat: null, + // 上一个字符 + beforeChat: null, + // 0 默认状态, 1移动状态 ,2 选中状态 + textSelectStatus: 0, + // 全选 + isSelectAllStatus: true, + // 拖拽图标宽度 + cursorWidth: IMG_CURSOR_WIDTH, + }, + onInit() { + mmsLog.info('txtSelect onInit'); + this.startPoint = new MyPoint(20, 20); + this.endPoint = new MyPoint(40, 40); + this.beforeImg = new MyPoint(0.0, 0.0); + this.curImg = new MyPoint(0.0, 0.0); + // 计算文本高度,用于内容居中显示 + let contentHeight = this.content.length * this.lineHeight / 30; + this.textPoint = new MyPoint(0, 640 - contentHeight); + }, + onShow() { + mmsLog.info('txtSelect el handleClick:'); + this.ctx = this.$refs.canvas1.getContext('2d'); + // 文本字体 + this.ctx.font = this.fontSize + 'px ' + this.fontFamily; + this.lineList = this.initLineList(this.content, this.ctx); + this.ctx.fillStyle = COLOR_SELECT_BG; + this.setSelectAll(); + mmsLog.info('txtSelect onShow end====='); + }, + singleMsgBack() { + router.back(); + }, + // measureText字符宽度,初始化lineList数组 + initLineList(content, ctx) { + // 存储所有行的集合 + let lineList = new Array(); + // 每行的字符集合 + let chatList = new Array(); + let contentArray = Array.from(content); + contentArray.push(' '); + // 记录行号 + let lineIndex = 0; + // 当前行宽度 + let curWidth = 0; + // 当前行第几个 + let curIndex = 0; + // 当前行内容 + let curText = common.string.EMPTY_STR; + for (let index = 0; index < contentArray.length; index++) { + let textWidth = ctx.measureText(contentArray[index]).width; + if (curWidth + textWidth > EL_WIDTH) { + curWidth = 0; + curIndex = 0; + // 创建行对象,存入所有行的集合 + lineList[lineIndex] = new LineChat(chatList, lineIndex, curText); + lineIndex++; + chatList = new Array(); + curText = ''; + } + // 创建字符对象,存入每行的字符集合 + chatList[curIndex] = new MyCharacter(this.textPoint.x + curWidth, this.textPoint.y + + lineIndex * this.lineHeight, textWidth, index, lineIndex, curIndex, contentArray[index]); + curWidth += textWidth; + if (index < contentArray.length) { + curText += contentArray[index]; + } + curIndex++; + } + lineList[lineIndex] = new LineChat(chatList, lineIndex, curText); + return lineList; + }, + getChatByPoint(point) { + let curEl = null; + let lineIndex = parseInt((point.y - this.textPoint.y) * 1.0 / this.lineHeight); + mmsLog.info('txtSelect lineIndex:' + lineIndex); + let chatArray = this.lineList[lineIndex].chats; + mmsLog.info('txtSelect chatArray:' + chatArray); + for (let index = 0; index < chatArray.length; index++) { + curEl = chatArray[index]; + if (curEl.x + curEl.charWidth > point.x) { + break; + } + } + return curEl; + }, + // 根据起始点字符,在画布上划出对应矩形 + showSelectArea(ctx, startChat, endChat) { + mmsLog.info('txtSelect showSelectArea'); + ctx.fillStyle = COLOR_SELECT_BG; + let delta = endChat.line - startChat.line; + // 同一行 + if (delta === MESSAGE_CODE_STATUS_ZERO) { + let width = endChat.x - startChat.x; + ctx.fillRect(startChat.x, startChat.y, width, this.lineHeight); + return; + } + // 多行 + ctx.fillRect(startChat.x, startChat.y, EL_WIDTH - startChat.x, this.lineHeight); + ctx.fillRect(0, endChat.y, endChat.x + endChat.charWidth, this.lineHeight); + if (delta > 1) { + ctx.fillRect(0, startChat.y + this.lineHeight, EL_WIDTH, this.lineHeight * (delta - 1)); + } + mmsLog.info('txtSelect showSelectArea'); + }, + // 清空文本区域 画布内容 + clearTextArea() { + this.ctx.clearRect(this.textPoint.x, this.textPoint.y, EL_WIDTH, this.lineList.length * this.lineHeight); + }, + // 判断是否全选 + isSelectAll(startChat, endChat) { + return startChat.allIndex == 0 && endChat.allIndex == this.lineList.length - 1 + }, + setSelectAll() { + this.startChat = this.lineList[0].chats[0]; + this.startPoint.x = this.startChat.x; + this.startPoint.y = this.startChat.y; + let chatList = this.lineList[this.lineList.length - 1].chats; + this.beforeChat = chatList[chatList.length - 1]; + this.endPoint.x = this.beforeChat.x + this.beforeChat.charWidth; + this.endPoint.y = this.beforeChat.y; + this.textSelectStatus = MESSAGE_CODE_STATUS_TWO; + this.isSelectAllStatus = true; + this.showSelectArea(this.ctx, this.startChat, this.beforeChat); + }, + // 单击画布响应 + canvasClick() { + mmsLog.info('txtSelect canvasClick :'); + this.textSelectStatus = MESSAGE_CODE_STATUS_ZERO; + this.clearTextArea(); + }, + canvasStart(e) { + mmsLog.info('txtSelect canvasStart :'); + this.textSelectStatus = MESSAGE_CODE_STATUS_ZERO; + this.startPoint.x = e.touches[0].localX; + this.startPoint.y = e.touches[0].localY; + mmsLog.info('txtSelect canvasStart rawX:' + this.startPoint.x + ' y:' + this.startPoint.y); + this.startChat = this.getChatByPoint(this.startPoint); + this.startPoint.x = this.startChat.x; + this.startPoint.y = this.startChat.y; + this.beforeChat = this.startChat; + }, + canvasMove(e) { + this.textSelectStatus = MESSAGE_CODE_STATUS_ONE; + this.endPoint.x = e.touches[0].localX; + this.endPoint.y = e.touches[0].localY; + this.refreshEndSelect(); + }, + refreshEndSelect() { + let curChat = this.getChatByPoint(this.endPoint); + // 位置没变化 + if (this.beforeChat.allIndex == curChat.allIndex) { + return; + } + // 最少选中一个字符 + if (curChat.allIndex <= this.startChat.allIndex) { + return; + } + // 清空之前绘制内容 + this.clearTextArea(); + // 重新绘制 + this.showSelectArea(this.ctx, this.startChat, curChat); + // 是否全选 + this.isSelectAllStatus = this.isSelectAll(this.startChat, curChat); + this.beforeChat = curChat; + this.endPoint.x = curChat.x; + this.endPoint.y = curChat.y; + }, + refreshStartSelect() { + let curChat = this.getChatByPoint(this.startPoint); + // 位置没变化 + if (this.startChat.allIndex == curChat.allIndex) { + return; + } + // 最少选中一个字符 + if (curChat.allIndex >= this.beforeChat.allIndex) { + return; + } + // 清空之前绘制内容 + this.clearTextArea(); + // 重新绘制 + this.showSelectArea(this.ctx, curChat, this.beforeChat); + // 是否全选 + this.isSelectAllStatus = this.isSelectAll(curChat, this.beforeChat); + this.startChat = curChat; + this.startPoint.x = curChat.x; + this.startPoint.y = curChat.y; + }, + canvasEnd() { + mmsLog.info('txtSelect canvasEnd :'); + if (this.textSelectStatus == MESSAGE_CODE_STATUS_ZERO) { + return; + } + // 显示菜单 + this.textSelectStatus = MESSAGE_CODE_STATUS_TWO; + mmsLog.info('txtSelect canvasEnd rawX:' + this.startPoint.x + ' y:' + this.startPoint.y); + mmsLog.info('txtSelect canvasEnd rawX:' + this.endPoint.x + ' y:' + this.endPoint.y); + }, + imgStart(isStart, e) { + if (this.textSelectStatus != MESSAGE_CODE_STATUS_TWO) { + return; + } + this.curImg.x = e.touches[0].localX; + this.curImg.y = e.touches[0].localY; + mmsLog.info('txtSelect imgMove curImg:' + this.curImg.x); + mmsLog.info('txtSelect imgMove curImg:' + this.curImg.y); + }, + imgMove(isStart, e) { + if (this.textSelectStatus != MESSAGE_CODE_STATUS_TWO) { + return; + } + this.beforeImg.x = this.curImg.x; + this.beforeImg.y = this.curImg.y; + this.curImg.x = e.touches[0].localX; + this.curImg.y = e.touches[0].localY; + let changeX = this.curImg.x - this.beforeImg.x; + let changeY = this.curImg.y - this.beforeImg.y; + if (isStart) { + // 开始图标 + this.startPoint.x = this.startPoint.x + changeX; + this.startPoint.y = this.startPoint.y + changeY; + this.refreshStartSelect(); + } else { + // 结束图标 + this.endPoint.x = this.endPoint.x + changeX; + this.endPoint.y = this.endPoint.y + changeY; + this.refreshEndSelect(); + } + }, + pasteMenu(index) { + mmsLog.info('txtSelect pasteMenu :' + index); + switch (index) { + case 0: + // 复制 + this.txtCopy(); + break; + case 1: + // 全选 + this.clearTextArea(); + this.setSelectAll(); + break; + case 2: + // 分享 + this.txtShare(); + break; + case 3: + // 更多 + this.txtMore(); + break; + default: + mmsLog.info('pasteMenu, code is not exit'); + } + }, + // 分享 + txtShare() { + this.textSelectStatus = MESSAGE_CODE_STATUS_ZERO; + this.isSelectAllStatus = MESSAGE_CODE_STATUS_ZERO; + this.clearTextArea(); + }, + // 复制 + txtCopy() { + this.textSelectStatus = MESSAGE_CODE_STATUS_ZERO; + this.clearTextArea(); + mmsLog.info('txtCopy beforeChat.allIndex :' + this.beforeChat.allIndex); + let strTxt = this.content.slice(this.startChat.allIndex, this.beforeChat.allIndex); + commonPasteboard.setPasteboard(strTxt); + router.back(); + }, + txtMore() { + this.textSelectStatus = MESSAGE_CODE_STATUS_ZERO; + this.$element('more_menu').show({ + x: EL_WIDTH / 2, + y: this.startPoint.y - this.lineHeight * 4 + }); + }, + // 更多菜单 + moreMenu(e) { + mmsLog.info('moreMenu, allIndex :' + e.value); + switch(e.value) { + case '0': + this.searchText(); + this.textSelectStatus = MESSAGE_CODE_STATUS_ZERO; + this.isSelectAllStatus = MESSAGE_CODE_STATUS_ZERO; + this.clearTextArea(); + break; + case '1': + this.textSelectStatus = MESSAGE_CODE_STATUS_TWO; + this.$element('more_menu').close(); + break; + default: + mmsLog.info('moreMenu index is not exiting'); + } + }, + // 搜索输入框输入的文本内容,需要跳转至'浏览器'app + searchText() { + if (this.content == common.string.EMPTY_STR || this.content == null) { + return; + } + let messageCode = common.route.MESSAGE_CODE_JUMP_TO_BROWSER_TO_SEARCH; + let actionData = {}; + actionData.content = this.content; + // 这里需要跳转值浏览器app + } +} diff --git a/entry/src/main/js/default/pages/transmit_msg/transmit_msg.css b/entry/src/main/js/default/pages/transmit_msg/transmit_msg.css new file mode 100644 index 0000000..1614e20 --- /dev/null +++ b/entry/src/main/js/default/pages/transmit_msg/transmit_msg.css @@ -0,0 +1,450 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*新建信息*/ +.container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +/*头部标题*/ +.transmit-head { + height: 100px; + flex-direction: row; + margin-top: 20px; +} + +.transmit-head-image { + width: 50px; + height: 50px; + margin-left: 50px; + margin-top: 20px; +} + +.transmit-head-text { + font-size: 40px; + font-weight: 500; + margin-top: 10px; + margin-left: 30px; +} + +/*搜索框*/ +.transmit-search { + margin: 30px 50px 0 50px; +} + +.search { + padding-left: 30px; + padding-right: 30px; + height: 100px; +} + +/*选择联系人*/ +.transmit-select-contracts { + flex-direction: row; + margin-left: 50px; +} + +.transmit-select-contracts-list { + flex-direction: column; + margin-top: 20px; + height: 90px; + justify-content: center; + align-items: center; +} + +.transmit-select-contracts-line { + height: 15px; + width: 100%; + background-color: #31A9A9A9; +} + +.transmit-select-contracts-text { + font-size: 32px; + flex: 1; + font-weight: 500; +} + +.transmit-select-contracts-image { + width: 28px; + height: 28px; + margin-right: 45px; +} + +/*横线*/ +.transmit-divider { + width: 100%; + height: 5px; + background-color: #3B808080; +} + +.transmit-recently-contracts-text { + width: 100%; + font-size: 30px; + margin-top: 20px; + margin-left: 50px; +} + +/*联系人列表*/ +.transmit-recently-head { + flex-direction: column; + margin-top: 10px; +} + +.transmit-recently-contracts-head { + margin-left: 60px; + margin-right: 50px; + margin-top: 25px; + flex-direction: row; + align-items: center; +} + +.transmit-recently-contracts-img { + width: 15%; + flex-direction: row; + align-items: center; + justify-content: center; +} + +.head-image-div-single { + flex-direction: row; + align-items: center; + justify-content: center; +} + +.head-image-div-double { + flex-direction: row; + align-items: center; + justify-content: center; +} + +.head-image-div-all { + flex-direction: column; + align-items: center; + justify-content: center; +} + +.head-image-all-one { + flex-direction: row; + align-items: center; + justify-content: center; + margin-bottom: -2px; +} + +.head-image-all-two { + flex-direction: row; + align-items: center; + justify-content: center; +} + +.head-image { + width: 80px; + height: 80px; +} + +.head-image-multi { + width: 36px; + height: 36px; + margin: 1px; +} + +.transmit-recently-contracts-number { + width: 85%; +} + +.transmit-recently-contracts-head-image { + width: 80px; + height: 80px; +} + +.transmit-recently-contracts-tel { + font-size: 32px; + margin-left: 20px; + text-overflow: ellipsis; + font-weight: 500; +} + +.transmit-divider-list { + background-color: #3B808080; + height: 1px; + margin-left: 170px; + margin-top: 30px; + margin-right: 50px; +} + +.transmit-divider-list-no-head { + background-color: #3B808080; + height: 1px; + margin-left: 85px; + margin-top: 30px; + margin-right: 50px; +} + + +/*弹框展示*/ +.transmit_dialog { + flex-direction: column; + justify-content: center; + align-items: center; + padding-top: 20px; + padding-bottom: 15px; +} + +.transmit_text { + margin-bottom: 10px; + margin-left: 45px; + margin-right: 45px; +} + +.transmit_text_title { + font-size: 48px; + font-weight: 600; + max-lines: 2; + text-overflow: ellipsis; +} + +.transmit_text_title_min { + font-size: 30px; + font-weight: 600; + max-lines: 2; + text-overflow: ellipsis; +} + +.transmit_text_tips { + margin-bottom: 15px; + margin-left: 45px; + margin-right: 45px; +} + +.transmit-content-container { + flex-direction: column; + margin-bottom: 20px; +} + +.column-style { + flex-direction: column; +} + +.transmit-content { + flex-direction: column; + padding-top: 10px; +} + +.content-text { + border-radius: 0; + background-color: transparent; +} + +.transmit-base-background { + flex-direction: row; + align-items: center; + justify-content: flex-end; + padding: 20px; + border-radius: 15px; + background-color: #20A9A9A9; + border-top-left-radius: 0; +} + +.transmit-image-background { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + border-radius: 15px; + background-color: #20A9A9A9; + border-top-left-radius: 0; + width: 60%; +} + +.transmit-ppt-image { + width: 64px; + height: 64px; +} + +.transmit-theme-text { + flex-direction: column; + align-items: flex-end; + justify-content: flex-start; +} + +.transmit-slide-text { + margin-top: 10px; + margin-left: 30px; + margin-bottom: 10px; +} + +.transmit-image { + width: 100%; + height: 150px; +} + +.mms-edit-card { + display: flex; + height: 100px; + flex-direction: row; + background-color: #20A9A9A9; + border-radius: 20px; + align-items: center; + justify-content: center; + margin-bottom: 10px; +} + +.edit-card-img { + width: 48px; + height: 48px; + margin-left: 10px; + margin-right: 10px; +} + +.mms-edit-card-item { + flex-direction: column; + padding: 5px; + margin-right: 40px; + align-items: center; + justify-content: center; +} + +.transmit_content_list { + min-height: 120px; + margin-bottom: 10px; + margin-left: 45px; + margin-right: 10px; + background-color: #fff; +} + +.transmit_content_item { + margin-right: 45px; +} + +.transmit_content_item_mms { + background-color: #fff; + margin-right: 45px; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px;; + border-bottom-right-radius: 20px; +} + +.transmit_content_textarea { + background-color: #20A9A9A9; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; +} + +.transmit_content_body { + flex-direction: column; +} + +.transmit_content_multi_mms { + flex-direction: column; + justify-content: flex-start; + margin-top: 10px; +} + +.transmit_content_mms { + flex-direction: column; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px;; + border-bottom-right-radius: 20px; +} + +.txt-prompt { + color: grey; + font-size: 30px; +} + +.transmit_content_multi_text { + flex-direction: column; + justify-content: flex-start; + margin-top: 10px; +} + +.txt-content { + font-size: 32px; + color: #000; + margin-bottom: 40px; +} + +.image_single { + width: 150px; + height: 250px; +} + +.txt-content-single { + font-size: 32px; + color: #000; + margin-bottom: 10px; +} + +.transmit_source { + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-left: 20px; + width: 100%; +} + +.transmit_source_input { + width: 95px; + height: 95px; +} + +.transmit_source_text { + color: #000; +} + +.transmit_source_text_grey { + color: grey; +} + +.transmit_button { + flex-direction: row; + height: 80px; + justify-content: center; + align-items: center; +} + +.transmit_button_single { + flex-direction: row; + align-items: center; + justify-content: center; +} + +.btn_cancel { + color: #F30000FF; + width: 33%; +} + +.btn_restore { + color: #F30000FF; + width: 33%; +} + +.btn_cancel_double { + color: #F30000FF; + width: 50%; +} + +.btn_restore_double { + color: #F30000FF; + width: 50%; +} + +.transmit_divider { + stroke-width: 1px; + height: 50px; + color: #A1808080; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/transmit_msg/transmit_msg.hml b/entry/src/main/js/default/pages/transmit_msg/transmit_msg.hml new file mode 100644 index 0000000..9c75b0c --- /dev/null +++ b/entry/src/main/js/default/pages/transmit_msg/transmit_msg.hml @@ -0,0 +1,216 @@ + + +
+ + +
+ + {{ $t('strings.transmitHeadText') }} +
+ + + + + + + +
+ {{ $t('strings.selectContracts') }} + + +
+
+ +
+
+ + + + {{ $t('strings.recently') }} + + + +
+
+ + +
+
+ +
+
+ + +
+
+
+ +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ + +
+ + {{ $item.name == '' ? $item.telephoneFormat : $item.name }} + +
+
+ +
+
+
+ +
+ + +
+ + {{ $t('strings.contentSentTo') }} {{ contactName == '' ? telephoneFormatSplit : contactNameSplit }} {{ $t('strings.including') }}{{ contactsNum }}{{ $t('strings.people') }} + + {{ + $t('strings.contentSentTo') }} {{ + contactName == '' ? telephoneFormat : contactName }} + +
+ + +
+ {{ $t('strings.tap_content_to_edit') }} + +
+ + +
+ + +
+
+
+ +
+
+ +
+ {{$item.msgUriPath}} + {{$item.audioTime}} +
+
+
+
+ {{$item.contentInfo}} + {{$item.content}} +
+
+ +
+
+
+
+ +
+ {{$item.content}} +
+
+
+ + {{$item.content}} +
+
+
+
+
+ + +
+ + + {{ $t('strings.showSource') }} + +
+ + +
+
+ + + +
+
+ + + +
+
+
+
+ +
+
+ + {{ $t('strings.contentSentContentTo') }} {{ contactName == '' ? telephoneFormatSplit : contactNameSplit }} {{ $t('strings.including') }}{{ contactsNum }}{{ $t('strings.people') }} + + + {{ $t('strings.contentSentContentTo') }} {{contactName == '' ? telephoneFormat : contactName }} + +
+
+
+ + + +
+
+ + + +
+
+
+
+
\ No newline at end of file diff --git a/entry/src/main/js/default/pages/transmit_msg/transmit_msg.js b/entry/src/main/js/default/pages/transmit_msg/transmit_msg.js new file mode 100644 index 0000000..518b469 --- /dev/null +++ b/entry/src/main/js/default/pages/transmit_msg/transmit_msg.js @@ -0,0 +1,388 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +import settingService from '../../service/SettingService.js'; +import contactService from '../../service/ContractService.js'; +import common from '../common_constants.js'; +import commonService from '../../service/CommonService.js' + +const TAG = 'transmit_msg.js ->'; + +export default { + data: { + // 总数 + total: 0, + // 信息列表 + contractsList: [], + // 多条信息转发的内容列表 + transmitContentList: [], + // 双卡 + doubleCard: false, + // 内容 + content: '', + // 彩信附件地址 + msgUriPath: '', + // 联系人数量 + contactsNum: 0, + // 联系人名称 + contactName: '', + // 格式化手机号 + telephoneFormat: '', + // 多人群发只展示一个人 + contactNameSplit: '', + // 多人群发只展示一个手机号 + telephoneFormatSplit: '', + // 手机号 + telephone: '', + // 是否被选中 + isChecked: true, + // 是否是彩信 + isMms: false, + // 卡1 + simOne: 0, + // 卡2 + simTwo: 1, + // 发送短信ID + threadId: '', + // 是否是多条信息转发 + isMulti: false, + // 转发内容标题 + transmitContent: '', + // 转发内容编辑状态内容 + transmitContentEdit: '', + // 转发内容编辑状态内容备份,用于对比原值 + transmitContentEditBackup: '', + // 转发多条内容备份,用于比较原值 + transmitContentsBackup: [], + // 是否禁用checkbox + isDisabled: false, + // 操作类型 + operatorType: 4, + // 是否展示转发弹框 + contractsPage: false, + // dialog标题字体大小展示,字数少时展示大字体,字数多时展示小字体 + titleChecked: false, + // dialog标题中联系人长度临界值 + contactNameLen: 20, + // 一行的像素大小 + rowPixel: 48, + // list列表最大的高度 + maxListPixel: 380, + // 每一行的字符数量 + rowCharacterNum: 18, + // dialog中的list动态高度 + dynamicHeight: 0, + // 文本在list中的索引 + textIndex: 0, + // 多条内容转发是否包含文本 + includeTextSMS: true, + // 转发内容是否可以发送,若为空,则不能发送 + isCanSend: false, + // 分页页数 + page: 0, + // 分页数量 + limit: 15, + // 是否显示联系人头像 + isShowContactHeadIcon: true, + // 是否是收藏页面 + isMyStartPage: false, + // 是否是彩信幻灯片页面 + isSlideDetail: false, + // 彩信列表的数据 + mmsSource: [], + transmitItemSources: [] + }, + onInit() { + this.total = this.contractsList.length; + mmsLog.info('transmitMsg onInit() !!!'); + }, + onShow() { + mmsLog.info('transmitMsg onShow() !!!'); + // 获取是否显示头像的状态 + this.getSettingFlagForConvListPage(); + // 判断联系人字体长度 + this.checkContactNameLen(); + // 查询文本在list中的索引 + this.queryTestIndex(); + }, + // 获取整合通知信息和显示联系人头像的开关值 + getSettingFlagForConvListPage() { + let preferences = this.$app.$def.preferences; + let result = settingService.getSettingFlagForConvListPage(preferences); + if (result) { + this.isShowContactHeadIcon = result.isShowContactHeadIcon; + } + }, + checkContactNameLen() { + if (this.contactName != null && this.contactName.length > this.contactNameLen) { + this.titleChecked = true; + } else { + this.titleChecked = false; + } + }, + // 显示转发弹框 + showTransmitDialog() { + let that = this; + setTimeout(function () { + if (that.contractsPage) { + that.isChecked = true; + that.transmitContentAssembly(); + that.dynamicHeight = commonService.getTransmitContentHeight(that.transmitContentList); + if (that.contactName != null || that.contactName != '') { + that.$element('dialog').show(); + } + } + }, 200); + }, + // 查找文本索引位置 + queryTestIndex() { + for (let index = 0; index < this.transmitContentList.length; index++) { + if (!this.transmitContentList[index].msgUriPath) { + this.textIndex = index; + break; + } + } + }, + requestItem() { + mmsLog.info('requestItem,start---------'); + let count = this.page * this.limit; + if (this.page === 0) { + this.page++; + this.queryAllMessages(); + } else if (count < this.total && this.contractsList.length > (this.page - 1) * this.limit) { + // 对messageList的限制,是防止初始化时多次刷新请求 + this.page++; + this.queryAllMessages(); + } + }, + // 查询列表数据 + queryAllMessages() { + let that = this; + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility + }; + actionData.page = this.page; + actionData.limit = this.limit; + let rdbStore = this.$app.$def.rdbStore; + let conversationListService = this.$app.$def.conversationListService; + conversationListService.querySessionList(rdbStore, actionData, result => { + mmsLog.info(TAG + 'querySessionList,success'); + if (result.code == common.int.SUCCESS) { + that.contractsList = that.contractsList.concat(result.response); + that.total = that.contractsList.length; + } else { + mmsLog.info(TAG + 'Error: queryAllMessages() failed !!!'); + } + }); + }, + // 点击list.获取发送的dialog + clickSendMessage(index) { + this.contactsNum = this.contractsList[index].contactsNum; + this.contactName = this.contractsList[index].name; + this.telephoneFormat = this.contractsList[index].telephoneFormat; + this.telephone = this.contractsList[index].telephone; + this.threadId = this.contractsList[index].threadId; + this.contactNameSplit = this.contactName.split(',')[0]; + this.telephoneFormatSplit = this.telephoneFormat.split(',')[0]; + // 判断联系人字体长度 + this.checkContactNameLen(); + if(this.isSlideDetail) { + this.$element('dialog_transmit').show(); + } else { + this.isChecked = true; + this.transmitContentAssembly(); + this.dynamicHeight = commonService.getTransmitContentHeight(this.transmitContentList); + // 唤醒dialog + this.$element('dialog').show(); + } + }, + // 是否选中判断 + clickChecked(e) { + this.isChecked = e.checked; + this.transmitContentAssembly(); + }, + transmit(slotId) { + mmsLog.info('transmit,start'); + this.$app.$def.slotId = slotId; + this.$app.$def.threadId = this.threadId; + this.$app.$def.contactsNum = this.contactsNum; + this.$app.$def.strContactsName = this.contactName; + this.$app.$def.strContactsNumber = this.telephone; + this.$app.$def.strContactsNumberFormat = this.telephoneFormat; + this.$app.$def.transmitFlag = true; + this.$app.$def.transmitContent = common.string.EMPTY_STR; + this.$app.$def.mmsSource = this.mmsSource; + this.$app.$def.isSlideDetail = this.isSlideDetail; + this.$app.$def.transmitSource = this.transmitContentList; + this.$app.$def.isContainerOriginSource = this.isChecked; + this.contractsPage = false; + if (this.isMyStartPage || this.isSlideDetail) { + router.replace({ + uri: 'pages/conversation/conversation' + }); + } else { + router.back(); + } + }, + // 转发内容封装 + transmitContentAssembly() { + this.includeTextSMS = commonService.checkIsMms(this.transmitContentList); + if (!this.includeTextSMS) { + return; + } + let number = 0; + this.transmitContentList.forEach((element) => { + element.contentInfo = common.string.EMPTY_STR; + if (!element.isMsm) { + if (number == 0) { + element.contentInfo = this.transmitContent + '\n'; + number ++; + } + if (this.transmitContentList.length > 1) { + element.contentInfo = element.contentInfo + element.date + ' '; + element.contentInfo = element.contentInfo + element.time + ' ' + element.contactsName + '\n'; + } + } + }); + }, + // 包含转发信息来源按钮切换-短信 + changeValue(item, e) { + item.content = e.text; + }, + // 重置转发内容 + resetTransmitContent() { + if (this.isMms) { + this.transmitContentsBackup.forEach((element, index) => { + if (element.msgUriPath == common.string.EMPTY_STR) { + this.transmitContents[index].content = element.contentEditBackup; + } + }); + } else { + this.transmitContentEdit = this.transmitContentEditBackup; + } + }, + // 点击取消按钮取消对话框 + cancelTransmit() { + this.resetTransmitContent(); + if(this.isSlideDetail) { + this.$element('dialog_transmit').close(); + } else { + this.$element('dialog').close(); + } + }, + // 轻触其他地方取消对话框 + cancelDialog() { + this.resetTransmitContent(); + }, + cancel() { + router.back(); + }, + // 跳转到搜索页面 + jumpSearchClick() { + let isMulti = false; + if (this.isMulti) { + isMulti = true; + } + router.push({ + uri: 'pages/transmit_search/transmit_search', + params: { + doubleCard: this.doubleCard, + content: this.content, + msgUriPath: this.msgUriPath, + transmitContent: this.transmitContent, + transmitContentList: this.transmitContentList, + isMulti: isMulti, + isMms: this.isMms, + isSlideDetail: this.isSlideDetail, + mmsSource: this.mmsSource + } + }); + }, + // 跳转到选择联系人页面 + jumpToSelectContracts() { + // 跳转到选择联系人页面 + var actionData = {}; + actionData.pageFlag = common.contractPage.PAGE_FLAG_MULT_CHOOSE; + this.jumpToContractForResult(actionData); + }, + // 点击头像,单人跳转联系人,多人跳转收件人详情 + clickToGroupDetail(index) { + // 判断跳转到联系人详情还是跳转到多个收件人的列表页面 + let contactsNum = this.contractsList[index].contactsNum; + let telephone = this.contractsList[index].telephone; + let threadId = this.contractsList[index].threadId; + if (contactsNum > 1) { + this.jumpToGroupDetailList(threadId, contactsNum); + } else { + var actionData = {}; + actionData.phoneNumber = telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + this.jumpToContractDetail(actionData); + } + }, + // 跳转联系人app + jumpToContractDetail(actionData) { + let commonService = this.$app.$def.commonService; + let str = commonService.commonContractParam(actionData); + mmsLog.info('jumpToContractDetail,result:' + str); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info('jumpToContractDetail, data: ' + data); + }).catch((error) => { + mmsLog.error('jumpToContractDetail failed. Cause: ' + JSON.stringify(error)); + }); + }, + // 跳转联系人app + async jumpToContractForResult(actionData) { + let commonService = this.$app.$def.commonService; + let str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + let data = await featureAbility.startAbilityForResult(str); + if (data.resultCode == 0) { + this.contractsPage = true; + let contactsParam = contactService.dealContractParams(data.want.parameters.contactObjects); + this.contactsNum = contactsParam.contactsNum; + this.contactName = contactsParam.strContactsName; + this.telephoneFormat = contactsParam.strContactsNumberFormat; + this.telephone = contactsParam.strContactsNumber; + this.contactNameSplit = contactsParam.strContactsName.split(common.string.COMMA)[0]; + this.telephoneFormatSplit = contactsParam.strContactsNumberFormat.split(common.string.COMMA)[0]; + let conversationListService = this.$app.$def.conversationListService; + let rdbStore = this.$app.$def.rdbStore; + conversationListService.querySessionByTelephone(rdbStore, this.telephone, res => { + let response = res.response; + if (res.code === common.int.SUCCESS && response.id > 0) { + this.threadId = response.id; + } else { + this.threadId = 0; + } + this.showTransmitDialog(); + }); + } + }, + // 跳转多人头像列表页面 + jumpToGroupDetailList(sessionId, contactsNum) { + let actionData = { + uri: 'pages/group_detail/group_detail', + params: { + threadId: sessionId, + contactsNum: contactsNum + } + } + router.push(actionData); + }, +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/transmit_search/transmit_search.css b/entry/src/main/js/default/pages/transmit_search/transmit_search.css new file mode 100644 index 0000000..7f8c372 --- /dev/null +++ b/entry/src/main/js/default/pages/transmit_search/transmit_search.css @@ -0,0 +1,609 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +.open_retract_item { + margin-top: 20px; + margin-bottom: 140px; +} + +.open_retract { + width: 100%; + height: 80px; + flex-direction: row; + align-items: center; + justify-content: center; +} + +.open_retract_text { + font-size: 25px; + color: #C1000000; + font-weight: 500; +} + +.open_retract_img { + width: 35px; + height: 35px; + margin-left: 10px; +} + +.message-list { + width: 100%; + height: 100%; + position: absolute; + top: 130px; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.message-list-image { + width: 128px; + height: 128px; +} + +.search-div { + flex-direction: row; + height: 130px; + align-items: center; + justify-content: center; +} + +.search { + width: 100%; + height: 70px; + align-items: center; + margin-left: 30px; + margin-right: 50px; + background-color: #F2F2F2; +} + +.messaging-body { + width: 100%; + height: 150px; + flex-direction: row; + align-items: center; +} + +.searchCoverage { + width: 100%; + height: 100%; + position: absolute; + top: 130px; + background-color: #000; + opacity: .15; +} + +.unread-flag-div { + width: 8%; + height: 100%; + align-items: center; + justify-content: center; +} +.unread-flag { + radius: 8px; + background-color: #FF1E90FF; +} + +.head-image-div { + width: 13%; + height: 100%; + justify-content: center; + align-items: center; + margin-right: 20px; +} +.head-image-div-single { + flex-direction: row; + align-items: center; + justify-content: center; +} +.head-image-div-double { + flex-direction: row; + align-items: center; + justify-content: center; +} +.head-image-div-all { + flex-direction: column; + align-items: center; + justify-content: center; +} +.head-image-all-one { + flex-direction: row; + align-items: center; + justify-content: center; + margin-bottom: -2px; +} +.head-image-all-two { + flex-direction: row; + align-items: center; + justify-content: center; +} +.head-image { + width: 80px; + height: 80px; +} +.head-image-multi { + width: 38px; + height: 38px; + margin: 1px; +} + +.body { + height: 100%; + width: 90%; + flex-direction: column; + align-items: center; + margin-top: 20px; +} + +.body-no-head { + height: 100%; + width: 90%; + flex-direction: column; + align-items: center; +} + +.body-up-left { + height: 100%; + width: 50%; + align-items: flex-end; + flex: 1; + margin-bottom: 2px; +} + +.body-up-left-text { + text-overflow: ellipsis; + color: #191919; + font-size: 36px; +} + +.body-up-right-text { + color: grey; +} + +.body-up-right { + height: 100%; + justify-content: flex-end; + padding-right: 30px; + align-items: flex-end; +} + +.body-half { + height: 50%; + width: 100%; +} + + +.body-down-left { + width: 100%; + height: 100%; + align-items: flex-start; + margin-top: 20px; + margin-right: 30px; +} + +.red-exception { + font-size: 30px; + color: #F00; +} + +.message-detail { + font-size: 30px; + max-lines: 1; + text-overflow: ellipsis; + color: #666; +} + +.search-contacts-item-top { + padding-top: 20px; + padding-left: 48px; + padding-bottom: 20px; + padding-right: 50px; +} + +.search-contacts-item-top-div { + flex-direction: column; +} + +.search-contacts-item-middle { + width: 100%; +} + +.search-contacts-item-title { + padding-left: 48px; + height: 80px; +} + +.search-contacts-send { + font-size: 28px; + color: #E4000000; + font-weight: 500; + margin-bottom: 40px; +} + +.search-contacts-send-number { + font-size: 28px; + color: #0040FF; + font-weight: 500; +} + +.search-contacts-item-div { + height: 15px; + width: 100%; + background-color: #12A9A9A9; +} + +.search-contacts-num { + font-size: 25px; + color: #C1000000;; + font-weight: 500; +} + +.contacts-list-item { + display: flex; + flex-direction: row; + width: 100%; + height: 138px; + align-items: center; + padding-left: 30px; + padding-right: 10px; +} + +.contact-image { + width: 100px; + height: 100px; +} + +.contact-image-div { + width: 150px; + height: 150px; + align-items: center; + justify-content: center; +} + +.contact-text-div { + flex-grow: 1; + display: flex; + justify-content: space-around; + flex-direction: column; + align-content: center; + margin-left: 30px; + margin-right: 30px; +} + +.contact-text-div-tel { + flex-direction: row; +} + +.contact-text-div-name { + flex-direction: column; +} + +.contact-text-name { + font-size: 30px; + font-weight: 500; + text-overflow: ellipsis; + color: #000; +} + +.contact-text-name-light { + font-size: 30px; + font-weight: 500; + text-overflow: ellipsis; + color: #FF0000FF; + flex-direction: row; +} + +.contact-text-telephone { + font-size: 25px; + color: grey; + flex-direction: row; +} + +.contact-text-telephone-light { + font-size: 25px; + color: #FF0000FF; + flex-direction: row; +} + +.dialog { + flex-direction: column; + justify-content: center; + align-items: center; + padding-top: 20px; + padding-bottom: 10px; +} + +/*弹框展示*/ +.transmit_dialog { + flex-direction: column; + justify-content: center; + align-items: center; + padding-top: 20px; + padding-bottom: 10px; +} + +.transmit_text { + margin-bottom: 10px; + margin-left: 45px; + margin-right: 45px; +} + +.transmit_text_title { + font-size: 48px; + font-weight: 600; + max-lines: 2; + text-overflow: ellipsis; +} + +.transmit_text_title_min { + font-size: 30px; + font-weight: 600; + max-lines: 2; + text-overflow: ellipsis; +} + +.transmit_text_tips { + margin-bottom: 15px; + margin-left: 45px; + margin-right: 45px; +} + +.transmit_content { + flex-direction: column; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px;; + border-bottom-right-radius: 20px; + padding-left: 30px; + padding-right: 30px; + padding-top: 20px; +} + +.transmit_content_list { + min-height: 120px; + margin-bottom: 10px; + margin-left: 45px; + margin-right: 10px; + background-color: #fff; +} + +.transmit_content_item_mms { + background-color: #FFF; + margin-right: 45px; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px;; + border-bottom-right-radius: 20px; +} + +.transmit_content_item { + margin-right: 45px; +} + +.transmit-content-container { + flex-direction: column; + margin-bottom: 20px; +} + +.column-style { + flex-direction: column; +} + +.transmit-content { + flex-direction: column; + padding-top: 10px; +} + +.content-text { + border-radius: 0; + background-color: transparent; +} + +.transmit-base-background { + flex-direction: row; + align-items: center; + justify-content: flex-end; + padding: 20px; + border-radius: 15px; + background-color: #20A9A9A9; + border-top-left-radius: 0; +} + +.transmit-image-background { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + border-radius: 15px; + background-color: #20A9A9A9; + border-top-left-radius: 0; + width: 60%; +} + +.transmit-ppt-image { + width: 64px; + height: 64px; +} + +.transmit-theme-text { + flex-direction: column; + align-items: flex-end; + justify-content: flex-start; +} + +.transmit-slide-text { + margin-top: 10px; + margin-left: 30px; + margin-bottom: 10px; +} + +.transmit-image { + width: 100%; + height: 150px; +} + +.mms-edit-card { + display: flex; + height: 100px; + flex-direction: row; + background-color: #20A9A9A9; + border-radius: 20px; + align-items: center; + justify-content: center; + margin-bottom: 10px; +} + +.edit-card-img { + width: 48px; + height: 48px; + margin-left: 10px; + margin-right: 10px; +} + +.mms-edit-card-item { + flex-direction: column; + padding: 5px; + margin-right: 40px; + align-items: center; + justify-content: center; +} + +.transmit_content_textarea { + background-color: #20A9A9A9; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; +} + +.transmit_content_body { + flex-direction: column; +} + +.transmit_content_multi_mms { + flex-direction: column; + justify-content: flex-start; + margin-top: 10px; +} + +.transmit_content_mms { + flex-direction: column; + border-top-right-radius: 20px; + border-bottom-left-radius: 20px;; + border-bottom-right-radius: 20px; +} + +.txt-prompt { + color: grey; + font-size: 30px; +} + +.image_single { + width: 150px; + height: 250px; +} + +.transmit_content_multi_text { + flex-direction: column; + justify-content: flex-start; + margin-top: 10px; +} + +.txt-content { + font-size: 32px; + color: #FF000000; + margin-bottom: 40px; +} + +.txt-content-single { + font-size: 32px; + color: #FF000000; + margin-bottom: 10px; +} + +.transmit_source { + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-top: -5px; + margin-bottom: -10px; + margin-left: 20px; + width: 100%; +} + +.transmit_source_input { + width: 95px; + height: 95px; +} + +.transmit_source_text { + color: #FF000000; +} + +.transmit_source_text_grey { + color: grey; +} + +.transmit_button { + flex-direction: row; + height: 80px; + justify-content: center; + align-items: center; +} + +.transmit_button_single { + flex-direction: row; + align-items: center; + justify-content: center; +} + +.btn_cancel { + color: #F30000FF; + width: 33%; +} + +.btn_restore { + color: #F30000FF; + width: 33%; +} + +.btn_cancel_double { + color: #F30000FF; + width: 50%; +} + +.btn_restore_double { + color: #F30000FF; + width: 50%; +} + +.transmit_divider { + stroke-width: 1px; + height: 50px; + color: #A1808080; +} + +/*搜索返回按钮*/ +.search-div-back { + width: 96px; + height: 96px; + padding-top: 24px; + padding-bottom: 24px; + padding-left: 30px; + margin-left: 18px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/transmit_search/transmit_search.hml b/entry/src/main/js/default/pages/transmit_search/transmit_search.hml new file mode 100644 index 0000000..24facc4 --- /dev/null +++ b/entry/src/main/js/default/pages/transmit_search/transmit_search.hml @@ -0,0 +1,287 @@ + + + +
+
+ + + + + + +
+ + + + + + +
+ +
+ + +
+
+ +
+
+ + +
+
+
+ +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ + +
+ {{ + ($item.name) ? ($item.name) : ($item.telephoneFormat) }} +
+ + +
+ {{ $item.time }} +
+
+ + +
+ + + {{ $t('strings.messageSendFailed') }} + + + + + + + [{{ $t('strings.draft') }}] + + + {{ $item.countOfUnread }} {{ + $t('strings.multiUnread') }} + + + {{ $item.content }} + +
+
+
+ + + +
+ {{ $t('strings.msg_send_to') }} + {{ myText }} +
+
+ + + +
+
+ + + + {{ contactsFoundText }} + + + + +
+ +
+
+
+ +
+
+ + +
+
+
+ + + +
+ {{ showOpenOrRetract }} + +
+
+
+ + + +
+ + +
+ + + + {{ showSearchStatus }} +
+ + + +
+ + +
+ {{ + $t('strings.contentSentTo') }} {{ contactName == '' ? telephoneFormat : contactName }} + +
+ + +
+ {{ $t('strings.tap_content_to_edit') }} + +
+ + +
+ + +
+
+
+ +
+
+ +
+ {{$item.msgUriPath}} + {{$item.audioTime}} +
+
+
+
+ {{$item.contentInfo}} + {{$item.content}} +
+
+ +
+
+
+
+ +
+ {{$item.content}} +
+
+
+ + {{$item.content}} +
+
+
+
+
+ + +
+ + + {{ $t('strings.showSource') }} + +
+ + +
+
+ + + + + +
+
+ + + +
+
+
+
+ + +
+ +
+ {{ + $t('strings.contentSentContentTo') }} {{ contactName == '' ? telephoneFormat : contactName }} + +
+ +
+
+ + + + + +
+
+ + + +
+
+
+
+
\ No newline at end of file diff --git a/entry/src/main/js/default/pages/transmit_search/transmit_search.js b/entry/src/main/js/default/pages/transmit_search/transmit_search.js new file mode 100644 index 0000000..d4caa2f --- /dev/null +++ b/entry/src/main/js/default/pages/transmit_search/transmit_search.js @@ -0,0 +1,434 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import mmsLog from '../../../default/utils/MmsLog.js'; +import router from '@system.router'; +// JS公共常量 +import common from '../common_constants.js'; +import settingService from '../../service/SettingService.js' +import contractService from '../../service/ContractService.js' +import commonService from '../../service/CommonService.js' + +// 搜索的数量 +const SEARCH_TOTAL = 3; +// 文本长度 +const TEXT_LENGTH = 2; +const TAG = 'transmit_search.js ->'; + +export default { + data: { + // 所有短信的总条数 + total: 0, + // 通知信息内的数据 + messageListForInfo: [], + // 如果通知信息整合开关打开,则是非通知信息+非大麦通知,如果没有打开,则是所有数据 + messageList: [], + // 搜索结果列表 + searchResultList: [], + // 搜索结果的个数 + countOfSearchResult: 0, + // 是否展示通知信息 + hasInfoMsg: false, + // 通知信息整合开关'是否打开,该开关在设置里 + hasAggregate: false, + // 搜索匹配到的联系人 + contactsMatching: [], + // 搜索匹配到的联系人备份 + contactsMatchingBackup: [], + // 是否搜到联系人 + searchMatchResult: false, + // 搜索状态 + showSearchStatus: '', + // 信息列表 + contractsList: [], + // 多条信息转发的内容列表 + transmitContentList: [], + // 双卡 + doubleCard: false, + // 内容 + content: '', + // 联系人名称 + contactName: '', + // 格式化手机号 + telephoneFormat: '', + // 手机号 + telephone: '', + // 是否被选中 + isChecked: true, + // 发送短信ID + threadId: 0, + // 是否是彩信 + isMms: false, + // 是否是多条信息转发 + isMulti: false, + // 转发内容标题 + transmitContent: '', + // 格式化后的转发内容 + transmitContentFormat: '', + // 转发多条内容备份,用于比较原值 + transmitContentsBackup: [], + // 是否禁用checkbox + isDisabled: false, + // 转发多条内容 + transmitContents: [], + // 操作类型 + operatorType: 4, + // 是否展示转发弹框 + contractsPage: false, + // dialog标题字体大小展示,字数少时展示大字体,字数多时展示小字体 + titleChecked: false, + // dialog标题中联系人长度临界值 + contactNameLen: 25, + // 卡1 + simOne: 0, + // 卡2 + simTwo: 1, + // 是否输入文本 + isInputText: false, + // 搜索联系人数量文本提示 + contactsFoundText: '', + // 是否展开或者收起文本 + openOrRetract: true, + // 显示展开或者收起文本 + showOpenOrRetract: '', + // 转发内容编辑状态内容备份,用于对比原值 + transmitContentEditBackup: '', + // 转发内容编辑状态内容 + transmitContentEdit: '', + // 搜索到的总数 + searchTotal: 0, + // 一行的像素大小 + rowPixel: 48, + // list列表最大的高度 + maxListPixel: 350, + // 每一行的字符数量 + rowCharacterNum: 18, + // dialog中的list动态高度 + dynamicHeight: 0, + // 判断输入的号码大于三位,显示发送至该输入的号码 + judgeSendInputText: false, + // 输入框中的值 + myText: '', + // 文本在list中的索引 + textIndex: 0, + // 多条内容转发是否包含文本 + includeTextSMS: true, + // 转发内容是否可以发送,若为空,则不能发送 + isCanSend: false, + // 是否显示联系人头像 + isShowContactHeadIcon: true, + // 是否是彩信幻灯片页面 + isSlideDetail: false, + // 彩信列表的数据 + mmsSource: [], + // 分页页数 + page: 1, + // 分页数量 + limit: 10, + transmitItemSources: [] + }, + onInit() { + this.queryAllMessages(); + this.getSettingFlagForConvListPage(); + this.showSearchStatus = this.$t('strings.there_is_no_match'); + this.showOpenOrRetract = this.$t('strings.contacts_open'); + }, + onShow() { + this.$element('search').focus(); + }, + // 应用初始化时加载该用户的所有短信 + queryAllMessages() { + let actionData = {}; + let rdbStore = this.$app.$def.rdbStore; + actionData.page = this.page; + actionData.limit = this.limit; + actionData.featureAbility = this.$app.$def.featureAbility; + actionData.ohosDataAbility = this.$app.$def.ohosDataAbility; + let conversationListService = this.$app.$def.conversationListService; + conversationListService.querySessionList(rdbStore, actionData, result => { + if (result.code == common.int.SUCCESS) { + this.messageList = result.response; + this.total = this.messageList.length; + } else { + mmsLog.info(TAG + 'Error: queryAllMessages() failed !!!'); + } + }); + }, + // 获取整合通知信息和显示联系人头像的开关值 + getSettingFlagForConvListPage() { + let preferences = this.$app.$def.preferences; + let result = settingService.getSettingFlagForConvListPage(preferences); + if (result) { + this.hasInfoMsg = result.hasAggregate; + } + }, + // 过滤搜索词匹配联系人 + filterContacts(textValue) { + this.contactsMatching = this.contacts.filter((contact) => { + if (contact.contactName && contact.contactName.toLowerCase().search(textValue) != -1) { + mmsLog.info(TAG + 'jsRe searchChange contactName==>'); + return true; + } else if (contact.telephone && contact.telephone.toLowerCase().search(textValue) != -1) { + mmsLog.info('jsRe searchChange telephone==>'); + return true; + } + return false; + }); + }, + // 在信息列表页面搜索 + clickToSearch(e) { + this.myText = e.text; + let reg = /^[0-9]*$/; + let textValue = common.string.EMPTY_STR; + // 判断输入内容为全数字将空格去除,用于正确匹配 + if (reg.test(textValue)) { + textValue = this.myText.replace(/\s*/g, ''); + } else { + textValue = this.myText; + } + if (textValue == common.string.EMPTY_STR) { + this.contactsMatching = []; + this.searchMatchResult = false; + this.isInputText = false; + } else { + this.setJudgeSendInputText(reg, textValue); + textValue = textValue.toLowerCase(); + // 过滤逻辑 + this.searchContacts(textValue, code => { + if (code == common.int.SUCCESS) { + this.dealSearchContactsResult(); + } + }); + mmsLog.info(TAG + 'jsRe searchChange contactsMatching success'); + } + }, + dealSearchContactsResult() { + this.searchTotal = this.contactsMatching.length; + if (this.searchTotal > 0) { + this.contactsMatchingBackup = this.contactsMatching; + this.searchMatchResult = true; + this.contactsFoundText = this.$t('strings.contacts_found', { + number: this.searchTotal + }); + if (this.searchTotal > SEARCH_TOTAL && this.openOrRetract) { + this.contactsMatching = this.contactsMatchingBackup.slice(0, SEARCH_TOTAL); + } + } else { + this.searchMatchResult = false; + } + this.isInputText = true; + }, + queryOldMessageList(telephone) { + if (telephone == common.string.EMPTY_STR) { + return; + } + let rdbStore = this.$app.$def.rdbStore; + let listService = this.$app.$def.conversationListService; + listService.querySessionByTelephone(rdbStore, telephone, result => { + if (result.code == common.int.SUCCESS && result.response.id > 0) { + this.threadId = result.response.id; + } else { + this.threadId = 0; + } + }); + }, + setJudgeSendInputText(reg, textValue) { + if (this.myText.length > TEXT_LENGTH && reg.test(textValue)) { + this.judgeSendInputText = true; + } else { + this.judgeSendInputText = false; + } + }, + searchContacts(textValue, callback) { + mmsLog.log(TAG + 'searchContracts , contracts: start'); + let actionData = { + telephone: textValue, + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + contractService.searchContracts(actionData, res => { + let code = res.code; + if (common.int.SUCCESS == res.code) { + this.contactsMatching = []; + this.contactsMatching = res.response; + } else { + mmsLog.log(TAG + 'searchContracts, fail'); + } + callback(code); + }); + }, + // 点击返回按钮退出搜索模式 + clickSearchBack() { + router.back(); + }, + // 点击蒙层退出搜索模式 + searchCoverageClick() { + router.back(); + }, + // 检查联系人长度值,调整字体大小 + checkContactNameLen() { + if (this.contactName != null && this.contactName.length > this.contactNameLen) { + this.titleChecked = true; + } else { + this.titleChecked = false; + } + }, + // 点击list,获取发送的dialog + clickSendMessage(index) { + if (this.contactsMatching[index].contactName) { + this.contactName = this.contactsMatching[index].contactName; + // 判断联系人长度大于20,显示小号字体 + this.checkContactNameLen(); + } + this.telephoneFormat = this.contactsMatching[index].telephoneFormat; + this.telephone = this.contactsMatching[index].telephone; + this.queryOldMessageList(this.telephone); + if (!this.isSlideDetail) { + this.transmitContentAssembly(); + this.dynamicHeight = commonService.getTransmitContentHeight(this.transmitContentList); + // 唤醒dialog + this.$element('dialog').show(); + } else { + this.$element('dialog_transmit').show(); + } + }, + // 点击输入发送的号码,获取发送的dialog + clickShowDialog() { + this.contactName = common.string.EMPTY_STR; + this.telephoneFormat = this.myText; + this.telephone = this.myText; + // 判断联系人长度大于20,显示小号字体 + if (this.myText.length > this.contactNameLen) { + this.titleChecked = true; + } else { + this.titleChecked = false; + } + if(!this.isSlideDetail) { + this.transmitContentAssembly(); + this.dynamicHeight = commonService.getTransmitContentHeight(this.transmitContentList); + this.$element('dialog').show(); + } else { + this.$element('dialog_transmit').show(); + } + }, + // 是否选中判断 + clickChecked(e) { + this.isChecked = e.checked; + this.transmitContentAssembly(); + }, + // 转发 + transmit(slotId) { + this.$app.$def.slotId = slotId; + this.$app.$def.threadId = this.threadId; + this.$app.$def.strContactsName = this.contactName; + this.$app.$def.strContactsNumber = this.telephone; + this.$app.$def.strContactsNumberFormat = this.telephoneFormat; + this.$app.$def.transmitFlag = true; + this.$app.$def.transmitContent = this.isChecked ? + this.transmitContentFormat : this.transmitContentEdit; + this.$app.$def.transmitContents = this.transmitContents; + this.contractsPage = false; + this.$app.$def.mmsSource = this.mmsSource; + this.$app.$def.isSlideDetail = this.isSlideDetail; + this.$app.$def.transmitSource = this.transmitContentList; + this.$app.$def.isContainerOriginSource = this.isChecked; + router.replace({ + uri: 'pages/conversation/conversation' + }); + }, + // 转发内容封装 + transmitContentAssembly() { + this.includeTextSMS = commonService.checkIsMms(this.transmitContentList); + if (!this.includeTextSMS) { + return; + } + let number = 0; + this.transmitContentList.forEach((item) => { + item.contentInfo = common.string.EMPTY_STR; + if (!item.isMsm) { + if (number == 0) { + item.contentInfo = this.transmitContent + '\n'; + number ++; + } + if (this.transmitContentList.length > 1) { + item.contentInfo = item.contentInfo + item.date + ' '; + item.contentInfo = item.contentInfo + item.time + ' ' + item.contactsName + '\n'; + } + } + }); + }, + // 包含转发信息来源按钮切换-短信 + changeValue(item, e) { + item.content = e.text; + }, + // 轻触其他地方取消对话框 + cancelDialog() { + this.resetTransmitContent(); + }, + // 用于联系人列表展开收回 + openRetract() { + if (this.openOrRetract) { + this.openOrRetract = false; + this.showOpenOrRetract = this.$t('strings.contacts_retract'); + this.contactsMatching = []; + this.contactsMatching = this.contactsMatchingBackup; + } else { + this.openOrRetract = true; + this.showOpenOrRetract = this.$t('strings.contacts_open'); + this.contactsMatching = []; + if (this.searchTotal > 3 && this.openOrRetract) { + this.contactsMatching = this.contactsMatchingBackup.slice(0, 3); + } + } + }, + // 重置转发内容 + resetTransmitContent() { + if (!this.isMms) { + this.transmitContentEdit = this.transmitContentEditBackup; + } else { + this.transmitContentsBackup.forEach((element, index) => { + if (element.msgUriPath == common.string.EMPTY_STR) { + this.transmitContents[index].content = element.contentEditBackup; + } + }); + } + }, + // 点击联系人头像,跳转至联系人详情 + titleBarAvatar(index) { + var actionData = {}; + actionData.phoneNumber = this.contactsMatching[index].telephone; + actionData.pageFlag = common.contractPage.PAGE_FLAG_CONTACT_DETAILS; + this.jumpToContract(actionData); + }, + // 跳转联系人app + jumpToContract(actionData) { + let commonService = this.$app.$def.commonService; + var str = commonService.commonContractParam(actionData); + let featureAbility = this.$app.$def.featureAbility; + featureAbility.startAbility(str).then((data) => { + mmsLog.info('transmit_search.js ---> Data: ' + data); + }).catch((error) => { + mmsLog.error('transmit_search.js ---> failed: ' + JSON.stringify(error)); + }) + }, + // 点击取消按钮取消对话框 + cancelTransmit() { + this.resetTransmitContent(); + if(this.isSlideDetail) { + this.$element('dialog_transmit').close(); + } else { + this.$element('dialog').close(); + } + } +} diff --git a/entry/src/main/js/default/pages/video_operation/video_operation.css b/entry/src/main/js/default/pages/video_operation/video_operation.css new file mode 100644 index 0000000..b20e1fb --- /dev/null +++ b/entry/src/main/js/default/pages/video_operation/video_operation.css @@ -0,0 +1,108 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*最大的布局*/ +.video-operation { + flex-direction: column;/*flex容器主轴方向 垂直方向从上到下*/ + width: 100%; + height: 100%; +} + +/*头部标题栏*/ +.video-title-bar { + align-items: center; + width: 100%; + height: 150px; + padding-top: 10px; + padding-left: 20px; + padding-right: 20px; +} + +/*头部标题栏返回按钮*/ +.video-title-bar-back { + height: 96px; + width: 96px; + padding: 24px; +} + +/*头部标题栏文字*/ +.video-title-bar-text { + font-size: 42px; + text-color: #FF000000; + font-style: normal; + allow-scale: true; + font-weight: 600; +} + +/*视频操作*/ +.video-operation-video { + height: 100%; + flex-direction: row; +} + +/*视频内部盒子*/ +.video-div { + width: 360px; + height: 640px; + margin-left: 160px; +} + +/*单个视频*/ +.single-video { + width: 100%; + height: 100%; +} + +/*播放按钮*/ +.video-play { + width: 96px; + height: 96px; + position: absolute; + margin-left: 132px; + margin-top: 272px; +} + +/*视频保存按钮*/ +.video-image { + width: 48px; + height: 48px; + margin-left: 100px; + margin-top: 300px; +} + +/*底部菜单栏*/ +.video-menu-bar { + width: 100%; + height: 120px; + align-items: center; + padding-left: 30px; + padding-right: 30px; + flex-direction: row; +} + +/*底部菜单栏单个盒子*/ +.menu-bar-div { + flex-direction: column; + justify-content: center; + align-items: center; + width: 25%; +} + +/*底部菜单栏图片*/ +.menu-bar-div-image { + width: 48px; + height: 48px; + margin-bottom: 12px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/video_operation/video_operation.hml b/entry/src/main/js/default/pages/video_operation/video_operation.hml new file mode 100644 index 0000000..60c8283 --- /dev/null +++ b/entry/src/main/js/default/pages/video_operation/video_operation.hml @@ -0,0 +1,63 @@ + + +
+ +
+ + + + {{$t('strings.mms')}} +
+ + +
+
+ + + + + +
+ +
+ + +
+ + + + + + + + +
+
diff --git a/entry/src/main/js/default/pages/video_operation/video_operation.js b/entry/src/main/js/default/pages/video_operation/video_operation.js new file mode 100644 index 0000000..0b97d4d --- /dev/null +++ b/entry/src/main/js/default/pages/video_operation/video_operation.js @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import router from '@system.router'; + +export default { + data: { + event: '', + seekingtime: '', + timeupdatetime: '', + seekedtime: '', + isStart: true, + isfullscreenchange: false, + isControls: false, + isPlayImage: true, + }, + titleBarBack() { + // 返回按钮 + router.back(); + }, + preparedCallback: function () { + this.event = this.$t('strings.video_connect_succeed'); + }, + startCallback: function () { + this.event = this.$t('strings.video_start_play'); + }, + pauseCallback: function () { + this.event = this.$t('strings.video_pause_play'); + }, + finishCallback: function () { + this.event = this.$t('strings.video_play_end'); + }, + errorCallback: function () { + this.event = this.$t('strings.video_play_error'); + }, + seekingCallback: function (e) { + this.seekingtime = e.currenttime; + }, + timeupdateCallback: function (e) { + this.timeupdatetime = e.currenttime; + }, + changeStartPause: function () { + if (this.isStart) { + this.$element('vedioId').pause(); + this.isStart = false; + } else { + this.$element('vedioId').start(); + this.isStart = true; + } + }, + changeFullscreenhange: function () { + // 全屏 + if (!this.isfullscreenchange) { + this.$element('vedioId').requestFullscreen({ + screenOrientation: 'default' + }); + this.isfullscreenchange = true; + } else { + this.$element('vedioId').exitFullscreen(); + this.isfullscreenchange = false; + } + }, + playVideo() { + this.$element('vedioId').start(); + this.isStart = true; + this.isControls = true; + this.isPlayImage = false; + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/CallService.js b/entry/src/main/js/default/service/CallService.js new file mode 100644 index 0000000..b2c1ac2 --- /dev/null +++ b/entry/src/main/js/default/service/CallService.js @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import call from '@ohos.telephony.call'; +import mmsLog from '../utils/MmsLog.js'; +import common from '../pages/common_constants.js'; + +export default { + + /** + * 打电话 + * @param params 电话号码 + * @return + */ + call(params, callback) { + if(params == null || params.telephone == common.string.EMPTY_STR) { + mmsLog.info('call param is null'); + return; + } + let result = {}; + call.dial(params.telephone).then((value) => { + mmsLog.info('call dial success:' + value); + result.code = common.int.SUCCESS; + callback(result); + }).catch((err) => { + mmsLog.info('call dial error: ' + err.message); + result.code = common.int.FAILURE; + callback(result); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/CommonService.js b/entry/src/main/js/default/service/CommonService.js new file mode 100644 index 0000000..e10c9f3 --- /dev/null +++ b/entry/src/main/js/default/service/CommonService.js @@ -0,0 +1,195 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import common from '../pages/common_constants.js'; + +export default { + commonContractParam(actionData){ + let str = { + 'want': { + 'bundleName': common.string.CONTRACT_BUNDLE_NAME, + 'abilityName': common.string.CONTRACT_ABILITY_NAME, + 'parameters' : actionData, + 'entities': [ + common.string.COMMON_ENTITIES + ] + }, + }; + return str; + }, + getDisplay(mmsParts) { + let display = common.MESSAGE_SHOW_TYPE.NORMAL; + let first = mmsParts[0]; + if (mmsParts.length == 1) { + display = common.MESSAGE_SHOW_TYPE.NORMAL; + } else if (mmsParts.length >= 2) { + let second = mmsParts[1]; + if (first.msgType == common.MSG_ITEM_TYPE.THEME) { + if (second.msgType == common.MSG_ITEM_TYPE.IMAGE || second.msgType == common.MSG_ITEM_TYPE.VIDEO) { + display = common.MESSAGE_SHOW_TYPE.PPT_IMAGE; + } else if (mmsParts.length > 2) { + display = common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE; + } else { + display = common.MESSAGE_SHOW_TYPE.THEME_NO_IMAGE; + } + } else if (second.msgType == common.MSG_ITEM_TYPE.THEME && mmsParts.length == 3) { + display = common.MESSAGE_SHOW_TYPE.THEME_IMAGE; + } else { + if (first.msgType == common.MSG_ITEM_TYPE.IMAGE || first.msgType == common.MSG_ITEM_TYPE.VIDEO) { + display = common.MESSAGE_SHOW_TYPE.PPT_IMAGE; + } else { + display = common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE; + } + } + } + return display; + }, + setItemMmsContent(item, mmsParts) { + item.msgUriPath = common.string.EMPTY_STR; + item.content = common.string.EMPTY_STR; + let first = mmsParts[0]; + item.msgUriPath = first.msgUriPath; + item.audioTime = first.time; + if (mmsParts.length == 1) { + item.msgType = first.msgType; + item.content = first.content; + } else if (mmsParts.length >= 2) { + let content = first.content; + let second = mmsParts[1]; + let secondContent = second.content; + if (first.msgType == common.MSG_ITEM_TYPE.THEME) { + if (second.msgType == common.MSG_ITEM_TYPE.IMAGE || second.msgType == common.MSG_ITEM_TYPE.VIDEO) { + item.msgUriPath = second.msgUriPath; + } + if (content == common.string.EMPTY_STR) { + item.content = secondContent; + } else { + item.content = content + '\n' + secondContent; + } + } else if (second.msgType == common.MSG_ITEM_TYPE.THEME && mmsParts.length === 3) { + item.msgUriPath = first.msgUriPath; + item.msgType = first.msgType; + let third = mmsParts[2]; + let thirdContent = third.content; + if (secondContent == common.string.EMPTY_STR) { + item.content = thirdContent; + } else { + item.content = secondContent + '\n' + thirdContent; + } + } else { + item.content = content; + } + } + }, + getMmsSource(mmsParts) { + let source = []; + mmsParts.forEach(part => { + let obj = { + msgType: parseInt(part.type), + msgUriPath: part.locationPath, + time: part.recordingTime, + content: part.content, + fileSize: part.fileSize, + messageType: part.messageType ? parseInt(part.messageType) : 0 + } + source.push(obj); + }); + return source; + }, + getMmsContent(mmsSource) { + let content = common.string.EMPTY_STR; + for(let mms of mmsSource) { + // 代表存在主题 + if(mms.msgType == common.MSG_ITEM_TYPE.THEME) { + content = mms.content; + break; + } + } + return content; + }, + checkIsMms(dataSource) { + // 是否是普通短信 + let isMsg = false; + for (let index = 0; index < dataSource.length; index++) { + let item = dataSource[index]; + if (!item.isMsm) { + isMsg = true; + break; + } + } + return isMsg; + }, + judgeIsSelectText(mmsSource) { + let flage = false; + for(let item of mmsSource) { + let msgType = item.msgType + common.string.EMPTY_STR; + if(common.MSG_ITEM_TYPE.THEME == msgType) { + flage = true; + } + if(common.MSG_ITEM_TYPE.TEXT == msgType && item.content != common.string.EMPTY_STR) { + flage = true; + } + if((common.MSG_ITEM_TYPE.IMAGE == msgType || common.MSG_ITEM_TYPE.AUDIO == msgType + || common.MSG_ITEM_TYPE.VIDEO == msgType) && item.content != common.string.EMPTY_STR) { + flage = true; + } + } + return flage; + }, + judgeIsImage(mmsSource) { + let flage = false; + for(let item of mmsSource) { + let msgType = item.msgType + common.string.EMPTY_STR; + if(common.MSG_ITEM_TYPE.IMAGE == msgType) { + flage = true; + } + } + return flage; + }, + getTransmitContentHeight(list) { + let height = 0; + list.forEach((item) => { + if (item.msgShowType == common.MESSAGE_SHOW_TYPE.NORMAL) { + height = height + common.TRANSMIT_ITEM_HEIGHT.TEXT_HEIGHT; + } else if (item.msgShowType == common.MESSAGE_SHOW_TYPE.THEME_IMAGE) { + height = height + common.TRANSMIT_ITEM_HEIGHT.THEME_IMAGE_HEIGHT; + } else if (item.msgShowType == common.MESSAGE_SHOW_TYPE.PPT_IMAGE) { + height = height + common.TRANSMIT_ITEM_HEIGHT.PPT_IMAGE_HEIGHT; + } else if (item.msgShowType == common.MESSAGE_SHOW_TYPE.THEME_NO_IMAGE || + item.msgShowType == common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE) { + height = height + common.TRANSMIT_ITEM_HEIGHT.THEME_HEIGHT; + } + height = height + common.TRANSMIT_ITEM_HEIGHT.DISTANCE; + }); + if (height > common.TRANSMIT_ITEM_HEIGHT.TOTAL_HEIGHT) { + height = common.TRANSMIT_ITEM_HEIGHT.TOTAL_HEIGHT; + } + return height; + }, + judgeIsAttachment(mmsSource) { + let flage = false; + if(mmsSource == null || mmsSource.length == 0) { + return flage; + } + for(let item of mmsSource) { + let msgType = item.msgType + common.string.EMPTY_STR; + if(common.MSG_ITEM_TYPE.IMAGE == msgType || common.MSG_ITEM_TYPE.VIDEO == msgType + || common.MSG_ITEM_TYPE.AUDIO == msgType) { + flage = true; + } + } + return flage; + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/ContractService.js b/entry/src/main/js/default/service/ContractService.js new file mode 100644 index 0000000..16c9e0e --- /dev/null +++ b/entry/src/main/js/default/service/ContractService.js @@ -0,0 +1,171 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import mmsLog from '../utils/MmsLog.js'; +import ContactsModel from '../../default/model/contactsImpl/ContactsModel.js'; +import common from '../pages/common_constants.js'; +import telephoneUtil from '../utils/TelephoneUtil.js'; + +const mContactsModel = new ContactsModel(); +const CONTRACT_TAG = 'ContractService : '; + +export default { + + /** + * 查询联系人列表 + * @param actionData 入参 + * @return 结果集 + */ + queryContact(actionData, callback) { + // 获取rawContractIds,去查询联系人 + mContactsModel.queryContact(actionData, rawContractIds => { + let result = {}; + actionData.contractIds = rawContractIds; + // 根据rawContractIds + mContactsModel.queryContactDataByIds(actionData, contracts => { + result.code = common.int.SUCCESS; + this.convertContracts(contracts, messageList => { + result.response = messageList; + callback(result); + }); + }); + }); + }, + + /** + * 统计联系人的行数 + * @param actionData 入参 + * @return 结果集 + */ + countContact(actionData, callback) { + // 获取rawContractIds,去查询联系人 + mContactsModel.countContact(actionData, count => { + let result = {}; + result.code = common.int.SUCCESS; + result.response = count; + callback(result); + }); + }, + + /** + * 转换联系人参数 + * @param contracts 联系人列表 + * @return 转换后的数据 + */ + async convertContracts(contracts, callback) { + let messageList = []; + for (let contract of contracts) { + let item = {}; + item.contactName = contract.displayName; + item.headImage = '/common/icon/user_avatar_full_fill.svg'; + item.telephone = contract.detailInfo; + item.telephoneFormat = contract.detailInfo; + item.select = false; + messageList.push(item); + } + callback(messageList); + }, + + /** + * 处理联系人参数 + * @param contactObjects 联系人数据 + * @return 解析出来的参数 + */ + dealContractParams(contactObjects) { + if (contactObjects && contactObjects != common.string.EMPTY_STR) { + let params = JSON.parse(contactObjects); + let contactsNumber = common.string.EMPTY_STR; + let contactsName = common.string.EMPTY_STR; + let contactsNumberFormat = common.string.EMPTY_STR; + let length = params.length; + for (let item of params) { + contactsNumber = contactsNumber + item.telephone + common.string.COMMA; + contactsNumberFormat = contactsNumberFormat + item.telephone + common.string.COMMA; + if (item.contactsName) { + contactsName += (item.contactsName + common.string.COMMA); + } else if (length > 1) { + contactsName += (item.telephone + common.string.COMMA); + } + } + let telephnoe = contactsNumber.substring(0, contactsNumber.length - 1); + contactsNumber = telephoneUtil.dealTelephoneSort(telephnoe); + let contractParams = { + strContactsNumber: contactsNumber, + strContactsNumberFormat: contactsNumber, + strContactsName: contactsName.substring(0, contactsName.length - 1), + contactsNum: length, + } + return contractParams; + } + }, + + /** + * 根据手机号,查询联系人 + * @param actionData 参数 + * @param callback 回调 + */ + queryContactDataByTelephone(actionData, callback) { + mContactsModel.queryContactDataByTelephone(actionData, contracts => { + mmsLog.log(CONTRACT_TAG + 'queryContactDataByTelephone,result:' + contracts); + callback(contracts); + }) + }, + + /** + * 模糊查询联系人 + * @param actionData + * @param callback + */ + searchContracts(actionData, callback) { + let result = {}; + mContactsModel.searchContracts(actionData, res => { + result.code = res.code + if(res.code == common.int.SUCCESS) { + result.response = this.dealSearchContracts(res.abilityResult); + callback(result); + } + }) + }, + dealSearchContracts(contracts) { + let searchContracts = [] + for(let item of contracts) { + let searchContract = {}; + searchContract.headImage = '/common/icon/user_avatar_full_fill.svg'; + searchContract.contactName = item.displayName; + searchContract.telephone = item.detailInfo; + searchContract.telephoneFormat = item.detailInfo; + searchContracts.push(searchContract); + } + return searchContracts; + }, + + /** + * 判断是否存在名片 + * + * @param {Object} actionData 数据 + * @param {Object} callback 回调函数 + */ + judgeIsExitProfile(actionData, callback) { + mmsLog.log('jumpToCard judgeIsExitProfile is start'); + mContactsModel.queryProfile(actionData, res => { + mmsLog.log('jumpToCard judgeIsExitProfile is res : ' + res); + let result = false; + if (res > 0) { + result = true; + } + callback(result); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/ConversationListService.js b/entry/src/main/js/default/service/ConversationListService.js new file mode 100644 index 0000000..cc32a8d --- /dev/null +++ b/entry/src/main/js/default/service/ConversationListService.js @@ -0,0 +1,638 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// log 工具类 +import mmsLog from '../utils/MmsLog.js'; +// 公共常量 +import common from '../pages/common_constants.js'; + +// 获取假数据 +import ConversationListModel from '../model/conversationListImpl/ConversationListModel.js'; + +let conversationListModel = new ConversationListModel(); +import conversationService from '../service/ConversationService.js'; +import contractService from '../service/ContractService.js'; +import commonService from '../service/CommonService.js'; +import telephoneUtils from '../utils/TelephoneUtil.js'; + +const TAG = 'ConversationListService ->'; + +export default { + + /** + * 查询列表数据 + * @param rdbStore 数据库实例 + * @param actionData 查询参数 + * @param tableName 表明 + * @return + */ + querySessionList(rdbStore, actionData, callback) { + // 查询数据列表 + let result = {}; + let queryPromise = conversationListModel.querySessionList(rdbStore, actionData); + // 获取总的条数 + let countPromise = conversationListModel.countSessionList(rdbStore, actionData); + // 判断通知信息是否存在 + let notificationPromise = new Promise((resolve) => { + this.judgeIsNotificationData(rdbStore, res => { + resolve(res); + }); + }); + Promise.all([queryPromise, countPromise, notificationPromise]).then((res) => { + mmsLog.log(TAG + 'querySessionList,result.total:' + res[1].total); + result.code = common.int.SUCCESS; + let telephones = []; + let messageList = this.convertSessionList(res[0].response, telephones); + result.total = res[1].total; + result.showInfoDivWhenSearchFlag = res[2]; + this.dealContactsName(telephones, actionData, messageList, sessionList => { + result.response = sessionList; + callback(result); + }); + }).catch((err) => { + mmsLog.log(TAG + 'querySessionList error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + }, + convertSessionList(sessionList, telephones) { + let messageList = []; + for (let session of sessionList) { + let item = {}; + item.name = common.string.EMPTY_STR; + item.contactsNum = session.contactsNum; + item.content = session.content; + item.countOfUnread = session.unreadCount; + if (session.smsType == 0) { + item.icon = '/common/icon/user_avatar_full_fill.svg'; + } else { + item.icon = '/common/icon/entrance_icon01.svg'; + } + item.isCbChecked = false; + item.isLock = false; + item.sendingFailed = session.sendingStatus == common.int.SEND_MESSAGE_FAILED ? true : false; + item.telephone = session.telephone; + if (item.contactsNum > 1) { + let telephoneSplit = item.telephone.split(common.string.COMMA); + for (let item of telephoneSplit) { + telephones.push(item); + } + } else { + telephones.push(item.telephone); + } + item.telephoneFormat = session.telephoneFormat; + item.threadId = session.id; + item.timeMillisecond = session.time; + item.isDraft = session.hasDraft == 1 ? true : false; + item.isLock = session.hasLock == 1 ? true : false; + item.time = common.string.EMPTY_STR; + item.messageCount = session.messageCount; + item.hasMms = session.hasMms == 1 ? true : false; + item.hasAttachment = session.hasAttachment == 1 ? true : false; + messageList.push(item); + } + return messageList; + }, + dealContactsName(telephones, actionData, sessionLists, callback) { + actionData.telephones = telephones; + if(telephones.length == 0) { + callback(sessionLists); + return; + } + contractService.queryContactDataByTelephone(actionData, contacts => { + if(contacts.length == 0) { + callback(sessionLists); + } else { + // 将结果转换为Map,key:手机号,value: 名称 + let telephoneMap = this.getTelephoneMap(contacts); + this.buildName(sessionLists, telephoneMap); + callback(sessionLists); + } + }); + }, + getTelephoneMap(contacts) { + let telephoneMap = new Map(); + for(let item of contacts) { + if (item.displayName == common.string.EMPTY_STR) { + telephoneMap.set(item.detailInfo, item.detailInfo); + } else { + telephoneMap.set(item.detailInfo, item.displayName); + } + } + return telephoneMap; + }, + buildName(sessionLists, telephoneMap) { + // 将结果根据手机号进行匹配 + for (let session of sessionLists) { + // 多人名称的组合,名称是需要组合展示 + if (session.contactsNum > 1) { + this.dealMultiName(session, telephoneMap); + } else if (telephoneMap.has(session.telephone)) { + session.name = telephoneMap.get(session.telephone); + } + } + }, + dealMultiName(session, telephoneMap) { + let telephones = session.telephone.split(common.string.COMMA); + let name = common.string.EMPTY_STR; + for(let telephone of telephones) { + if(telephoneMap.has(telephone)) { + name = name + telephoneMap.get(telephone) + common.string.COMMA; + } else { + name = name + telephone + common.string.COMMA; + } + } + session.name = name.substring(0, name.length - 1); + }, + + /** + * 判断是否存在通知信息的数据 + * @param rdbStore 查询实例 + * @param callback 返回 + */ + judgeIsNotificationData(rdbStore, callback) { + let param = { + numberType: 1, + limit: 1, + page: 1 + }; + this.querySessionByNumberType(rdbStore, param, res => { + if(res.code == common.int.SUCCESS && res.response.length > 0) { + callback(true); + } else { + callback(false); + } + }); + }, + + /** + * 统计数据 + * @param actionData 参数 + * @param callBack 回调 + * @return + */ + statisticalData(actionData, callBack) { + let normalPromise = new Promise((resolve) => { + conversationListModel.statisticalData(actionData, res => { + let result = {}; + result.code = res.code; + if (res.code == common.int.SUCCESS) { + result.response = res.abilityResult; + resolve(result.response); + } else { + mmsLog.info(TAG + 'Error: statisticalData() failed !!!'); + } + }); + }); + let notifyPromise = new Promise((resolve) => { + conversationService.statisticsUnreadNotify(actionData, res => { + resolve(res); + }); + }); + Promise.all([normalPromise, notifyPromise]).then(res => { + let normalResult = res[0]; + let notifyResult = res[1]; + let response = { + 'totalListCount': normalResult.totalListCount, + 'unreadCount': (normalResult.totalListCount - notifyResult), + 'unreadTotalOfInfo': notifyResult + } + let result = { + code: common.int.SUCCESS, + response: response + } + callBack(result); + }).then(err => { + mmsLog.info(TAG + 'Error: statisticalData all failed!' + err); + let result = { + code: common.int.FAILURE + } + callBack(result); + }); + + }, + + /** + * 根据主键ID,删除数据 + * @param rdbStore 数据库实例 + * @param threadIds 会话ID + * @return + */ + deleteMessageById(actionData) { + // 删除会话列表的数据 + conversationListModel.deleteMessageById(actionData.rdbStore, actionData.threadIds); + // 删除信息列表的数据 + conversationService.deleteMessageBySessionIds(actionData); + }, + + /** + * 根据主键ID,删除数据 + * @param rdbStore 数据库实例 + * @param threadIds 会话ID + */ + deleteMessageBySessionId(rdbStore, threadIds) { + // 删除会话列表的数据 + conversationListModel.deleteMessageById(rdbStore, threadIds); + }, + + /** + * 根据主键ID,更新数据 + * @param rdbStore 数据库实例 + * @param threadIds 会话ID + * @return + */ + updateById(rdbStore, threadIds, valueBucket) { + conversationListModel.updateById(rdbStore, threadIds, valueBucket); + }, + + /** + * 标记已读短信 + * @param rdbStore 数据库实例 + * @param threadIds 会话ID + * @param valueBucket 标记已读的数量 + * @return + */ + markAllAsRead(actionData) { + if(actionData.threadIds.length == 0) { + return; + } + // 会话列表上的标记已读 + conversationListModel.markAllAsRead(actionData.rdbStore, actionData.threadIds, actionData.valueBucket); + // 短信信息的已读 + conversationService.markAllAsRead(actionData); + }, + + /** + * 更新所有未读信息为已读 + * @param actionData + */ + markAllToRead(actionData) { + conversationListModel.markAllToRead(actionData.rdbStore, actionData.smsType); + conversationService.markAllToRead(actionData); + }, + + /** + * 新增会话列表 + * @param rdbStore 数据库实例 + * @param valueBucket 新增的数据 + * @param callback 回调 + * @return + */ + insertSession(rdbStore, valueBucket, callback) { + conversationListModel.insertSession(rdbStore, common.tableName.SESSION, valueBucket, res => { + callback(res); + }); + }, + + /** + * 新增会话草稿列表 + * @param rdbStore 数据库实例 + * @param valueBucket 新增的数据 + * @param callback 回调 + * @return + */ + insertSessionDraft(actionData) { + let param = this.dealSendResults(actionData); + let rdbStore = actionData.rdbStore; + // 先判断是否创建过会话列表 + this.querySessionByTelephone(rdbStore, param.telephone, res => { + mmsLog.info(TAG +'insertSessionDraft,querySessionByTelephone:' + res); + let response = res.response; + if(res.code == common.int.SUCCESS && response.id < 0) { + this.dealInsertSession(param, actionData); + } else { + this.deleteDraftDataOrUpdate(actionData, response, param); + } + }); + }, + dealInsertSession(param, actionData) { + let valueBucket = { + 'telephone': param.telephone, + 'content': param.content, + 'contacts_num': param.contractsNum, + 'sms_type': param.smsType, + 'unread_count': 0, + 'sending_status': 1, + 'has_draft': 1, + 'time': param.timestamp, + 'has_mms': param.hasMms, + 'has_attachment': param.hasAttachment, + } + this.insertSession(actionData.rdbStore, valueBucket, sessionResult => { + // 这里调用短信数据库,插入短信信息 + mmsLog.info(TAG + 'insertSession,rowId:' + sessionResult); + let sessionId = sessionResult.rowId; + conversationService.dealInsertMessageDetail(param, actionData, sessionId, res => { + mmsLog.info(TAG + 'dealInsertMessageDetail,initDatas:' + res); + }); + }); + }, + deleteDraftDataOrUpdate(actionData, response, param) { + if(actionData.groupId > 0) { + let groupIds = [actionData.groupId]; + actionData.groupIds = groupIds; + // 先删除原来的草稿 + conversationService.deleteMessageByGroupIds(actionData); + } + if(actionData.content != common.string.EMPTY_STR || actionData.mmsSource.length > 0) { + // 存入新的草稿 + this.updateDraftData(response, param, actionData); + } + }, + updateDraftData(response, param ,actionData) { + let rdbStore = actionData.rdbStore; + let sessionId = response.id; + // 这里调用短信数据库,插入短信信息 + let threadIds = [sessionId]; + let time = new Date(); + let valueBucket = { + 'content': param.content, + 'has_draft': 1, + 'time': time.getTime(), + 'has_attachment': param.hasAttachment, + 'has_mms': param.hasMms, + } + this.updateById(rdbStore, threadIds, valueBucket); + conversationService.dealInsertMessageDetail(param, actionData, sessionId, res => { + mmsLog.info(TAG + 'dealInsertMessageDetail,initDatas:' + res); + }); + }, + dealSendResults(actionData) { + let contractsNum = 1; + let telephone = common.string.EMPTY_STR; + if(actionData.isNewMsg) { + let selectContacts = actionData.selectContacts; + if(selectContacts.length > 1) { + for(let contact of selectContacts) { + telephone = telephone + contact.telephone + common.string.COMMA; + } + // 如果失败,那会话列表结果就是失败 + telephone = telephone.substring(0, telephone.length-1); + contractsNum = selectContacts.length; + } else if (selectContacts.length == 1) { + telephone = selectContacts[0].telephone; + } + let receiveContactValue = actionData.receiveContactValue; + if(receiveContactValue != common.string.EMPTY_STR) { + telephone = actionData.receiveContactValue; + } + } else { + telephone = actionData.telephone; + } + let smsType = 0; + if(contractsNum == 1 && telephoneUtils.judgeIsInfoMsg(telephone)) { + smsType = 1; + } + let sendResult = { + telephone: telephone, + content: actionData.content, + sendStatus: common.int.SEND_DRAFT + } + actionData.sendResults = [sendResult]; + let timestamp = new Date().getTime(); + let result = {}; + result.contractsNum = contractsNum; + result.telephone = telephoneUtils.dealTelephoneSort(telephone); + result.content = actionData.content; + if(actionData.isMms) { + result.content = commonService.getMmsContent(actionData.mmsSource); + } + result.sendStatus = 1; + result.smsType = smsType; + result.timestamp = timestamp; + result.hasMms = actionData.isMms ? 1 : 0; + result.hasAttachment = actionData.hasAttachment ? 1 : 0; + return result; + }, + + /** + * 根据手机号查询会话列表 + * @param rdbStore 数据库实例 + * @param telephone 手机号 + * @return + */ + querySessionByNumberType(rdbStore, actionData, callback) { + mmsLog.log(TAG + 'querySessionByNumberType,actionData:' + actionData); + let result = {}; + let queryPromise = conversationListModel.querySessionList(rdbStore, actionData); + Promise.all([queryPromise]).then((res) => { + mmsLog.log(TAG + 'querySessionByNumberType,result:' + res[0]); + result.code = common.int.SUCCESS; + result.response = res[0].response; + callback(result); + }).catch((err) => { + mmsLog.log(TAG + 'querySessionByTelephone error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + }, + + /** + * 根据手机号查询会话列表 + * @param rdbStore 数据库实例 + * @param telephone 手机号 + * @return + */ + querySessionByTelephone(rdbStore, telephone, callback) { + let result = {}; + if(telephone == null) { + result.code = common.int.FAILURE; + callback(result); + } else { + let queryPromise = conversationListModel.querySessionByTelephone(rdbStore, telephone); + Promise.all([queryPromise]).then((res) => { + mmsLog.log(TAG + 'querySessionByTelephone,result:' + res[0]); + result.code = common.int.SUCCESS; + result.response = res[0]; + callback(result); + }).catch((err) => { + mmsLog.log(TAG + 'querySessionByTelephone error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + } + }, + + /** + * 根据手机号查询会话列表 + * @param rdbStore 数据库实例 + * @param telephone 手机号 + * @return + */ + querySessionById(rdbStore, threadId, callback) { + let result = {}; + mmsLog.log(TAG + 'querySessionById,param:' + threadId + ' rdbStore:' + rdbStore); + let queryPromise = conversationListModel.querySessionById(rdbStore, threadId); + Promise.all([queryPromise]).then((res) => { + mmsLog.log(TAG + 'querySessionById,result:' + JSON.stringify(res[0])); + result.code = common.int.SUCCESS; + result.response = res[0]; + callback(result); + }).catch((err) => { + mmsLog.log(TAG + 'querySessionById error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + }, + deleteMessageBySessionIdsAndLock(actionData) { + conversationService.deleteMessageBySessionIdsAndLock(actionData); + }, + dealMessageLockContent(actionData, callback) { + let threadIds = actionData.threadIds; + let length = threadIds.length; + let count = 0; + for (let id of threadIds) { + actionData.threadId = id; + if (!actionData.isMessageDetail) { + actionData.hasLock = 1; + } + conversationService.queryMessageDetail(actionData, res => { + if (res.code == common.int.SUCCESS && res.response.length > 0) { + count ++; + actionData.mmsList = res.response; + this.updateLastItemContent(actionData); + } + if (count == length) { + callback(common.int.SUCCESS); + } + }); + } + }, + updateLastItemContent(actionData) { + let length = actionData.mmsList.length; + let item = actionData.mmsList[length - 1]; + let content = item.content; + let threadIds = [actionData.threadId]; + let hasAttachment = false; + if (item.isMsm) { + content = commonService.getMmsContent(item.mms); + hasAttachment = true; + } + let valueBucket = { + 'content': content, + 'sending_status': item.sendStatus, + 'has_mms': item.isMsm ? 1 : 0, + 'has_attachment': hasAttachment ? 1 : 0, + 'message_count': length, + 'unread_count': 0 + }; + let rdbStore = actionData.rdbStore; + this.updateById(rdbStore, threadIds, valueBucket); + }, + /** + * 搜索 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + searchMessageWithLike(actionData, callback) { + // 会话详情搜索数据 + let searchText = actionData.inputValue; + let sessionListPromise = new Promise((resolve, reject) => { + this.searchSessionByTelephone(actionData, res => { + if (res.code === common.int.SUCCESS) { + resolve(res.response); + } else { + reject(res.code); + } + }); + }); + // 信息列表搜索的数据 + let contentListPromise = new Promise((resolve, reject) => { + conversationService.searchMessageByContent(actionData, res => { + if (res.code === common.int.SUCCESS) { + resolve(res.response); + } else { + reject(res.code); + } + }); + }); + let resultMap = {}; + let result = {}; + Promise.all([sessionListPromise,contentListPromise]).then((res) => { + result.code = common.int.SUCCESS; + resultMap.sessionList = res[0]; + resultMap.contentList = res[1]; + result.resultMap = resultMap; + result.search = searchText; + callback(result); + }).catch((err) => { + mmsLog.log(TAG + 'searchMessageWithLike error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + }, + + /** + * 根据手机号模糊匹配会话列表 + * @param actionData 数据库实例 + */ + async searchSessionByTelephone(actionData, callback) { + let result = []; + mmsLog.log(TAG + 'searchSessionByTelephone,param:' + actionData); + let rdbStore = actionData.rdbStore; + let telephone = actionData.inputValue; + let numberType = actionData.numberType; + let queryPromise = conversationListModel.searchSessionByTelephone(rdbStore, telephone, numberType); + queryPromise.then((res) => { + result.code = common.int.SUCCESS; + let telephones = []; + let messageList = this.convertSessionList(res, telephones); + this.dealContactsName(telephones, actionData, messageList, sessionList => { + result.response = this.dealSessionLikeData(sessionList); + callback(result); + }); + }).catch((err) => { + mmsLog.log(TAG + 'searchSessionByTelephone error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + }, + dealSessionLikeData(mmList) { + let sessionList = []; + for (let item of mmList) { + let map = {} + map.name = item.name; + map.threadId = item.threadId; + map.telephone = item.telephone; + map.telephoneFormat = item.telephoneFormat; + map.contactsNum = item.contactsNum; + map.isDraft = item.isDraft; + let names = item.name.split(common.string.COMMA); + let telephones = item.telephone.split(common.string.COMMA); + let telephoneFormats = item.telephoneFormat.split(common.string.COMMA); + let nameFormatter = common.string.EMPTY_STR; + let index = 0; + for (let name of names) { + nameFormatter += (name == null || name == common.string.EMPTY_STR ? telephones[index] : name); + nameFormatter += '<'; + nameFormatter += telephoneFormats[index]; + nameFormatter += '>'; + if (index < telephones.length - 1) { + nameFormatter += common.string.COMMA; + } + index++; + } + map.nameFormatter = nameFormatter; + map.date = common.string.EMPTY_STR; + map.time = common.string.EMPTY_STR; + map.timeMillisecond = item.timeMillisecond; + map.size = item.messageCount; + map.icon = item.icon; + sessionList.push(map); + } + return sessionList; + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/ConversationService.js b/entry/src/main/js/default/service/ConversationService.js new file mode 100644 index 0000000..8b7ce35 --- /dev/null +++ b/entry/src/main/js/default/service/ConversationService.js @@ -0,0 +1,1092 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import ContactModel from '../model/contactsImpl/ContactsModel.js'; +import ConversationModel from '../model/conversationImpl/ConversationModel.js'; +import common from '../pages/common_constants.js'; +import mmsLog from '../utils//MmsLog.js'; +import conversationListService from '../service/ConversationListService.js'; +import telephoneUtils from '../utils/TelephoneUtil.js'; +import contractService from '../service/ContractService.js'; +import commonService from '../service/CommonService.js'; + +let mContactModel = new ContactModel(); +let mConversationModel = new ConversationModel(); +const CONVERSATION_TAG = 'ConversationService: '; + +export default { + + /** + * 判断联系人是否存在 + * @param params 联系人电话号码 + * @param callback 联系人是否存在 + * @return + */ + judgeContactExists(params, callback) { + mContactModel.queryContactDataByTelephone(params, function (result) { + let hasExitContract = false; + if (result.length >= 1) { + // 联系人是否存在 + mmsLog.info(CONVERSATION_TAG + 'queryContact success'); + hasExitContract = true; + } + callback(hasExitContract); + }); + }, + + /** + * 获取信息详情 + * @param params 电话号码/会话id + * @param callback 返回信息内容 + * @return + */ + queryMessageDetail(actionData, callback) { + let result = {}; + mmsLog.log(CONVERSATION_TAG + 'queryMessageDetail() start'); + mConversationModel.queryMessageDetail(actionData, res => { + result.code = res.code; + if (res.code == common.int.SUCCESS) { + this.groupDetailMessage(res.abilityResult, actionData, resultList => { + result.response = resultList; + mmsLog.log(CONVERSATION_TAG + 'queryMessageDetail() result:' + result); + callback(result); + }); + } else { + mmsLog.log(CONVERSATION_TAG + 'Error: queryMessageDetail() failed !!!'); + callback(result); + } + }); + }, + convertConversationList(mmsList) { + let resultList = []; + for (let item of mmsList) { + let result = {}; + result.id = item.msgId; + result.content = item.msgContent; + result.isLock = item.isLock == 0 ? false : true; + result.isStared = item.isCollect == 0 ? false : true; + // 彩信相关字段 + result.msgType = 0; + result.isFullScreenImg = true; + result.read = item.isRead == 0 ? '0' : '1'; + if (item.msgState == 0) { + result.sendStatus = common.int.SEND_MESSAGE_SUCCESS; + } else if (item.msgState == 1) { + result.sendStatus = common.int.SEND_MESSAGE_FAILED; + } else if (item.msgState == 2){ + result.sendStatus = common.int.SEND_MESSAGE_SENDING; + } else { + result.sendStatus = common.int.SEND_DRAFT; + } + result.subId = 0; + result.timeMillisecond = item.startTime; + result.isMsm = item.msgType == 0 ? false : true; + result.isCbChecked = false; + result.isDraft = false; + // 群发相关字段 + result.groupId = item.groupId; + // 判断是接收方还是发送方 + result.isReceive = item.isSender == 0 ? false : true; + result.date = common.string.EMPTY_STR; + result.time = common.string.EMPTY_STR; + result.completeNumber = 0; + result.failuresNumber = 0; + result.hasReport = item.isSendReport == 0 ? false : true; + if (!result.isMsm) { + result.msgShowType = common.MESSAGE_SHOW_TYPE.NORMAL; + } + resultList.push(result); + } + return resultList; + }, + groupDetailMessage(mmsList, actionData, callback) { + let details = this.convertConversationList(mmsList); + let msgIds = []; + if (actionData.contactsNum == 1) { + for (let item of details) { + if (item.isMsm) { + msgIds.push(item.id); + } + } + this.dealMmsPartData(details, msgIds, actionData, res => { + callback(res); + }); + return; + } + let resultList = []; + // 需要根据groupId 进行分组 + let detailMap = this.convertConversationMap(details); + // 根据组进行 + let groupIds = detailMap.keys(); + for (let groupId of groupIds) { + let groups = detailMap.get(groupId); + let result = groups[0]; + let failuresNumber = 0; + let completeNumber = 0; + if (result.isMsm) { + msgIds.push(result.id); + } + for (let item of groups) { + if (item.sendStatus == common.int.SEND_MESSAGE_FAILED) { + failuresNumber++; + } + if (item.sendStatus == common.int.SEND_MESSAGE_FAILED || + item.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { + completeNumber++; + } + } + result.completeNumber = completeNumber; + result.failuresNumber = failuresNumber; + resultList.push(result); + } + this.dealMmsPartData(resultList, msgIds, actionData, res => { + callback(res); + }); + }, + dealMmsPartData(resultList, msgIds, actionData, callback) { + if (msgIds.length == 0) { + callback(resultList); + return; + } + actionData.msgIds = msgIds; + this.queryMmsPartByIds(actionData, res => { + let mmsParts = res.response; + let mmsPartMap = new Map(); + for (let item of mmsParts) { + if (mmsPartMap.has(item.msgId)) { + let strings = mmsPartMap.get(item.msgId); + strings.push(item); + } else { + let strings = []; + strings.push(item); + mmsPartMap.set(item.msgId, strings); + } + } + for (let item of resultList) { + if (mmsPartMap.has(item.id)) { + let mmsParts = mmsPartMap.get(item.id); + // 判断是否需要展示 0 普通样式, 1 主题, 2幻灯片, + item.mms = commonService.getMmsSource(mmsParts); + item.msgShowType = commonService.getDisplay(item.mms); + commonService.setItemMmsContent(item, item.mms); + } + } + callback(resultList); + }); + }, + convertConversationMap(details) { + let conversationMap = new Map(); + // 分组 + for (let element of details) { + if (conversationMap.has(element.groupId)) { + let groups = conversationMap.get(element.groupId); + groups.push(element); + } else { + let groups = []; + groups.push(element); + conversationMap.set(element.groupId, groups); + } + } + return conversationMap; + }, + + /** + * 插入会话详情及短信详情 + * @param rdbStore 数据库实例 + * @param sendResults 发送结果 + * @param threadId 会话列表ID + * @param isReceive 是否接收 + * @return + */ + insertSessionAndDetail(actionData, callback) { + mmsLog.info('insertSessionAndDetail,start:' + actionData); + let sendResults = actionData.sendResults; + let isReceive = actionData.isReceive; + if (sendResults.length == 0) { + return; + } + let param = this.dealSendResults(sendResults); + let rdbStore = actionData.rdbStore; + // 先判断是否创建过会话列表 + conversationListService.querySessionByTelephone(rdbStore, param.telephone, res => { + mmsLog.info(CONVERSATION_TAG + 'insertSessionAndDetail,querySessionByTelephone:' + res); + let response = res.response; + if (res.code == common.int.SUCCESS && response.id < 0) { + this.dealNoExitingSession(isReceive, param, actionData, callback); + } else { + this.dealExitingSession(response, param, actionData, callback); + } + }); + }, + dealNoExitingSession(isReceive, param, actionData, callback) { + let unreadCount = 0; + if (isReceive) { + unreadCount = 1; + } + let valueBucket = { + 'telephone': param.telephone, + 'content': param.content, + 'contacts_num': param.contractsNum, + 'sms_type': param.smsType, + 'unread_count': unreadCount, + 'sending_status': param.sendStatus, + 'has_draft': 0, + 'time': param.timestamp, + 'message_count': 1, + 'has_mms': actionData.isMms ? 1 : 0, + 'has_attachment': actionData.hasAttachment ? 1 : 0 + } + conversationListService.insertSession(actionData.rdbStore, valueBucket, sessionResult => { + // 这里调用短信数据库,插入短信信息 + this.dealInsertMessageDetail(param, actionData, sessionResult.rowId, res => { + mmsLog.info('dealInsertMessageDetail,initDatas:' + res); + let result = { + rowId: sessionResult.rowId, + initDatas: res.initDatas, + groupId: res.groupId + } + callback(result); + }); + }); + }, + dealExitingSession(response, param, actionData, callback) { + let sessionId = response.id; + // 这里调用短信数据库,插入短信信息 + let threadIds = [sessionId]; + let time = new Date(); + let unreadCount = 0; + if (actionData.isReceive) { + unreadCount = response.unreadCount; + unreadCount = unreadCount + 1; + } + let hasDraft = response.hasDraft; + if (actionData.hasDraft && hasDraft == 1) { + hasDraft = 0; + } + let messageCount = response.messageCount; + messageCount = messageCount + 1; + let valueBucket = { + 'content': param.content, + 'unread_count': unreadCount, + 'time': time.getTime(), + 'sending_status': param.sendStatus, + 'has_draft': hasDraft, + 'message_count': messageCount, + 'has_attachment': actionData.hasAttachment ? 1 : 0, + 'has_mms': actionData.isMms ? 1 : 0, + } + conversationListService.updateById(actionData.rdbStore, threadIds, valueBucket); + // 这里调用短信数据库,插入短信信息 + this.dealInsertMessageDetail(param, actionData, sessionId, res => { + mmsLog.info('dealInsertMessageDetail,initDatas:' + res); + let result = { + rowId: sessionId, + initDatas: res.initDatas, + groupId: res.groupId + } + callback(result); + }); + }, + dealInsertMessageDetail(param, actionData, threadId, callback) { + this.queryMaxGroupId(actionData, res => { + let maxGroupId = 0; + if (res.code === common.int.SUCCESS) { + maxGroupId = res.response.maxGroupId == common.string.EMPTY_STR ? 0 : parseInt(res.response.maxGroupId); + maxGroupId = maxGroupId + 1; + } else { + mmsLog.info('dealInsertMessageDetail, queryMaxGroupId fail !!!!!!'); + callback(); + } + this.insertMessageDetailByMaxGroupId(param, actionData, threadId, maxGroupId, result => { + callback(result); + }); + }); + }, + insertMessageDetailByMaxGroupId(param, actionData, threadId, maxGroupId, callback) { + let count = 0; + let initDatas = []; + let result = {}; + result.groupId = maxGroupId; + for (let sendResult of actionData.sendResults) { + let insertDetail = this.initInsertDetail(param, actionData, threadId, maxGroupId); + if (actionData.isReceive) { + insertDetail.receiverNumber = actionData.ownNumber; + insertDetail.senderNumber = sendResult.telephone; + insertDetail.isRead = 0; + } else { + insertDetail.receiverNumber = sendResult.telephone; + insertDetail.senderNumber = actionData.ownNumber; + insertDetail.isRead = 1; + } + insertDetail.sendStatus = sendResult.sendStatus; + if (sendResult.sendStatus == common.int.SEND_MESSAGE_FAILED) { + insertDetail.sendStatus = 1; + } else if (sendResult.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { + insertDetail.sendStatus = 0; + } + if (sendResult.time != null) { + insertDetail.time = sendResult.time; + } + this.insertMessageDetail(insertDetail, id => { + count++; + let initData = { + id: id, + telephone: sendResult.telephone + }; + initDatas.push(initData); + if (count == actionData.sendResults.length) { + result.initDatas = initDatas; + callback(result); + } + }); + } + }, + initInsertDetail(param, actionData, threadId, maxGroupId) { + let insertDetail = { + receiverNumber: common.string.EMPTY_STR, + senderNumber: common.string.EMPTY_STR, + smsType: param.smsType, + content: param.content, + sendStatus: 2, + sessionType: 0, + featureAbility: actionData.featureAbility, + threadId: threadId, + isSender: actionData.isSender, + groupId: maxGroupId, + time: common.string.EMPTY_STR, + hasReport: actionData.hasReport, + isMms: actionData.isMms, + mmsSource: actionData.mmsSource, + messageType: actionData.messageType + }; + return insertDetail; + }, + dealSendResults(sendResults) { + let contractsNum = sendResults.length; + let telephone = common.string.EMPTY_STR; + let content = common.string.EMPTY_STR; + // 发送成功 + let sendStatus = 0; + let failSum = 0; + let time = common.string.EMPTY_STR; + for (let sendResult of sendResults) { + telephone = telephone + sendResult.telephone + common.string.COMMA; + content = sendResult.content; + sendStatus = sendResult.sendStatus; + if (sendResult.sendStatus == common.int.SEND_MESSAGE_FAILED) { + failSum++; + } + if (sendResult.time != null) { + time = sendResult.time; + } + if (sendResult.isMessageSim != null && sendResult.isMessageSim) { + telephone = sendResult.telephone; + contractsNum = 1; + } + } + // 如果失败,那会话列表结果就是失败 + if (failSum > 0) { + sendStatus = common.int.SEND_MESSAGE_FAILED; + } + telephone = telephone.substring(0, telephone.length - 1); + let smsType = 0; + if (contractsNum == 1 && telephoneUtils.judgeIsInfoMsg(telephone)) { + smsType = 1; + } + let result = {}; + let timestamp = new Date().getTime(); + result.contractsNum = contractsNum; + result.content = content; + result.telephone = telephoneUtils.dealTelephoneSort(telephone); + result.sendStatus = sendStatus; + result.timestamp = time != common.string.EMPTY_STR ? time : timestamp; + result.smsType = smsType; + return result; + }, + + /** + * 插入短信信息 + * @param actionData 会话IDs + * @return + */ + insertMessageDetail(param, callback) { + let actionData = {}; + let time = new Date(); + let timeStr = param.time != common.string.EMPTY_STR ? param.time : time.getTime() + common.string.EMPTY_STR; + var stringValue = { + 'receiver_number': param.receiverNumber, + 'sender_number': param.senderNumber, + 'start_time': timeStr, + 'end_time': timeStr, + 'msg_type': param.isMms ? '1' : '0', + 'sms_type': param.smsType, + 'msg_title': param.content, + 'msg_content': param.content, + 'msg_state': param.sendStatus, + 'operator_service_number': common.string.EMPTY_STR, + 'msg_code': common.string.EMPTY_STR, + 'session_id': param.threadId, + 'is_lock': '0', + 'is_read': param.isRead, + 'is_collect': '0', + 'session_type': param.sessionType, + 'is_sender': param.isSender, + 'group_id': param.groupId, + 'is_send_report': param.hasReport + }; + mmsLog.info(CONVERSATION_TAG + 'insertMessageDetail stringValue:' + stringValue); + actionData.stringValue = stringValue; + actionData.featureAbility = param.featureAbility; + mConversationModel.insertMessageDetail(actionData, result => { + if (result.code == common.int.SUCCESS) { + this.dealBatchInsertMmsPart(param, result, callback); + } else { + mmsLog.info(CONVERSATION_TAG + 'insertMessageDetail fail'); + } + }); + }, + dealBatchInsertMmsPart(param, result, callback) { + if (param.isMms) { + param.msgId = result.abilityResult; + this.batchInsertMmsPart(param, res => { + callback(result.abilityResult); + }); + } else { + callback(result.abilityResult); + } + }, + batchInsertMmsPart(param, callback) { + let actionData = {}; + actionData.featureAbility = param.featureAbility; + let bacthmsParts = []; + for (let mms of param.mmsSource) { + let stringValue = { + 'msg_id': param.msgId, + 'group_id': param.groupId, + 'type': mms.msgType, + 'location_path': mms.msgUriPath, + 'content': mms.content, + 'recording_time': mms.time, + 'part_size': (mms.fileSize + ''), + 'state': param.messageType + }; + bacthmsParts.push(stringValue); + } + actionData.bacthmsParts = bacthmsParts; + mConversationModel.batchInsertMmsPart(actionData, callback); + }, + updateSessionAndDetail(actionData) { + let sendResults = actionData.sendResults; + if (sendResults.length == 0) { + return; + } + let param = this.dealSendResults(sendResults); + mmsLog.info(CONVERSATION_TAG + 'updateSessionAndDetail,param:' + param); + // 更新会话列表的状态 + let rdbStore = actionData.rdbStore; + let threadIds = [actionData.threadId]; + let valueBucket = { + 'sending_status': param.sendStatus, + 'content': param.content + } + conversationListService.updateById(rdbStore, threadIds, valueBucket); + // 更新信息列表的状态 + for (let sendResult of sendResults) { + actionData.sendStatus = sendResult.sendStatus; + if (sendResult.sendStatus == common.int.SEND_MESSAGE_FAILED) { + actionData.sendStatus = 1; + } else if (sendResult.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { + actionData.sendStatus = 0; + } else { + actionData.sendStatus = 2; + } + actionData.msgId = sendResult.id; + this.updateById(actionData, result => { + mmsLog.info(CONVERSATION_TAG + 'updateById,result:' + result); + }); + } + }, + + /** + * 根据会话ID,批量删除列表数据 + * @param threadIds 会话IDs + * @return + */ + deleteMessageBySessionIds(actionData) { + mConversationModel.queryGroupIdBySessionId(actionData, res => { + if (res.code == common.int.SUCCESS) { + mConversationModel.deleteMessageBySessionIds(actionData); + let groupIds = res.abilityResult; + actionData.groupIds = groupIds; + mConversationModel.deleteMmsPartByGroupIds(actionData); + } + }); + }, + + /** + * 根据ID,批量删除列表数据 + * @param 主键ID 会话IDs + * @return + */ + deleteMessageByIds(actionData) { + mConversationModel.deleteMessageByIds(actionData); + }, + deleteMessageBySessionIdsAndLock(actionData) { + mConversationModel.deleteMessageBySessionIdsAndLock(actionData); + }, + + /** + * 根据GroupID,批量删除列表数据 + * @param 主键ID 会话IDs + * @return + */ + deleteMessageByGroupIds(actionData) { + mConversationModel.deleteMessageByGroupIds(actionData); + // 删除彩信的数据 + mConversationModel.deleteMmsPartByGroupIds(actionData); + }, + + /** + * 根据批量标记 + * @param actionData + * @return + */ + markAllAsRead(actionData) { + mConversationModel.markAllAsRead(actionData); + }, + + /** + * 根据批量标记 + * @param actionData + * @return + */ + markAllToRead(actionData) { + mConversationModel.markAllToRead(actionData); + }, + + /** + * 根据单个id,进行更新 + * @param actionData + * @param callback + */ + updateById(actionData, callback) { + let result = {}; + mConversationModel.updateById(actionData, res => { + result.code = res.code; + callback(result); + }); + }, + + /** + * 判断卡是否存在 + * + * @param {Object} preferences 偏量数据库 + */ + judgeHasSimCard(preferences) { + let count = preferences.getCountOfSim(); + if (count > 0) { + return true; + } + return false; + }, + + /** + * 查询最大的groupId + * @param actionData 参数 + * @param callBack 回调 + * @return + */ + queryMaxGroupId(actionData, callBack) { + let result = {}; + mmsLog.info(CONVERSATION_TAG + 'queryMaxGroupId, start:' + actionData); + mConversationModel.queryMaxGroupId(actionData, res => { + result.code = res.code; + if (res.code == common.int.SUCCESS) { + result.response = res.abilityResult; + } else { + mmsLog.info(CONVERSATION_TAG + 'Error: queryMaxGroupId() failed !!!'); + } + callBack(result); + }); + }, + + /** + * 保存图片 + * @param params threadId,pduId + * @param callback 保存状态 + * @return + */ + saveImage(params, callback) { + mConversationModel.saveImage(params, function (result) { + let message = ''; + if (result.code == common.int.SUCCESS) { + mmsLog.info(CONVERSATION_TAG + 'saveImage success'); + message = this.$t('strings.attachment_saved_to') + result.abilityResult.filePath + + this.$t('strings.please_keep_it_secure'); + } else { + mmsLog.info(CONVERSATION_TAG + 'saveImage error'); + message = this.$t('string.save_img_failed'); + } + callback(message); + }); + }, + + /** + * 分享 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + gotoShare(actionData, callback) { + let result = {}; + mConversationModel.gotoShare(actionData, res => { + result.code = res.code; + }); + callback(result); + }, + + /** + * 更新锁标记 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + updateLock(actionData, callback) { + let result = {}; + mConversationModel.updateLock(actionData, res => { + result.code = res.code; + callback(result); + }); + }, + + /** + * 更新收藏 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + updateCollect(actionData, callback) { + let result = {}; + mConversationModel.updateCollect(actionData, res => { + result.code = res.code; + callback(result); + }); + }, + + /** + * 模糊搜索,根据内容 + * @param actionData 参数 + * @return + */ + searchMessageByContent(actionData, callback) { + let smsPromise = new Promise((resolve, reject) => { + this.searchSmsMessageByContent(actionData, res => { + if (res.code === common.int.SUCCESS) { + resolve(res.response); + } else { + reject(res.code); + } + }); + }); + // 信息列表搜索的数据 + let mmsPartPromise = new Promise((resolve, reject) => { + this.searchMmsPartByContent(actionData, res => { + if (res.code === common.int.SUCCESS) { + resolve(res.response); + } else { + reject(res.code); + } + }); + }); + let result = {}; + Promise.all([smsPromise,mmsPartPromise]).then((res) => { + result.code = common.int.SUCCESS; + let resultList = []; + resultList = resultList.concat(res[0]); + resultList = resultList.concat(res[1]); + result.response = this.dealMessageSort(resultList); + callback(result); + }).catch((err) => { + mmsLog.log(CONVERSATION_TAG + 'searchMessageByContent error: ' + err); + result.code = common.int.FAILURE; + callback(result); + }); + }, + dealMessageSort(resultList) { + let favoriteList = []; + let messageList = []; + for(let item of resultList) { + if(item.isFavorite) { + favoriteList.push(item); + } else { + messageList.push(item); + } + } + let response = []; + // 收藏列表倒排 + if (favoriteList.length > 0) { + // 倒排 + favoriteList.sort((a, b) => { + return b.timeMillisecond - a.timeMillisecond + }); + response = response.concat(favoriteList); + } + // 普通短信列表倒排 + if (messageList.length > 0) { + // 倒排 + messageList.sort((a, b) => { + return b.timeMillisecond - a.timeMillisecond + }) + response = response.concat(messageList); + } + return response; + }, + + /** + * 模糊搜索,根据内容 + * @param actionData 参数 + * @return + */ + searchSmsMessageByContent(actionData, callback) { + let searchText = actionData.inputValue; + actionData.content = searchText; + let result = {}; + // 这里需要掉用查询详情 + mConversationModel.searchSmsMessageByContent(actionData, res => { + result.code = res.code; + if (res.code == common.int.SUCCESS) { + let telephones = []; + let resultList = this.convertLikeConversation(res.abilityResult, searchText, telephones, new Map()); + this.dealContactsName(telephones, actionData, resultList, sessionList => { + result.response = sessionList; + callback(result); + }); + } else { + callback(result); + } + }); + }, + convertLikeConversation(mmsList, searchText, telephones, mmsPartMap) { + let resultList = []; + for (let item of mmsList) { + let map = {}; + map.content = item.msgContent; + if(mmsPartMap.has(item.msgId)) { + map.content = mmsPartMap.get(item.msgId).content; + } + map.name = common.string.EMPTY_STR; + map.telephone = item.receiverNumber; + map.telephoneFormat = item.receiverNumber; + if(item.isSender == 1) { + map.telephone = item.senderNumber; + map.telephoneFormat = item.senderNumber; + } + telephones.push(map.telephone); + map.nameFormatter = map.name + '<' + map.telephoneFormat + '>'; + map.date = common.string.EMPTY_STR; + map.time = common.string.EMPTY_STR; + map.timeMillisecond = item.startTime; + map.isFavorite = item.isCollect == 0 ? false : true; + map.threadId = item.sessionId; + if (item.smsType == 0) { + map.icon = '/common/icon/user_avatar_full_fill.svg'; + } else { + map.icon = '/common/icon/entrance_icon01.svg'; + } + map.groupId = item.groupId; + resultList.push(map); + } + return resultList; + }, + dealContactsName(telephones, actionData, resultList, callback) { + actionData.telephones = telephones; + if (telephones.length == 0) { + callback(resultList); + } + contractService.queryContactDataByTelephone(actionData, contacts => { + let groupIdMap = {}; + if (contacts.length == 0) { + groupIdMap = this.convertingMessageByGroup(resultList); + } else { + // 将结果转换为Map,key:手机号,value: 名称 + let telephoneMap = new Map(); + for (let item of contacts) { + if (item.displayName == common.string.EMPTY_STR) { + telephoneMap.set(item.detailInfo, item.detailInfo); + } else { + telephoneMap.set(item.detailInfo, item.displayName); + } + } + // 将结果根据手机号进行匹配 + groupIdMap = this.getGroupIdMap(resultList, telephoneMap); + } + let lists = []; + let favoriteList = []; + for (let key of Object.keys(groupIdMap)) { + let value = groupIdMap[key]; + let contactsNums = value.telephone.split(common.string.COMMA); + value.contactsNum = contactsNums.length; + if (value.isFavorite) { + let temp = JSON.parse(JSON.stringify(value)); + temp.icon = '/common/icon/icon_favorite.svg'; + favoriteList.push(temp); + value.isFavorite = false; + } + lists.push(value); + } + // 将收藏的数据,放入到搜索的列表中 + if (favoriteList.length > 0) { + lists = lists.concat(favoriteList); + } + callback(lists); + }); + }, + getGroupIdMap(resultList, telephoneMap) { + let groupIdMap = {}; + for (let map of resultList) { + // 多人名称的组合,名称是需要组合展示 + if (telephoneMap.has(map.telephone)) { + map.name = telephoneMap.get(map.telephone); + map.nameFormatter = map.name + '<' + map.telephoneFormat + '>'; + } else { + map.nameFormatter = map.telephoneFormat; + } + if (Object.keys(groupIdMap).indexOf(map.groupId) > -1) { + let list = groupIdMap[map.groupId]; + list.name = list.name + common.string.COMMA + map.name; + list.nameFormatter = list.nameFormatter + common.string.COMMA + map.nameFormatter; + list.telephone = list.telephone + common.string.COMMA + map.telephone; + list.telephoneFormat = list.telephoneFormat + common.string.COMMA + map.telephoneFormat; + } else { + groupIdMap[map.groupId] = map; + } + } + return groupIdMap; + }, + convertingMessageByGroup(resultList) { + let groupIdMap = {}; + for (let element of resultList) { + if (Object.keys(groupIdMap).indexOf(element.groupId) == -1) { + groupIdMap[element.groupId] = element; + } + } + return groupIdMap; + }, + + /** + * 模糊搜索彩信,根据内容 + * @param actionData 参数 + * @return + */ + searchMmsPartByContent(actionData, callback) { + let searchText = actionData.inputValue; + actionData.content = searchText; + // 这里需要掉用查询详情 + let result = {}; + mConversationModel.searchMmsPartByContent(actionData, res => { + result.code = res.code; + if (res.code == common.int.SUCCESS) { + let mmsPartMap = this.getMmsPartMap(res.abilityResult); + actionData.msgIds = this.getMsgIds(mmsPartMap); + if(actionData.msgIds.length == 0) { + result.response = []; + callback(result); + return; + } + this.buildMmsPartContacts(actionData, searchText, mmsPartMap, sessionList => { + result.response = sessionList; + callback(result); + }); + } else { + mmsLog.info(CONVERSATION_TAG + 'Error: searchMmsPartByContent() failed !!!'); + callback(result); + } + }); + }, + buildMmsPartContacts(actionData, searchText, mmsPartMap, callback) { + mConversationModel.queryMessageDetail(actionData, messageDetails => { + let telephones = []; + let mmsParts = messageDetails.abilityResult; + let resultList = this.convertLikeConversation(mmsParts, searchText, telephones, mmsPartMap); + this.dealContactsName(telephones, actionData, resultList, sessionList => { + callback(sessionList); + }); + }); + }, + getMmsPartMap(mmsParts) { + let mmsPartMap = new Map(); + // 分组 + for (let element of mmsParts) { + if (!mmsPartMap.has(element.msgId)) { + mmsPartMap.set(element.msgId, element); + } + } + return mmsPartMap; + }, + getMsgIds(mmsPartMap) { + let msgIds = []; + for(let msgId of mmsPartMap.keys()) { + msgIds.push(msgId); + } + return msgIds; + }, + + /** + * 从图库中获取图片和视频 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + queryFromGallery(actionData, callback) { + let result = {}; + mConversationModel.queryFromGallery(actionData, res => { + result.code = res.code; + result.pictureListFromGallery = res.abilityResult; + }); + callback(result); + }, + + /** + * 查询最近30天的短信 + * @param actionData 参数 + * @param callBack 回调 + * @return + */ + queryMessageThirty(actionData, callBack) { + let result = {}; + mmsLog.info(CONVERSATION_TAG + 'queryMessageThirty, start:' + actionData); + mConversationModel.queryMessageThirty(actionData, res => { + mmsLog.info(CONVERSATION_TAG + 'queryMessageThirty, end:' + res); + result.code = res.code; + if (res.code == common.int.SUCCESS) { + result.response = res.abilityResult; + } else { + mmsLog.info(CONVERSATION_TAG + 'Error: queryMessageThirty() failed !!!'); + } + callBack(result); + }); + }, + + /** + * 插入SIM卡中数据 + * @param actionData 参数 + * @param callback 回调 + */ + insertManageSimData(actionData, callback) { + let rdbStore = actionData.rdbStore; + let sendResults = actionData.sendResults; + let value = this.dealSendResults(sendResults); + // 先判断是否创建过会话列表 + conversationListService.querySessionByTelephone(rdbStore, value.telephone, res => { + mmsLog.info(CONVERSATION_TAG + 'insertManageSimData,querySessionByTelephone:' + res); + let response = res.response; + if (res.code == common.int.SUCCESS && response.id < 0) { + this.insertManageSimNoExiting(value, actionData, callback); + } else { + let sessionId = response.id; + this.dealInsertMessageDetail(value, actionData, sessionId, res => { + let result = { + rowId: sessionId, + initDatas: res.initDatas, + groupId: res.groupId + } + callback(result); + }); + } + }); + }, + + insertManageSimNoExiting(value, actionData, callback) { + let valueBucket = { + 'telephone': value.telephone, + 'content': value.content, + 'contacts_num': value.contractsNum, + 'sms_type': value.smsType, + 'unread_count': 0, + 'sending_status': value.sendStatus, + 'has_draft': 0, + 'time': value.timestamp, + 'message_count': 1 + } + conversationListService.insertSession(actionData.rdbStore, valueBucket, sessionResult => { + // 这里调用短信数据库,插入短信信息 + mmsLog.info(CONVERSATION_TAG + 'insertSession,rowId:' + sessionResult); + this.dealInsertMessageDetail(value, actionData, sessionResult.rowId, res => { + mmsLog.info(CONVERSATION_TAG + 'dealInsertMessageDetail,initDatas:' + res); + let result = { + rowId: sessionResult.rowId, + initDatas: res.initDatas, + groupId: res.groupId + } + callback(result); + }); + }); + }, + + /** + * 统计未读通知个数 + * @param actionData + * @param callback + */ + statisticsUnreadNotify(actionData, callback) { + mConversationModel.statisticsUnreadNotify(actionData, res => { + if (res.code == common.int.SUCCESS) { + mmsLog.info('statisticsUnreadNotify result success ' + res); + callback(res.abilityResult); + } else { + mmsLog.info('statisticsUnreadNotify result err'); + callback(0); + } + }); + }, + + /** + * 根据groupId 查询彩信的信息 + * @param actionData 条件 + * @param callback 返回值 + */ + queryMmsPartByIds(actionData, callback) { + let result = {}; + mConversationModel.queryMmsPart(actionData, res => { + result.code = res.code; + if (res.code == common.int.SUCCESS) { + result.response = res.abilityResult; + } else { + mmsLog.log(CONVERSATION_TAG + 'Error: queryMessageDetail() failed !!!'); + } + callback(result); + }); + }, + + /** + * 根据SessionId获取锁的状态 + * @param actionData 参数 + * @param callback 返回信息内容 + * @return + */ + queryMessageLockBySessionId(actionData, callback) { + let result = {}; + mmsLog.info(CONVERSATION_TAG + 'queryMessageLockBySessionId() start'); + mConversationModel.queryMessageLockBySessionId(actionData, res => { + result.code = res.code; + if (res.code == common.int.SUCCESS) { + callback(res.abilityResult); + } else { + mmsLog.info(CONVERSATION_TAG + 'Error: queryMessageLockBySessionId() failed !!!'); + callback(result); + } + }); + }, +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/GroupDetailService.js b/entry/src/main/js/default/service/GroupDetailService.js new file mode 100644 index 0000000..07120b2 --- /dev/null +++ b/entry/src/main/js/default/service/GroupDetailService.js @@ -0,0 +1,157 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import GroupDetailImplModel from '../model/groupDetailImpl/GroupDetailImplModel.js' + +const groupDetailImplModel = new GroupDetailImplModel(); +import common from '../pages/common_constants.js'; +import mmsLog from '../utils//MmsLog.js'; +import contractService from '../service/ContractService.js'; +import conversationListService from '../service/ConversationListService.js'; + +const TAG = 'GroupDetailService ->'; + +export default { + + /** + * 判断是否需要全部重新发送 + * @param contactList 发送短信的列表 + * @param callback 回调函数 + * @return + */ + judgeIsAllSendFail(contactList, callback) { + let count = 0; + let isAllSendFail = false; + for (let element of contactList) { + if (element.sendStatus == 2) { + isAllSendFail = true; + } else { + count++; + } + } + if (count == contactList.length) { + isAllSendFail = false; + } + callback(isAllSendFail); + }, + + /** + * 查询详情的相关数据列表 + * @param isDetail 是否查询详情 + * @param actionData groupId/threadId + * @param callback 回调函数 + * @return + */ + queryContactSendDetail(isDetail, actionData, callback) { + if (isDetail) { + this.queryGroupDetail(actionData, res => { + callback(res); + }); + } else { + this.queryRecipients(actionData, res => { + callback(res); + }); + } + }, + queryGroupDetail(actionData, callback) { + let result = {}; + mmsLog.log(TAG + 'queryGroupDetail start'); + groupDetailImplModel.queryGroupDetail(actionData, res => { + mmsLog.log(TAG + 'groupDetailByParams Success'); + result.code = res.code; + if (res.code == common.int.SUCCESS) { + let telephones = []; + result.contactList = this.dealGroupDetail(res.abilityResult, telephones); + this.dealContactsName(telephones, actionData, result.contactList, contactList => { + result.contactList = contactList; + callback(result); + }); + } else { + mmsLog.info(TAG + 'Error: queryContactSendDetail failed !!!'); + } + callback(result); + }); + }, + queryRecipients(actionData, callback) { + let result = {}; + let rdbStore = actionData.rdbStore; + let threadId = actionData.threadId; + mmsLog.log(TAG + 'querySessionById start'); + conversationListService.querySessionById(rdbStore, threadId, res => { + result.code = res.code; + if (res.code == common.int.SUCCESS && res.response.telephone != common.string.EMPTY_STR) { + let telephones = res.response.telephone.split(common.string.COMMA); + let contactList = []; + for (let telephone of telephones) { + let recipient = {}; + recipient.contactName = common.string.EMPTY_STR; + recipient.telephone = telephone; + recipient.telephoneFormat = telephone; + contactList.push(recipient); + } + this.dealContactsName(telephones, actionData, contactList, contactList => { + result.contactList = contactList; + callback(result); + }); + } + }); + }, + dealGroupDetail(groupDetails, telephones) { + let results = []; + for (let groupDetail of groupDetails) { + let item = {}; + item.contactName = common.string.EMPTY_STR; + item.date = common.string.EMPTY_STR; + item.time = common.string.EMPTY_STR; + if (groupDetail.msgState == 0) { + item.sendStatus = common.int.SEND_MESSAGE_SUCCESS; + } else if (groupDetail.msgState == 1) { + item.sendStatus = common.int.SEND_MESSAGE_FAILED; + } else { + item.sendStatus = common.int.SEND_MESSAGE_SENDING; + } + telephones.push(groupDetail.receiverNumber); + item.telephone = groupDetail.receiverNumber; + item.telephoneFormat = groupDetail.receiverNumber; + item.timeMillisecond = groupDetail.startTime; + item.id = groupDetail.msgId; + results.push(item); + } + return results; + }, + dealContactsName(telephones, actionData, contactList, callback) { + actionData.telephones = telephones; + if (telephones.length == 0) { + callback(contactList); + } + contractService.queryContactDataByTelephone(actionData, contacts => { + if (contacts.length == 0) { + callback(contactList); + } + // 将结果转换为Map,key:手机号,value: 名称 + let telephoneMap = new Map(); + for (let item of contacts) { + telephoneMap.set(item.detailInfo, item.displayName); + } + // 将结果根据手机号进行匹配 + for (let session of contactList) { + if (telephoneMap.has(session.telephone)) { + session.contactName = telephoneMap.get(session.telephone); + } + } + callback(contactList); + }); + }, +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/MyStarService.js b/entry/src/main/js/default/service/MyStarService.js new file mode 100644 index 0000000..874422c --- /dev/null +++ b/entry/src/main/js/default/service/MyStarService.js @@ -0,0 +1,363 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import MyStarModel from '../model/myStarImpl/MyStarImplModel.js' +let myStatModel = new MyStarModel(); +import { commonPasteboard } from '../../default/utils/Pasteboard.js'; +import mmsLog from '../utils/MmsLog.js'; +import common from '../pages/common_constants.js'; +import contractService from '../service/ContractService.js'; +import commonService from '../service/CommonService.js'; +import conversationService from '../service/ConversationService.js'; + +const TAG = 'MyStarService ->'; +export default { + + /** + * 获取收藏列表 + * @param actionData 查询条件 + * @param callBack 回调函数 + * @return + */ + queryFavoriteMessageList(actionData, callBack) { + let result = {}; + let listPromise = new Promise((resolve, reject) => { + myStatModel.queryFavoriteMessageList(actionData, res => { + if (res.code === common.int.SUCCESS) { + resolve(res); + } else { + mmsLog.info(TAG + 'Error: queryFavoriteMessageList() failed !!!'); + reject(res); + } + }); + }); + let countPromise = new Promise((resolve, reject) => { + myStatModel.countFavoriteList(actionData, res => { + if (res.code === common.int.SUCCESS) { + resolve(res); + } else { + mmsLog.info(TAG + 'Error: countFavoriteList() failed !!!'); + reject(res); + } + }); + }); + let promiseAll = Promise.all([listPromise, countPromise]); + promiseAll.then(res => { + let listResult = res[0]; + let countResult = res[1]; + result.total = countResult.abilityResult; + result.code = listResult.code; + let telephones = []; + this.groupFavoriteMessage(listResult.abilityResult, telephones, actionData, favoriteList => { + this.dealContactsName(telephones, actionData, favoriteList, list => { + result.response = list; + callBack(result); + }); + }); + }).catch(err => { + mmsLog.log(TAG + 'queryFavoriteMessageList error: ' + err); + result.code = common.int.FAILURE; + callBack(result); + }) + }, + + /** + * 收藏数据处理 + * @param favoriteList + */ + convertMyStarList(favoriteList) { + let resultList = []; + for(let item of favoriteList) { + let result = {}; + result.id = item.msgId; + result.image = '/common/icon/user_avatar_full_fill.svg'; + result.content = item.msgContent; + result.timeMillisecond = item.startTime; + result.isMsm = item.msgType == 0 ? false : true; + result.isCbChecked = false; + result.msgType = 0; + // 判断是接收方还是发送方 + result.date = common.string.EMPTY_STR; + result.time = common.string.EMPTY_STR; + result.groupId = item.groupId; + result.isSender = item.isSender; + result.isReceive = (item.isSender == 0) ? false : true; + if (result.isReceive) { + result.receiverNumber = item.senderNumber; + result.address = result.receiverNumber; + } else { + result.receiverNumber = item.receiverNumber; + result.address = ''; + } + if (!result.isMsm) { + result.msgShowType = common.MESSAGE_SHOW_TYPE.NORMAL; + } + result.sessionId = item.sessionId; + resultList.push(result); + } + return resultList; + }, + + /** + * 收藏数据分组 + * @param starList + * @param telephones + */ + groupFavoriteMessage(starList, telephones, actionData, callback) { + let details = this.convertMyStarList(starList); + let resultList = []; + // 需要根据groupId 进行分组 + let detailMap = new Map(); + for(let item of details) { + if(detailMap.has(item.groupId)) { + let groups = detailMap.get(item.groupId); + groups.push(item); + } else { + let groups = []; + groups.push(item); + detailMap.set(item.groupId, groups); + } + } + // 根据组进行 + let groupIds = detailMap.keys(); + let mmsPartIds = []; + for(let groupId of groupIds) { + let groups = detailMap.get(groupId); + let result = groups[groups.length - 1]; + let numbers = []; + if(result.isMsm) { + mmsPartIds.push(result.id); + } + for(let item of groups) { + numbers.push(item.receiverNumber); + telephones.push(item.receiverNumber); + } + result.receiverNumber = numbers.join(common.string.COMMA); + resultList.push(result); + } + this.dealMmsPartData(resultList, mmsPartIds, actionData, res => { + callback(res); + }); + }, + dealMmsPartData(resultList, msgIds, actionData, callback) { + if(msgIds.length == 0) { + callback(resultList); + return; + } + actionData.msgIds = msgIds; + conversationService.queryMmsPartByIds(actionData, res => { + let mmsParts = res.response; + let favoriteMmsPartMap = new Map(); + for (let part of mmsParts) { + if (favoriteMmsPartMap.has(part.msgId)) { + let strings = favoriteMmsPartMap.get(part.msgId); + strings.push(part); + } else { + let strings = []; + strings.push(part); + favoriteMmsPartMap.set(part.msgId, strings); + } + } + for (let starItem of resultList) { + if (favoriteMmsPartMap.has(starItem.id)) { + let parts = favoriteMmsPartMap.get(starItem.id); + // 判断是否需要展示 0 普通样式, 1 主题, 2幻灯片, + starItem.mms = commonService.getMmsSource(parts); + starItem.msgShowType = commonService.getDisplay(starItem.mms); + commonService.setItemMmsContent(starItem, starItem.mms); + } + } + callback(resultList); + }); + }, + + /** + * 根据号码获取联系人姓名 + * @param telephones + * @param actionData + * @param favoritelist + * @param callback + */ + dealContactsName(telephones, actionData, favoritelist, callback) { + actionData.telephones = telephones; + if (telephones.length == 0) { + callback(favoritelist); + return; + } + contractService.queryContactDataByTelephone(actionData, contacts => { + if (contacts.length == 0) { + callback(favoritelist); + } else { + // 将结果转换为Map,key:手机号,value: 名称 + let telephoneMap = this.getAddressMap(contacts); + // 将结果根据手机号进行匹配 + this.buildAddress(favoritelist, telephoneMap); + callback(favoritelist); + } + }); + }, + getAddressMap(contacts) { + let addressMap = new Map(); + for (let item of contacts) { + if (item.displayName == common.string.EMPTY_STR) { + addressMap.set(item.detailInfo, item.detailInfo); + } else { + addressMap.set(item.detailInfo, item.displayName); + } + } + return addressMap; + }, + buildAddress(favoritelist, telephoneMap) { + for (let list of favoritelist) { + // 多人名称的组合,名称是需要组合展示 + if (!list.isReceive) { + list.address = common.string.EMPTY_STR; + } else { + this.getNameAndAddress(list, telephoneMap); + } + } + }, + getNameAndAddress(list, telephoneMap) { + if (list.receiverNumber.indexOf(common.string.COMMA) > -1) { + let tels = list.receiverNumber.split(common.string.COMMA); + let name = common.string.EMPTY_STR; + for (let telephone of tels) { + if (telephoneMap.has(telephone)) { + name = name + telephoneMap.get(telephone) + common.string.COMMA; + } else { + name = name + telephone + common.string.COMMA; + } + } + list.address = name.substring(0, name.length - 1); + } else { + if (telephoneMap.has(list.receiverNumber)) { + list.address = telephoneMap.get(list.receiverNumber); + } else { + list.address = list.receiverNumber; + } + } + }, + + /** + * 计算列表被选中的值 + * @param mmsList 列表数据 + * @param isAllSelect 是否全选 + * @return 统计数据 + */ + calculateChecked(mmsList, isAllSelect){ + let count = 0; + let textCount = 0; + let mmsCount = 0; + let mmCheckedList = []; + let result = {}; + for(let item of mmsList) { + if(isAllSelect || item.isCbChecked) { + mmCheckedList.push(item); + count++; + if (item.isMsm) { + mmsCount++; + } else { + textCount++; + } + if(item.isMsm && this.judgeIsContainText(item.mms)) { + textCount++; + } + } + } + result.count = count; + result.textCount = textCount; + result.mmsCount = mmsCount; + result.mmCheckedList = mmCheckedList; + return result; + }, + + /** + * 判断是否存在文本 + * @param mmCheckedList 彩信列表 + * @return + */ + judgeIsContainText(mmsSource) { + let flage = false; + if(mmsSource == null || mmsSource.length == 0) { + return flage; + } + let textCount = 0; + for(let item of mmsSource) { + let msgType = item.msgType; + if(common.MSG_ITEM_TYPE.TEXT == msgType) { + flage = true; + textCount ++; + } + if((common.MSG_ITEM_TYPE.IMAGE == msgType || common.MSG_ITEM_TYPE.AUDIO == msgType + || common.MSG_ITEM_TYPE.VIDEO == msgType) && item.content !== common.string.EMPTY_STR) { + flage = true; + } + } + if(textCount == mmsSource.length) { + flage = false; + } + return flage; + }, + + /** + * 复制被选中的文本 + * @param mmCheckedList 选中的列表 + * @return + */ + textCopy(mmCheckedList){ + let strText = common.string.EMPTY_STR; + let index = 0; + for(let element of mmCheckedList) { + if (element.isCbChecked && element.msgType.indexOf(0) != -1) { + // 判断是否包含文本信息 + let splitStr = common.string.EMPTY_STR; + if (index < mmCheckedList.length - 1) { + splitStr = '\n'; + } + strText += element.content; + strText += splitStr; + } + index++; + } + commonPasteboard.setPasteboard(strText); + }, + + /** + * 保存图片 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + saveImage(actionData, callback) { + let result = { + code: 0, + filePath: '/common/icon/test.jpg' + } + callback(result); + }, + + /** + * 调用分享功能接口 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + favoriteShare(actionData, callback) { + let result = { + code: 0, + } + callback(result); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/NotificationService.js b/entry/src/main/js/default/service/NotificationService.js new file mode 100644 index 0000000..b3baa62 --- /dev/null +++ b/entry/src/main/js/default/service/NotificationService.js @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import wantAgent from '@ohos.wantAgent'; +import notify from '@ohos.notification'; +import common from '../pages/common_constants.js'; +import mmsLog from '../utils/MmsLog.js'; +import conversationService from '../service/ConversationService.js'; +const label = 'notification_'; + +export default { + + /** + * 发送通知 + * @param actionData 通知参数 + * @return + */ + sendNotify(actionData) { + // 创建Want信息 + let wantAgentInfo = this.buildWantAgentInfo(actionData); + // 构建发送请求 + let notificationRequest = this.buildNotificationRequest(actionData); + wantAgentInfo.requestCode = actionData.msgId; + this.getWantAgent(wantAgentInfo, (data) => { + notificationRequest.wantAgent = data; + notificationRequest.id = actionData.msgId; + notificationRequest.label = label + actionData.msgId; + notify.publish(notificationRequest); + mmsLog.log('notification finished'); + }); + }, + + /** + * 创建需要发送的跳转的Want + * @param agentInfo 参数 + * @param callback 回调 + * @return + */ + getWantAgent(agentInfo, callback) { + mmsLog.log('notification start:' + agentInfo); + wantAgent.getWantAgent(agentInfo).then(data1 => { + callback(data1); + }); + }, + + /** + * 构建分布式拉起参数 + * @param actionData 参数 + * @return + */ + buildWantAgentInfo(actionData) { + let parameters = {}; + parameters.pageFlag = 'conversation'; + parameters.contactObjects = actionData.contactObjects; + let wantAgentInfo = { + wants: [ + { + deviceId: 'receive', + bundleName: common.string.BUNDLE_NAME, + abilityName: common.string.ABILITY_NAME, + entities: [common.string.COMMON_ENTITIES], + type: 'MIMETYPE', + uri: parameters.pageFlag, + parameters: parameters, + } + ], + operationType: wantAgent.OperationType.START_ABILITY, + requestCode: 0 + }; + return wantAgentInfo; + }, + + /** + * 构建通知参数 + * @param actionData 参数 + * @return + */ + buildNotificationRequest(actionData) { + let message = actionData.message; + let notificationRequest = { + content:{ + contentType: notify.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, + normal: { + title: message.title, + text: message.text + }, + }, + wantAgent: '', + slotType: notify.SlotType.OTHER_TYPES, + deliveryTime: new Date().getTime() + }; + return notificationRequest; + }, + cancelMessageNotify(actionData, callback) { + conversationService.queryMessageDetail(actionData, res => { + if (res.code == common.int.FAILURE || res.response.length == 0) { + callback(common.int.FAILURE); + } + let count = 0; + for(let item of res.response) { + this.cancelNotify(parseInt(item.id), result => { + mmsLog.log('cancelNotify, success: ' + result); + count ++; + if (count == res.response.length) { + callback(common.int.SUCCESS); + } + }); + } + }); + }, + cancelNotify(msgId, callback) { + notify.cancel(msgId, label + msgId, (err, data) => { + if (err) { + mmsLog.log('cancelNotify, error: ' + err); + callback(common.int.FAILURE); + } + mmsLog.log('cancelNotify success: ' + data); + callback(common.int.SUCCESS); + }); + }, + cancelAllNotify() { + let promise = notify.cancelAll(); + promise.then((ret) => { + mmsLog.log('cancelAllNotify success: ' + ret); + }).catch((err) => { + mmsLog.log('cancelAllNotify, error: ' + err); + }); + } +}; \ No newline at end of file diff --git a/entry/src/main/js/default/service/SendMsgService.js b/entry/src/main/js/default/service/SendMsgService.js new file mode 100644 index 0000000..89277b6 --- /dev/null +++ b/entry/src/main/js/default/service/SendMsgService.js @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import sms from '@ohos.telephony.sms'; +import mmsLog from '../utils/MmsLog.js'; +import common from '../pages/common_constants.js'; +import http from '@ohos.net.http'; + +export default { + + /** + * 发送短信 + * @param params 包含卡槽,电话号码,短信内容 + * @param callback 返回发送信息状态 + * @return + */ + sendMessage(params, callback) { + mmsLog.info('sendMessage,params:' + params); + sms.sendMessage({ + slotId: params.slotId, + destinationHost: params.destinationHost, + content: params.content, + sendCallback: (err, value) => { + let sendStatus; + if (err) { + mmsLog.info('sendMessageService send message call back error'); + sendStatus = common.int.SEND_MESSAGE_FAILED; + } else { + mmsLog.info('sendMessageService send message call back success result = ' + value.result); + sendStatus = this.dealSendResult(value); + } + callback(sendStatus); + }, + deliveryCallback: (err, value) => { + if (err) { + mmsLog.info('sendMessageService send message deliveryCallback err'); + return; + } + mmsLog.info('sendMessageService send message deliveryCallback success sendResult = ' + value.pdu); + } + }); + }, + dealSendResult(value) { + let sendStatus = common.int.SEND_MESSAGE_SENDING; + if (value.result == sms.SEND_SMS_SUCCESS) { + sendStatus = common.int.SEND_MESSAGE_SUCCESS; + } else { + sendStatus = common.int.SEND_MESSAGE_FAILED; + } + return sendStatus; + }, + sendMmsMessage(params, callback) { + mmsLog.info('sendMmsMessage,params:' + params); + let httpRequest = http.createHttp(); + httpRequest.request(common.string.MMS_URL, + { + method: 'POST', + header: { + 'Content-Type': 'application/vnd.wap.mms-message', + 'Accept': 'Accept', + 'Accept-Language': 'Accept-Language' + }, + extraData: JSON.stringify(params), + readTimeout: 60000, + connectTimeout: 60000 + }, (err, data) => { + let sendStatus; + if (!err) { + mmsLog.info('sendMmsMessage error:' + JSON.stringify(data)); + sendStatus = common.int.SEND_MESSAGE_SUCCESS; + } else { + mmsLog.info('error:' + err.data); + sendStatus = common.int.SEND_MESSAGE_SUCCESS; + } + callback(sendStatus); + } + ); + } +}; \ No newline at end of file diff --git a/entry/src/main/js/default/service/SettingService.js b/entry/src/main/js/default/service/SettingService.js new file mode 100644 index 0000000..ac91121 --- /dev/null +++ b/entry/src/main/js/default/service/SettingService.js @@ -0,0 +1,236 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import SettingModel from '../model/settingsImpl/SettingsModel.js'; + +let mSettingModel = new SettingModel(); +import mmsLog from '../utils/MmsLog.js'; +import common from '../pages/common_constants.js'; + +const TAG = 'JS->SettingService->'; + +export default { + + /** + * 设置初始值 + * + * @param {Object} preferences 偏量数据库 + * @param {Object} callback 回调函数 + */ + setOnSettingValueListener(preferences, callback) { + let result = { + integrationSwitch: false, + maliciousWebSwitch: false, + showContactSwitch: false, + }; + mSettingModel.setOnSettingValueListener(preferences, settingValue => { + if (settingValue.integrationSwitch === common.bool.TRUE) { + result.integrationSwitch = true; + } + if (settingValue.maliciousWebSwitch === common.bool.TRUE) { + result.maliciousWebSwitch = true; + } + if (settingValue.showContactSwitch === common.bool.TRUE) { + result.showContactSwitch = true; + } + }); + callback(result); + }, + + /** + * 还原页面的默认值 + * + * @param {Object} preferences 偏量数据库 + * @param {Object} callback 回调函数 + */ + restoreSwitchValue(preferences, callback) { + mSettingModel.restoreSwitchValueToDefault(preferences, callback); + }, + + /** + * 更新相关的值 + * @param code 更新的code + * @param actionData 更新的值 + * @param callback 回调函数 + * @return + */ + updateSettingValue(code, actionData, callback) { + let preferences = actionData.preferences; + switch (code) { + case common.route.MESSAGE_CODE_UPDATE_DELIVERY_REPORTS_VALUE: + // 送达报告 + mSettingModel.updateSwitchValue(preferences, common.string.KEY_OF_DELIVERY_REPORT_SWITCH, + actionData.intValue, callback); + break; + case common.route.MESSAGE_CODE_UPDATE_AUTO_RETRIEVE_MMS_VALUE: + // 自动下载彩信 + mSettingModel.updateSwitchValue(preferences, common.string.KEY_OF_AUTO_RETRIEVE_MMS_SWITCH, + actionData.intValue, callback); + break; + case common.route.MESSAGE_CODE_UPDATE_RECALL_MESSAGES_VALUE: + // 取消发送 + mSettingModel.updateSwitchValue(preferences, common.string.KEY_OF_RECALL_MESSAGE_SWITCH, + actionData.booleanValue, callback); + break; + case common.route.MESSAGE_CODE_UPDATE_AUTO_DELETE_INFO_MESSAGES_VALUE: + // 自动删除通知信息 + mSettingModel.updateSwitchValue(preferences, common.string.KEY_OF_AUTO_DELETE_INFO_SWITCH, + actionData.booleanValue, callback); + break; + case common.route.MESSAGE_CODE_UPDATE_ARCHIVE_INFO_MESSAGES_VALUE: + // 通知信息整合 + mSettingModel.updateSwitchValue(preferences, common.string.KEY_OF_INTEGRATION_SWITCH, + actionData.booleanValue, callback); + break; + case common.route.MESSAGE_CODE_UPDATE_MALICIOUS_WEBSITE_IDENTIFICATION_VALUE: + // 恶意网址识别 + mSettingModel.updateSwitchValue(preferences, common.string.KEY_OF_MALICIOUS_WEB_SWITCH, + actionData.booleanValue, callback); + break; + case common.route.MESSAGE_CODE_UPDATE_SHOW_CONTACT_PROFILE_PICS_VALUE: + // 显示联系人头像 + mSettingModel.updateSwitchValue(preferences, common.string.KEY_OF_SHOW_CONTACT_SWITCH, + actionData.booleanValue, callback); + break; + default: + mmsLog.info('updateSettingValue code is not exit'); + } + }, + + /** + * 获取高级设置页面开关值 + * + * @param {Object} preferences 偏量数据库 + * @param {Object} callback 回调函数 + */ + getAdvancedPageSwitchValue(preferences, callback) { + mSettingModel.getAdvancedPageSwitchValue(preferences, callback); + }, + + /** + * 更新短信中心号码 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + updateSmscNumber(actionData) { + mSettingModel.updateSmscNumber(actionData, result => { + if (result.code == common.int.SUCCESS) { + mmsLog.info(TAG + 'autoHandleNumberChanged(): success'); + } else { + mmsLog.info(TAG + 'autoHandleNumberChanged(): fail'); + } + }); + }, + + /** + * 分享短信中心dialog内选中的内容 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + shareSmsEnterSelectedText(actionData) { + // 分享API目前未提供 + mSettingModel.shareSmsEnterSelectedText(actionData, result => { + if (result.code == common.int.SUCCESS) { + mmsLog.info(TAG + 'shareInSmsCenter(): success'); + } else { + mmsLog.info(TAG + 'shareInSmsCenter(): fail' + JSON.stringify(result.abilityResult)); + } + }); + }, + + /** + * 通知信息整合开关、是否显示联系人头像开关的值 + * + * @param {Object} preferences 偏量数据库 + */ + getSettingFlagForConvListPage(preferences) { + let result = { + isShowContactHeadIcon: false, + hasAggregate: false, + recallMessagesFlag: false, + }; + mSettingModel.getSettingValue(preferences, settingValue => { + if (settingValue.code === common.int.SUCCESS) { + mmsLog.info('getSettingFlagForConvListPage(): Success'); + if (settingValue.abilityResult.isShowContactHeadIcon === common.bool.TRUE) { + result.isShowContactHeadIcon = true; + } + if (settingValue.abilityResult.hasAggregate == common.bool.TRUE) { + result.hasAggregate = true; + } + if (settingValue.abilityResult.recallMessagesFlag == common.bool.TRUE) { + result.recallMessagesFlag = true; + } + } else { + mmsLog.info('getSettingFlagForConvListPage(): fail'); + } + }); + return result; + }, + + /** + * 判断是否需要送达报告 + * + * @param {Object} preferences 偏量数据库 + * @param {boolean} isMms 是否是彩信 + */ + judgeIsDeliveryReport(preferences, isMms) { + let deliveryReportSwitch = preferences.getValueOfDeliveryReportSwitch(); + if (deliveryReportSwitch === common.DELIVERY_REPORTS.DISABLED) { + return false; + } + // 如果是彩信和短息,直接返回true + if (deliveryReportSwitch === common.DELIVERY_REPORTS.SMS_AND_MMS) { + return true; + } + // 单独只有短信的时候,才有送达报告 + if (deliveryReportSwitch == common.DELIVERY_REPORTS.SMS && !isMms){ + return true; + } + // 单独只有彩信的时候,才有送达报告 + if (deliveryReportSwitch == common.DELIVERY_REPORTS.MMS && isMms){ + return true; + } + return false; + }, + + /** + * 计算被选中的值 + * @param mmsList + * @param isAllSelect + */ + calculateChecked(simMessageList, isAllSelect){ + let count = 0; + let checkedList = []; + let result = {}; + let switchOff = false; + for(let item of simMessageList) { + // 如果全选 + if(isAllSelect || item.isCbChecked) { + switchOff = true; + } + if(switchOff) { + checkedList.push(item); + count++; + } + switchOff = false; + } + result.count = count; + result.checkedList = checkedList; + return result; + }, +} \ No newline at end of file diff --git a/entry/src/main/js/default/service/SimCardService.js b/entry/src/main/js/default/service/SimCardService.js new file mode 100644 index 0000000..032306c --- /dev/null +++ b/entry/src/main/js/default/service/SimCardService.js @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import CardModel from '../model/cardInfoImpl/CardModel.js' + +let cardModel = new CardModel(); + +import common from '../pages/common_constants.js'; +import mmsLog from '../utils/MmsLog.js'; + +export default { + + /** + * 设置SIM卡信息 + * + * @param {Object} preferences 偏量数据库 + */ + simInfoHandler(preferences) { + cardModel.getSimSpn(preferences); + }, + + /** + * 查询短信中心号码 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + querySmscNumber(actionData, callback) { + let result = {}; + let index = actionData.index - 1; + mmsLog.log('querySmscNumber,slotId:' + index); + cardModel.getSmscNumber(index, actionData.preferences, smsNumber => { + result.code = common.int.SUCCESS; + result.smsNumber = smsNumber; + callback(result); + }); + }, + + /** + * 查询sim卡短信信息 + * @param actionData 参数 + * @param callback 回调 + * @return + */ + queryMessageInSimCard(actionData, callback) { + cardModel.queryMessageInSimCard(actionData, callback); + }, + + /** + * 获取sim卡的数量 + * + * @param {Object} preferences 偏量数据库 + */ + initSimCardNum(preferences) { + cardModel.getSimCardNum(preferences); + }, + delSimMessage(actionData) { + cardModel.delSimMessage(actionData); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/utils/MmsLog.js b/entry/src/main/js/default/utils/MmsLog.js new file mode 100644 index 0000000..3efe77a --- /dev/null +++ b/entry/src/main/js/default/utils/MmsLog.js @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const APP_TAG = 'MyMms: js--> '; + +export default { + data: { + pageTag: ':' + }, + debug(msg) { + console.debug(APP_TAG + "timestamp:" + new Date().getTime() + this.data.pageTag + msg); + }, + log(msg) { + console.log(APP_TAG + "timestamp:" + new Date().getTime() + this.data.pageTag + msg); + }, + info(msg) { + console.info(APP_TAG + "timestamp:" + new Date().getTime() + this.data.pageTag + msg); + }, + warn(msg) { + console.warn(APP_TAG + "timestamp:" + new Date().getTime() + this.data.pageTag + msg); + }, + error(msg) { + console.error(APP_TAG + "timestamp:" + new Date().getTime() + this.data.pageTag + msg); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/utils/Pasteboard.js b/entry/src/main/js/default/utils/Pasteboard.js new file mode 100644 index 0000000..57dc55c --- /dev/null +++ b/entry/src/main/js/default/utils/Pasteboard.js @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import pasteboard from '@ohos.pasteboard'; +import mmsLog from '../utils/MmsLog.js'; + +let commonPasteboard = { + getPasteboard() { + let sysPasteboard = pasteboard.getSystemPasteboard(); + return sysPasteboard.getPasteData(); + }, + setPasteboard(text) { + let sysPasteboard = pasteboard.getSystemPasteboard(); + let textData = pasteboard.createPlainTextData(text); + sysPasteboard.setPasteData(textData, () => { + mmsLog.info('pasteboard setPasteData done'); + }); + } +}; +export {commonPasteboard}; \ No newline at end of file diff --git a/entry/src/main/js/default/utils/PreferencesUtil.js b/entry/src/main/js/default/utils/PreferencesUtil.js new file mode 100644 index 0000000..41e629d --- /dev/null +++ b/entry/src/main/js/default/utils/PreferencesUtil.js @@ -0,0 +1,139 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import common from '../../default/pages/common_constants.js'; +import dataStorage from '@ohos.data.storage'; +import featureAbility from '@ohos.ability.featureAbility'; +import mmsLog from '../utils/MmsLog.js'; +const TAG = 'PreferencesUtil.js->'; + +var prefIns = undefined; +/** + * 获取轻量级偏好数据库实例 + */ + +export default { + + async initDataStorage() { + let context = featureAbility.getContext(); + let path = await context.getFilesDir(); + prefIns = dataStorage.getStorageSync(path + common.string.PATH_OF_PREFERENCES); + }, + + getPreferencesInstance() { + if (prefIns == null) { + mmsLog.error(TAG + 'getPreferencesInstance(): failed to get preferences instance'); + } + return prefIns; + }, + + /** + * 获取值 + * + * @param {string} key value值 + */ + getValue(key) { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(key, common.string.EMPTY_STR); + }, + + getValueOfIntegrationSwitch() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_INTEGRATION_SWITCH, common.bool.TRUE); + }, + + getValueOfMaliciousWebSwitch() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_MALICIOUS_WEB_SWITCH, common.bool.FALSE); + }, + + getValueOfShowContactSwitch() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_SHOW_CONTACT_SWITCH, common.bool.TRUE); + }, + + getValueOfDeliveryReportSwitch() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_DELIVERY_REPORT_SWITCH, common.DELIVERY_REPORTS.DISABLED); + }, + + getValueOfAutoRetrieveMmsSwitch() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_AUTO_RETRIEVE_SWITCH, common.AUTO_RETRIEVE_MMS.NOT_WHEN_ROAMING); + }, + + getValueOfRecallMessageSwitch() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_RECALL_MESSAGE_SWITCH, common.bool.FALSE); + }, + + getValueOfAutoDeleteInfoSwitch() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_AUTO_DELETE_INFO_SWITCH, common.bool.FALSE); + }, + + getCountOfSim() { + let count = 0; + if (this.getSim1ExistFlag() === common.bool.TRUE) { + count++; + } + if (this.getSim2ExistFlag() == common.bool.TRUE) { + count++; + } + return count; + }, + + /** + * 获取sim卡1是否存在 + */ + getSim1ExistFlag() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_SIM_0_EXIST_FLAG, common.bool.FALSE); + }, + + getSim2ExistFlag() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_SIM_1_EXIST_FLAG, common.bool.FALSE); + }, + + getSpnOfSim1() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_SIM_0_SPN, common.string.EMPTY_STR); + }, + + getSpnOfSim2() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_SIM_1_SPN, common.string.EMPTY_STR); + }, + + getNewSmscOfSim1() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_NEW_SIM_0_SMSC, common.string.EMPTY_STR); + }, + + getNewSmscOfSim2() { + let prefIns = this.getPreferencesInstance(); + return prefIns.getSync(common.string.KEY_OF_NEW_SIM_1_SMSC, common.string.EMPTY_STR); + }, + + /** + * 给设置值 + */ + setValueForSwitch(keyOfSwitch, valueOfSwitch) { + mmsLog.info('setValueForSwitch start:' + keyOfSwitch + 'valueOfSwitch:' + valueOfSwitch); + prefIns.putSync(keyOfSwitch, valueOfSwitch); + prefIns.flushSync(); + } +}; \ No newline at end of file diff --git a/entry/src/main/js/default/utils/RdbStoreUtil.js b/entry/src/main/js/default/utils/RdbStoreUtil.js new file mode 100644 index 0000000..1a71c6d --- /dev/null +++ b/entry/src/main/js/default/utils/RdbStoreUtil.js @@ -0,0 +1,110 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import ohosDataRdb from '@ohos.data.rdb'; +import mmsLog from '../utils/MmsLog.js'; + +const TAG = 'RdbStoreUtil.js->'; + +// 数据库名称 +const STORE_CONFIG = { + name: 'mmssms.db', +} + +// 数据库实例对象 +var rdbStore = undefined; + +/** + * 创建数据库 + */ +var getRdbStore = async function () { + if (rdbStore == null) { + rdbStore = await ohosDataRdb.getRdbStore(STORE_CONFIG, 1); + } + return rdbStore; +} +export default { + + /** + * 创建数据库 + */ + async createRdbStore() { + mmsLog.log(TAG + ' createRdbStore start'); + rdbStore = await ohosDataRdb.getRdbStore(STORE_CONFIG, 1); + mmsLog.log(TAG + ' createRdbStore end'); + }, + + /** + * 创建数据库表 + */ + async createTable(table) { + await rdbStore.executeSql(table, null); + }, + + /** + * 新增数据 + */ + async insert(tableName, valueBucket) { + let insertPromise = rdbStore.insert(tableName, valueBucket); + let rowId = 0; + insertPromise.then((ret) => { + mmsLog.log(TAG + ' insert first done: ' + rowId); + rowId = ret; + }).catch((err) => { + mmsLog.log(TAG + ' insert first done: ' + err); + }) + await insertPromise; + return rowId; + }, + + /** + * 更新接口 + * @param predicates 更新条件 + * @param predicates 更新值 + * @return + */ + async update(predicates, valueBucket) { + let changedRows = await rdbStore.update(valueBucket, predicates); + mmsLog.log(TAG + 'updated row count: ' + changedRows); + }, + + /** + * 删除接口 + * @param predicates 删除条件 + * @return + */ + async deleteItem(predicates) { + let deletedRows = await rdbStore.delete(predicates); + mmsLog.log(TAG + 'deleted row count: ' + deletedRows); + }, + + /** + * 获取查询条件的对象 + * @param tableName 表名 + * @return + */ + getRdbPredicates(tableName){ + let predicates = new ohosDataRdb.RdbPredicates(tableName); + return predicates; + }, + + /** + * 获取数据库实例 + * @param tableName 表名 + * @return + */ + getRdbStore() { + return rdbStore; + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/utils/TelephoneUtil.js b/entry/src/main/js/default/utils/TelephoneUtil.js new file mode 100644 index 0000000..ceccd61 --- /dev/null +++ b/entry/src/main/js/default/utils/TelephoneUtil.js @@ -0,0 +1,162 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const APP_TAG = 'Telephone: js '; +import common from '../pages/common_constants.js'; +import mmsLog from '../utils/MmsLog.js'; +import call from '@ohos.telephony.call'; + +/** + * log package tool class + */ +const infoMegTelephone = [ + '1065796709202', '1065502043202', '1065902090202', '1069055999202', + '106579670915', '106550204315', '106590209015', '106905599915', + '106', '400', '111', '100', '118', '116', '12306', '12329', '12345', + '12122', '12321', '12580', '12520', '12583', '02512329', '053287003810', + '1258319559899', '1019', '12583110086', '000000', '95', '96', +]; +export default { + + /** + * 判断手机号是否是通知信息 + * @param telephone 手机号 + * @return 是或不是 + */ + judgeIsInfoMsg(telephone) { + let result = false; + if (telephone == null || telephone == common.string.EMPTY_STR) { + return result; + } + for (let item of infoMegTelephone) { + if (telephone.indexOf(item) == 0) { + result = true; + } + } + return result; + }, + + formatTelephone(telephone) { + if(telephone == null || telephone == common.string.EMPTY_STR) { + return common.string.EMPTY_STR; + } + if(telephone.indexOf('+86') >= 0) { + return telephone.substring(3); + } + return telephone; + }, + + dealSelectContactsSort(selectContacts) { + if(selectContacts.length == 0) { + return; + } + let result = []; + let telephone = common.string.EMPTY_STR; + let contactsMap = new Map(); + for(let item of selectContacts) { + telephone = telephone + item.telephone + common.string.COMMA; + if(!contactsMap.has(item.telephone)) { + contactsMap.set(item.telephone, item); + } + } + telephone = this.dealTelephoneSort(telephone.substring(0, telephone.length - 1)); + let telephones = telephone.split(common.string.COMMA); + for(let element of telephones) { + if(contactsMap.has(element)) { + result.push(contactsMap.get(element)); + } + } + return result; + }, + + /** + * 手机号,从小到大进行排序 + * @param telephone + * @return + */ + dealTelephoneSort(telephone){ + if(telephone == null || telephone == common.string.EMPTY_STR) { + return common.string.EMPTY_STR; + } + let result = common.string.EMPTY_STR; + let telephones = telephone.split(common.string.COMMA); + // 如果只有一个手机号,不需要进行排序 + if(telephones.length == 1) { + return telephone; + } + let telephoneMap = new Map(); + let indexs = []; + let count = 0; + // 分组 + for(let item of telephones) { + if(telephoneMap.has(item.length)) { + let strings = telephoneMap.get(item.length); + strings.push(item); + } else { + let strings = []; + strings.push(item); + telephoneMap.set(item.length, strings); + indexs[count++] = item.length; + } + } + // 从大到小排序 + this.bubbleSort(indexs, count); + for(let index of indexs) { + let arrs = telephoneMap.get(index); + this.bubbleSort(arrs, arrs.length); + for (let arr of arrs) { + result = result + arr + common.string.COMMA; + } + } + // 取出对应的结果及进行配对 + return result.substring(0, result.length - 1); + }, + + /** + * 冒泡排序, 从小到大排序 + * @param arr + * @param length + * @return + */ + bubbleSort(arr, length) { + // 每次从后往前冒一个最小值,且每次能确定一个数在序列中的最终位置 + for (let i = 0; i < length - 1; i++){ + // 冒泡的改进,若在一趟中没有发生逆序,则该序列已有序 + for (let j = length-1; j >i; j--){ + // 每次从后边冒出一个最小值 + if (arr[j] < arr[j - 1]) { + // 发生逆序,则交换 + let temple = arr[j]; + arr[j] = arr[j - 1]; + arr[j - 1] = temple; + } + } + } + }, + async formatPhoneNumber(phoneNumber) { + if (phoneNumber == null || phoneNumber === common.string.EMPTY_STR) { + mmsLog.info('formatPhoneNumber param is null'); + return common.string.EMPTY_STR; + } + let promise = call.formatPhoneNumber(phoneNumber); + let formatPhoneNumber = common.string.EMPTY_STR; + promise.then((value) => { + formatPhoneNumber = value; + }).catch((err) => { + mmsLog.info('formatPhoneNumber error: ' + err.message); + }); + await promise; + return formatPhoneNumber; + } +}; \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..3d2698c --- /dev/null +++ b/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "app_name", + "value": "信息" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "mmsapi_description", + "value": "hap sample empty service" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/base/media/icon.png b/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 FV1l0Z<~slY literal 0 HcmV?d00001 diff --git a/entry/src/ohosTest/config.json b/entry/src/ohosTest/config.json new file mode 100644 index 0000000..5c406c4 --- /dev/null +++ b/entry/src/ohosTest/config.json @@ -0,0 +1,53 @@ +{ + "app": { + "bundleName": "com.ohos.mms", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 5, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.mms", + "name": "testModule", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry_test", + "moduleType": "feature", + "installationFree": true + }, + "abilities": [ + { + "name": "decc.testkit.runner.JsEntryAbility", + "description": "Test Entry Ability", + "icon": "$media:icon", + "label": "$string:app_name", + "launchType": "standard", + "orientation": "landscape", + "visible": true, + "type": "page" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 750, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/entry/src/ohosTest/js/default/app.js b/entry/src/ohosTest/js/default/app.js new file mode 100644 index 0000000..665ffda --- /dev/null +++ b/entry/src/ohosTest/js/default/app.js @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + onCreate() { + }, + onDestroy() { + } +}; diff --git a/entry/src/ohosTest/js/default/i18n/en-US.json b/entry/src/ohosTest/js/default/i18n/en-US.json new file mode 100644 index 0000000..55561b8 --- /dev/null +++ b/entry/src/ohosTest/js/default/i18n/en-US.json @@ -0,0 +1,8 @@ +{ + "strings": { + "hello": "Hello", + "world": "World" + }, + "Files": { + } +} \ No newline at end of file diff --git a/entry/src/ohosTest/js/default/i18n/zh-CN.json b/entry/src/ohosTest/js/default/i18n/zh-CN.json new file mode 100644 index 0000000..cce1af0 --- /dev/null +++ b/entry/src/ohosTest/js/default/i18n/zh-CN.json @@ -0,0 +1,8 @@ +{ + "strings": { + "hello": "您好", + "world": "世界" + }, + "Files": { + } +} \ No newline at end of file diff --git a/entry/src/ohosTest/js/default/pages/index/index.css b/entry/src/ohosTest/js/default/pages/index/index.css new file mode 100644 index 0000000..6fda792 --- /dev/null +++ b/entry/src/ohosTest/js/default/pages/index/index.css @@ -0,0 +1,9 @@ +.container { + flex-direction: column; + justify-content: center; + align-items: center; +} + +.title { + font-size: 100px; +} diff --git a/entry/src/ohosTest/js/default/pages/index/index.hml b/entry/src/ohosTest/js/default/pages/index/index.hml new file mode 100644 index 0000000..f64b040 --- /dev/null +++ b/entry/src/ohosTest/js/default/pages/index/index.hml @@ -0,0 +1,5 @@ +
+ + {{ $t('strings.hello') }} {{ title }} + +
diff --git a/entry/src/ohosTest/js/default/pages/index/index.js b/entry/src/ohosTest/js/default/pages/index/index.js new file mode 100644 index 0000000..d153aa7 --- /dev/null +++ b/entry/src/ohosTest/js/default/pages/index/index.js @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import file from '@system.file' +import {Core, ExpectExtend, ReportExtend, InstrumentLog} from 'deccjsunit/index' +const globalRef = Object.getPrototypeOf(global) || global; +globalRef.regeneratorRuntime = require('@babel/runtime/regenerator'); +export default { + data: { + title: '' + }, + onInit() { + this.title = this.$t('strings.world'); + }, + onShow() { + const core = Core.getInstance() + const expectExtend = new ExpectExtend({ + 'id': 'extend' + }) + const reportExtend = new ReportExtend(file) + const instrumentLog = new InstrumentLog({ + 'id': 'report' + }) + core.addService('expect', expectExtend) + core.addService('report', reportExtend) + core.addService('report', instrumentLog) + core.init() + core.subscribeEvent('spec', instrumentLog) + core.subscribeEvent('suite', instrumentLog) + core.subscribeEvent('task', instrumentLog) + + const configService = core.getDefaultService('config') + configService.setConfig(this) + + require('../../../test/List.test') + core.execute() + }, + onReady() { + }, +} \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/CallService.test.js b/entry/src/ohosTest/js/test/CallService.test.js new file mode 100644 index 0000000..c9aa327 --- /dev/null +++ b/entry/src/ohosTest/js/test/CallService.test.js @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import callService from '../../../main/js/default/service/CallService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + +describe('callServiceTest', function () { + it('call', 0, function () { + let params = {}; + params.telephone = '10086'; + callService.call(params, result => { + expect(result.code).assertEqual('0'); + }); + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/ContractService.test.js b/entry/src/ohosTest/js/test/ContractService.test.js new file mode 100644 index 0000000..92fef89 --- /dev/null +++ b/entry/src/ohosTest/js/test/ContractService.test.js @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import contractService from '../../../main/js/default/service/ContractService.js'; +import featureAbility from '@ohos.ability.featureAbility'; +import ohosDataAbility from '@ohos.data.dataability'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + +describe('contractServiceTest', function () { + it('queryContact', 0, function () { + let page = 0 ; + let limit = 10; + // 全量查询 + let actionData = { + featureAbility: featureAbility, + ohosDataAbility: ohosDataAbility, + page: page, + limit:limit + }; + contractService.queryContact(actionData, res => { + expect(res.code).assertEqual('0'); + expect(res.response.length).assertEqual('4'); + }); + }); + it('queryContactDataByTelephone',0,function() { + // 根据手机号精确查询 + let actionDataTwo = { + featureAbility: featureAbility, + ohosDataAbility: ohosDataAbility, + telephones : ['10086','1008611'] + }; + contractService.queryContactDataByTelephone(actionDataTwo, res => { + expect(res.code).assertEqual('0'); + expect(res.response.length).assertEqual('4'); + }); + }); + it('searchContracts',0,function() { + // 模糊查询 + let actionData = { + featureAbility: featureAbility, + ohosDataAbility: ohosDataAbility, + phone:'177' + }; + contractService.searchContracts(actionData, res => { + expect(res.code).assertEqual('0'); + expect(res.response.length).assertEqual('4'); + }); + }); + it('judgeIsExitProfile',0,function() { + // 查询我的名片 + let actionData = { + featureAbility: this.$app.$def.featureAbility, + ohosDataAbility: this.$app.$def.ohosDataAbility, + }; + contractService.judgeIsExitProfile(actionData,flag => { + expect(flag).assertEqual(false); + expect(flag).assertEqual(true); + }) + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/ConversationListService.test.js b/entry/src/ohosTest/js/test/ConversationListService.test.js new file mode 100644 index 0000000..0381f53 --- /dev/null +++ b/entry/src/ohosTest/js/test/ConversationListService.test.js @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import conversationListService from '../../../main/js/default/service/ConversationListService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + +describe('conversationListServiceTest', function () { + it('queryAllMms', 0, function () { + // 不传参数,只有分页数,查询所有的信息会话列表 + let actionData = {}; + actionData.page = 0; + actionData.limit = 10; + conversationListService.queryAllMms(actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.hasInfoMsg).assertEqual(true); + expect(res.total).assertEqual('7'); + expect(res.isShowContactHeadIcon).assertEqual(true); + } else { + expect(res.code).assertEqual('-1'); + } + }); + + // 查询通知信息会话列表 + let actionDataTwo = {}; + actionDataTwo.numberType = 2; + actionData.page = 0; + actionData.limit = 10; + conversationListService.queryAllMms(actionDataTwo, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.hasInfoMsg).assertEqual(true); + expect(res.total).assertEqual('3'); + expect(res.isShowContactHeadIcon).assertEqual(true); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('statisticalData', 0, function () { + let actionData = {}; + // 统计未读短信的数量 + conversationListService.statisticalData(actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.response.totalListCount).assertEqual('10'); + expect(res.response.unreadCount).assertEqual('1'); + expect(res.response.unreadTotalOfInfo).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('deleteMessage', 0, function () { + let actionData = {}; + // 会话主键ID + actionData.threadIds = ['1','2','3']; + // 删除会话列表 + conversationListService.deleteMessage(actionData); + }) + it('markAllAsRead', 0, function () { + let actionData = {}; + actionData.threadIds = ['1','2','3']; + conversationListService.markAllAsRead(actionData); + }) + it('searchMessageWithLike', 0, function () { + // 根据手机号模糊查询 + let actionData = {}; + actionData.inputValue = '123'; + conversationListService.searchMessageWithLike(actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.response.sessionList.length).assertEqual('0'); + expect(res.response.contentList.length).assertEqual('2'); + expect(res.response.searchText).assertEqual(actionData.inputValue); + } else { + expect(res.code).assertEqual('-1'); + } + }); + + // 根据联系人名称模糊查询 + let actionDataTwo = {}; + actionDataTwo.inputValue = 'a'; + conversationListService.searchMessageWithLike(actionDataTwo, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.response.sessionList.length).assertEqual('0'); + expect(res.response.contentList.length).assertEqual('1'); + expect(res.response.searchText).assertEqual(actionData.inputValue); + } else { + expect(res.code).assertEqual('-1'); + } + }); + + // 根据短信内容模糊查询 + let actionDataThird = {}; + actionDataTwo.inputValue = 'b'; + conversationListService.searchMessageWithLike(actionDataThird, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.response.sessionList.length).assertEqual('3'); + expect(res.response.contentList.length).assertEqual('2'); + expect(res.response.searchText).assertEqual(actionData.inputValue); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('getSessionList', 0, function () { + // 根据手机号,模糊查询会话列表的数据 + let searchText = '213'; + let sessionList = conversationListService.getSessionList(searchText); + if(sessionList.length > 0) { + expect(sessionList.length).assertEqual('1.0'); + } else { + expect(sessionList.length).assertEqual('0'); + } + }) + it('getContentList', 0, function () { + // 根据短信内容,模糊查询短信列表的数据 + let searchText = 'sa'; + let contentList = conversationListService.getContentList(searchText); + if(contentList.length > 0) { + expect(contentList.length).assertEqual('1.0'); + } else { + expect(contentList.length).assertEqual('0'); + } + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/ConversationService.test.js b/entry/src/ohosTest/js/test/ConversationService.test.js new file mode 100644 index 0000000..ed98311 --- /dev/null +++ b/entry/src/ohosTest/js/test/ConversationService.test.js @@ -0,0 +1,106 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import conversationService from '../../../main/js/default/service/ConversationService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + +describe('conversationServiceTest', function () { + it('queryMessageDetail', 0, function () { + let params = {}; + params.telephone = '10086'; + params.page = 0; + params.limit = 10; + // 根据手机号精确查询短信列表 + conversationService.queryMessageDetail(params, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.canSendMessage).assertEqual(true); + expect(res.response.length).assertEqual('5'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('getTransmitContracts', 0, function () { + let params = {}; + conversationService.getTransmitContracts(params, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.isSelectContact).assertEqual(true); + expect(res.transmitContracts.length).assertEqual('5'); + expect(res.strSelectContact).assertEqual('张三以及其他2个'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('judgeContactExists', 0, function () { + let params = {}; + params.telephone = '13643893489'; + // 判断联系人是否存在 + conversationService.judgeContactExists(params, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.hasExitContract).assertEqual(true); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('saveImage', 0, function () { + let params = {}; + // 保存图片 + conversationService.saveImage(params, res => { + if(res != '') { + expect(res).assertEqual('附件已保存到 path://sss ,请妥善保存'); + } else { + expect(res).assertEqual('保存图片失败'); + } + }); + }) + it('gotoShare', 0, function () { + let params = {}; + // 分享 + conversationService.gotoShare(params, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('updateLock', 0, function () { + let params = {}; + // 更新锁定状态 + conversationService.updateLock(params, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('queryFromGallery', 0, function () { + let params = {}; + // 查询图片 + conversationService.queryFromGallery(params, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.pictureListFromGallery.length).assertEqual('1'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/GroupDetailService.test.js b/entry/src/ohosTest/js/test/GroupDetailService.test.js new file mode 100644 index 0000000..87e8107 --- /dev/null +++ b/entry/src/ohosTest/js/test/GroupDetailService.test.js @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import groupDetailService from '../../../main/js/default/service/GroupDetailService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'; + +describe('groupDetailServiceTest', function () { + it('judgeIsAllSendFail', 0, function () { + let contactList = [ + { + contactName: 'aaedd', + date: '4月23日星期五', + isDraft: false, + isLock: false, + isReceive: false, + sendStatus: 2, + telephone: '1003', + telephoneFormat: '1003', + time: '上午10:20', + timeMillisecond: 1619144409755 + } + ]; + groupDetailService.judgeIsAllSendFail(contactList, res => { + expect(res.isAllSendFail).assertEqual(true); + }); + + let contactListTwo = [ + { + contactName: 'tosaa', + date: '4月23日星期五', + isDraft: false, + isLock: false, + isReceive: false, + sendStatus: 0, + telephone: '2323', + telephoneFormat: '213232', + time: '上午10:16', + timeMillisecond: 1619144179154 + } + ]; + groupDetailService.judgeIsAllSendFail(contactListTwo, res => { + expect(res.isAllSendFail).assertEqual(false); + }); + }) + it('queryContactSendDetail', 0, function () { + // 获取收件人信息 + let isDetail = false; + let actionData = {}; + actionData.threadId = 1; + groupDetailService.queryContactSendDetail(isDetail, actionData, res=>{ + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.contactList.length).assertEqual('5'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + + // 获取群发详情 + isDetail = true; + let actionDataTwo = {}; + actionDataTwo.groupId = 1; + groupDetailService.queryContactSendDetail(isDetail, actionData, res=>{ + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.contactList.length).assertEqual('4'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/List.test.js b/entry/src/ohosTest/js/test/List.test.js new file mode 100644 index 0000000..e8f3bca --- /dev/null +++ b/entry/src/ohosTest/js/test/List.test.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +require('./CallService.test.js') +require('./ContractService.test.js') +require('./ConversationListService.test.js') +require('./ConversationService.test.js') +require('./GroupDetailService.test.js') +require('./MyStarService.test.js') +require('./SendMsgService.test.js') +require('./SettingService.test.js') +require('./SimCardService.test.js') +require('./NotificationService.test.js') diff --git a/entry/src/ohosTest/js/test/MyStarService.test.js b/entry/src/ohosTest/js/test/MyStarService.test.js new file mode 100644 index 0000000..dcebff3 --- /dev/null +++ b/entry/src/ohosTest/js/test/MyStarService.test.js @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import myStarService from '../../../main/js/default/service/MyStarService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'; + +describe('myStarServiceTest', function () { + it('queryFavoriteMessageList', 0, function () { + let actionData = {}; + myStarService.queryFavoriteMessageList(actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.abilityResult.length).assertEqual('8'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('calculateChecked', 0, function () { + let mmsList = [ + { + image: '/common/icon/pin.png', + date: '12月23日', + time: '下午4:28', + content: 'bcndfisdas', + isCbChecked: false, + msgType: [0], + type: 1, + address: '12324', + isMsm: false + },{ + image: '/common/icon/pin.png', + date: '12月24日', + time: '下午5:28', + content: 'uasbajkka', + isCbChecked: false, + msgType: [0], + type: 1, + address: '12324', + isMsm: false + } + ]; + let isAllSelect = false; + let result = myStarService.calculateChecked(mmsList, isAllSelect); + if(result) { + expect(result.count).assertEqual('2'); + expect(result.textCount).assertEqual('1'); + expect(result.mmsCount).assertEqual('0'); + } + }) + it('textCopy', 0, function () { + let mmCheckedList = [ + { + image: '/common/icon/pin.png', + date: '12月23日', + time: '14:28', + content: 'asasa', + isCbChecked: true, + msgType: [0,1], + msgUriPath: '/common/icon/test.jpg', + type: 0, + address: '', + isMsm: true + } + ]; + myStarService.textCopy(mmCheckedList); + }) + it('saveImage', 0, function () { + let actionData = {}; + myStarService.saveImage(actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.filePath).assertEqual('/common/icon/test.jpg'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('favoriteShare', 0, function () { + let actionData = {} + myStarService.favoriteShare(actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/NotificationService.test.js b/entry/src/ohosTest/js/test/NotificationService.test.js new file mode 100644 index 0000000..18a968f --- /dev/null +++ b/entry/src/ohosTest/js/test/NotificationService.test.js @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import notificationService from '../../../main/js/default/service/NotificationService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + +describe('NotificationServiceTest', function () { + it('sendNotify', 0, function () { + var params = []; + params.push({ + contactsName: 'asasaa', + telephone: '18720910689', + telephoneFormat: '18720910689', + }); + var contactObjects = JSON.stringify(params); + + let actionData = {}; + actionData.contactObjects = JSON.stringify(contactObjects); + actionData.message = { + title: 'woweweew', + text: 'I Love', + }; + notificationService.sendNotify(actionData); + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/SendMsgService.test.js b/entry/src/ohosTest/js/test/SendMsgService.test.js new file mode 100644 index 0000000..49692c7 --- /dev/null +++ b/entry/src/ohosTest/js/test/SendMsgService.test.js @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import sendMsgService from '../../../main/js/default/service/SendMsgService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'; + +describe('sendMsgServiceTest', function () { + it('sendMessage', 0, function () { + let params = { + slotId: 1, + destinationHost: '10032322', + content: 'I love you', + }; + sendMsgService.sendMessage(params, sendStatus => { + if (sendStatus === 0) { + // 发送成功 + expect(sendStatus).assertEqual('0'); + } else { + // 发送失败 + expect(sendStatus).assertEqual('2'); + } + }); + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/SettingService.test.js b/entry/src/ohosTest/js/test/SettingService.test.js new file mode 100644 index 0000000..455bcd8 --- /dev/null +++ b/entry/src/ohosTest/js/test/SettingService.test.js @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import settingService from '../../../main/js/default/service/SettingService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'; + +describe('settingServiceTest', function () { + it('setOnSettingValueListener', 0, function () { + settingService.setOnSettingValueListener(res => { + expect(res.integrationSwitch).assertEqual(false); + expect(res.maliciousWebSwitch).assertEqual(false); + expect(res.showContactSwitch).assertEqual(false); + expect(res.integrationSwitch).assertEqual(true); + expect(res.maliciousWebSwitch).assertEqual(true); + expect(res.showContactSwitch).assertEqual(true); + }); + }) + it('restoreSwitchValue', 0, function () { + settingService.restoreSwitchValue(res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('updateSettingValue', 0, function () { + let actionData = {}; + actionData.intValue = true; + // 送达报告 + let code = 32001; + actionData.intValue = false; + settingService.updateSettingValue(code, actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + + // 自动下载彩信 + code = 32002; + settingService.updateSettingValue(code, actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + + // 取消发送 + code = 32003; + settingService.updateSettingValue(code, actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + + // 自动删除通知信息 + code = 32004; + settingService.updateSettingValue(code, actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('getAdvancedPageSwitchValue', 0, function () { + settingService.getAdvancedPageSwitchValue(res => { + expect(res.deliveryReportSwitch).assertEqual(false); + expect(res.autoRetrieveMmsSwitch).assertEqual(false); + expect(res.recallMessageSwitch).assertEqual(false); + expect(res.autoDeleteInfoSwitch).assertEqual(true); + expect(res.simCount).assertEqual(false); + expect(res.firstSpnNameOfTwoSimCard).assertEqual(false); + expect(res.secondSpnNameOfTwoSimCard).assertEqual(false); + }); + }) + it('updateSmscNumber', 0, function () { + let actionData = {}; + actionData.telephone = '1093389945'; + settingService.updateSmscNumber(actionData); + }) + it('shareSmsEnterSelectedText', 0, function () { + let actionData = {}; + actionData.content = 'I love you'; + settingService.shareSmsEnterSelectedText(actionData); + }) + it('getSettingFlagForConvListPage', 0, function () { + let result = settingService.getSettingFlagForConvListPage(); + if(result) { + expect(result.isShowContactHeadIcon).assertEqual(false); + expect(result.hasAggregate).assertEqual(false); + expect(result.recallMessagesFlag).assertEqual(false); + } + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/js/test/SimCardService.test.js b/entry/src/ohosTest/js/test/SimCardService.test.js new file mode 100644 index 0000000..ea9ef3e --- /dev/null +++ b/entry/src/ohosTest/js/test/SimCardService.test.js @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import simCardService from '../../../main/js/default/service/SimCardService.js'; +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'; + +describe('conversationTest', function () { + it('simInfoHandler', 0, function () { + simCardService.simInfoHandler(); + }) + it('querySmscNumber', 0, function () { + let actionData = {}; + simCardService.querySmscNumber(actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.smsNumber).assertEqual('1990923445'); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('queryMessageInSimCard', 0, function () { + let actionData = {}; + actionData.simCount = 1; + actionData.index = 0; + simCardService.queryMessageInSimCard(actionData, res => { + if(res.code == 0) { + expect(res.code).assertEqual('0'); + expect(res.content).assertEqual(''); + } else { + expect(res.code).assertEqual('-1'); + } + }); + }) + it('delSimMessage',0,function(){ + let actionData= {} + actionData.index = 0; + actionData.indexOnSim = 0; + simCardService.delSimMessage(actionData); + }) +}) \ No newline at end of file diff --git a/entry/src/ohosTest/resources/base/element/string.json b/entry/src/ohosTest/resources/base/element/string.json new file mode 100644 index 0000000..64cc611 --- /dev/null +++ b/entry/src/ohosTest/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "app_name", + "value": "MMS_L2" + }, + { + "name": "mainability_description", + "value": "hap sample empty page" + } + ] +} diff --git a/entry/src/ohosTest/resources/base/media/icon.png b/entry/src/ohosTest/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 Si=i^t#o)Zjx#Hg(qy7WV5E6R; literal 0 HcmV?d00001 diff --git a/figures/cmd2.png b/figures/cmd2.png new file mode 100644 index 0000000000000000000000000000000000000000..b771fda0faed1df341bb1e7c7247223bec53986e GIT binary patch literal 110399 zcmbTe2{@GP|M#D4NpX`b*~%J{nI=lXfQKkxH;_gGK;;`uA*&zw1PQByLDJk>lpOZb-aQlB=AG`hgjUStvrGXEKa9kYGex9(eTn$ObBH%>H4uS-c z3QSz#U8%yClP(7XPrxfs!W83yHmMs-2?#-5zI1r0=M^3HPw5-@>98^3_M|uxLix)G z@eQT;Et{ zKDEOH$CfJh`GZeKj$QuKj>P`RYF!E`f7|WSF-Om)wzfNrv4oQYCNL49+&hAw@Za|a zZwl{MmGzO^qiR1Jg7;PcA@mPcsz6lRgyu!GJlvoPjF3M)fSCnNsMm^`GnP>6^dWE~K>Q`_V7S(IVVc4LRMc+FyX2N)l(FcvjM?K2d~-g%G{*0}zrV zafp{hM?5|NY`H>@viE)pgMJDhuasAHgtu4m92kKQ)K9ir!Ic;lwblb#Xb$YCv7)bP zsc~m26@)Xh+AHs?y09aS2XR7wE{fxjCzQDC``~?K|J#>)S>sg!dcBKKT+c<^)!)r5 z5v6<|eI-;7M*}&VB>77 zjiqUQ;y38yxqxCTW`k(Z?Kr6xw8Ak{M;u&jk=r)0)0`-MKp1nbJUyq}$q4EL!Sg7e z2jUm22p-J~_H68x4`*N25HK{?iK8=nj0Y~xP*GaU7F)Z9+JdPr)!;P&E#%w37} zC$QbBWp~2x8CCfjlr~iI3kHm!y-qsiU19{aNAu!`F_M-!kuyqv-^B*Og4ngVufhU@ z<1@jxfgaoCdw6y@VL;i4QS8>bg1}>;Jx#Zos*c1g`$^Ta4$8P}$b$m_POyM<2&l(A zP^-qdfG<~ie3;_J+v9UiM*z6;yeH;F+sLlHGjP&cr^d8g5DxwgN3=U?=UwujAc5fT zzllI!!%vp0D3nilCZ3$s^Ag_zd!Ds1{vK(kiA}|ZEyd;?1>xc08(or`l@iU}4lHR5 z?@LJ_GsRRA2nCDtEg+BD?UDU_UP37dPo9QE(4Y(WDeyYAvq9L9FPO0&Y#Gjb`DiSrUnqcxOF_ecz&{dNwe0YyYMpuD}GeG>lN ziDrAH;lcJiTuG$~;A3_0YhJ>JI$CTlfyq%BnrpM4>gNf8bWI#R`NU5a|l{AcxQ z(deqSw)KeKz{+_2S*xGRGjrK9-}+}205-C7@&7sb=pWT3`G0-`X+mC1e}5@CzF-wv z{ZlT!kNz?L`b;W_gaJeT^#=$VgW>qE3t;}+1&*ClA|fLG6>u~n=G>vMa_!#DIMPYn zRJeW6=4~tA_Zrh9^)EPiomFvkit2g3QO>=fkGf+@a((*;W1wA>O{Mw-@Y?Tkf5fag zhTE^vX5C_M@D2)kk!6!|uz&DwXsGRoPo|=;-gEj9~R@RPNP{ruc+#B5~ z`>IjP>{Qa2{84frz(z#gI&l3;rN-3~ zBVX=TMb)xtmGZw7ui9HOxU@2_6W-P@7*OwMp6?lk=}|fqO|5t+Q{SL@ZYEmN#2Zds zM9`j};jb&$b(6C&iG42~p&%NPd*yL#aBaA=^G9@G!H_&%S?W1l)SRbygq8TamqG=3 zZD++wTxjV+LUl%hI$jl)!jvqpe`Sfh$As|&lym(Vi$pbsSVg79<(j$s`35RM&QSKH zeVM4QFQb>UFZ%?xasF(p0$nu%`aM=VYk-RHpI)?~`0ji@d=Ps$eR7AE)##hDg?|36 zo9Z1_R6-Z6F6Ug{u7- z1=X;+L3R12!xua}K26}Xr^|bIaK=jW)AO4bAd|Ie^>gRmQ*-Bhh_}%32yutzDlA$r ztronc7dB^AN%j(W?>KUuZF8xdSDi1=7Fxq8G_^900>&@z--!tHcTld~GNnoT&SRD0 zbhP&*ER+tQxI(;g$?VpxLE>Ve8gtGE&-i2Uw$FvF%hb+n<+iKZ?{H1eaPs#J>;DYW zkFJVhh-sm??kjqF;%)f=9|ZXAD|0%ZjvL{d4pP}t^2n9o%i|V_w%@8Rw5Kbw$F&4* zH5IL~`#L5Mv8#lSv(8M!*@0mXnO_Y$ zvZe*RHEX{p^@U*tRT`9kbg$?gpPbou#~;C^Ltch3T%l2{i6U;3>1idC!82TtHS^V! zHrL@WiuTXc=W?d?B+iaG=LwJF1vXl$3E!`oq|Exq)nwX9jp-}?pspWT>zLqQ!mlE- zgB_)%xhE)#4!457$STi(EI#b8eTu|23E?ii`G5kM@Y(<9aC7?<;+9?>^P6!xF6i0b z(0cU}(IvUbjxjE-A0IeNc(gI`Xkg7G>GclLz)~FR#hUb1MZCy?@zx%fyVkCpJD67GhaRZ-g@4TJ~;4$)1N!rJf@Ofen{zD{~dKn zXqV8Vizq=FCuCy`WNTPiH}nm+tTJ;%YJ}z%z`#y+5dlNZ%d4Y8^vP;_V1e@_sYP2zIh%IH5T-nIYTnx|e^O1mP8nrzxWpAL!5ucoJIsd95w zU(BB8-I1ohBWURDGg6^;@PN5f+YlWc#PCGTVCWhm(+ClCc)l5ulPr;cJ?a7#6_bF6 zpD0CiZ-Py_x73rX38fz~(FqSdcO~3_mWy>2l}UHE^uum zzMgV+

t`*CEhs7UB*pU9Ei*TO+S=HVL`(qIq0WshMVG0igeRA0c-8YV+o!)3iyf zwTzLgdZO6yDMGw$((^a@Z4f+Yzkqh8K;Ma}7O%E@icGX#Egk0H?GfMNdjp)%b9>44 z+)}4<>QUUreKjEj$HlsfNnRSZpPJzzDFqusK5pgl!2s+t+L=Hz+G~ZM*y=AC&l(B5 z@8aLfVa5=DI_L&b7g4BgJhHb)m~fUTn!9;(-9@Fc^VQ_@Xc5Es^c1X>sK@EfLJysu zv+DfHU(`Xf>n82jJ&Sgzvmk1fer;}Fk=&_&I@xoT(CX_HHEi^;bm?|ZJ)A1?S zM27K`gM-{TyAJ47-F@3E57&o=<2xVYfypq%qiOv&H;nVP9($!O%ugf?QLG%W#}Jn| z`UL*8x>Pfz-4~L=x8X4R&D)xt*3-`C3n8D_OONQ9dDPWib*eja?bfc8U34rk4;Xz! z&(&OGk?f^mBgL`2&KO-d?rwiR&#x)Y*gRJq%BB<7roDp%#*4f;oCw^F7fG&pzvi`? zvrM!x>+ctA=PS+J^t*Pp!Fx+G;pR2YTi;FeHQUShZoA}r9UCBCa56+R#mz?kLHG`j zr=ho!&dlhA*_(dBTwpE@!Cj8J?JV+A3+}D?StT)x-^fy1T-=CGGAJ_nlf0I!z%4%$ z+Ln%#JC1W+*o)se$5k@o?~f2DpP}z4Lsj1ao44F2xNQ^qztpDX3Z&>anIfV;L#LLa z&-j=|`-~%`>(81N&ABo+WaoTH*RW-+lMAzkgzs*cAUD1FFi)-(rM&pl#g6uk&uo`s z8X00YI}>#BwAUW*Q-A!RA}Zi%+jq$!D0?EfTIsvqb|L-qfn?3`*93Hl05~2&tO@Pn z3$-Ko1lnwV;n3m`>tAZzB+t%eBh8u)Td>;)c?U6XSjo^%c@t;Tk}LeV!an|*ASdI^u0rw zQQv#ozslzRpGE(5dym~gKtR(KrhN7LDZD<+`&Z@8dBIdXUBzcucJjSP`q{auO0}Nd z8nTnSzk-+YV2P$G&ETe!yZ9K(-WD^8m^u&^!0~)uXS;}FB)wz;SR*TW99nl)s~86s<&AzbM&|&5dV*yF&9`( zR-ats{)wVLE=-$vymTrzVQ!b+tj)O_a?3ysvF_|@aPIeLEp*Bjwy1szyll(mt8_L)|`akfRL0MAcW>WVmQZen;aZS~VU<(J|4KJ^6oxfDF zkjb1B@0SwR_g%W#lsHfmTMIwYlfeGe?qeH;z%(@ahYS++;7IQO5=OIqm#^O>|M$^a zAeOiNwtgUfEyauF?BKPj+)>LE={B2hXmzz~kLqXNN2 zN>RX(ldQPaU&RW!hH{!GcI>0Q0y4VWfLHSVnGTi;$(AqDEx!#o<>Q)5)q`eV? z4tSIdPF+n6kUSMR3JRX7!e99{A8=W*R%RhHL7#gnQn)DO=hKpI-C`Jpsv2$vCH=|qCw+uROeqprI z__3!l4ZRMoJmqrX|1$y)uVh4|b_9!fguIAHN@yN+cic)d-vNZEU?0fKvGArlPt?vq zg6VeZEw`ecA2SKW#i{zximcuX4j!CvD6VLoYs5tzMN!A)3>37*u2?ZNTQSe*^h>s&6*TQb$`dY6I3P=e7CNf|wG?&eGqx8K|QTFe#!pIjaMQi=3QJn>$QOnsNanzlbm$siZ zt_HQWQZwpQ^-(-~4sJ7EYwFG>G(nXg1DtUs7tNqDN6pcv+^wP!O`MYx9ha_uFoQO& zT}hUrzi_2yL>;Mch4Ka-W!D64+BiCy?lt!MPl?ucWeU08wRiyTqVPk zXQL+krj*WOqvaC;G-b8MvNf|dg?T_@3mCRVN)c}Bxu~uWgN(bGRFuLI>N#*D_lL=7 zj8Bk(t3Vz|dIrKaDOe}h^CK{)jMc~19sA)#J%&1j!2+6E;X`LAgyniatEa1^U$_Do zi5dHh5eC;G`J0tZ{Foe-;kq%>_mi_{aA~ir{-IyS(J_ z{jMRy6#E=}0?LRW(KLh8D*UM?BFM_E|6uCTIFPlrA=tvoKfvhV%Hrv5_Toj}|%18807xc;V@(BGxh}9;Tcrc7J+-^^OLfpSOd{4-<3(fZ=T<~zPLv*^4H|A`a}75 z8=k*}%6^88ps4@;SqS{sxW35Q+C5o!xOOUkCD9;xZ$t>b_i&!T&-YPctkx^ml@E+k z^o+3?Wk}Spefw$zxPiq=T_C5ZOyAN^u7l^RYP|9y3}UzgrjWfRtUBy#AF0?Dq;B! z*3Vu`=+PhMcT~UXqeO$qTCF-lH!?0f5^&P2ipa@MdH}|H&c-0=Ec|gV2*V#6 zyE>F|H^nJ^rRSmCMP5fvTr>Z$myB;QQg=tYV`6iq!LiPo^6Xv?(RPJ*6=^$#Id5b|Mb|``{q?XM$O~Q0SCp%vPfZ;M z4WAMwANO5%%!p|2-A-N*XV8tT2zuG&<1KZBeLA}viCA|UR88VunKZK@02hj ztm%Th2idB%IFr&(-)EG%wGUd)<8BK9Dt+}L&U%&cPc#-=w9v$sx&R}VJtD{IgPHX6 zCguSRoY*h8WmVS|z#-&eW$5YPcoWx6=&JcU)7#fwQ!YJU9;iR-8v+ox&Y8!Bsk#4V z*3xTWL!z*39Bt~Av9W14-p~T57=s+H0ZZ829|N@PEuTt@OTCdt%`et(*$9#svgfEN zCzpfs9M#Kq9wGS)>Tmme1IG?`m+%a6Non%=5rTWkV!R*Y8K$0pLRZN-tazL038Gqb zB)p4YX>M#VJGtIs6Hl0k-si|^3je4Us7z(mCZXJ{*>tDbtHXH&Blp)zyAa_Ss&66HF8nRA6CX?xHoy$7)>L;UzpszQwr)ag+mHs-ULJ0S~q?z z<(eJ9fXIvwIJd#8e&lTL3Ww(6|EAI`$;cbGJkysCqMS3(}e2jH_N< zI&_*QE5_Sx<9eYTd>b*)KjEF5KN_98KDdC7$QG z4+wwdCyHoBQgi)eDdalrF*3dLusZhH?c$E5U0bDL*43kjm-#(rV|Bu#R=oL5e=un) zy2Ai2RNAbla-re#Qvp=IX|EF$tTViZ-9yT4kW&4m3TncQ1~e|LgT9+qSf- zkbBfL4mypuujXs&|D&$_Age2ck&2h~P$wJsb~IDW)INM`{*o9x2K>6C-@xEeh9^ z@b#pb$%nT+O`?!X{MRhlp^UuO@HEZwap20G+b>dRTf*b92_VKhl@{( znewQDRqBf@cM3fgnJui+<@{*8+Ir3VC;7_iHO5o21z)`GJaj46hpQL$`L_84t|%xIIL^7p-&evl zFxV=jy1&oJf~@8=H<$7YH^chuP5jdN8nRu{Y$K?UQ(}q%JMbC@rRP-C6RRC;JqXMm zb0tXJU;Zv$A?4^$*k+32O%mgCZE-0$;Pwj9s{47{1vd>G-IJc%=#`Go*U2FkdU9}i z&ujzE%>-3`qI?NY$cc>1K}SJPqFOUe)0L9GroSPlNG((c%(CeNH?lak#Kv>&zGqf# zI+QP~aNb;!(9?fs$S}Zrm46-|TJ58;7-iiFhGmQJVc$NGq915nbD272GE$04WiI5J^jWz#dwb82P$f}t zR4D&~X`tjGiq}cy9JKw*OzoqX=W^AJ^`hI}8;-kec zDOSC@cn`j|S0Vh>S|Zf$`G~|Jj=#h@J^D(J5V=B03X1n-9b}+9DjT>CCVxV6IOkJ( zo_EryAaEw!-F?i-lp!C~a}N%Y4uQf|{$7CVlE@2iv%>JR_{Y49Zo`1P_by^X7_f&y ziUts3I!c6IYC>jD#sC-Ny#8iTv1950_znEl^hk$ZQfA;tN-N$e)np)YBvD!m(0hj=R=|`?gcpe zkETBJg$wV1&vTo5z}kcTESuGrIL4UCRiIc2?>)S7OVMo}!FH!!>ny)fnxG@Oeud^V zGbPxp$0N5#kfHLzCTcmjLk`^B`Y8_&;&YYKd^Ya;DiO9LyWeqRY5S9{;=4SXoWprE z-VmycMlP&R-SeY%D&@Yt)yeFQCuLX`c3x|dJb%IKw=)%gtF1GAd82N5(RU$Igmq@ z@S>HB52`lu6+>DXQ(J8euv9MWM|;KN_bKw{Xkwv7c&UCISP_;nDQUuK0w}5J!=fZMBvVuy^m28_eDg{J>IE$h>@g|-`q{Zs zyTd?H_>@E4$tfo0c1e{}j@R}!rivk0>>AzJic;k~ZEsicO(p3s8@TI6){E|^n4sGc z$%N+hV9?;@WcN{((C-!P4`jK#Ds({l$PuCwI<5grY}>@OkM2nPftyw+6pTMbR_zoY zE?0GACG+}7&0alC?K2rIQ#GoK8&(9IJB|o2kqWn9HA1~XC!% zk7V((F9AGIbKsr4jZ+;Q)Auvoo7w5wGPmrrDmmH%2jAa)->@~Q@JU1;IiZQz3}Lp(l>D4vEieQWMq1TZND`r9Wx8agPnCK?7X;kSf`A;GVp~a2M#Gy znk%`|Xmns4_(sP}9>h-B{C&zyp&oi2;^O87UhU+B*-;s>PAGs7RG18lXCaz_}^lJ>D&yS zpj1M5gNh^Tx;5@l0xJ~P3UyHq>IkQF`D)_vOIEIdc8(ua_*+eaU$nIUEhk6zZ*jrK zrl%!O6WdUSZb6_T?tU5h40oovBjl|YW^%Rx!32l+w8fk${Ct3@IeSkk5lar`*ZnSY zJ;^kEanog2n`N-m{N>xbfCW&A>xDD_d~F6Rv--!=k)9_KdqJ%{p7ueY*45T?l=dtS zmp{FkH-B{Yu$7A(1o2EhiY3d!V?*&{s>64jt_E-AZThJhe6|jm=}1Nn`Dv-Cxk=os zNc^pqljVSlr^D3}RNk@F_QU_UPi9xiE)Gsp^@0;~u{j0z`ay{V&Gx_km|AdrUDfU# z*j^ATr2aMDpueWK!n6z2pm$cjV)3S%dxg5bE2r5{3%cAa6i`N+c2EC2ML&cA8<-sp4V(VSTc8X1LQK1ojd=T$;S z0n%Rs0fhTS$J@D)R3EplB~-V!pZ%rZrW~zRAG~0=QIrO*$$9kDGB&vRoX(Xdc1!JS zZN(UIPWBtj{XD!|Q+{2?KrY+2=ssPiJdS@rrE$HKIRXtxJ=j=<*TOhTaC`1McK0Wh`i~7(N@J_J zdf_c}i5pwApGLbi1}1y4rCO)r?gG5%^tV^)qr|xBxG3+=(qM650M#<_>D!0S@VNo} zojz7cTE@+`od2siqybhlVlbF+{exn@VS#ETi0fTJ%95*@PGw&)5|!Jz{DR?Vw;%Kj zR&n80rec%m$U3}{itrqA+vyB6nVn=bwHA`sr&FhHgDh2M*FCDccwsc^wP6)nOHc+Kk2noSvx$@ ze?W9vzwh-rMfFiJO#E$*Z35NbN?^{iiFWt z2gt3N!)hTsOdmAFSA_rL6VZF}B8NsDED-S1=G9U&y?8)eP?XK|7h2{{)Xn43L_DDK zRsQOw*5=Jz(FE?&y-d!axeX&KUfu}yp}MKltqj?MY(P`dGED;ThsbWjIndyUoa}6Y z0_v5>!0Dn}y$?fO-OIfeKjIr{9klSzPs)GN>22EzGD6%Inp+E-4xu1^ALsm4V43C@ zKhpJ^sll>Qn)ZshwL%t;YNH*Q3GW3~83#fgysVyDGBgI)zD{19o3)ceh--E($;fxh zTx?moxUxFNsSLCUnNz7cG_r1?%Rfyb!~c9oYif**>vjE zwcsONjs@9i(G!vUixPU$;)WlySV*fB&tgTCrVEESI!u;DhQv2t{)=Gc0H zG`pJxw(hp$<@t862C<@yQ|-fwsfSdhcfwb;HiO0+oOvgotIAfUl#7LzIrWTC3jES{ zEhC;aZ!}$E8YqbKLa+AiTsyd_AB?t?Y!D2B~!ni_OCWvSzCE# z$Uql;7t>lTbSW;$Mn%eD@JYvvir*qkMMI>VA-=9ygQf9F$gN$%L%wpU!3|#AwftJV zN>#W6-{ncRz(mJfpwp{%L8YXQhmN#R?U>cR?8i!32<9~qZ|#Gus$ zVe`_S$^5^V)x5%3*KtAIQf0alH}4ik&3x0EzrSl&Sd{cSg4VUJGeIcxp-9B4U=ouXvD19^7GOL|W?o(N#;trfeUbWNA=+25 zKUqF-OTk}8rC{xxST~{Fcj&NJ)ZulK4V`Z`Ro3yj%KYHzGABA@WWQ0@_S6zoAI`|h6j7=(t7xoE76sf4H!f=p zvBkj2VEX!RGm6Gvxq?PQzrZv<5$_ojl&z!qUse>dqjCYorJqSoNihWO)QO9|uqi*1 zo8a%sim<6Zq~@c_tc=KHaC zkZ3bRaO54=xqK6c_mL$}qZ5w$YllNE6LW&^OQes6{PJoh$Z87P?t?L!3 zWY}zw?*zuH)-N7g8OiQ?-eZ!vYZ^DL^=TGKUL|o5(>b#FYXX-j;eOdX38(sgx!``1 zAL&+-$Pf|fM+5r?X>$XDP2Tb7FMZWi=G31c3v|DZkU;eA-X1TMcH^=UKdYrwxs znjHo8Xwx!QlJg;yMbCM&gG}#FsQd-f^t)%RL;F07w#rVJoA^vUOpnr7>1~xy@ko`? zv996~&)j*B34?FbPi{`&E}}s9&wBrjXdKo*CS*s$bm!F3b@~$J;zI!^8x_)xGF1`r zSx@dx za>vICNQyU0S3j(@Tg8?9%WWM+{hwW9k&7AD)O~&pmV&>VgA58!`u^E%MYfhd`6i40 zlIDGb-TN0r{5r;jBr@Z{-CL0?yh$b;@D)_Ru5-%oKCX7W7MLX4hyFob_sgLoN4H%E zY;0<;=TWS81-g%bFo6QEye5&$H@MrNK3yT(JeE!`aM>F=LwQKm?4;TS*Q(1vQ0wPS z;Pz$9@}om#pi|D_$&lFEb*g05N|n5NQTKrMw4Jy`hUSJ}juT(r>{6HcpkBg};5g=0 znQ&=-?Uy;1ad!g#cf`CH_S@Dy?DhZ4*6k8CocBWZ(~edehI7(S{c@eK2#dU#{Kfcm zo49TQ%V+jn>(bnxpbM;NXbDfJxY5Lx)=dW!S(k1qO5W583vo93^`$USSZsM! zoc!lg4(jw+Z`oBZO^4gpq-Qyq*n?5jFU+Q%655^qI6lhq3kW|l4<|={bHc{ONG`6R z;I?kZ#?VLkVdx2vWaqLc>$@5DZh5hd!+&#v&s*gGn-dl{5r+EtLo_r|R5g7Or}fsi z+IeWx@(2fpDJu;A=oKRI%$fsl{j&3xolJ<5Z+4OIr>DJp#os&4e$UNB^m{o72vgYx&$( z*gK4So(sy~K5Og*$!|i|1KfCZXrtlD8G$Wi+LJ3_Ph= zo!j*y%JuE19-S~JH>od`Sy@5hk$$%%jN~qUqA%vs8y)(W)4^thBJtX78uf*DZ3K%1 zWTN|9{fdyi0?-fnjKS85_By%ZixB_cb3$E^Jbf&-aNOznhwaVSx1nOniex9e3jcMf zB8x5tx|V>WzXH8g71hmU9egaw-U2#S%`>8@7Pdb*Y*6?5&&fxdHTQDmd#8UeRYR0D z>tsmyTIiJlp+1AvWlqY9d^ZxTdQ-lkF>(&cW9CKvlV*tZcx2#mhTD~|bj)s?t4W=o zR->M*^V2^$xoVpi@nQ9$H?@fXeCE3@t;xG+%@Fwf^qdm-{hHCoWczVHAXAK~HX>LX zDK)o-T7Y^1HeWRWeH?(kMJ@Bi&^E7_tSom!Winq3pVoent$Ybp=v#WD(6+Wg&c<7_ zm;h?^xcjh1t)FT-BV7{c!4?f=i2b9amV+B5d9iGDzxm^%!~!`I|8bD)fXLQk-H?7z zd{4`bE1h9&m}xCl!b$SQCt9CLfuZLgs&zgB5?T-J9Xq0f$uCvDd5e4iTuhA7fPAZ})6+{xQJ1#K}PFV{bj(_Ysfa=Bwd>;H>f5+5=b|8L|Hpeahsnt%Mq z?cR!{+I}*SYLNVp=4_Zy%lHk7u(w<0X0vJkBA1^<;ljT#&Y`9eMJs%K-1p*1J)=uqURFd(_lnS4^v3w0!}J(o9e03MOp@K6>v>{;Y8CU+*FX= z%iSHy9g!Ia-cwS>Ug&g|e|j@HL1oh?#E1L$ikte&B)?@cu4HMn{ZZVoL|t{Yw>Pw? zXB7yWsnfIzaqt@9x%~7G*0|rpHvXa-QQO~C!|g++8m@XW)r6}rDhlorb_TQM8fORI zF)Uf+&yzze6W_RgGL?)Plc|Jw9}*;xL}l!_nk6Q4ZO6j;tPbVd-I!jvZc8^Og6I(vLqP0jv8&^rd(1Jf$vFpoSYk%Rhv0_ZOF~BRd18Pf%A@PT$ z%H!nR0tLm~K;4G5#MR%MzK$o`%sq6>WpfH7*d*mXj9ja|cSW5!?w6mQKk&c&^gear zfBf{BLeFE2z2e$%RATkhKw(QcgkF4CFt|$fQ9brj9rDcLACfV!vLNi|GaLt+iQKKd zZyPLSD`;$?SUU#cw7%8!Z)qFKeNEcc(XOu^N)|aHQ;gS%EV}>Z@s4 z5C%PmzZ8cN+zE9BW)G}|LuC|ec1ptD@>H|ls@X9~`@nA*IF;sx=>a|?P@7*6b%B(h zR<9`d{+?Ogzmt9U%mT9HJfp_WT$Op2f%aVGE{26})=E1u_irc~kGvHWIk6e_t7}-p zLMz<`b!Qr^80aS3X%^BMHlM?lH`<=;s_n)8$9uo5#a{VeOeD|5GHuihw^WF7J9iDwf#2fV-RGM zzA^BZN&jyy3ex$_MTFL%>|nY7jf=7r|Ib|HrQUVFQFp3a*S|kJ}P%rm>;}^o{4QYsfc=K5f=2wt`2b>wHH+;2aZc z!H4)`Vi~hwcIP|VjKq}lPI7x0jW%*U9J9M;kSYu?;JCML;ddUVOQA;gD2;mq-yPX- z`4D(8+WbD*icQABxXn9>wuRA4{3tugxI)nMO}>uV)tm=T(1G3aHvs=2zPy?g!R zJ!#W&cyl@zrqru{BdcgQl=bDTQcZCP(8AZEw_Dx4y}2h)@%5@&YiZG~lHd!v8{#Su zuhK|Il;+i2xy04!K$8)ZpzfZ!imjgd!<_Gb5?aO0lh%C~pM#}b(I-zYtZL<;r5+;? z6Z(0+<%1=p&DzJA=u}7aOQ*)-ATD54oB*=1s?aUy?`;Cai4pQP0Ta_VCT|69X8yS`dlbLDFAKq;$I}wC#uIIGgo^&$?AO>n8MUrE z>!T|bFQ^-Qo!Q;oiAR4h-Kof} ztg36~sS^9Uvl_f4Ke@u^v6h@u86{}E^vmr_!w=&E%7i7|xR$#k7-h=pB(+V(Uaarj z%t7qe#eQ_ETz>!G(=vAdBP~-q_x0!h+*1o1d%E#Uw|NDCwQtRWP=uj}5|-p}6qeLp;W^*C@C zhPBrD|D91kPl)fJUJhYs^Dw9{y=pGaMr<%cnUFpxUjx4Rz4Zo^X3 z-~BF0H1;Yc9=dTT_KrpM|7E^*dX0$m6)Ik~dzwO^ojX(aLe(hKbLPo=K}#UEn@-hE z>cV{MZH=*{JNCyGdb=li-a@65>FPAq}@ zkGcpw01cG~Q87r+td=A-=T3^sOMm`a^8BNr56l&gy0Ec^L_@=&%_Z!6IW>wxfx%VO zTpUg1kPD|B86G{!TuG9gKg`?ipUM5Pngae>rJS|?>Fx}e?~Ug)4yN?CWrDroxC$R{ zh23(teWIRqqnI{Bf0mBCIPLpNw&n0>WXeGfx2sM~7z6iIg;fHmrw&{pjwk7-5(`9L zynU`PgXar==aS2qFb?|1YuD(#yQU1JT zMxL=ZK8vppF^Vd9{KnDx!R{OD7PbZZ+jif#F{B}fip?sX1(R4O2M>;xrVT804hNW@ zBKTJ=Ip!s7EL( z;N{A%ue*>1Ebf%^2x`!#y<6_!Kj4r&{TLl+uObLbN7Ax1h({x3`f}nd6?ejuh{8!h z$xbT0F2g=`?8RJ(m|g~>*KsxEuiA4OUbV}F&`WoIjmnBEr zv5Lm5!>=VvmsgMIfMD&j#&F62>0>T<9ocaP>P05Jn|VY!)iq>Ax!aTP8^9obw!Rr(N5lQ#6xQ)0`l&&l*tFCL{z^b&977BPBip zT)U%4ucU86yuvxDXQ%XT__s=YOjK~?xue<9zk#ospMQ}smSS==cE+bP%m?EA$)TF7 zJxZ6x=K8J;Q$}H+|r+8 z*InOOFO3%zyv?Vl@8*#&z`NpVOKI6~klB<@R8;rbCd)(H4l6_c$r=-Eyh^onkl!RZ zxnK8r={1o{@A}KbzOP-7khZZLP7d43!BloXzFS;}umL6n#e%iH-grZNQ1}CWFvWdN zEOtif;ZCgVhd3|_{dsw1>V>d+b^AK_)z%Z1Zg z-AAGW(2Z@_$CQ!x8Q$#!g@%Ui3q2?F=C##cyyNJaZ<~8|JPr^NzGgxQ%LhzVh9qGa zHqpLT<95>@*aN^eYtnIGENpROsMD#OV2m%Q82*d2aN#ijK2& zNQNv4m=X+T;Nv~>S#n(ONAk8Ex}};iX*SS&0Vk!*C(-4(p}0_o^ne`-6T>X^Mg2X~ z7(O0W?BTkDReFLU*`8y-1G@JfIv;St#Saoz8MtBuA|H+Tsq=UX_jiVbjKzViU_e~B z{(VNQ9|GW9r#ugEcpz}P=Pg)!;a4zF7WaIXu8TWn>SiRgD|ymPqmwft-*^EZM+ZIi zBy-{pSOx(Xm`{GWNMJRGNn&%~;Yd2gcU4$C?QQi8W8LcWWJh)kmsABxN?UJt41@01 z2(8XPf~s3=dn-aaA_Gry{EPe}5;oF4l&zyd(LY+72}*BpzFV)%#o9t@iyGp2#`+1p z*k3%cj~4jFkEjqY9;o(3S#~ajr8HagBp!wd)dSgK_3ln8EUM)NaGipamk2pVH$!ui zkumPEU6RQv$;~LF_m-0J45qsMSf`78yXIl9LDi(itLjN>^3_WH0i|#L1DfC&rW$OiYO-h(-<>Ms;Z*y18=2xP2NH?E@62LE|4=x-=4UDe8hc zNorL#FBBhpdzU^>Z2iM`xFgO2eXEu`p}^c@*}r4cpLlo;hmy;>TRy6nB0t2ss^}6ZQ@q1K3L3y=T?ikub8!d3H;d$93i8 zFdU%W0px3Ti?DF8i)dnpX)uGVZEiB8=)_j|sePXqA${_bpP-#6)Z}6a91d?Ss5=_- zxJ#VQrX77}n>L7)ht`Iw{nILb%rV*#RbM0(KX%{sUnGP!NaVizDOSEd8b0{WBQmW_ zv;ID>UWB+g2r~EpGA+N3Mj6j}oKjY}ahg(|*HGy(7&IZkz606$f(PBX7J<8(5#N}y z$-=%-hN9B(jyz_N#=G9@Akqk`!mqY^6~Dg>96Pw|hSh(_Exk+?R4z~hk~ffSX`^0ODBm zzsPf;%XWDmQZ2uySodC&gDs%PWn(h=Xu`u~d9&eSh`q`Us^NsHGF2@-T^pSO1jPZv zr`*6qQ-^tN+wCdM4}9`lg>*tKai;t|Tb_*v+8$CzdNkK7Q6u z)q(GhTW@^2KRwbti%Uebg_f-Cjp9Ng=OsE$gn24N;3lYE%R)x{^*QVKhpNxK5>K8@ z1mu|TfC3;Fm;*BhhtN2G5q)Bdd8O|P-!sb7Qb6}9Ly#9aM`mjCpL{adAyp<8{}yC&``m9wiVpKQ_h z1;{G%om?l$3rv&t3 z#jmL!hcysAe|;4{s8?}W zN&3RP9RQM6j}J|I1dUo0U{Z@)2g{ z^V*xXgVPq}XV;SPpXpCICw5Hj{UyM7hE6CP&a!%;{rOGIFiU>)eT)stLM(d!AlV!p zO#TLPbfE=S3~9cmoT*C$2L2m&hvSSKrdrs6B7}cMG*|A1D{HBL+%3P&^V0u)t!&!H zjn~>=*=5ngB#)Rf^VsEl)66o)AulS%^?)w1H*c`OIM>5rPWDF8yreHz@?y2Nlittx zXtU9)#elvay!hi%IPq z3tZN*ud^R?D-0f5F`74J?trWC^ZZD1QON?@9wdrYU$rRv%F(iQ11FoZW7E5*6rbKq zF6{0Qf91xt_NsRbjH&m@S?{F6v2%0+ZSNb#_e9z~h9fe2EaUQhi!J3sz4zw6& zQp(qnUrXb`^Pk0=pUJxfK;C6+xl2GLcWS=8>l&iKqLi19e*@aa{TVZyp?U=xX(Pk^ z**}D5PrcAd+d+fjQ&0eC9d~sbGJiv z`3&%LPQ-%g3<#M~6f)ko*w!^0vS7D0mvso2TXIuRepSdlAi*$WVqJYUjNuR$c0F-U z<0Q1VWRmh@&9K@}>h#uc3f%f}s~%>+ad-uLbIy}Ln05k^(r8lt63 zeyB$xm2>HDqNmklqV%WE~r@;_jqBsHOa!tH~PXB&B;5Y8q=Lj2kv zrgyj-jcGw+wha}JS>}lyvA1hJ5rXbrC&n{!z<8EepR#0vXgE?S2g$#;n^EuYY(zkp z%Ms_G3wh$y;f)7I{%~ySI@|4On{QF#2fOO_iI;1rcu6F#@?p*LCy!wVguAwlTnb6m*qkd)poQ??`unsgLPGNwz#GDpv>8^%u@$nhlBx`(xvi4>E0EA z5fFG>NJmF-pI}n8YNTK|Jn<7Vfs-vuNd{fKl_~i$Xxw;w*A(2dJUaaBI7wvL4~~rh zjHdh=CKqZTlP#)76Cv0I<)`n!BJ*wrq!&l3{eR*TOV!DBj z6|(OumoJ3GA4(&XW{LIUq<3lYun0*Al=7ZrW^gaigPyNm_Ebe?0`+SE4FU1Q#S^Bi zl8i>n&Xr6EJCg841fE{ltbw}K>!Zfo>PIC(inbh+1c9g-xUzdE5BCR(=j+Sy>_gni z{xr1RCK@l~A#ZM#WH_oByj%C^k7`oA(I1l?x>a7PIr@THG~S7->v-kmLur|1GV80O z>jI%D@?9?c3GaOOV((RiPCkS&Sk~btnsYn2XW848Rj-yl=(fh^)Cq+=umI^EiLHNB zBJp&7N95;a*Tz9xqPlRk0KfPUf?6f*ht#E9*>&YJ)T}D;Rpwfn<t#vTYPO%LGGO*I|y3Y#mqKD%VYGpm9bD*MsF}>tv*hy(vy@fzoNa${uKcu z_LS-ky&T{91i)F;^~dTyB=SFyT3*Ze_sJKXLZ3(F6&zOuh)MJX)gG`!3iWx=g#mSP z(govXjccL9Pco~EYHG_FZx~*w@mxFgwW*A|U4fl=*USQEM&{;-?^R!ACj=|;m+E2K zJWCKUZLts;_oiv#!syaydHD-2`{)gKXr>o4y5~%oSUft zP;^o{%^IeSvz5ceE`aVYJ0PQCXQIB-Q)`X1K^RZWxLAKsQ>VNj^h(l zcn!rhJ)eXhAWyHQluo*efPvPNej!Xk(}|ru%~h}CkL)7%afuI_n!u+fUcEi+;vKIK zncQUv&;o`1JJ8ZlbOu`V#9NjA04;TY30jOL&Oi&pzk-(XtfVTz4_0GK7bBK6>t396 zo6gXS;94I-bWfl6##*cohphRTes-J2^zW4TQsTssk*XpkqDepn$M}|oG6GFZ-4hB7 zd8BY|adlBs63+3jU6MoGBGU4MYHv}P*^C*!A+unKMDUhEdVsf(rV>-O|HfO|BL0H6 zST|uxC7K62B`d?AU|+n=XJDePBjaA*q{Plnd#oc=<^dLdfWPcH zLG(qo53~}K8D@GEK?@}Ax84z-#PJ{;085YnBJDg9Kiy?mnemiQ_d@&Z+GC63*oTmL zEFw(UJJqRs3&bBBJ+XPV*aJQw+1UwPA>M@2l$z09Lx40TryF*fkN)Iys_ReXQ)p6qS4Tcvl_ zI4#{gzwu=zVp$B4V~9m?0eS|MhOhf|QVzDGChQrZXqj5+C?nmL^#Q;y-u?*ul83-A zNu_wt3-LnE@QX(C8Gh+R6C2jeP2m>?tMASCu+jUEO+O3TFus)IJURq-j_41vn#WrTuSgD>h&p7*IWE^w0k%qz}WFwaqK1n6! ziQ$N+q_E$I)zh3SRJB_!41Y+S8uPI0erDI+JmZ%K9VZSmp1dkHhKoo`ZD$6vMbw}a zmg{>*sa$-rhHF7D`u2MildvF#b^}*?Du|Y3Yf!G{qU`Km;_P3YrBrfB^m;VXq#;e# zark*xaaCEa{7u=QZLWfaqUUJ?tC3~{XIKdcvxit?RVc)DG#T9e5`kbkc|nXjZu$rW zv)q#(7+yjEOU8<{Ydd<;^!C8ET_)~9c4ggnzM_0{OVIi#6k0-Wz^D!w%eEOQ+apmK zsVmB0a&7x6m%z0rx6#^be;^o50Ku%)GXV%DB;y={@p^cSV4fc%7^zbPV;uey!CVTh zah05a2hNhd7JhFevmQaG*ZkoiAP6vo>AP+KV3OkzM39JSPHsn@MzOl<@KK>?vVFZ6+7{SXEI#0{%(N9i+w6+Z!Sl;q#R$&ty zJINxmT{0pkC&Xu=A6UP=hY1CaXV}&3)W`KVU~3BZxmX9(GU3N@D1PAIT*J*BFoY#K zp_6k9U)lmHs_xvj?53sX&VVPFD8JEFpFsx>CgK^_LSwBnF;H5JjMN(((-iQL#YxAn z1T2RKkzJ%?Q|P>2bK%t+lz_=$SwPqn!1Sp0{#w{TL;xr3yKc$`5Lrx@PS18xS{i2t zn3pF@z0xvw$pq1=VPo9(7^sDCZZ}2=6`To^UH7>1_I;CkdLz%b1BkxMeBz`=Y_{>{ zz_hcIk9cRj@8=`O2gKugZ55)}wH#me{1-rD=50^jx-1M&hL^eUzb01!!%`xHNI#|? z1~rq;GPN4&FFe$8t$FLFgP`iNvJN4oqIYOP`FxclXBv?gJwzgGp6ku~&4UWAw3x<> zZ6MKoUH8K4KFwB{3?_r!YuUvF?}%`0D!|A((~{mrmX$;}xvp2MaPRar)Oprp!kjBV zynO`G-nqYwRVZ%!`SrVJ&w`#dmM$ASKWzRKY5kFf&?o>i;i84Cs|I$4W{xe7bUB=; zMwvJI@aD=*!^H5IY_At7;|=UwKXi!FYj);|f?HZmdY00^=;ZYe-0Qf`>8>c?+GkDr zjq)Um1JPfw`7m~4;g`5kJ+YL%!b}G&Wlv8nWyyf0?Bj{0j3$>#Dd5af*5R5+`Fqr6 zsLz4qm!%B#Bx+*=L~YP*epceJYtI8QSJMISU zx+6+6k1_|{1%NDN#@0vYap6p^hvWEJfzb>f!tSOT$uU7zceYD}oQ`s7XYctR)kp$v zF{K4I3B31QL*2Tg$8NNK&V}zG#jonKM}Lxoa2gd-Iy3ODIAyQvSRc{v6yBDuNG$;yC+LF9K1LVgaA$9^DY&rlkL6l*Y5h1 z-bUffKQ;irh@LJJ0#^oH+>ex?&#nM{2+kR$+`si9*vTOJ5P-xE^+1fiVWskiq65ln zx8yzTR%*adFyyo0nCecECaBxsxH$It#*lwG)|EUhQ2s%(ox<0Ke5J`t%gYDt-HT;? zzY_a_Z#fQo04tJ0!JBNEz1GY7d1Kkx4{}V){ZKP}TgFOca*iayN4dpXS+4oh>Uno> zizcJlhTJ8__>|6Bcnx6| z-002oz0b)aQ;sIuo?w2C)9_AR7!39de0t-xgaKO#&4^V9!9Y2n3Shd@5fx|AneQT@ zr9JcfNdRa22K@zPG(woSzPsL1c_Z@1iNM(|13+>RP|x|+H$VI0*jl*G61!|C0Ja+_ zDo_3@7cCLcg_fLvKSq!-O<7weu*J}O>3RR*=^yQVg#J1C>aA{0Fw(pHg$Sc10dSrj zf0eX%UTWpc4H4gXkMlzC&-i{3;7C*3^(-&?A6{Ru_P(d|){9Lgzxcs7Za|XGX2aW} z%;E5ad^8b?Ro1*Q6JhrwiSZTwIs4Nn3j~O=^b6B1Ib?V3$YfsWmgd4=^3ofOymde1 z>*ppkqThr4CylU3!iiwm$SQ$iGnS?n3X627fu&kw&2(WIFF1u?;_XP~n7P+SAnLxB z>D7E;RTA~)o>5_aiRUX`*XJ<`DQwJk)n zfy?%944tIidhrkwJ-phEx6RmH-pKBYhXRjZ zF*x2zn+RwJ1H1+&!!%u0GVvUu^bS7<- z9-m5^zJ0+i>h!(!e;{q7e@YwU4TO~}@-L)KK}Y)GDo~UFD4S$K4hJp3OlHbOwVn4e z=Sa8u?80L4%S<-e%WSidnW^-c#tcQIr39H0SCvMuY=?55=|f~3Pc9KFPo5*oHcBAn zh3HNO<_*jOm)pkAiCc2C0S|=p?fysC5e1zR)yD;$hkbOd;H1Ot%ju64Ee%-4r>z!A zNm>qgf?Je~?Hc+oQ3>7MuS+QFw3@D_-Lmkm3#C5d>>M2-WOoAB3pHKZ{*Ot2j&Jc}l&jXSZL=$p`XfC_}5RC!G z&QaNp;a!)*ye>IB8?)>xyHLfTzSB?BR6MYFke)W8l$b6{gRy=4tdWcoT-mMKww?PYy1!x^`PXbMA@FPdJJZ)8>Io3DuOub8{=0b6&UR z=H{+J#Q?M=Txy?&+oBhJM?S|gKbaXghL316qD;JyB<=TUekdXYMg&T{TeKx`SFET| z2-zrV2+tL;Ri3DtH+ZivKk>BH3pMy8x$H^#svi$o=RQww-MWWnK^?+V#^e8GjDv+N zZ3d{nL`CHUzF!&ePhi&}O|N=QuGE(d1I{Jmg^zFQ8S%*>dL|j}5b3xo`0k=)8%|cI zcq?!Z9JLq)(Xgq1q9_mu-Q9tP=hLWtRZpH)L8Ef@w3`qWtOP;g0#rS7{7ANU-AN+4NcduwtHC8c{guL838SQdYIMvSmLOU5F>%mf~=L7ct-NgNLg%mZcY=j)QxKLe&vV?bW(%P0xeaiMr1^1AdU&IK7`lqB(ih z*1bST_xYOHl7R7tMRfsx>5S#qvX1r?uaa>)XIk@-8Li%QYz!eA$)X9GH9vqs=niTp zl!nBw@3mFS6)FbiIZaW$oJS$}xQ8$3{q~>h=5DJD8*$zu&0y) zB}%PuSI(Y1d`zVRogsau5i?cSq@efATt<5pZYvEE6D#LVa1L!3eN73*<6<=~1{_>9 z#;lE>?!<{_ItlvqjC>YQG$3|6)Me)1>{`q1RAzNvUa#R5PB)opu<_)58?wq|teu87 z4W=2Nw$Q~MzRZ9P*@Uf$YeABv!|x7)dL%@zJ?`~rF}$`BYs6Bx`8JP#O1?H9aezfb z!_%snh8@MDmZbgkP2jR0LT|I+xPBD2);O!L5pU4M(fL;z-HpGh$M_j zqqW``7Go-sy+W@3K{*aH9tzws*LlEW!1!9xIKFV21a)p*Z3;%Ybkc4oiQgsP!N6P? zld(180AxPfEHXhF5?h*y!*5Bl=lHe*ywBS003G*$=Ld9^Ab|Dmhrzcp_?lVxpR)xu zQc?tU28&hDL?|;3P41=A!UH4o1E0!s=Y{*x4R1HVI|VXc-__jRU$SGj7atwx2ANms zC}#{?;^wR+TY2(ANLcgaRSinkBb)k(b_Mg+wtzblTjKCX*NJ0tlLC;Nm&fGB<9Bl7 z91W10%ns8ChIpG_W;4r<6SGkeI;^lM0F;YpP!SwAAa%>y{TVC;sBVLTf6(Eh-dW)pv`op*PyQZcMSnh+ zqS=2#rkw5iPL(B2>7fXOBm*#;P2wRM11$P^^A6~<=QPoD|By9Uoandylr@+-KLE2C zXgR+rv*YvRbbxd+rl#_v*ycTF4*B6@X=B+io)65SxgW9r6KQkD&F=q6o8N}z{zBT& zf-CmK3gpJLG)v2U4zwdVhh1BsCo!(;&LY4rO-htQ7toHdr2P3cIy6;`@BeFAW1rEG z`WLe1=H8L+_&;`={nktN%oJ6JWc>x#dd{7;s3hVW;X=y5u0&b6nou#|%(ScJ;}rPh z-F#z9Zm6GDx-*;!-&+D1|Dgpc->>bthlgYL023YZ$DX5S*&Vk2yl`7jPcOTo&@meh z5KD5WK8t$v!-=aFPo~jtbmr8@YWo6iTH%Mg`(}w^MqYk(x|nRc2*a~5ALsv}t?{J%W{WrPIn9tm1mqh=cY8O z3;1IB_O<&iO6&{Ymhj_T;O_#?DVf!=u0Q$A+0X!*ICXAH;8U1Ho8C(rZ_vLl1NgfU zIt8g$>0^zCWp$H1!hCwdipkG zNu%%qqz>jsn>swb{N4C%Pz;!UZ*iFRj564l0>%6ew60*b!JoZjHvgt~tl$#O{C)0x zW=4OlT8#&io0gU=iT1JS$nFV=21M74+}wy}zi0VeWX*E4a`4$ZH&!QN_bezKw>~nv z@b!eIo!w~-nb?9j9-f(gP~Vs#cE)(K`P`MXU86T5)Y6zIF0=Zl|LQWExO=@Oh_i<4 zJ-*dQn3mMoS91t>O~m3YnuYL7@*;U?uT@h#qg(I>pWmaquZrAA|27ok-n9bjCipL; zV%+rpr&BQ@RsSv(^ObPhp&FnJMH&l~=AGI>BBnNe z1br4GatMA^{J@1^v95Z=>NC!XExmj6ShR#K)js}Bw4kT{AzDaD%}^zdMT@rn&`X@3 zqGb~yS}6V$EtaREMS$_zEz@8Fld)h?9Zb@TPv}Ro#b{rkqR>o!<^~b2!mCW;3J}TMI9)Pt86~k*-HejLBNRKbDfv(aBs0gRu;2@vzN=T?y6!D zS-5B%&*usMKA%^e{J?C*=1z8@ke3Hj9Er23)3Qm&YrY+)%|y~ZRw09mxwLvo@eSoz`vHEE&w4dwBu9m-YGe$yY$wn7Gh4(Cn( zrQpm0@F-;s1LNoG-FfFsWh2L?GT6*7QyHWG`q4IYw_hn18_OmkCzZDH%Rp)A*uka` z%;gr@dZpUr-j`p@1uqp~E<}V`j&(AP@UPvs)^|Aa1$Qd@a%sFZt`I=KKgchb%l;Vx zp7ww<*6x3~4cBn<@ijV{iKGYiBC+odQqy_gp?G@xQX2 zyL?B$tzO|>um(6lmd)CFgU>$`bc5gisv70Bf$XY~$s{tBm6TGEYfYyEd{-^1)2@s~ z-Uvv{NxaksOvC*#!53RmEM_J#Iq6UYCc3GE<*a-l#F0V-jJggEJX+lnk9ERPX1cyx zj#1@7$!to3%5?2Ja^J>b}9JY+JS4{ znUfdioR!S{H!IoC%s%GKUu5=wS;_u!W`E+Rm5ldKD;eTfGA8VRCJwgvMu?~-)5-M# z-;k-<*>gF405%&&3{yt78eFBJ`8~29nZ9-JA4T@LEZ=_$D~*%r`5+@Y5*=x8eXSR( z%UCkg8}vD<3EgEM=1efrP6A85KRJC*;^|X9LIXY-{Z^I^@hKPA>voA-pN8M0(zVLf z)enp_sc7%)js1LSfaiQmDzm$XVYHw4Dzch~3y+DTkEpz{G_Me=0V@7+@$myb^xUQn zvb6pu_z&d@#gXJIKO*6Fe+8Edi;fu7bZ~sR1x&ok+~}=*axe0Wluk?}c#0{}E_ZoU zE>u&Jau5%%_;B?F)~rEpLBAQF2sJ)muo6;wL_w!H{ipsJ+V~|$YT#wkl~~!@_Y13# zliM8vi`RB&DB(bVR^SvHo_3hU!-9Pcr8bAQ7xlW*N-P=7l$z4PEkFU%U`QAGMkYB1WB-6-np zLsW^dK=DNJ558V@C=#l>&Qq#j$2CZ4Q0*BNBZb%vdr#7%5y_CI(Zc%5Lj-42%@=p` z4Urnq(7`y(Kt{D+Ru3{qC`M3s_n@i2PC11+22e=`r0Nf^`aj&6i?C<*Q?&Qo z=Qh&G8Cy;&>h3mYYSes5?%TJdCGJ6kq4Hl&?F)&WOYLj^Yij=w%NTNGwgF%nlMFkv zj9J~bhCrT&!xcHGfI>3T4)!6gwQ_ZaFBdB(Rk;_-7+ceC3k0Z48(mx#$sk^L@y5bs zO||FiO!XN2pg{(~+@1#fVm7CKG3W}=$@9Re%|VatxMi7IX-Ar-x-uN4_m#<4qhW8n z^5dFiEShWAPHUF+?lD_DdUaN_%)5`MS-$=S9+)h^IhLfLYA3zN-I>J+DXhnpE+21! z65i4RT9>;Bn>tEv2Upz^LK;vlR0@^HL>GVkN;71}Ph^7f!phOd2r;oQpAXdP+^L$z z&bYQSByZ+x|or$6V!d^))FP<}-Vu-RaX^A@TnaEt_rIVhrPcKWeTZJcnp39VjY^2dbC|Scg@?@GdE@g*( z@Sg0BSOxXLnh)4{$r4Lrr1@E8Myx|6H}?eBK@r<10XzK*&hIcxX-)8MsY{JGKjq0c z=bkU^ugXn#&g+87hkmyuaY1b)Mn#_F)WN<#If_jt?6b9tDMG+MyZkK!gK;46>p(Jt zd{1)z@+jDs9H;+?)l?zsuvubQgflB)sI4)|f(QD0NAt>RLKXXD*K-xMYICNll}oGj zankfrDz{d5Jx{!1hrGvLu~z2->tnCjH^3`acMuhN+$u1O&;$@!miiyr2 zd&TI6e|p8bN6!%ztiEHSazpgmcvF`t_YV5BUV1D2@?OtZgu72|m+QxkTvTf|~a^6HN z(}_!rxjysXd&KUV$*tle6OovP#|5+06#Lu@b$XbvH;8R4*^Lz-j#fv4Lohy0pQ0gS zAkVEway$7;z2P4--ET`3lLq=1i@Y1iy;nBgdRXHB%TBit_o$d5A)9$lz`zU1==!je1N#`wP%T{Jx&N)S8_~GJk!cQu{vK?;6ld zz=CKdfY+Az*iT)5$t2w2eo{4dCI45|SPQ}VsAT~hG@C1uU*53O;7nrH_SsA zjnJj~_IdJ5SuD!0-$3U2cWukP_wrtI*&&AV zmVJVZID3oh#MLCkEkRU=z@0_3XQrf?^Wl&owJ`2|0s}SKE{O0W-ndx0#7jedN?0_D z3k6UUW@gu1&nXAbYRdQTH_V=IuzM4?(h6cItV`kck!*f~%3Ym|Ard@9QgWzMKA+yV z1PXq>#L6bW)hNp3CA^gXecPd91tmD8EzZ%)xbaF=TUpZc?|#p4l>E;YTT*=gGm9;y zQQ}}m24J=3D)EOVb-m2qX93dpo)KoEh*Rms_N&HcHYl+7uL{s~LzvE0jX~es&hbF< z`80J z$_N6hpwgdU72#k6R-qmJiBa4fM{x4f*Qx(;D^!_qcBCkGu;wXvpW< zP~&wGT`tF9Po_| z1LIRk+6_kT9*FYf!*<)-hx0>#mrnCA509{Se9v2&I?!E>?^DTHMo0wFHwKUub47kI zqHjzb>9}t!@!PK{m}e5QfAo!MivxXQ5mEdp{b1fE9MZ55w|BwqPrV;y1nAaZCd5TV z*qi1kzjS5sCt@=$EcIZ}i%nh#?hIf1Ak|Z^Dc&$u|F}vg!T3r#ZrEkl3VfxP_a6rMAyOG`hycI;&j5e-C;K%iCA%MBYJc;3d6Cy^gstubfz5oR zrZacdCd(G$9Gb+cmt9#>blSJ)b(rQ29*BB`m}(3Z#BDShMTQW*pB`~3Cbx1A_deV=9!PnqW-90$8XF_?LbkU%* z_eCUKX1dQMT{gBKpyALudX^y|3+ON>;BO#Hx!JGk444625DY-)3>LsD)#K6v7`m@{nxe6 zM<1qlJ&powfh%Av2X}h&j!(o*>a%^IQ}?0c7xMdy!GVaex@awt8wfG%Xo)G=wpS} zKl9zmHVj^rl#tf@tpbxLaiAurBYsSTyD>wqqg3*ja@q5VZn|!v6y;kne%gPdRSGB< zrxL1T`7djJANvcSJ-5UKaQ2l z&DrIiGvz|*uzoJXANWUx-~H>~W%$`j%{|8_Vq1)ldCU6VNr?Y2xNAIaiO+t@v4^g! zXBRcfhzf%xJz#O9zrfm+pP#WOQII~M0@xlcP*mwQ6WEuI5Mc<}DOPhl9-}Ft;;x%} zN^bLHSLsaAF^>J({OsG{Zc^D74$Z%u>WicnF)`s`U>>mBTWLD~9Lq6Xdf@iWQTZGzn#JsC$+Sj$OO&+DdKt1Gz-n) zv^FZjf3ql4N)@MmvM7^)GLU>zJ^SbAr|P8r$)Jou&CcgM-v=<&#GIo{?Hg`|Fy(UZ zsw$67wyHdb_j&~syl)Ix*JcgPWFk2xyB-a|cB25_ot>Vj0?>n8RtTI6tH05GI;bZx zm<*cttAZW`4}yynp2rM3-GSR*Sf=YjL*wdFQHV-#0AE$#`%q-Cct8jcm(0n%ufK@P zT?BFYE#;!G?YX>_sUe3{49tD*`)TX7p1rkZTK|T)kev{h)J*k@DLg&u*eEc#WZlm9 z6w(vA00}zI@w?MG^!!cp7(@oaR75D#S~oLIq5^Wv)72T66K$$a!xPXKXD!O)qPx}vnpsQnYD4#|LJr;O=0B5jea}z@o47t`?;$j zfRIq6bX)+Fmm+-9lqruyv1KP5{&Kj+43q@_uOZ3DJ zKHf9~k?=2FZpAnDFwY^akG*}%4dPgeQ<;Q~U6@S&HjB^%CbeDG8@7EORy=>dI zH`D6ouglV{IwI;aErx%_+grbX{An(F%8|F(d(?MiPBMjC;TdNTUgUF4YFX;LJ)EYl{cEXU8Q+t%wB+SQ2O?!+`}b;|)2&j$%L4u_wv zrfS*#@Hn{e^#O=Rjkn+uTCfl;P$?iA zgQ#%!5u@T>u<_A7a?!nnT-mGH-f0yB}0lWLzL}nOc z-3aVgU7Ez8Q`oVKO++*P5W4R@gbO~ zh>7O&Hz2>Whh_iyr`dlwxY;-xK*^AQiH3pmyzve4 ze(7G{MZT`CYd3f!6eOTxtUJudg#;tDzX}PGuk#mKUnfJ8!!a4uC#kxVH(?x&uGn04 z|62O;$~M@yucq$fkHJM6mDlkW4d|o!0fUZ37leDu6Q?2bnQ!hfhkZAbD-n^ATa~GQ z{r>jScWn$YE@*7K@i3C5Tl&y=f;NwRn2*yA-=Xwr9?d@^RJa zI?lijEmS*DKMNVYHf``}ELM=_P2HM9NQUf9jcQ%v&o7TC7jp2o>>fpmK%7@B)$;8a z>^myO!w%=`a{KTLx?URcuneUU_zXSY)kX@cj+-m&=EfvbKsDCZ+JPB&?R8U zFu-wPZjbSC)fmOgR=H!A;pZV8iucam)n*qvkwA=s_hccmuBmtAova18zKDjiPqswg$$?Ls)|nw@$3 zs=AQIqNOQ7Ocgd^(z(EjsH)rpBt8GC5J^X3%g*iZ#+1{)Ty;;Ys=rcihv;I_Uz-;^ zQbo#dJ={SFd`VF;Z~st5YG!+^S6wU{Nf3LMzV$=3zF%r4F&zIJvp(QxM%9@v|FHf2 z<2YoVFu?^W7f}ITp0G*cblARsRfqoIin9#VX8X~$BOHEQz`O`?0X9c_h-)lGW#{eN zjKPi`H(|Cw&Zq*H)-hN6Arpbw=!v96x^!MrW>tt$yZLNy_^N)6l1;;%07~ILx+!7J zkzeF@x*Y|OErrnrEP{&}_;;D9)1r($1}?me*A~=YUQ~iYZ~d&Q&d)C;(hlz=^T8i` z=1$gc@lZ8k62zUWZ9DF~T=jZv?VvUx3u-#H#zM&SBa19q<_J|ndKG-c2Yu4tpnQBU z9IFH_#}0;{Rmr|$cq$JKP}5@vZE^KEJFgJQEIV7$dP-npkC}N>Jm&;PaN4D){|{?t z9T#Q0uX`005di^}1`!Zx34s|(xFzFvVQ7S*^9-Wv zeb-)V?Y+Ne%w6C6y6)>oHFNf<)b0dJmXi0XO6mI)RFzVmeFx)VqQQl2 zHz1@9-f_3(ymjm1=Gf|;e*GDS#6lV#u2Mqfv8hy#31^?^eLZvE1{n%c?G#ptR2M^j zi=P8|Ch~}jT%>KSQhNa;ab-p>R_e z!}dkG*n}5#vFH=@m6-wr!LX^c%%_eJ8d|CTK~Z5P;O(ifdVRp z!A~J;UPSAbz~3sJ?%(?i>Jg4j5=Orxbn7lK=TRbwwBwrAp9BWA9@%2NRdonE>ZH<= zofrNjtm1uy=I}7-vk<}^dDLN`i=m>*EGQYU*XYkxSK`$B#FnP7@s-KB9g#t21L)q95pBg=&f1 z$r09=7FkvuXBIo!sJ1c;jw%cu~n9&WQK53$|7@ zqz%+X3D)9L%xtF@yu7`-m&19aL)b>ZMhNuW{#OL|#*v{yU-2zf&`jQ?twi!AeTTUg z`+nRfR58Xp?8J2gr&*cR^@LpJb|(EeK3OkpO6MYRL;f;J!FV0}hv@nBEG=U6H=m+gfGT8r7fsGo`1CQ$ zEJoGZZALW#(NmKOnT7$u(ChL-dBUFLq_LrW-i*O4kc+PNp9`P=sxFkSc$E%8)4k87 znU7l&`|Ajm&QZcOH+Li*tQ!8Cyl%V(wlurSzv8;ffY$b-i%`zr;dgD<;dcc1f}8JC z!0VCId6G zD|ucYahk+7O-8GbpSN2ufxip;V0qEXUSLK%Am@GvnKS+XmO^_mzR8KN*bhdDgwUp+ zAdYpK3YIHdV-Ko?>y%C;C^kH|HanTw#(hB3-602b+Z{Wz-$ez?D4IOoj=p3mm51B& za$6nFiPA;(84Fw#EVL>|5o3P^S754=xUSi55}QvBKjf*>UKI^OyCK*X7Cd>CU1Spo42p& z*QF7)Z73$Pr+yXeef3IvS$iM6X^tu#l=i~FB{ga8MfDHMs{2&GLHz;vPn!3$G_DXp zd&9#Xz>^@rpQ5oQ5iwX`i+5yUKlBTO4*n%DFQEtUyn7h>uN7cfl6ZyiUIW(mg^+li zUyt(j4+ntK)7v7(>eyNoYl(@Qmac^ay$R*3E)r=-xbrbZJ-fW~89WN~=vEiyc*=l! z6jz-#s@CI^6}HFsxs~8R2A||~lxr%fCPe1lp?5x5D@5hnajUcEz%=FN)2loQEu9Yu zeA=ql&rExD>PoK4u12~2BunYD@$|Fa&EE)fUYze~zXs79kUw%D$ypr}Z7+|x=tY&X-; zo}YelpY_h1fMa_#DX5zIYn}!F=Y8>CK9O=!>y4cq?3mfR#KHHclulc3__eE18|gpT zE&w0HW*;Kl_tD~p%1|By|2#jDwu6KFCMu{9mcE$wwroI2tlmYZ3o+`P{4V_2%MS~B zPT9%Q|8vy0{7>rt9VY+hqgQF5qQWbrJzp&Ga{r|muI*eK9Up1_&FIMfccUZeui`{J zvscB5ihma;YW`K6=zqw}`}lvInfKooCxX6MzB^c0wH_*-AU!+|ubiuDtknOh z8tXp?eiyZz(`Gwb+Iq%@o-ZfZ$Y9Na|0m(l)?$)%90l6=9A3}#r*4MlZL|C;Qe=%P zQlz(rDpItPa8;zp?(ap4a7F(2MT++Sn<7Q8GEv(~t4O7giaV4)8U;{!KY!{Kp+v;f ziS;HUtMge@y`s-VOH)A1haEfXB))gnZXA6r_-gGFRiJ&rl!gdKxgWv*~8~ew7DqTzH4F;4{^qJaCnrKY8Gatf-`k;9p4-`0qLX9-sHt zeS7_6>_4UF4fy}Z^gQ0Z|fy->WpgkDvH6FT2lgjHGEOKjc@K%7>8-MYznYV1(wCtAv}7| zs4HagVl+!g`^NR_r=NAHMbxfcBW*=1^9JQ-Hg&4T0S6AEZYU)6LsP*1=Y3BH4&OfR z3D&WCGA)a6YiF+v`G#UWM~Ui92_U6&f%h`i=m~>VqkQ2^=@CV_FMl%Ei$(MrFLf zuR5Cxdj~#C*Mirtuu|0V0k*t(?G`%vTc3+>jx&!+$Ias0qVTrGvHtx4AJ-T4`dGz? z)rWi^tdcP-(8)}D+(omjMnp&2v=Vv!DjYWOTS{Ti4m#50 z6?0p$gB=~7sma|vKS>j>lyw)6d<^}t%`RTi>3s*BqOp~|^TnWUA~!{xwPToqqzR+) zQ;#?Yje`M0c21DNo{hvRt^?^Ddgz3%c&WPu%&g|&L;jD**NX>wFT}32(+6kH{!PD+-ZOU+Ao~k0$d9il$*S+oH zar%Yqlz9(ywEXyf-|Dw*X~sTQhww)rwW#rS-^Ue8(9CVkNJ_?nOLO=)YuKiA`SE>2 zb6+BKo;K}i5vp;?c+E=neH*c}+e7|`tUt$f%2QkFG-cxJwKXwffsky-@M`HQ?^~4^?zTm!dpLr__D&xyf9?=DO&c%+ zG&0!q#E@mf<@W>K81L%rV_oIe>wit}S<-4`?4uOEC370k-EA<|w#doj8(czeMK^@v zKU68#&8`X=p`;Yhsq=WTOs-s1fuNE-2gEzY!M?p|n-6+S-ODvtTpskOjM-VwP^RxS zk04T4oOp-7WM_WODyK(*lGB@0X-%P42K#vD=ADR9?LMiyhEfI3Yc)l5*8=hA0u#r% z-!3V4RYGjf*;3zD3i6eCf=Fk1GkZYMjP~81MIGn7-t)n!kz#8Os_5ek`;jVOCCQdK zim9KKLj0cx>*R;}oomi#<`GDhWKOpJL?s+wIM%)vHe6!Sn^4h^IDWd=Gq@e3k;3Px zLYPMGml&elf(z*~!=uns2rc%At>t|+rR8S{y1ZZQgBaV;|La}q=yj>TxIiR(_QaSU zjjUFj(4;feh01+Wm9w;LDAgA|_lu?i2>}I(6NzMW3$jK&IMZeudFS&OWDiH0%3oj< z7+(4sjz4*BJl$n8m<1YRH1zN1`C%J!dkDBmPJ%8jZfA(iVWo2Jcb@CT8OfNxx4#sb z0C|D%UQ9IE4t^wSCf|TjF{!3l82N#g-{H1Phdki@)W}Or;{1lt?u!vV%-Iu0yQLp~ zO5}1xKgWbwgYOTHyDDWVqEG2v99d-)1+7%hX3ZE0cencAHA-`x1p$2^Tx8fwjC*!$ zQ^`^vD5uBj1e)Kh1wsm`FAMZLA8u0hC_0^hpuMrQX{b#X zY7jK+lccqKJ&VuN8oHaTG-x9~y}hUpvmS%`LFHY@=zqMTP-3OXrmj2G2~2d!WD+R7 zu$z`lll}5l<^Zy^Y8-0<;9Z~xN&HZSsUI<51iNyT>uf#3h&X!fJ+gWrEfeLJgoikP6d1p+&J zC+h#>^1UBl`$|6!;|kj4_$(qID#x^GR0RL{+cT~2aMIJ{) z^R@j%2OMJC=L1g@bGZ&&HC{3(G*>%Ni=uJo^3)GxZc-w;wK5Gxy2z@Bt1^9>V2z$ zRj_bW{(!@f0-W4*L?g@k^{Xqz@^@}i z5UJbfa}lf%n@6?6rWw&`edvI>%ot6f5rR8iPF%rmF~ZF|Y9GAG?Kv)F@in z2bml{3^_t0izDe6lo#buDRt{}6hVC_c&3o@Sqe7_*_FC|(QHrMHdIlIzaB7Zps#d$ z8^?vnK4%!WZL-U4*xQa$JfPRhh@z|GZMn@1`ku(M=#f(F z>1waP~yo-~xk8yTi6zW+6tH3Ycx^?|Af7|YnoThJ- z)nBt+w~8!km^JgGGF;?ls=lu8Gt6-ahYc)g`FbVD&6}`YZbw3A#RI|3THx(G;c6(X15vdZF6a+ zF;;IJM7hKKa#^0>NrEIUm{)lxZrs3!oO)xFHIO#4Y`>s;wEOeoi25SJd~TI@Oijn` zG@C~|P=B5IcmFx-ON_E*^xsxfA~ZlVwgcPAnRm3P3b7@F+Z?#&#v-O=a^Sixr8iX< z22y%s9Fzx2QBw{ph3tn{TKCEh9>O9+EBtk-X0gR%l_NB=aV?0aC%ekB84GOQ$+18a z9ot-ro?dE08{WMu^1)4}sr3{TDXYsyxDuOJMGv-y0i_QlSlra{`U~9~W!9 z#{cmw^#QYhHs8^AgeEPzV3VPp*{P1|y7?ky-E%T1#`A}LW|Z~IktUPEE3*KDb z#6o%MXkIt&hOR4`A<@01qKM;lZjqeNv&r&BiaSoVZP(RNg7CKtj^@)=*5(?0GR zzWG6_V$2PZ_^vzAk&ey#2Xzgc8Y4}#JGw+``HRwJxvdOyqLLZ2VZj>7JB|J2z7xA{ z$#-0>+(4F7n;bOKugcC2IMmN?ZQ(r6+y6|~PPOBR;qWj%Op8=@!lGNN>C^2(mef;% za&n({jyJDc_<|!`Z<-zeg25#%N-xzhFH*~d zp3nHd0S)HJrzyy-WwoDoPus)zCz_wFT)a=y)OpuevFZy7PMx`RJl8jzh7=RBaJTg% z)6i)?=(noV{j0faRijKxixL=yr+$0j$H>TD&Ym;Cnv18^8x_Ja_+qUaS#5f&*fkCT zjOye59&nOXvC#%Vw8}9ty=QpJ4T0?f)z)emvtuyvyptsFDsNEOXP#;2^aaZxK#b zX;w}iQ`Uwo2T{?SK{)aHJEGn<2YK7xvB~&6ZQc8eje`3zobit1xY%~T+sQdWvfAIt z#cM5nF><#l72qoq0)$xTgSrvc}>bDgT{2DmZ*83}EPs8*tf z;l}W1d&cTKRrB!7FqRE-udNWmF#`D>{wgZ6kYX0vJ(l-%Cx3OKx$i$n^na~_jbl88!e9)M@Cy8N?wq1o?1j>m27Z z!#!ivZvAYH+-i348i;~x_ND!@#JsvT5n7FGH2mkXM5mTsQ=??)jfXSK__K2&jYDkV zEj3F4AXWg{=IvfTvQ@Vo!6e4X`8Uo-HPR1JhpG8YV>&4X`ix(xZNdu-o(7$a8pOcp zW!y_qk9#6=OD+43N?>hu|2=o7qUGx_CHV|ivVyoMynhv+m8i0&)FKa zYHPQt);Ex5pI4aN08Acln0GH^Uy%;RqY#Sz@lyUUY8Byy8W8qQKpPDP2xYzP*UL&m zB$_dsb{#L*r6(@PNVaeC|MhY9%@mBUZ+l)Gx4U(U89=o2b=ZiY1Ve9J$?&pofWD?( z2zQs-%U&T*s@N~&*$n3AF|Tv*+pvpQ-0ZAC)t#D>%VPnhyDA;1RtB9>0Jo*@@U9m9BDp3Z7ehOYIf}pA$)p1ocM= zK!705p~8M4ab^$hCCU@zz{#VUHz{1KIzP~&YQL}|Tp=D=meXTg0AG3f4qy-@@eDCh z=;{I|%yr%TVlo|>yfU0oCSW)q1oX>$?8h(v`D_O1SdbX+ns1yZU`r1?FxE zg^cTh`fC2bhYfPx^K!89^1`g)3$_&^cKRNk?@oP)?OmVrkyDxny2#Je6W`7>mZ=If zf3Gxd-1vzqBXvbA|9FjyY4(*)$mQSu$CVokQ=k5YSw0K)v08=x?XsXIC#C1NRsW~J zkpPE(!z`MHeWeL90WS67$7>HAHul;YSH@ZFgGDEMdV`NwolDR%`N@^|U|Kp^23D>z z^)78^)VwvY(A|gbU%SqU58X})&;^k;N^6^^@P;<~cBdH_+$NH@t;zPy+GhJY3qk$K zw`9z9sVwER@G6#dA>%gVnGnzWZjE1gUHA~^hdg-jGwle?C1TpPR{gw~=6#wqn;C;D zmb&OK`$(?wnB)aK7khBSuZRAaOjB+fL~)U^!+s&U-EtS;&^#H6E5Aw21jMoP^pwY` z;I~l3B6bKg3P4H-Kyx=H%&Ppz1Y3LyH!pk@;gtJwPVYv^{ODCvH#5?^_(pOXWfYu` zi1WQ=9QlW!bkFpq&eelW56nylOm~GSjC`JSZ@I_f!*V)pe!fk3_=>kpVFNoiO#KUx zV#z5+8-$^tGh!ezt=~;ai>fb3Kl=I8o*z+kTum?Ky8RvQlJsXv&~Eh={bF%GN;96% zZb`ex)bOwTTt!&9<3p(@2;i+hXk*zc@aZLzEZ9Vq|M}C=!daatUQ#dQqx2uptc4Y7j6Q ziT4-iQ0a5{^0UQxx}Dv@Rw>PrN_1G=Y@E~GG9c)&g}`X{%N20?J0^T49*$V|j&a89 z<6pxW=ySOn3$`5s2Id^`bisukrQjgdi??&)6W`cY&ey!_G471rYHxDuiBH?Q9hL9e zPS7t%V>VFUV(*dfVV7l41y57c87WaJg6O?`won{6<|N_BjD=6l{Jkn;1L>A>sq#S#3e4E@HUEw|FLGB4E_e6f3Bo1 zD^4)0o}bto6Y%aN7HdR(7yY4whj-QU>Ypx`LqF_i+^B9VguqUPN4V67oQL>uj;S7A zPUxP$+Z)J!`%L;c%~m1!Yx9?=n%Z#@$FqWTLj@fS|agvCs)NTvCq z#sU*%J0~-JgIO%(UA>1J8OaQhucG%VIp-giDC`_fWPE}%VhYCEPM+8#e;^=3>ZEMj^;FeAA6D}vL-BhX#zy0jy2k9R&32r?obCB!HJo1^=i7X<8lc_l zDCyPej!lWJoWxdmWD1t^k(593)85jP;DsElIk`9#VO1QiZoJQypp1EM6;w8R16+~M z13vcm9Muk0wT`!u>QMh)g6zQ-pLmNxEc`*cWkZJkq^~7yx`6r_&>R5G_RjHP&AwcWsEw3mQrn2mkz5T{D32+yXr^N`vYN)ej#nQK{zx}Fke#I~)+N&f@8fB( zclvO=cU+6wckCRuv6M`zx;5a!Js$N9+hDaGjXK#ZnU?V_<`4YcU*jKvJWJb3W6DT~ zaHA*0AFPfNFp>6_ELbFLx+gs0l}DTARP+sIZg08;tATB2Fxy}k?!>kk^^vS9SL}7$ z6##MgCJ=3l7Jh4dh?{r{73=8hI`v6m;Ji4C9!+#a?lhEPjX!hN?o*^y&#A{*5{8;z z(3nA7&Wupw%DKD5=0~Q^nq8QtEm4u9>cP*C*hy5D#Z5`9W8;U8Zx8%~ysZyejy{6z z-d_^N30pz4a!=%ltO%=Lwl9&g#6$#sMqUsq9ZpUs6m136YgTE=9ax5t&)HsZ*I6%- z*sYo>Biq*f&u&U;3d><*7!FDR{NQH%pa*OeRLi&x%pi^V=Z2M?V#}#JEhUU7j8mSJ%Q0GB zUy}*{v0cNNz83r>@D5Wn30_ue%8R{qm9?0jeM2A`pzCKUCynr#v13wK10loOc#=cS zL&I8+j6i3+skPV3OC+2xj4K&zOPSQUIa&gj*pwbbxrBc*21rUkXsyEplFaL zw+pkmgO@SAF+;g}(^|PV-YAKaJehTN)Y)9?XUm$7_rW>L`$ZS{LM`XQJvd33!qo3v zpVmK?vve=^{KtvY+|)si%g#tLkO#S)chW8ijpTF z`fT$tZZ{wUm2A96nQ8>!u3YndQrUo!XfdX!7fFk^e4ZgLk#E9J_VcfWvyZ_-gW5QzW$=Js7I6P5}@RtsD(u!Srdb+F~Z8Y~vJiglQQ+W5F90iR6l%Z3x z<%^S^c+mrI&@(93eb~WZ5GYc?5UsEE`NbIT2M)Jdfsa{d%b;YI!L(64Ge2jRK4T&?O*R_YVr_FtI)~YxF~9DG?Od7@PzbU1FOa1YcrHam(E=wZ%n#DxIPCi;&d+I z6&#|S$(|rnwB!kIdlK>%7<;A9)l+SQaqZo8j~`laQcz^-%ZV1(1E1Z_VC3EV4D~x9 z%P1i|7H9ctv&W_e*e%G!l$@%m921)@YIatq>7K-%7f(~`w+Kakez9)rNosYt>l2<_ zy5DhU1@vC5M~ls7Kmh*Ulh@9`WG_UX+TFa*MD_!H)JSFdxI^6LnXp}ZzQWcczThB= z(7^FJXG*B06==j`Q?WjBa(0~pEyP;~B~nl`jgNh)uBmq{X8#iStBMZt6!9d5YhL=7l4a8POG?gx( zwdW8$*(?dl?GNIQ)!z+-@uUBGQUP)EzET+o{#Nue=X)4$sEv5y{b*NLG@Z zjuAg%`{yE$RSoj67u!oyF|05jSvY3Vnbw^o-gV1FKA~0U@oSxb@k^2T*ckUNQU9z& zr^Apgtmf6cLXO0wTP&!2tDm<@?xm+mrzL;U)1@*6~otluX}dke@X;o2%#(;e@e zYXBEBG$sY)tAApo(IBIqFT1}Y+eA`meMufrvUnC9xPNZLt!)o1CgV>XAdmX)*^OHY zp;KU95J8Qrgnlv|@`k3hyZ&1Hb*-;6kdy;qI)v`m3_jkE5+pq&7=PlwM=6r_x`>Q4 z>e;ydOik_QXk6IPN!BxKhLFJVYXDD{&MbXToipPxx6h!Ir$mzb!3%4 zE1q_#lDfQnyjjz}naOehk}~ou>z=ms!VY+`-xjIE>)gkO|F$;nh(%7@cY+?tcr@}l#oMvjZPd02keIt@hjpane1?mi1ky&CJ z$+9dJt|#I>={IQ^ZW57JFj^(8!^{pYhk0P|Sk+XG6MkNcQNjVwH>NJ7RgPIy`PbJf&L1FftAjet->!{g|4pvEu~2*m(9ZneUsX(uV>CJO+k>fc zKY-iiT>`jd)&KZE7Pf!T+k$s+m+Q4V-R$r2IJm%c_SR!++S1IIm)p+vcqcw7QiS9t z?G&*neTDL6Y4hoO;E~VTNI3iRtHC{jT^r5=y;F`C^fw&OK{~J+ecr8|U2Z9I*aG0i z{sC-1CQ#db{3EGSu82KrkqccC|1NLTI{{a@>Pv7*9h;CgFM0IjQPAlFk$#%JV=H*} zxa;+;y|(jl083^+B56Y155IY+K5Zfv(ay+!uUq1Bm`_Y?S-p5muDE?0_QsJkPxEtS z1epHtP5K3!D16bZ;BLg0TZWaANL%Dd1@Y*{_(;m=(r5mjdrZ-@r!Q&S6e3^?`J9xd zPC@CYRRdMUBYXai9p?HaJd{skfhpeA`z;_PBXI*;PJmYK1Z;_XOmB=I$uST7EK@J8 zpO4e{{cO)=B%h((@MJ4`H;T=$HS!GO(XMkBA|eu>4T;(z06g3ncVgV?6zGpzUiZHU z*txr6E4F7_oW3zrq$IgwvdZN+q3xBdzWsZ5a_8X`;NbjRkR=`49@tFy?mrqjfV6^K7eX+tOtgxA+>?$29}lWpX|;$FZf2kyOo5L zh=q8&dv5$ZYbbY`>*1372(fJ;9n3HSDpLSCQW*_xp+gFXtRyeUPSD<0W5>&ye#wVX zm4`G@@s)sxmGb!BvFRFnRRt4g0}6}dtWxK3UfHm8)H$2hbw-e)Q9Y)v?b9phJ$2+(^il zwxt9RA9&&uiX+Vd-^`JQ_(=h^mYmpsKp*x}#@+KiDa~j{QBMEy5ThSGNnatcES=#=M0?Ir z?*4Dn#6vz~I4P!AIxTr`4us56Qfk1L*Nui63GFBpZyLm?gRnv4-k5Cv+ zNae43)p-pEDG7}|^Mx2Ya5opl&j2C*SvCmcIt^G!qP8VqJE%od@S@%lb?ZFm8cf)v zVT^$>on!3u=$be+>!FqauJOf34e1&E(R;@xofJIp>zN(Sq2`y=TyZilj>TImivPUr z*8dsi4fjfInhnV?j;Xr#VO-c?IWue{Y-3!WlwFi+3jUe5{*h|Kq_qE)5i4qHje0Ts zv!YfyzW-~%^UpIn1vVS-4Kd=&0C%5AZFd1o9w4_>LMFqk@pcD}1KtGAQ*McG5a!U` zVCQwjq4@%CeXK+IroFXK57uMrlusl3NiV3N^|_>W+WV`~W!52%yhW%jDKEHz{rX_( zj=BVT6ayuY0<_Q<_xO;z*}9zz+?`u6-S`rOF@!)#olH&|wyvJ?>OX;;B^G7NOwHTd z!lot0LEErH$Fj|OrGX)aq`)1PLE4>$c#`~NIdnZ`Sd=?SW$qg{&gma$>gM*fQ^Dc$ z7WLN)+Z(s>Yi)zDP-6&hq+~3xL4yRqB^P0ftV%C8f0PeUcfckCqEqLO6b>;5cm(6` zo-UmXeux<)^MmL?h3NXA_RS7`+`6#x(CN?^96v0?7@F119!32l=HTJ+HG)?OO}jf( zYbR-9%Q+~7hC({r-X&6)3r2ajkiRqPFBUcprOyUQ;70k)*0YO=JtC$AP1EGkKiW6j z%h=@~jgF*;l3{brWzp5pD)&X#n#QGxO_K*7iUnGH!J~Ui5!^$)= z5J|-lkW(WPz54EE4kzu{dq=U}7?WwioE74^O9+6AY8s1q& zg+0LY;h4ZA{%(r~lAXidB!ldT!w~eu#*k?cBFGl3u`;SB7zh_z5m0)xzFny437?-# zge!nmfpemP)n^33N#r@4sJfE1QqUhBE>7>W-N4Nmm%DrtO%8Y9fwg0QdX07BFZw1R zQEdjzs`%1g#`pV58|E83QUB3+ZO^U0{KG9Q-Zo!lLJGF4s1j}kz~ za9OpbnS;9GqB6UX0ce$?^Hl2!?(jzzs6(Yh4 z(=j0-Z`-x7VvMuabMIR22fGZSv^}ZWY1~)EBX7cKB~E;}9@h$YS%?pPTPl@8t7%LV zIWAW^NGoD_2i{Z?U}ZB?f&z zG(;0gX^=39y?SPl9$qmgegf5q2+A!38XPqa#IcdTB7T^7D9X!47k1s--!x&`d@ek4XjiR#+_huLqb&H65Wm*6O zLF|`~Qd9y^c!?n&1d}a0eAR8Rc-wd(2ek?D4cD$412fqtz;h)Ch!#zWP(sPjO8oMm zQ*~pu$D7}AcwTNElIjR!*V`t~xjdsNyU8ahzIrjz_!0&me#{fWM8jY~6qZ$qPJY0! zWkc#c9*DbM+u!sE)q}#M3ElgumZ-_bLk>p}ng+U__0|jS3tu2PZLV0~SnvLt3BM%^ zUSqUp%rjR0`pViIlLy{euO0`aRn{KySWqY7vj2t8sgXOK2qaa86&=meG7l9LY@r>rl_NEJ0rb|u^X*2?9=KVE+f0R7QAc=FXp%Od) zJFT9K8Tuiljst1_fs*Wtnx4Qa9n26tA;`@oM?qXHjZBPR%Yan;U89U!x@^ckiwj>> zdR_>cd7t)W>~?o|2p73W;Gd41B8oEMa$4T6W~A{6GZYua!+=Q$=sUld2-s=sjQARb zh871!R>=qOh@s#(b#Ll9akbpg($`T_pHvaVvxv4+5iUst*b%$%A4+o-zIOL8u|;;p z=bUZYl0Eo9T%H`PoC@j=zmG15mNf5DPkm{D3V4pezw4RwVnom(ix=?eG!woA-3)DC z1OtJXr<8Xo+q$zUr_#SWF$12JveR@;M(*mtxSN@$MjrEJjS9$CudE|!EtLGssMB3_ zzRtzSao^~*=`s=qPt!vH}@!hWZ+O7YmcP=<&0G0kdUxl*+o$|q7_Q`HL& z6Td`0A({0#H&PCt?o;nx8pfc9COe*YMXo8^K=6!lM~b$%kLnSe$r;DbPokp3(8g%w zUj}v(nb4Z>Z%Dw#(K#11&at8ZCv8SYMt`(t=&MDhcUg&154s}X$vOa%n@0|nI{cH& zywWrFPLBxLzyfFviC9cn zfBy@j&5z?n_~w!qh{yh*Liyh~*Z0fIcUQ9YSAwCJPJF!k@-)eo0J+zZau0RS)J21T zVJ`Yj5{X$#9!Qq5>#pOojw{TKgIF+lm&n2k)VdxfJ7P!ZvR|8YF@KwM(fgJ9{z4xRpHty|(Qb4sHfh=S11i#hkfWMp)hVo;QRo_-vJI8Zp(}_iP z1=N#)ei)o*$z)=ex1Q}7E2{n-FXN^-X@ZYTTT@k)Sh1m`^?Uu=a=o8M1z*YA>i(Rz z?-(LVy0n~r&O--7Y22lRAab3p8uk4OiQ>e}{Pwn{qxB2zOH$+Lk&| z(s&k%krnp?PgI8cnmD;2Ht$x7g)iWVNVD~_5i=$9&68{@W7+DLz>}WoR!kktv@;v` zN)&Z3*Kb9Z+19x_oo0+v(klcX=AT%uMG@*-NIyopewv0*`DY4!lFN2lu{sscC0ma%e}{*NaEb+yW20p;@j z$IFwc1K^+=YTHAy^w;Ir4`XCID6E0c{ITs_W}UO&UIeUk{C2*ge$tabHO_Y9xl)>T zu|WgShm5Cwhvj5nT1#Jn)7Dns!-ag~b#6$za=+7f4Bg~3xl(Zws{lsG7Iy}(NOA$F zv5jy3qE&FfZ6?y?)T6rCW|o!w(8-yUCdB3^DeBVBNw;WmgPCu8JY7@{^zaWM&M7uxNxRJ`H$0~81`u9V8g#AX^&&{!}6r3HU_2dAP6jmrnh~I89@V5T#}huGt@R3we5>h!&TkUD!AoL5EF-o==DLskyVt&&NjdIRI5WluPkNK z4^-pk*^~1M*E6&*ar2R`_t#Ar(LeidMcTepCa)P1+O;bbLfD{3j@t`CL^!q&8 z)m!FCQmPMizaRhb1*A##+Wq9UGZDH{qz!M6w40}F#R+_TfrtsPh5RvNq_qEX+akIU zWAogao)#SvbTFrOM0DRPT7cr(FSL}`UUoRC7E;rfv@%0tH66BpL@jJMN)inz@3DhL zs@JSlN+_8w67f2DkPxSVxR8G6px{N(o^4WPdiAkXXEa(5rw-?0T-Caf@%!I?+vNuj zlqd%L_DwmRGNw30k0}mVKz15bwQ2kazcNzZG*6^Ta8_i7)2quv+9G?rKdp}c3LJm9 zj%BpBH(AyuEip@COojRt`xrDZ&V|FfJmJ1jrDaZh(@l3E&jgWD2h9Wt%$)0^K59=@ zpFe)cwB~8?0>`!A77<4VF3Eomm7`5t?deuY;xp6@ZUMPe!|QDCF5lnXwqHlfF7;R) zXg)iXFR7hZ2}EmW=s)i^kcRHuk-fn6(W3p+!A0cF`&d!z2&s8&TbrH*>k6Kci_=hS z?`D5qot{xLI=T7_6r~5L#ST$ALG~+jcE7Ohe<%97tN&YvEv{~W`}a_7_nmKjB&VNl zdZ1IId{=R0z1myxI1jEIW9&mWUnRIRXdy^-V64HO0S)sr{)b1__sn>U&ri^8|ZF;q+gZ;y%fRSYjBN^QNk|6heykk-EwUgakGh-m457z=Cj2mf-~I!S9r z6Sp|7W;hjkD3lQ~QV3jWfaEabdMGhRYJ6OAAkM89IJMxy;yNbli3Pe@#9kiLwcS<= zZB;MH=gE{)dg~Qa`Qq)`E38}=j(EnE^(+^ZFDXuL!H43gTW7f8X>aAkxQQr1$0!`M z>?t0MDA-P|{H3bCTkG{B+~yPwh|CKSTc#xZ1%P{SJc8_kYgG!>+R`W;5V1Xnt#?0I z2u*hlIG+AsJsN50Qt3C5$*ANo%@x^sK>HD~G&#wR$MGAtt{k<-bytpBTRdwVM5G;F z3DqYuhCjeX>?$&~f+DV(j$xT=cdU;_x29aKccDj{sbF&D)5`tn@COOPtB6iT*tt8w zAcr}3KQ%nj7G-W+wlZ~#+S-)6be^6&cefQ7=RFi+hQ!osj@-mh%j2ECosRNpUioVs z-uU(?WM6zhOt}4YLVzxd@~qxl5GC=T+{Ls3`gN54rvK>o50e5d@|W%v#{51axO=r>Eu4GD{!#YnYLGXX{x2FDWPKibg+r&P6A)K8gwd%_#zB!grlXLyLFVij zl(RkzXO80@K!bmDvg3YtEYi`w95fc0r6_69;%X7od#}K(=}K{A@rQQ^ppIA8x1Tpn z>u#cpuS8>hMhT9cF;89XQT5`li#~oooASLy=l6bBZ`C&8T2~F;$*HmrdS` zJ}nCX^T+Yb4*t&WMIHMRwooTXy148RWXQH-N%=q&bplYxGU=24F1wY%5@eOSL@w2i z2a7R#g!z_uSwqg`{`Nike&s(TLe4RlRE3>SP2dZm^=3~jMrnQ40-fDaj@u^H`vi2a ze$F{KDdoA6e_Uvn@AoUxOr!4l$GG|J!#ONrV{i%5?M(% z<@T8k)N=Ka|1!5y%c9J!+Ljt)3I=%g$tD!58{9petr?T+h7t2_95hs6>0b2(y!8VP zKx2Q@_Kc-p_haltY+j0e7s>jUr#vV%P3C;{$O7L$tAApP2m(^^iGU`u?9V4tOpfTgIOn#*+$SQgh1I=pQmxA zhtC{rocx+r;Rnbfoj64Zy_%t2ErzM8Bk9?kZG!xe8~(Xew*>1tN;uR0)`1m|!!tw& zN8{m9N6~{{u`<`u?H7<(Ynifp>{q@hD5&qiM|5+s-Io>JOV{ z$rcST{=-cCjHbAzM{TB3kZ5RAkFSYihuGrPNj$NNjrjpc%JgLAhCZtBNP(IZVf;CG zGm@9&dX4Y$XN_+=osCb^P4CVJfE&?v9lz(MopMFl=cXd4SnJ6go~tkzP6dQu+2b73 z2{*`Mm8F!fVOEohov(};r&1A+W!R>x+pIJxmzz;QXYNl|?#qG~Bkn6^)mf-^c6x$m zYqC}4{AAniQpPEtXdn7%Fv}>z6VH`Eu}XuKv}WcgM;T~*G_P3H z1~%}6ypzAXR(;pk&eqofGS#e@(g+X%4f?!{r0k&9FmeOAK(@3U+;F@X#J8V;?& zlKO$c8oC|zI3!CG7{=aM9pet+PaxdBnBcd=?k%f35jBu^_lY`mIj@m(s> zHLGn*Rd$xBS9C&C_%~XTZ|?uImees~fsIkj@NLINHskloT4px+HDz+P8^2_AL4PpG zEiHE=yD{%K>+!P5YTLASb1o^vs2w5HnXf@1Re1P0HbN@=o(VneUYisJS{SN+%*{{Oo2CK+pWQ<+#e zwRuTVmX*UJ2w$7K`R!j<-UKwiY@f{wb%tGwCAM#5uvi_P>Cf+my`w1mG*lsQV=UzQ z^qUiQpNML*{Wu!r)SvACQ1;&ORR90~f3KD%p;9?WlE@|;^Cc^UjO>w>y^g&rI~;o- zWFE42c3B69V`guTW3OW!9DYw4uh;vtzL(#>jX%zFJ?`UnyWWhuENqfTx78*vd4hSx zH~l!I9R<2qlh>S9FaC2scVVS@TceyP!HQ$?wNnM>(m>_7#65RRd~^HXoq&Mzh5}ZA zZxM6NFqpPBuao=YB-I5MH}l?a?1Cb<-hl!jKc?+;y;T1%yIa;DyPM~4yW5dp_BzRi zTgT-PrG(6H?H&n=P+TulJr?)yK7d5%J53E$%z2bf)cmNpf%%{=kWnR~PLZt^I zDZa~QzCAkaA7u(z=4_Xl70__rjr4g=h+ITRV^RBEcjhLS2OLcXSSZwEPc9F(6&)%_ zB+IE0otKd%WE^^@gPLUW~zh4a?k zP5!jQq;! z;~0^q3a$9&2MBGHr9r>UBYLT)+e_6qP7gY9UXFJqRv9$4Nw4AskAFnS3o-;$Wpgtl zZt!t{2yXcURX0O7BbnQK5%u{d1w+8`W(3sj97yftS}n60{kSO|^w8E9xeA!in$v8P zM)Ir<(NVVsk?eZ%Bpzw4_5DwoagMKu4>9zb{JNJF4Te8HcMA(W{{$8>iMaZqc zRL<78Q=S$#Rn>AepM2sf&VIzu4xtMl%6t6@OPW}i$RVrL)b4wivK+g&7o<+~JYM0f z4mWrHrw(5S^)~Yd43}(*1D2q>$eXlt%c4bf)Zbs#FG*A7vNkAc<80kC?3z<;h@pqzre3K+vWTiz_MOMp7D94yU=Y*V}_R;g~LW65MYoUt&l=t_J|rqpb>^y8zT#doLW3flWz1XLl8%zL$`%M#_y{h zchJhr%SOutW9P?3D%~!(syv1Fto;8JbnjHQ_5wU+KJzOlJ4X1bTiyVcf+jRb^-rZiL2R~doXqe{D3m?6y2i^)P z4`T=TcN5~Ka)tRCYd}%|6b>p3@q^yfUkaEMkW1?fu2wNrE9& zv%wJ$-QT5Z68-kJ*?q06z?Lr55IfIJmGG2Pdaou=IyL71Im~VYM>!kFxk$CBlk99m z!8JN0c1|*F`?R*tit%G$f9fHDO!`&Z3+VA3vrfhwn2V9BFtb7pvcZqk`WM}_QA7?0 zs0cI}aw;(Y{p7u$^cjNb$MMo_GmGhga+oYL z*-W*Gh}_k$_Iau+h6#7xm(V_2LWHrNEg>jpT5ncR!`d|UuBSW^q+64mGn#09dADzP z+Mbt6AMEZB#u~q)bBOtANz95LucdO*gijsNGtNCdQZ=DB1LHK}yVPRHBI{UY6W zvuxkO8_DU!+LZ}q@w0g^Jw}s`u5b`?dFz}qKCapTjE~xmU3MlwTE8*!0@3O{O9?Kx zXtL`vJjYEX)An+%H7tQ&>$7IV{NpR~lV!6NGNJa5_4~?Rqai*QFb|idYqi;RO!V5_ z0b3is>NfBg1fO$=C0cRF|0*y{bN|;`Nyyp^3$;PICKmE|3?Pn(~Xy}ZAHDP z9}}I=Gjj|?K~A>?p^ze3`P^UfHm4YR1%b>9x9kw)(Vq`{WkUryQU<;B_lWu6B(8oe z$s{9FRpxLJU*K@sT_18H+EDv5ELy2lD;S(SIl_kE!h?HxYnAH_AXY5t(|f#+W$EX< zBa$mXbXk(8Lbi#gXF|61bd328$6u~AA-1a1`rml$PyK&7;x~umhr3PohIn`$q(8Gg zbShaAaVIKmmL!oP;ivNNN5yXan*(P`Ce~M_B}rh=mwG}IELmX@Q3MN=V|Y2vI_FmZM}U^eJG)aa;kK;=R6X5B1;>?x7cy)S>om+pgU;(! z4S58-_>%7XENTCA1M4mSr5i|-x;L^Xh`N6Zs<0lzn%hYh{?=>fCsX71Y5#4qx%uD1 zv2&W_HeiGvU*7MbA@C31n-QSce*Xu+pf>msrcVa+0yTi+?9U%xv>En3`U_6;ap5)H zT%w~oI@urkAEve_Fv60Zc4GO z@Y+?jou&KOh>ZoPNV~{(8^fO27g5lU=bMbNFD8V%8=k1|h$7kDyC9yMn5q zUUPft!e*mw^yvV8Eu<>8x~R)NMG?9aEVRA@J0RuezMtZ_b$r*w?z@90$++|3XqZ`e zC@C^adt~|Y+%GA{l}CWdEck|rW{_vkVWBWI(VEMkNs&)75OraEa$gJ#dXjsq&fy9mSiq6mh)ar}oA{RSJVDY*?KP@qNXm zK~tp?9YrtY2(klKno?DV^+wn|2^pwY!H9R(G#eBENCo#R^y3~Ps<*?Xfw{on?TwJ8 zqQ0*A+jF?Cei@@ABy|?D?ik7Yj(vwRxYMSv#Bpp{zF=)VR`l65)pO?xXe332l?YQq zyA%bJ(=`V$m)XI}%r3O2^e?hTw!Eid-J)<+Xj;=d;SwUW9q!*`4QN(* zh|$V?rs%l%r_8c}e2arIlKam_Jif%}c2h_csXtM7FlIdrEl`ui#t_N`UqoLs!D)jQ zPzVZ(tds3WEt|qr^JUtT^3TC3^XB#TMX_DsY~vwbxY*}n<5w9}_Mj|DUQz>}P5hRR zl<^C%+N_acz_ce6@3hqS$u>G*6QZ$lZjRrA9~JUF&3N=^#hWQX^JLTjP(D4iM#3TL z;^N^nfBQ%XPZJ&C}mOLV9c6U3Kkg z+$~<+_Ly}V{V%Y}l^Z(p3X%RqiMSt$70GW0Y9`0^_d+f>>tr7mJ{b_AMIyc*ABT`? zC+n!!ti@Z!YL*=RdQF77{@E6^s-A8ODuedAR);S$@lhm=f=9N8jRhX#HB)kn(ksev zzVCw<5r`)@8I9DgGz8Je=kulp3_T?ElnpR|WtL62xz$nd+5*s{5$OEZ1?BZ~_CZ#{lJ3sV^IGmPr3$&x1m z@$wh>{xOu1?U;{3j-~*^7SO%8CZh-)+-^gz?zR|9T%s@oMoU;?2~wukXFQ!ev<6Ii zL(cE~XjZ_a+owcj^k6-=0P2;Hz zn8s{=7{a@9M2sjyHVun|J58`EHhW@$WFca02Ke&NEZ9l;kGNm+j`zzCxiGN_uQFxF zKUI#)_t~JuE#VzZ*|X^T5gWTt(RS0tQ17D*W5~q*|K=wHSu()@+KN=9$^OVVZKsi% za>R=@K7xkRenwPPk7_ejMQ7VuNFmcmcwVFAph^Bkri$Xy6^z4!5EJwHTM;M)R}_0+ zHUfI%nP2bWVd#jUhM{vH$aCUt*S(NKJpMED_541Y&mW%7@?<^KdWh!R9M}Uk48%9v za6fqVU~eW3i3DFF#~i;{tRKo$cv@C2fXs`Kv~)AVy=`XM*F=ka)EqhPXAuNXzJru_e96_aJP zp7jo{e_<&CV9w53rJ9Uq(!tZ!oO(JrI{oICk%$mr;_XwRpgyX$9xm!z*4azUvwPMu zNy{tOF<+~#jB>$#3xJ!;3PR`Z^T!ihyEw-T` z!e5Aw*V?`ifBHbZa%%|8X)iMz4e?N0zLfBbG)Do1=*HGBe=R-F+9RF@Q8K`|%rRYN|Lt*tU;$ z)F`3E;E}=Dx=aXvmztm7g7=eNzXWMq4O=71zA0(Ej6ZiIJ&`XhO!^f9X70{Q=b0Rr19KJw`sjhPk!{P4-1ZvO9-qIwBTWZb#N%B^2-?O zS(cPuf(C%`pNGxGvD_%?m{h4f2RL_4;_h*sGbD0W-igpyDlrC!3QHqoXjMStN^9-T zwkdCG&bBFDEL^2|KJ^Bqg5+(8 z#dZ42TcZ>&zrZO-uaCWxr>?-}ALxzC%jb@T#PNGSlD>(MEOv}cr>*VWBTXeN7>X@; z)v%ELwII*nUtrSWy?lBDjKOgJ{V>p#gN?(JY?BQoOzj(dwIIkNp zUH5DEsws5l03)7Nyhv(z?UY$U*!s%?W;CSQn!Yl8G+ckY{BsKvCf>W7EDZEY?vwj4sH8Hm?Od;xOM|NrMg}TwYqw_16JQKc~fsx&Sdm|lxJtJmL_1!WWlDWmn(1~Y#%x3l3FX7{C}DRN?Y9VDSk zNPvYh8Xv*@SbtnEuiVDfst?AJUI7^-gBoa<|1y0Qbw*&P!e6_z!{1Eg7_;7AG!*X| zzM27V8JN|!pC{Swjj{DV`2E|DC;{0-%S*2gn$)?c&HRQ$sU$qp&L7)FqWb8SB?1G_ zTD}hU&$WMWCYg_Bhl{{tw&z+(-42W%0Y;d zZXvd`M5sO?#oldT-56jNx}fecA8h9k+d^%n6<$XaQ)GNUr@Hle=fTY1J8Z(0u*%@@ z#0$ghv?6AIyPdX-+DK%3Tyu|AD$Ks{eL{l5_^Vx%bNGYE@$Ky0jmOx^&E5JPBEmP6 zAK#{q)+cJ4l%z=J&@MfAZ4{r{vP`>`YGfyZm6CAkp)`2B&cCo1AW3|(QED~^0Q9>4xn=`rzP)=ZJ_&{vPy zbk5=S4<8VthQ_mG&*xkISa40pd_Y?AAWaR^5dCL95i!TSLqFrh^x ze0^9Jb3GZR^wG=}s1Jw1(Dj)9~t z^3bldD`LB^^~wt~50P!T_Ga4}+Eb27j)=hv4+h1=I1*dxew4@oGgq=gCD0oyRFAY8-nhPIr@f;Gek6)t~<<2sEo) zcdwa$NZ%sRuyK%On1RVH2{5xnh>`n^uH54qaH;VTiJ|LW|z zPybG9tEoK}_QB!fd?QpK6>*b%Fz?v69VDPL$T+yx;iV)rT zns9yT*ZEZ}5!38|KZ{8z-6fac;aryb7@v}p2l?(Hljz9+3n}^)?>#GE-=(9oukEhe z1zqNBO!i&>(9?fwmcIkpV%%wUs56u7%aZHKDEB3br7WNyDul*e?3MI1%{i_DEd^i1Zq@DN)sFWs)aDEeVy z1^dL%hR3WXuibs$s{nRkJF}lWp_uIqGge-!i%1Zo+y`TfiMeZKRh&F znIF|r8Q%+i2WG42N@m%17#yFZq1;QbJh`_Rl%?#3ScY-`NCsz6U}qh>F4=r7|BCoh zz~Ycjd3lbyKVGL3_jWFRApeS5&cTh8vpu%%uK51(R-Mc_H z<~YUz%hk!%<#pM3WVdMT5eVHJ#i#_UxV6|zjg$9SRLfL$`bGy5-+V_kJqLHz`L*U^ z{_iR`lcD!mn|tBmBC{Q+N%m6<*SGca7^WK656r*xYu_q=%H5{;4YoC=Beb>GvPNl5 zXAr;lb36%OVfsah%D}$U^VwoGe-u&#h`;D-uz&fhM?Lp``Fz+vT*`A(OTwrkp^N{0 zIhUw^){KY3Qxl#4$7Y;o(eD4TorCR+N4iw+66V_o*d2bM2&roN@oaVZQ`NZQmG}@= zylvNLflY`MGnj)hLBXo#8HT&QYDeoqv`Y5lgMsRfBh@hj@3F61(T$fzFU3s5x0gV3 zwVDj_T4P=Iqg4*q5Orj-)a}R3-z)Kb_@rNTXOoCACf3cL?D98N{?_`R8#)nj{<4VD z1^#Y4UO=G#pj7g?@eoryEs6#|mRYP{kn-ri3Eqf#Nfx2u33VmRSb)xGFE*J^S%pm* z6>>T-J(zi@xZdMrWPA<0bL!w~6!_gg zbH-%+jdOz*Qy!SnDNgcHIs*Q!!;@+rt+AEFbDsJ78<=fVIb$$KV-so2w_#alT=Su}0+yXDjAdy3i#=9w$EA{`Pw-nCit)lOf{-jQ( zjuRcQ7VI2AzqGZfiTl2Z!55RNR3o|*iN=rbVAa?&0nOa*?BV~~DR&lFy4!qn?)WKf z>lU;#e$=sRzNX9@bBddcAe%oFDdkfS*R9)~Jr&0BX9ILfBGVgXDDS6(pQo3xR*Mhy z1)LLJnLMWuD>hUH8|FWIu?*jCmsJI04~}}5y0>E$4n9{CCbn1NuOlOyT4FK zw}j{{a*nvDMuaMkqraUl>ZHKb4sMnqyceP0TQ+R@BoaK5Ys?F~Dn#_3;9>ApW6Qd0 zT@HsP$H-)!kso44f_4XpV)VI^&cP8kqmb$~y|PzV0Y%+z>N2Mmbonq22S^!|m)UEzj3;pl%4}Ti1kO<7&aRwe3c>I_f zSZpe?DIMR=8{mp7T-AP%cwB^CFl+qoJ|QpZYf_^o%QE5yo*z6o6#a>$%$h#F1G$>| zW9A!mtGi2_`Qq;0_A|-4dLz#G2a!)zJdt?;{6cY8%KIS#&6YPb_K$C+hI6D<3!X@7 zDtW|Da{THfoB$QgPdH_Gs>$j$=@qm?JFv3zNMa)bEN!XHIB-3vGN+|BO+zHjl$-hJ zfZHlND}CC`F@`f4tu1q{vR*Z*^mJ>PsKIXfxG1EfH-|;9_mV;#n-wteylMPaJYrQ6 z36o@~Aj9mm$F8sI>JQtT`@m{v4=m_<$Rs@2ZW3ISct?@}k`-J%E=mz}*bRw5R8v?0 zN@VQNEXXo7zbGz2@`pv#WQf;tF$uK3o+#TwoNT16_3`eE;H*XXu8WhP6bd)RRH7;8 zC7_?Hv%XGXp>CbLYm0;sy9?NWrfn9ZEI`%Z3Z&$=SRMzZU$AjU0u;ssgWOl#!&S}D z+aEfD!HvqR+Vb8-|!aPN<{<(y#MYQB*U@uK)N zLy5`hCSO_V3Ti5<08zMB`Z%@YX(Xe18ESPkx-`35x0`(TAPw{o>vp zmK}(7zI*R>9_SpH47^i?4?dVkesRdze(s`B*=8y&6*Vd=5gIxS2=f?5+n7&OjKXj0 zLzX_g$rnC^xSbOYtz%sVMqnzJWxzt}q0H*7Ozl^t;&+|0j?12v-r0K;Q*;p1IZp_( zKp=kY6N4A7DyCcRC{s32+hz>I(m_SsPMo7y$&S+Fqtr_oPs2#C@|~lE*jqQbeW8kn z?_}P@@X;k`IDn{!DFA>u<_yTi$qFK_}=I}2R+x$R-by854$&*NLr4ita$4AI}mZn$W1WiMbKQci95f}szrIvaJG7`KhXn&5sbSIb+FQS=wN5U)58 z!DM~O_q0gqMt-&DOExRF01Us9z>NZ*tykek^aSz?oe9h!aQyS#gJPY*j`Ko64kvay z6CHlW;0W5q^RzK(cz3Fgt!T&gyemvVd<`Dk0tElPQg!ZiR^=hTGr}L5}%1BApZdR3Y4g~Bx#|fg0KLhr5r_S}~ zz&Yw(i_!FY=I8ZX>t*k5Q+lX8ay@eW{?D(`-*#u6>4o*k)&RYv;$h#o(dKr7Mj+x2 zh(OR3v6Kijyyu!2dG9WZi1Gu#AU|vgy0|0v+dB1{%^bTc$?wLJ791>&tW43-Y5H0Y z62HW^y~5i%7`i7Pha!ZYiy*jT+$b;gCbc>8sX4?wBrgqdV8mu7s9;o_VUWROYfmvZ zbxnY<p)1CuWq?fK^ymtt z91**c3&U0B+BhZo-V?4aBIy@eRN6uX(*_@O4x(aVKe3xU9WqHICf&VTL*7{|Qj9b_ zr`=+LlWa2fHm_b&tqk(xGI9t;S`0I){&%0KK~ob$SbOO38&y`okJKRe1 z#<%;ve>>|L1AzD9{Ts;U#i-G)Vgbt&wcDo=1)!HeL_xf>G`fP^A+XvRUFqRrp}6Jk zPrO(o1wcVUi|Z_-fTgD%o;_@}oMW$A${uO{4}sx5M9yItdxA^Qg2J$+QD z3aOYjZohCP=GhzxG_M>Er6D14YoD#t8i+|ruG`psi4uF4&vDw6dH|R`m%=dID(rw8 zKz&Yrat1}FncA#>opB&nYXlPxpVUUEb*hQwS^)Kr_l;cVUKqF5+|fI7zRK3aiUfG1 zYPlkA=KF&Ni^bfos^xArK#G*Ncekc2{KRwq1HF9vzuww^8>fgi8}{=(dh~7I)y;}N z_^Uu9gl1W#-*bp6qU$#!B#L!GV*+}Wi*n!CjqAWn?ih7_SV)(iFG0vWL9W6LpnjP0 zWlmmCbQq?V&x@ot<7%Ic9gf@d#Vrn^{0A6^i?BEBo>6RkD zipol&uGh9pDe(M5*#Wg-g**`@iv-?T8lyl3EAyq#Cp=ZFpR%N%Tl#a+CF1eq??6=> z1LK%3GMDP*wZXsHpmo4Xcb#LWs6C7})ZO(U^~hE1>3839n&+0|&V5lFX>*V45|Qn7 z!T(BM;G*Cwmpv$7E+Jg}JSsGP*!yvZw%&<%>=VmAJ&sMc?pKGfuYm(15f%V==yM%0 zzY5!qRX6pW#R&xXLc{k;Lzsh8;pTothlFb7d!dL#+YZEsUvI~`sdY3U_da)SpZ*`q z)Re?;e&~DFjolZOwPCi+wX?UyfB&DDzyAL;l&|U1{>SYuip`ndJt}KaF?xBad{v@v zFS{=u=(sh&uSY}^=@4N+rbh+GMH9JiYzH3ul&dVNJ5*UZ!`PY z^!*ww;x6J$NC3t^+X-4IbixMbcVwvDaZ0+8-33UZzud{O@KWw0d`>{M#qlH>Q%Kr! z+R7ZQY0A9t@KDX#YvH6kNdb>{5AHJ3&+Pvl&0<@=?^$p?sk%3!aOWp z1q%Vn$QE^)PL6!1hfK3q``qmd>%Y3wVxfC~np4~cS4WS7LIk!&#o|T(J<2C9SseWO zUowd$5^Zn1PRl?X`DU{)I0eoZ=*&DAq_-`x@;ZDpxwp^A)!W|97)UpmjvG+Zbaj^q zJz%ig87!cTVx|VDmSs6~hsKNTcXoHqW24_8?vcCbE$-95SVqP{dbH%^=10~mN)F+B z?pIMMKyz!k&RMBYnnc98&b`C023#PD9e( z{O#ta`{EJ&A3P~+$J+9TVf{+ek2N+sj7WtipiSkkwl`)S4O!P8xNT3Dr8zESy$Mn( zzAVG1iK$qUFp}~$^8gN^a5Y8#m!JG(1b4b8nktO<01HB2wo|AZNOLac&A?%dvfo!e zdF$033a_0x3-*j3c6L$3M11;g!te` z+}dr8y0PiaZ0>cx0xCN14)0W=S(#6_=&vHXbaQFCEU3ve!1OWE`>1v<2UON6G3Dhn zgi>Xv_DTKd&}cL{FG#*v78;p$^+!i>q9OD_;~J_mUnALV;!6OS>_o<_NlxkYF#_J5zeCexbokH3 zt`Fnf_&Cr1T0ZA&n6Jul3pVxSGxK6o`h=pHP6{h=>Iv&BKu82p&YwPggi^V&pG-hH z{@Qhx(IKJ!56kZpnRoM^40?0sD@TkE!~+JW=gk+K`rf6#M?y^8d(`AS>6n>>64#}z zgZQM5-!{!xF7Q*SE=*Vf!re_R6!hU{tYpAkB2IQ6gVOJc2!aa20amMha7rrn){3_0)R={Ckkh~=wnzrq`@&{@tDk*JG*6a7FUb-iZkx(u5fXI%G_ zFq)Y7{ZyFm%86TDhvn%<(vy=8jIf*1ai$#a0srK!)L{d#lG_IUb{h`d$6F|iCy(o@ z1*ZKN`Hlj$pI6!orVsOsSRN>wxk?T>umsDVh6aqmp>>+(^t zUeyI$F()GRQ}qi#tb#LJzO$e#_fraQhw3-JsD`nEcENlt{qDOS?ZEC*3wT*L2wDZ< zJI|(TAC?YYK=2T*OOGEiZM!=gOfcF3RO>b@tt}w^oj


W^h$1aM)wek@8zHd!#d6p1UYSwa_51+WEa>v!=nl!|0~^<)icWx5wIM z2i%ix3}En18Edh7iTyD&m4zr*!oYLYv#h|*e-@ji!&}Q!`yMwEa!z87O;ygygc=i& zXoGk(xiXf0t18ER0=P39hqtP2J6tv%5Za1HpuV@gxC;vJ9F6%15x#RuirJ=+Ju=j2 zwJ;{$SV`++Mt@PlKj=w&S|N9Fxn4`|=K!N7IG47C=MK>eU>)xidQ2;aH0P2-_S^v& zm}*o3l=^Dc(BSrgXnp-~ySbsa+sLRaKJ(Wo#=VVh;tFgX=A zI@U^1EvH-v7wFkZ$sZ4Xah~LX+A5bhSdJ$u;LxKlDw%L#piOI1*&S!)Tshz)g8O0o zXyAft^&yPWb?B?>%#q=|Su;6PIUs2cS3>KLh`%ddJU)x~I2Wi+)DV{DQ1Q1;8r_fj z_=VG3ckI;ZTtYiAABf>j=me+U+}@#uX_gKgUa34jWV(#=IjXzy!c&09LuYByN_S1V z*8Zg<2*#pVM!NzX&Bd$qXz2Z_%da5`QQwg_ z9p%P;Ivm~dS+rbOKSZa)9+;98Ziu{lyL}J&g8!p~Heha+jcROoULTKES_^ZptgVZ^ z#0Z!~BeD*S&|x;_AEx}q(8kHJJQuaWas%2L&+QJ$*dWz?z{KO-?F&e&%(#f=o0yR} zq`P>-XVbE#k$0AraV4*Q2r;DsHWdG3CJBZju12#eDJD|OnooREz2Ot{hu!CsDn=sr z{_?>{pi{r^Oj;424h4|s>`u)b3VR;cZFQCkX5*Jfu5LJ*%kysTqIxLe@%qlS{s|*C za#$eHW{1IY--U;#_OeCHr2irdsIAI7?yUEO12*smrU@G!lp*CPjH@N3HuP3Qw)4MAGr*h ztSz#NNn?Cg89eKEx^kETosMHXP28LnQf73C=p*Z|VaV!;UU;+uGAsQ34pBja>TnyZ z>(=lv9sP^jt1XhRPxkkB#vC3~aXO(ccS?NOQJMK`rL^yTYX17|xq>CZmbgeC3Fys< zW8Gw(aR_K){S8W{e`k@z{=`8%ib?3xEH(FIZM>o{Ds6UJrNUFbVL8+|TA5O4#|&ez z*)ZfX*K5Q3_vv;1N@{jp6{QZg&@2?L7@Et%k3?Ng+}WeLU^HW@<)Os<;0U@m3WjaD z-}gqj+&ZZ1|2p~j0UD)-s2wQVNJl%GHy=UmNlg=BEXIZrcb4CDM>i*bq|g{24I7{) z)$U5vO`>aDD2ajL-k+;qzXaws67;j_XFe$mHM-{`Ce< z?R=ll{GzJ3kB9rF-u=j<>p3bL=Y_0CPHD8R?S@BG&k*&y?V?TbqFR$|scVyjTwh+z zdSQ!k0S^M%Pj+`LsrDf)r)K-S>Njarm}beojMyb=WC+lzjH*2BnEPugu( z?H$#zcwHH+M^47vjnPKzrDr|b+ms17zh%0#6y+kQ=$w(Rjg}R7{c;^Qb-RJ5g^@6c zPef2oJfq8@zoe(KOZVEb?uWFwbg!i%No<)Xs^agt+L`Icb>|=*2GT|knJIH(2-Q@> zY&{6hco*kiC23{4;%>_VeaDxp(i?-1(NFvjssb z_AtSv`**~GEl*Zj2(0>ecOHHMLbY5v*do zLamvZp!*QM7WO#2vPdEZ#o86&arW9$;Ma zwOQf{8unPOF~YrLHXrWb`bC>0u5ehzh4c2XuE9KddHAP~qb`S8csQ9ea1-IoQ#R?A z4rxsD@g9Nd9%F;ulQ9zAYD6AObq01A8AmOw7c%O+tYBpJg{)T=D#msT_Ps$;<|+zw zRzD1ZHtWSVXwe{7Ppf_LV`PToPS=3DC?EmxO0JM~$&Vlw@N4rT;Mp3; zRB1MiBcaro4k^+g;@?(+(##w_)oSg_1JfpHG^&x&?|XNQ6J7GB1eVRWi0Swcb6!`3 zgyDeNLeGKddSp5u_IeT$nO@nV`<16rJc6HB6Hr^=mg6yvK7R{}8sF+?4)LO3@O2s* zp@3TiH)2#c#~sq10O+8LJ0Vn@r`})ir^elfsLPJkub_SJl@x&dhksAW#^`jHs;{uS zbR1O#a55;|L=<%9lEQ9OJk+7zM#>n|1}QIJaiov2Oj0-s%ynunnSZi$U>8v3$v5Yf zJJsR!G*{>2=y+<$_~5mkQEi_^U?h)b0}iLvLw3Cvd9x2@hp5-#c&y?<9L3e+J-y?P2oO8_*XX~5vJ>osvr!5WAb+AKN z48M{nWr2wBQwhdY1n^FXHvSVmI&<^bC;vb!M34^EN)V+Y8*Nfo3 z0siH9V6pHRnn@eN&E<|noRC$oB=0NRb9oMNVKSY7xtz<~ZSq7195q~>UU9%Y62VrK zIPp%RLQA}@SV~6@RW}*{5xkdpOc4}A#mJY+tm150J!BC`K=-Cwb*K4gO|H4P`)Bsf zS9H-5Uq}jOvwi{!YI8zQ`rAbAkup*;<06Y2H%+7T6HTut&giASs^>@@bx43D++-r7 zc@TTmBQ0Mp2B<{jmxAd}M_)6H)?G-#kVEL!((!+R>HAq7y0CDl*JV9 z7i92P$7CU$1(|L8ifCjx(fXwRtRZ;IWx#?ifQ!Ce9s6XiCf)%wn$fTnxQ3@jUe4XC zTRq5y^BQ-J5=~giw}o8Ax@TXg$S$L7wb`GHS*l*&#}A~2?q$r^EJ7PUVpQBKc-M*6 zZPMNA_ZpV&40X^TX5PS=1DIU31|asr`MSaF~6BR(`rLw(P50`4a^p*(q9J)9zvI+hJL z1av3+wfp}$7sMC7XMwd^yG={Oh%Q?GVk^Dp7M3MFckaqZtiyQiRQ1{6Gl=|Y^YD<9 zYAEdV49+qM-2Lm^`-cWf|CXV=1|GR{nrzlT4dU-#hT(>J>=G)_iJ_>|zd1J*{_Wqe zrepO`+ZCd}{+km-4Ws%qcZi$L8-b2n4}7wS;{C)$U9XoH}<4AC@Wx?Q+;_ZR*LpZpv?~pEHJS1d^EDm z)2@{cil85^=lGSnN;(gI1=qsCsFP}Q5B3ko@Sqm&`)BZyZ_feBZVM6r3eUYjf~;RD zsjdF-|H~n+^xrAMFC-p~%R~Ac2Mo14hwJheMt_Jn3fdhaWJ~vSq2&?rFzz~2($toX zovFXR{-z6eH;M#DQ)0<8&-lWJ1diza2uLyc6^|D2fANK{U8m!w)L6CEsO61XqGiwu z(=CjVVA=IBT;dXG_qci?M}>EMp<3DD0OPdJBFSidEf2qj$6z8+gk4QRQ-R$ z4g*O;7t}`qXwTQQn>)$cqSgN-r226@V^r4KMapWfQl4E0mD3C%zy|W~!Q9Z+|2UZY zFHB+oNv_Q2E+8IE*T*3HrX>694WE>3^!Sz-4i_>bxqYRRmy{ zP8+Jo2hs<9QfMRlVih`{#2hOy65O;(TX%d1_Y7bkesiR;fCqy0GG73p@JIBY;e!DO zMY9m7;~rw`%n+08~aFAHoo9 zp400{z|eB&15hi@uHInNKYkCd!s8K;U}1n?9;rJa-;k4&CC0dKJtBr>0lV7m|C=P- zP_pB}V1G-Zx@w`r4_IBCB?$eVq_zEPk`~_Bzeo4bz9c*~BQzVm|2FOIX^N2M@oj(_ z`P?1mZ9{`*e+_AyKWQ@lNGk)sY)C$y6X^6YNt?ql^0wK0MzSBZlbcb9BID6en=RyjuB_VEjG&=&iqQ%HVm$>dvfN8jn zOaGROOYjCypw>y=Cj3@9yb5^B>6zv8LrJ+ab2M-LGuKKONx_2dW{%_h(|E|{b~-6` zac8$?YUGbaMaBO+@m^5IiaCIfvPnk@5 zJCsK-Imuy?9yxkgq`pzGaba**-O*iN_nQl)+qcX4&;EjhU_~l#+(?9sWk$KKo`nYK zY$igckHJI=Q_d?pP43hcA2uCWb8@xMn;`um%V8ZphDajBERQsEJOr9_I#?4<_euDC zTtuqD%e}8h;1?SF23nD}hFxC7%zaE!H|&zO^SBW=HfE{<9R{&fEVq{-u&uM^0J(S& z2?P;EW5yx_pA$xp55cTxrAxFm)CBAXZ6Zs)DuKa+e;qWm?nK<(ayG3~H4&R~5%OEC zKrV~evfA=?;i{cI z#cAu-Gkyrb9TIp>CtkKXGDl&@Of;lgQxf)mz_U71wps}2v4^ZJ1K4EgPhBH+3N_00 zS;PEH5(+?Xb5m%@(eGxv1syxpK%8z`1@^ZR*Af!K;BRc?CQT=R5S za$xv$r$j5i0Px$_+YZnnhe;l4tiCG&OISV~ha4^Ar+SX~9~Opy zDhG(a3!guoMmc=G5O=7t0=d1=Km8azhfh^2QhFNK>H(>?Fxu9AT4~%m{K8D&)rCr!ol9TJw#p7rPNJ_>{C!%j_-5828 z3&Hkh3+A;ZC3I!$=z-4Skra@MVO2jg)C!LHh~QrNNgtm*QoDnd;&aco(Q_*p3j(Ai zOa!;BqB`aU206u-!LKT`$eJyE6ksa-m|?=x=X=WW48f)Goe1CXa0uWXA64Z|UF?mr zXeB7ri)x1j?Sj(YGTjJodwDO_RO1o31;bw!-yE`^js!=%KbD-0N)8>K`tmDjXdhs1 zcms*9KE@LG^ZCrs4r{(zrTjamxZ};Q$vQt-$KE|73h3Cfj`46_&ZUG9rCG)AO-8}g z%QYO~Vhy$rmr6zq`-LxA)>frGW?HnUb9_io(AMH+n4%#|R9S2G11`ZK^&XJ{@ixrX zP2y>(Tmv$Of>^WEnQW}$H5@T84RL(m2c}2j;%({CocAestAkIO0Kz_}!W9DF`gx}^ zG>B+r>{<|I-$L@8MMH~(8U7arXyWk8TcaOt03WwI`->)`h5Dv-LltInpHRHh72{(> zlnC=DOKytGvKg+@Y0+^TnynjvGp2SD{C9$=X?22%?|KN~a^N#|#p@A&QJ>Gl4$-qc+FrdW7mE4_TkM7~v}org(`Bf%TSF%^kJJ5s#jf7CrU;zK@g$QN6JDf+qY zQwxT4znG|_$)$y-A%N-9=grm+`XTzA> zwDEq6%O4f;u(+Rn#BK0o>fME5j)1f$-HPj)GGQ}4`4x@aAZa25`#yfNYBF79ETijm zDAWu%DW@?`#fP6Utm6($Lu>=J6nHT|!?R~n4g)Nw#UF_GzPoxBSLAx@Qd2-6X|*A-~VoZ4LS|C~2 z!M{UPk4Jnb) z{%*>Pk3ikVsgEgU-^ue9ETYzIy?WngtnQ`&o^(TS=n2RLIDJ+FDqwxr&h#QZzrFL>A8JjqB->YyN)uKpC6zvH{cvW0A?9&#N+dx zl$L0c2us@L$ItS}l$-100i6)Gr7jBj31&- zYJ$xvtXUR=xPxH&`huz1-=XjtTnlC1abCS~V~<{!vy{bMPLctmM+oq!?C|NYwaNeN zd3MsyFq6$Gg%2f4%~b!u)2`h?XY7IQrfU6#VVQmD0VFT!&olK?{j8|%i35S?&X1?O z=BCClif5*ak2DA~Hf<)N?=R~@m1QsVKkyrLNCLh*QNZ!_m+XYIbT8wT(Vi8z^lDwp z)sZmf*UY+nWelS3LVpQ0)ic$4Skys)KrEKKg^ z+U{mi3I?Mn-!!@_SH5j6@)56q5h@!9x9iW$@o4Tfs=ajQOf1VhekE~ur0lV9cDEbx zvkPqP@92%{5DU92mx`~$`ILeBSA8#HgFfAnBea~7aVV~64P>TFDN|1+3N;o)Pp6_(mX(z1{b)wRO3}EH@fle;RmUWq zXQEc7pj;Lma_R`L&4KJhTd2x>3ZQkWUqT*KyUmSBsn788yEjs)1GDa1~UC89$G{8dgrDoa@bp_PtDH` z2@dVipRbo`*bbq1W01$EpbWns->vBRm4MNZMPk40F$8KaveRXRpM5C>2&6o$GLx}( zWXDav#+7p<(e?1h(BN=$-$o)lQ*{CPlN!&d{K;0Y=8P3_Nib-!6iE~S#2yvDOXDXL zH0r)T~FFEfXG`WgKH&@9m^%B>O-$ zKThQpuGoeF#OSLN{}7{n2seyUt?(#+%h4J`3lU_q|K<4)H#FBO)l;^#iH#XrbYp0& z^y%H0{I|ZN?}25h>pw#v*QNO+OC{w880b3oew5A*4Ww$J&HaCzy=7RG z?Z5SJpomB-pp=4wbV`S`bPCcU-7vsVLnul}Nq4uD6lxlOjJr_eNXNyomiZH2=wA*!0CyHASv;? zb^_nt9J}$Y7o)iVbXpL}X`TtKUNCZ4v`lTlc8Rv{if*%+-R)s>t0UvVCK}jCc4t)d zq}s$2ytVVu4b9axCwr8?V;9(*IbAEs%M%64HF;lN!~j;S!d&?(?l!=XRd-CLmY&|n zV3Bw!zSMi&8}>ide-rHL10Q}u^3Ckj(X3X~&pISGeV8=j=I!?AtK@mJ#_{V2;zj|z zN+IWGhkD4@4$gdSQ@u1WZ$fUIwww9QD6cj6Z|sE^_gjRj$Bsix+b&v~L)q`x3Dfcw zN%~wudY^o$L1LIAUA*tsAGk%@ukYr#o~Td^*+Q8e8lL^GXSU`2y;E}e=>|~m2p36D zL|^`w8sgQ@>z7k!zireb>m3nrFp9GI!~6e|LQw!N7!jKFdt|tK6!<% zBXG-0-@W6`8Dr$CvTxgdAnFfa@znhiOih&#M62)jzlh)H6dI7M!0v~#W_lDzyf}IB z!t@2tQu8-HY3t+O>h3O&Vb8sd)l@!;>a+0dJgomk^yV#sW6)7B^D03D;uMxbGAcN9 zp#bag@$w4o9ph}~23OT;FVPbk+C^kU9}O*y!x6D(xc1fh1Dib*|MC#2q@Q;}hP)k~ zNc#7DFov&a&r-0P%QaIN(wp#!kME2g>;__Nnu?xf6Af&lyT^>Vx=W5ME;7)(|NoV% z*#QbH+1g)Cn~QH1C)Jnna=hr~g7h;Yd^c-9wZv(iIAVADJH@uQS$H9qt}I0NJECSR zA}K=b`z@7Kw8^lZoooF8C?4_gT=o^2Ie1#11%2HggZDq#smdg9$KV^!as9n(pfC^Y z8aT`R?jLF_o%V>k*rf>uI}XI+0I`#+KB98Y*@=b1nm3Fpjc*3y>z0A?VF|!tR0esN zRX_e5?oUlH`4nUbUNi5Hg|aL!n>lYjr-g6Z{50T9fzR=0|4b5+^!V~SzcZ(>l%HTA z4C#y8I|4|(G_^9yA2=81>6Kifxg`ffPqqI^!vsfE0lp=`1;cA+NovLAo>y+gWLXm} zk?l!Jwp%_wR}Y{bh_jF_AlCtS7i+`lEDh+YJ-7wqq?HiK!>EQKJriql?r*wkM(msv zF#Ws&a<02w$&P1aLsCQ=17A7un5n{<2c*?%&%^XM(Q z?Bb&DKvg<9SeUAAw0_dNfCDT+e4|J8U?(Z0#^y-Imy>`cshV`dMp)Ie^b~w4C6QEh zJ^pWa9x|A@HprIGB`#Z53G0uSPW9;CpT$)7&FFGWgM_5s2Kd;WaqgXYvM&?=`+p@ttlWaDMWd(PuB9k%o`pNro8N@1Ha?o;K)${7B~<0% zUKfUHN1!FKnCk|IKNnp!!!6C?<)42~koHi8$Jiz1!g%#iz z&+DuWfeaKWVJUV322pn;hxb1{xfFhrTy)6POi~}-COiiX{R}5v_#pReUy;UlF<>pW zM-96M=A1ULRk+0!s9su!Xzj1qvA{Zv05tnKolMXdnjsK&#V-JZTnqqU0IGhG-_dCU z;JPLnzGgxcfxOE1qQxLwji$e7wu4w(B>H*#ugoct+>J{G#pgIp=SkVf5ma2vi(2#=a7P@mAaw;dKr6B8cW*)I7NCjZe*(l)wJYX9pyo zK1(Nf;c<@VYUu+x?W*spXny+fP=%lKZV$KC#V8Hvr9b8}yBflVoy0Wk;tvGvRpa^J z%-yM8@`z(`eMENKxThYWQ$PS&iznjA!%c&cf+ernso!C_`F05x%kN8@aIpj}u$9`DogvBpp!s`+# z;HzOGqWZ8t33Bwlm)nCVE#mLl@EJhYtv{t*ETJn3!TPPT>^2Q5ElL82HF=Qs8VlQ# z@`U1-p^t`rBCBN+uzknyQVd#o;{&!#k>mU+)-j5m3#>v;f?S&aemH zvPfxkVPnH)353Afeh%N;6RYf1mRbrZr4&{nCtyH~jU+$cfq~mg+AHN`EBqS? z@*#4O6dU)C#3bA}?yudJ6ai;Bd@~xutT`o~w$tYO*Xnj$V(hLN^u4_7d~F3$<6aiu z1XR|_&RAVS?8YlsccLhN_1lPmzfTn_|!Ps{TvnZHho*RIHN{@j||w zjKc`lTjdekPX|j$nh@d%2By@;JTg($OO0uKHp0N^KM6!L1hEEcLx%cXs?Vlo8?MBT zXM(+lFCccbcDk8M;Z3)Jx*G?&*)GVDsBk^oyf?A3(W5w6k!MgFs3uu}S?&4e?y#v7 znSIM;-hZoLSaLC2AlQQD-QTJ!!1*~B{UEW=e_|My z9X4BrgO;xxeb@Qpl{Y$s=F8S+zt!fc*o|{0Tcc)P4U`?+kHOWHjWcI4E;7YbH3Op#@Y{R@Xm2j6gs}& zYP0^OV9duPnFuA9oD50zm(p%ZnmZcJNN~xYo&5c@^osv4Y9OBKdV+70Fck*a=adnN zr^a-RRFnq{gcC$1ztt8kN}dNh|9*_THuj5&x1Iesu`ri*-zwCSEB2m%IzazSB6s<7 zPng@inuR`@UoQS>A4#`#c3{nRPm{4Y2y=u4zkInpeQRr)}SH7SWUFn+XuA>BXyDN;u%ktcG zIeD?E)bY&3$4F&0$Z6>mt`4o2Y1*ZW6q|L8j-|kqzrzeO;?e%5WBbrUx~NxprYjSF zq~%N-T40fFyY4oBKW$x)GyzDh{7sti17e}W*IEBsV2k(Z|BjePHwdMrG>|^i3^G5k zFz+|t6`@F_3f+8OwZgZ?Rs^@yQ~#qF3}_}#SR`Rma=j#%oizqWu5*42|1}YTeM!P| z^2z$5QY2Yd%{DdU1dS+)prseH*SH(ehj_l0+5l$TuUoKl3Ti94Xb2c;>6yXUM)2PD zlrK8?7-j!!wu+f48)x%L*ollcmi>e%N~TNU(Cv3C5iZXEC@Lscf1IBfNEG-Vd0Q@7 zX5ZnPnbb{U{qc)r_wQtak>MN131&XKa<_ZasQwK-*5qdflc_%}h3fyuPSvr~)lnk! zgf`0fU^bJv8>PE{xxOJxeiUFr0uZw=YkXTLnvxjgCA;H@rd*8#&WpfWwS{2u1 z{Xkfc>IE;Nu-Qh#p&b!wLrPDzj3ZUx)s$txab5oy$zIgQT!1YXLYoN`diLigz#6`3 zYkCllPFgnnK6Q8O2P-;lkf~?(Yc?494V;D<5d`nr5C=J;bHtYSgrN3iD~BCjw@-i! zfbl;W0BAD2;nY7}N5=s!n(fJO1*9wJaXP46V^ZsiV2Ro@X0G-~&kRk`e!{2+gjvkF zSHFhpC?zAKG_W=Gw|lh!q;lBiB3}aq#k!#fes%J5l@pB)l#_R&WRI|_#0A+iPZp82 zIDfU?wgC-ak6+1vhrj;hm;4El_6&Yo8bE6xdhf=^KeecI3PDqxgrv6`VYK$~808R% z{HETdjkUC@oOPl+DTyRZZr0o?90RtQIj};(7gEnjI)xyMG>mDDU)oFSi8k;kXi!+Z z>az)WblFt)SQBVO{VbZd<1_6inhD9suFx9u zDZc6#9ACi;jYXcwsL#^>gJ6-sKWS&EJEo)tOynfU(eSMauiM5P6G>&=u^AvYJKdr{ z)Hyk46d5}19Z_{e$_+AiyG5cQ+n2V6)JmQ6i$j|fB&!A{7u+tjumP|oDSwDS?>zPD zqxh;=)oC@<8FwWU{ru4-w9eQeH8D{39rGsp47FL2FCu+00cVD-YoBABz4dti+@nA1 z)}fgYl!0hqjGzsVJX&|6wK(3sCP7SZn0LW$+^@BErG282Hk#EjxrjbV8S2@#H{(Lw zA?QoI_T@G7*;;ZGV7&ixC^>-2oYKI$RN3?49b4(=+$J*N1Qj*uJ--T30h_z!@_i7= z?oQ|{hsjLs$gg@-t`RPI=EHhfIsEJ7+yo2`lV?&Nj@y)^{t-D9{}MSvm!!B1ikPSj zbEq_6FOQ7RzpA!zK*NX?Xu!@bNnGFcbflJIrOqaQv-GHpxeXl`Z3VLws55df>W@IC z-&#rgG?kW+l3^C&yQ)_sqGiVndYI=qVY&Hz01P3uDSN|UT0G^K#B!y3o{+Ms$Mr~c z;<{%dYh?YbpW-s;m?vwHqur1GWas+~qc-s*Y9mB~?akcwy7}-k>b)qw_?+ zlQCMNGrNye0Kx7@u6l*tI;eAE4&tDIART!oQA;wea>>d!`EHE!-~EsJe}oe?4omY zwhAs)ENvuse~#3^n(-c@!!OQQ#Dy~nzTVDKqPo+Cx-VX1hu<$`W(m#{TPM!>Jt6EL zrwWty%~=b$rQgq_c`{{4=M;C0z>az-my2YZeF$BBdp(=HT}Aabc#k`#!*2VGkAz>kilaOHbvk()Hf!+GtC6N{&F6hjJCZ@T zpJr-TfJ}jgK@szbV-Lf2lj$Ll0`GzNMX_syF)4z0CT9@IV>{^+4X>D^V*N{&=BS2q@@ID%7+lh=~`x?W>`(XOq z?&<8i@bm+V=+(^b-ibX{Q{G7&A?&3)AgCukIkMP8D-4hAL%ybx1&p2Q5>%fJjk)!{s04Ap8T$0pN-z98x=9EMBUy;wv@AW|$eeCLFQRDy(=hY(gJb33{J< z=Rp&vO>%S7A=~7*X;}gZAQ}QKy7X1QiS`wG16qqBa%FuEz{4rN=OoQkeWoev-$*@n zIL_;u?@3q+r*fp$l2)5!Qy&w?F6>`;TZ=P!1|^ z1fU8@@PO$M_FB$F*SFHzyO_wo_tPlge#%yCTeOJ!PC-~+F17T&xDY)yx~+TQsVb49hf5vVXydckdPg`V~C{10SC zOq!vW6&!Z|AL96+cm=8S!eQ-ls?Nvnow3PXk9-kket5rJ&+^ZmkO;k*E*p6 zP>gypo2~rCE@nqgbcwxIwDrZ&M*+7oJibQmu%gT6QflO|UGt}5qA~a7TZcu4Nq5Xv z-baV4LhExvdxHt~bOB1pT!Xuo>q-Fcr-N*aAtB&>DZ}_o^6V zSUVX^1$nC_wMJUkC=qZ_fPou&??*LHQKMi9R^H{+9s?|Ql{?? z#9ufA-89)vj?!82fKDo^&3r?Bb9Pp;`Yip5&*mF!TP4CYKW^@}%1!y?M>hW^%*g%W z@d~C*$fC9(oHyK~cW49QL7I)EvHb6gP9Cd~7d@GzL(8XEc{Vd2Z!EMM$M z!t3VAs1$AC_U~~tJuXAyy*3ra;Q_UtH9*a(5nm)TdH$2BsNUoJ8f-Ekz&hz_^Fxas zbzwptgP-~DtG4SOSMVt=bKur0kpQO&oKHRjZ<}|IyTn8M%=e5H73lDRgPT33@ePJ| z{nAFv+lBWbttROW2a8*^U(N`kN=i{p6)1Y z*;rrR3)#hP*%Pt7I z>?qB`J`PET75Y`HF8G+*4^GTB=(na~+DyBjLsFqNn;uyA7nTF;D)$9dDDp@(ZcIQg zjl}97@hwgHlov)5xpa8grI|#=s`A%iz(mce(~7f9JJ9s)P_e;UhE0v&+81o#K3d1j z_(pFxAiJsH=tFWC1p)lGLhx#c{6EEJ_Uq)$s}`mNtyVK%bdnIyF3877%p>**o;C>S zo!?K{*UojB;K1O?EBVHsS<|&^9)IhY?%cFtj)0Nys88|9>;LJSw0(&CZwGE6z-Rft zj-1#g{~J*WbfE@@WN-a9DE5Ixym#o*?)-x7GR+uu1^+Mh8#yZZ4QJ+zv-*|w_NFI} zvJ>FF#XQS}ZBqStlXHU~gGs}c1g1Hclrf~Yb%l}{JxY?mVbqC)J%aU_3%~$d5lqk% z^-_LDfPp~HLV*K!U#tDlUS`#4W_bvrplqtLzvdrTY8(2Biz{tbCvBizDSmNbq3LwY zY(rWj=^;Dd${AmDpXIieNrZU2drtnu$uGzQX1n1VL<3!?=9FU*vXvKOrPCbw2^-t4 z+u8++Jn^`6C%CKi{Mpkob0b26E-KTQtKKZf*`vH`DkMI_c~X+?Oy_pSt7#!dc_BW_ z3qG8%TQATNMN17NNys1e#R>hdx*y7G{MtfzELcblT0c4Q)|DVzbpRe;|5|HbwGkuF zSkp(vPK7H#2ec0BEaq+x13vIgD(VrZmxkc1)c&-nt4}uv;ZL#}w|(vMnDEb=HdyZU zwZ8a_%4eB63}%4;PP{Y5ZRPOf7-GeND|>B5LV6?aT?xx)rEr0fEFaK)LF|lTx|2gy zDi7FZ%v)b^zJ`?ErYqb%U`M8oNSCM*ftqP7(#@SW$Yqtq1sAsJ6G`-1I}13QIT}`d zOBk|N{Z?8sgABg2ze<5*+&fRDhJU-jmA<$VrCeNmla@=zGQ|m;KEZcJx!;=1UXs@} ztenIsN+Wuvb)Qlm(A75}`v?yH)#8%P~C?Hf5%T z6?++)@kVSzG`U~EIEZkvjc+e7@3|^VrQ?Tf=nu!l{{xJxlf$#BABFR|O*sGz<*BQY=i#KW5oKLsO2Xqt(3oaGjKRmV(1V@HX!w&(D{8t*m_RUQB>hw%Yx! z7V-kIoXo(bxKx62PUyZTDfOa+e%1bd_P(gEsT)8{j|daF>q$2cKlJuIb-|yNx}?k% zwdY+K@vZ^A-j|az+lc0LMspF+Z;BixRAb*z@ax>E_6mY?3Fur!9VLuQ8TvxS)xx#1 z3EEl*z(deRG=BMC`SJ1Pvq@XqWT!oEeO?U4Y$B_AQl!P1JEi&;&myhaz9;wIZe0_L z3yC`2dHn;__gEbk(u7o8=WL(kapB!rN#1mQq#E3&(e963NQfTnSP#{shUI-O4E(Hu zIQ%1EBc-pi3HinczPb7CE6LR%@M?(tt5p+BR`(!MAi&uB%OMLiY7K}io${dfRmQ&_6^HJnN9V---^oyZTs1pH9V-C*noI>Vu^!gBExQ!A`B zzrdD@3c8_fQMBZSh?yJ4J2F7ld#Ywn3eTCs)^PzSP<~d7jp9 zxZMn7_O+&l#}a{wBdV=)1=pn}b97bJRM zHJ&B1Gr>Ri5htVgEGREzte*VWscI_+DAomZTQD7#(O_J#$qlfNJ?@LGEixY0sr$d9 z*_M`yPEF*{i{_TR0;*6n91%SoGIj;3CP^DAZ;D{-RR}eR4 z;@%g9Yk(v01;}lj+UOuCNYW<#i%~1aEIq)J>r(`Ha-N9cn;L~WsRjLxOjJlbIlq#L zgr>KnjBR+l-jYb97n;uQoFAYjjV}y0=~A#ixnUNsU-Xnr2LTEHl%-woYF1 z;%(Kx;4Mq(WO`r!=^5ho#!@#3qk8s3e|W$-#8!~?8M{eu?)QDFYdUB4O=pa|!ld!J z+2I-%Is|A@;i2`nSB_@VMugl2%J;WBODN&!Xy_AAA~y_3$xGpzGf_O*Gi29uQu zM?o+5A`VvCruKP&gaXbx0o*ei^%d~m)5RVkk;V4iM79?3(Z9JA5U7jJ0;X0SNeApmIyEwLZ zmn$>e002*`HeNl_23)7MTSXsrJSKCUuUw~${eh!j@bE}~zzz27L^c5Yn8RG|bEvxH z;>SzDY7-H6C0N@FK=GvIdNn``DDtNJy*O+tHNag5bY*P1SbN4Z8@7Ta9Rgz@ya{LS zWiqB5i;!qp=gz($b)KcSp8OGAq2Q+WXPqeSPX@;{#gc6P0aVF!q;>~QT66D)gn$yP zL!;+)pK%2zc8ht^Uu5R0D#M8NU`7X$JpE+8*g}7c-}jixyXvrB_~&K7MNG~XXBQ--ul z_;!r&QDAlt3x>zwf3K;ya~o-Y?6h7VC|LxtwGv-?@dfE!*8rtWrqN^|6lu#!VjIxW z+pC<}|8>rLSv>u15l!4y^t_V{F$=++mw~^*3qcLVeaVnr7Ji@~BhrcSas3`FG zm<*rxi^>rg+C*ce@<0LMTjS{gi+>}zJ|F}UNf4Oy!?F*K zSd;Y!aq0sH=*Q>wJH>JP2sO27 zP~5f@m?XBXhZdplB6>F3*BPtPAZr?FwSG*qpLvOnqgF=!l*ca7PLtiR9-u`4nOvk!*!LYmiHV^H9s%i2m~?De2yZ&9U_;y2wLmV8I5z;l-;YZlu@SaixA*oQhM z0s?CCNnhI0uakC5#)k!*>0cAd^aQSQ(>h+Z2J1!bZ8cAq<&PTj=iFZaf9R~S4=f+v zTq7I0YFy8~u`eEOq4)b%SIPNL_3t7&Xy=RGS(wzvx-SwNYxB9bV)Uz*7R^_e7R{Ob zv{q?iY{spjk#XF)bi_nujsPn8JM{^d0}Y4ZA3&X^+g;hp{2?Y1!M_g8XV!3~qW{jI z$;a_G3aiq@a3y+i(w{o4mG+0q;MP8fa=(plugmkKLR3DXTc~QfsAyCxHnMM}!6lJ*f@H{$u0{{{hU0759@vh9>u;G1K`d zz`)ow_he>CHL=&RsqTDbIoY5V`<{}+PnW)xe2YMN9Q2Bj~ye2Zmf^Z8!U`N=?#@($}OkliyJZFi?$cBRhyD8 zD5}?f`zNF48ZOS$f%dU6$OE#OUREfw!`So#lA9y{pf!-_m-zj4GXVZQXS!0ofBz38 zvATE&VP=tkUjZ_xeE-E+S;NxK1IGegMpL&%$SoDm(n8zj3A!(Qkp9h#kd`mX;n zL(KKfl>pneD3E7E!yIuypoTs3n6K|6IV`02wf=6 z9+-a>U%jZTh<+8U@WfQGaj#FnrlD1U&V~5lM)_PM_((-d%oxyHKODaP30G(WW8)qank-8rw6c;ky% zg;qe#%x1n$O|^MTrKn)7D(so2mH+1Fn#1ZM(MQ;NWV1tor%Ctwun)Ev5AD&Yw#b6E z7$f+KNWHsGQ-@UmRcN*U`BIKbE+`AP_y3v`LcNX=&X1=8+Yy!bj% zlw0gpiQPu_jLY3b2R@Pj5aa801g?N=>tb#ca8thA4azDY{_4ZRwvO|$dMV}?g1zkQ zae8AE-s%s#=2MsDjwguduHi$yaDkpkImc1_73k& zGcM5^b>1C0wt6)?U{x=&WceWsu9f{I_t3O9+`sa|Rba;}gET9AIvgCh_ryvvi+0@|r{j9Uz-E{M*#QL8(^2+ds|DTmsC7R?K}dbHSX$ zp00Qs9{s*91!GRCa`L1&9s0$qC3@hW=7+?W82pBJf-=K&&6(!STv zEc(lutUUA1!C8i4Dd?_{K{bm2IBE&d@;?KVWk0ZHPI{wSXzQm=WKs{XwwU{J^ilO! z+XB7qW38<@ESxP(7$L$~QtmED(I#pB^BI3-py9bX+mp(f%+<`Xce0`jwbP8eCnt;I z=XWp_(dYyQ+C$s-t4QOy&LLM$*hJjKLlS18h;k(6>iC|62#?& z1P%+u_3fyR2c8N&rqqVV&lj6=ZyDZ?WpPb{8BOlJ_UHtXtnN!SNwbV!EyJi4dTR|= z-2y1&lAJtVvOU%`wEU4H3kk;>KrKRGM_d6il075=0&oWyP?jf%p8VwAynvq{Q7&RIY5=W&u z?S>r|G=oo9XP{r?ze!f_>3k|FbYQTZnc`TPL7X><&<3@YNiVj8A7V};dY_}HJ74=o zKM0Wv4PuGjumtu%?B{CwvVG^Ku2yXm>C!u)S5pe zD@^Wn$6UF8k`a!~rPm>@ZB3NR=FocDo+YQT%o7?n zy>zYKb8}%iJChIL(j*OC;2FptE4*B;BT`vX`|yt8+^*ScrF>uEAK^Ya*03rb#}5&# z6mM3D=-oG@IPSE~?09+QgMW4&DxyW&Os)=5DrNmJ7`uD7V?$T&GZ>0N?Yc6Y)@Kvu zA87_pN_oy6i0B*>$}f}U3Jpks4k&+trsXwx~O&=SC@y1 zFvJ?`X0oorc=5eC`avxhzMG#twhuCKYmBy7i_~Lxr?zX7VwurjkUuPzCv^k~d|9ms z2pll9h)#K#l@MKLIbEZmNya?9#2y0l#O^q3Aq$LbYk;5)VWiH!(T*1de%Hpv_=|ZP z;Vm7QUfRS8C)pu7dH}esVnB*0Qzv16X_sf?<=7^U%r~+Wp;Oo=TD1|*SHaKJ%={k6 zuc=upq?*4sb(RseL)Rb3f5XtuTpac(tupDkL41zN+K}Ok?D;0u8H6({sL!rlJK%9) zygh5W+pGw0xciV){5LpAA6<}@wFMUv!%uQrBw!#XK`1assQT zz=qIqjRfnE8)5hGbjro!Fg9mBj!PDt8UACi2PNKXMW^#cX9I2v-nzY#mdV%ULe*%W zw&{v_%~l(mDR}3liIUl4E_5kjk; zxq715%B#eh!TmTdrdvDU9zh~RLFx@^5xSWcOaN>|ZBvr-dkh)uC&tN{oGfSY5uIvB zpZW2TLCdF(OXIk$!KbL{1uwd_;s?q3?DC&093~@W$Ef!9GooqE9hMD5`4MuriTYA)vNw5+7g1uot#ru04DW!9l(i zLEJ>i{iJ@J^@*ZpQXD$FH&9UIu%+jJ5M~ffM06hDV+z(RzMd5}C3iJnKkM7`Ih&SJYdQ1Ezc%&)+jfH}U4?-+9KP74l~m&5+XEYL z-5l;26ED_Ez2Am$*EuTarhNj}k)TbWJ$dwbUn0USc|hD|re6jMaU(Kfg-6p-)Td5v z#gVY2c$SY|pR45_yFAK2)wLwAZ>w-ua#J4~kZ@%=euDCF*NHjId$mM5Hlv3D*=|xp zyJRV2TJps(?%n{GgF{C_ItYV&LP>X9i5)67_G;QWGx4mZ22FwmhX7k_m8oV*ot2S}Ey4Z|8n-Wv?b z0ZOj27^?Y>;UO%vxe-*~hb*xZ=!%zZ^-~mLODN)hy%}r3oslzGmy%jsY2oUMwAs}SOtE@E3TUXpFYCC?g$3+pjGcj24upqMvhde2WWz>_w@+Q z4qF_yWxh%4S(*5z;xjZt-8e(KoHdj_4wQTkWRo=2c&}x?JN5UKTgb@uo~UDb1ok?| ztvvR=hzi_@Xt{CnDRVi^nTD_pqM3=>@O)3_Em@*|R`T^QAr;M!bE(C?WhBT7`-bGR zP))7Fn?4&M-al#t_y-$rk7hxmNJSgT6QF3Ai3s^=$i}w)b67xm&91X&A2P(D43 z)&90m6k$vDIzN7s^i6$Vd3}pNW8y}cG^%GXruoKZi(ON=JBw!pIYe&Uoxi>Cok8h= zf9g+)0O0_?vG|%#A|%xtjWpgf9Lc6qX2s5Gu;=73BM)-0ZLI8(?$-0>>E1_T1-9e=ZC2Z`{Ddea&^4gt7uXyin;~IDde8xlyCU?E@n<6wOF}lIO9kZts8MXjy zpb4>h9CTkVnLYr;b}MU4N%k-&c4C-(u@-7f;&Vj4(AUp*W99!`chs|BKJT$W7OgiY zNZ_+si`RDg^YGTAqc}*U3sqoIS@4ZH8aocVz)+l@yX1sQWDDt2rC0`@P}jOzj^@E9 z`f{$D{>`FO=msVn{ehlnq#+~+@ViCp8n8UShv|3{`RED&zg5Yy18eO=3u)i z@t{$5Eg8`8)5-3*s^ zqmi?nl|ol{G6L~7uk@i~D?!_e$dnq}cMI)yo6V5NSrGi`V-T;?OJmequ)Vm4q@Tq^ zu9t%Pdf-?@epx2MP_dhM+QAjgQg55bY*ky>Q*40{dxT5VfkCl(#;u zuHPIIkrfV)+wC{2{y>PN4bM#>F+-CUDBgD7X?6J$UQWTfp9`w`r zBGKD%)10Uxxu)&5k-Ga=o!QQ#d+RzS{ChE4_2FzL7dB*`k*nCu$;hR!uh%zgc1fJa zoJWdP2nau9B8D7;cn1vzS5Ss&@zz||aZ=ef+tjb0;oX{vLLG3vCO6tjScpr?UKMD_ z2%k8PP1+o>7gY_hpFSZRq!o;3vSei_X7*`e_dQ8%>C+P3s$v(ZzY#3j%ttiU7_$6DH#{Gj8vJYUX$Ny7S)Qu2XesGM7U#f#aCgHLrAgT)RM;QW2)S zpOh1d(mZ`ndOKDhx5v*}?+f0uSEe2dtu+>aC{X!7nf1n36XeM~*=kd;7mbl5Udtlb zR$7i13nta=-sK=VF;ft_HnFLtG+2k#`O&I(Q@jxezOfj`OZLE0o#`O1cc`?UKy%~W zc%NZqP}@&*AxnY2v%+k7vd^DUa%nCZm1In_I!VhB)CGEaJ71!|9(|_R+{v@aewS+C z)@P(t%nfAWg}D;3jXjS9K6bhuk!IFo3SN&CUtVZEed)Oz9!0Ky3z?Ybp0@4kN%4mK za-lE;V|x>dp0Aa=&j?y>sY^~h4qpi*tYA)XzIXL>8NJmIVwIM<_U(4Pad|bFZ}mo6 z04bvWFcu%!WnGvyV}aSso|spE$;KRb2Jp>DkzFQ;RC{vCZUt#4;4%Hc{@ur`$8?A$ zX*j{%Sqv4IKEitz_^D5I9^FhH>UtYTQba=AgtHlD`@P zk$L8bjKCjKk>)3>YU?a?Y3FsVsp-**QpisUV?PUb!1*Na?xO3aw-e=XcvJvv+mbd+ zf?Z>?C2H18739_1pEa{5S=EopWn&z+Nw*?wdqur>S5>lcKp028ONVdWp7&E!8|G5B zPPDM2@2Hb!+)_VTZgjjyf~Y=Z%z!Z`mLYmL$(q1=9bcJ+h|ggny<1h{E}-q&Rxuag zN#s!e-gg&-20wRZi-6B9)BP|SwaNO$k%A&75INCdYz0D41&@Bsy=~xJtgfg!G+Qpf zMBM)KKq41q53_$l`k5;41?mR!$C$KJFYkNdu zBTg%cKYbJO$$4^8ciy*rI38nc<6;AS;o@eCc~=^vn7!2Cwdn61VhSg)HHZEPkkt^h z^R+kL>WMcHtL0GU$ere;e$B;;+Few?tPwHn+@BjlFBp1nxeV{hsmLEZDJWeB|6IqB z$c7{x?_#Bu3hcLuaV1s{00EY#Qw+zA*dOXV945ty2urI;ldYq5TD}BB=SptFji^@n z4~8{HRmx;sEZ%V7ZJ2BkIpq^nMK0`y-9_Dw zPfIJJ&Y;IkrFzUlX)MYb(*_3#+sznZO0(42K`WMPtrXwn{SH@>EkcYYk|Fm`??2#mh3W!1{`x) zr(ob^Jzk-cq04=V+S9X>=<`#QL2Uqzr(HLr-~=`9HwxYBEhqi@i0nPdVK53KhXfLz zv+#f|Q>R@ICDeZXnxJGZSK8_NXz})~>`#csccJb4JaH|}U=aKyGqg5(yq+5<+hF*4 z`~mRIe@B5h?CxE&6>R^cYcAqmgAk_{b$Ts$V{#UG_u4iOchc)~_g8Z9Tu-Y0jP8w7cg;;kOr4nWvmt>v)*e<3nhVsGzyr zdG<;Uth%K&f3Fz$e(vNN@caILoxZ`fUyt{SF*tt=|0lZB$X&=y2;!ym!+Buq-Y`Vh zK*hW9yBqZKr?sRu7hjm1UeF#LEdas(T4ZCRyv<&`$Awx^=&N|te%H~4$2Tu!ilCe% zJKd0*c5x^d-E`N*)7OH6WB5h7W^M(Q$g_L;XLy;AO^*|SRi%!R-as(#fDhzGLM)R! z-?ft`Ct0d#)yv7%JxTA01n;D(zKbUUlY5`-I!BJJk(qe--5mdu-sZ!fun#1Xboyh$ zYVcz8*yY`L8pOxw(n-#YRiL|`SfYnm`w>xniI!K0#CfATCgPZKY75>jH% zDSt>wVjU^Api7&J7g1X5$F9p9Ze)1>=ru`^pyTB#q54;Gxzttj!FD5} z6wuAa?!-eZmn6)AJZ*jK3Er`1o45@wvG;HR{Z;q&SK9M~E;1QkD{~N8y~Qx4DB2q~d@o*)C6*N~ za?j$W7OO2qL}mN&&UEw)*t|l{Dl9D~uC;}vfQwe9cCpGQuu5VQ?n<~k;&^|MNQ{7W z#&RZ{nt=%mVHipF=Z&mP(8J#luansuASXk$scD7jcL!7#!HG$MS`WxQY23%Mrp#pv zuJ!nfQ}Wd^mc(iEwLB!@Lq5Qq&e$;^RzeDJ@-7)Dc{}<%wlg;H`&hjqix;G}h0Vuu zAs9;k@nC;mABSQ=l1N33WxNj2{t+WVFK9{B*SNLME^VDgSZels9>*zQ0)1&W(HQ5) zO-~emy3>NmpW93};_c6v_U*)SF&b*5R<{E}* z5s2@|nhLbm$gR{nbhBk6+2U!k-fe{sw3A_VarZZ@wYJwXRepxkMoolLDvDS!^F5%T zP~cdwO4+a?lXb?NJ`3LXmUV% zH^lm_P06m&maU0V4cSP_lAXJ-;|{a6{lNRhNtRa2-O+3F3=|01+I|k#BmdLa{cg0n z@s1@JVv>d9+HZP0CI*=`9>=I%S7u4sF70rEX&Yxy4UBSF`8XTE>*GeZ{b-#(_C7=&*Yk z{n-+&W?i7|0q6z}Hy3DE7Tu&9JKH`e$qd_xXqeyAUHln~gJ#N^xRD;eITc$WMy5ua zj?I8=Deliwi4_3BZ8ZOhizO6rpJSEE+!n$)rlyX)sjCrE;B1m;ryMb6=E=tG;q4p4 z=o9;GNCLJp-PZV8{b~2Zv6_10t-{Y#&it6(&?zVh_EILcy5iY%c8f&I;N5`qXePK+ zAQ*iHV!;959kivUzV%s7AEj&Wm7)<~!_^}Vs;uBQX7Q^p+>6J?#1 zz(UQ~g@0OR4`wFh^!*ri8Bp44(xPITNKjs?kn{O!ibNAW@QL01;2fUWsq=C!g?m@v>64}K z0E=Qp8eQkHV-7v5=b={p?eLC9V2{tKQfMolOO?R!4PF4XW%@ZeM{^R0nR(C~zGU<= zXgHy@$-VYw>F_t5qA)F`S;xWbb^3SLtx1UFTBwnev&O9HT=DWyNYYU2v-NLnZ^5N? zGowjCXtz&MP0sUy*-`Z=!&A&rqZQ<*YziS|D(jrjYnF$4&cY*$K2K1eSLE%^jk_o) zC~&yL$3N13bzn9fXTt{JI@VX4TU$jf5Os1JJnI~aX>H|{fiApRM@`PLDlW3JIP7bv z;)|6=@s6ld8tmp$#J*bM3;lZoQ-_j?(EUNK+Flxt4yC$VIy`J9Fnu?d&YY1Y+6jd?kuNVvpZ z_fC?{ff~nAux937*+YWY;|uFUA5wUicH#s|nrlYJslO1n*T)HIiTGmJ(3im|k_VlK zAZgF8EKS?M&P&sfDW(lt`-P$#x$fF=ANRy`W zNUu_*iqfTnv>+h81qi)^BE5;yBsA%Q5JE4Z2?V5w(n)C2Tcno&fp1Va&pGFN-#_pC z;kqUyv-j*hv-i5!y4O8JY2FhIp9+uA*xYsnI`13CKlSvcj^u7VLG%msm9gy{p)oyN z9yG?{x&yP+Ee+)G76m~Jq0foAA%61hLx+-rK6s~lK@Ci8-<5-)r4ZJcMHCx(uNu^R ziI7tS1;ZRbv zzT1P{=Ujyl21sK zx(O}41?XDWd=xl-oOJBr0|{q41eRS#U;+GAZGZ4XPQm69k8OH{7V5&x!B>{#e$3`f z5g?hm@AlF+OPxX9bkm)9UV+;`sG51%#7mVkb+fj|`v5!=!Sp+(Fj*)kXW~M&CG&Xu zw(NxK>t&}WKvd!SUd1y0JQ*~Q%bRb8#UUI}S25=9YZT7-Y!%cqyz1N=Hzuw`u)mlz z`-O30wudH;K!2pubxM6kaI*f1EKuwQSL-l$4VL8OgbrKru3DyZ163Bv?R=N-qeD)0 z9SO1+?JdN$8{N$x`;%eFZwG92rjGwMf(4efX`(F~i1Kw4#1o}?iI(nOS&ED=?lzxk z9yJihG;BI_nE6{M4bE~suDf(}WBq|~ocvv?raN!uyLYEE=jaa5pR=En8XTnW6+j)w z-|U8_m2Sb4zpuawdN!++&>{vOG-FW~WvUv3DjgfIh|MOmMjPMH&p1y)?6ccFPxVyp z6->{pg;!E=Jb5a`=0_sskdXpBD95PvJ^=x?Ss7K{44@o0bt)Mn80%wWl=fL zFMTuw0XQ%vWVQ>cI}?%R&w)q_dTSIx(lT5>zi|_bigS?(t=2`UC5hAL|FhUd92;;a zF#;S_>}DdBrfG|@Us6j7?rmgt$E!Y#6S{cdyKQex6@!?9*n}dlxfz_aE;&dGi0&Ei?RJ8CDJ|H5^;YPBj2w@@WDc>?mxxHZqA zJ;|ICUJyDaiKrZ2#FJ~0`3~q5Bav)_!37wJdpWS<$UBwe1FWQmE+}g z!+E;*CnFr1x=1YnNs1A>a05BpBy#k{b3_->6mZ&~Ar%nivH6oHrna30{e*rkRM#59 zojh?Ie-eh`p7tya^uz`>UhKl03}TqiG)6u|6BLt6KYzZfdy&Q52D$i{WkG#rv_-Y( z3ZCza{vy4l6Q1JA&kbPwDS-!ujrl>E=>zh-M@^g5Tr z?n=6BMo_i213^6o{|EQYm=zi<&HGy!u{}G-V(?m`h)|y36%u3j(Nm86%?=Jj0qj)y)bz+?MX{}qQWkYRttg&a z)zUHqQgByvzW1wi_&xvXVBP-{A*JmlMviJTA(R#ugyk%;n3YeAgT73KvQD{y?@Ko3 zL4BS(P`*ZCY1~R~+}f{`GwagGHvAY_q5K54FYMYIUH?J7_Z&p(F#y=*8-012(8FKQ z!ca0PU3nN`A1!Gy3B*ILeT7t4!aQSxpd71r<%U>)qvO$i`M7*)M{#Cl&>RG5vBDEI z)y|n5fSA;>6QROYMLttvmZ7mNREht}9tUk|(^J>Xncn0q>2TSjGG+9EGc}FB+?+ag zUNoq9cK;bRi;s=kDL^W=J@p|CvW!4HX4S9VABge*$Mm4DEoeUUUJ0T&NcV2{J_T5l zN_9P~x)S+?i|)h{SCW?fJc9~iG@0HI8L{&seYo}0Cb#J7E_73i_aCImC6-(~nS^8k zt&I!=vkA!ixlp=bnWbxAyL|NG97dk@C$h7pL<*H&5rB*M*_H*~o4R^`K=EUcV4?|+ z$b_r$r3d~I-rBz!cig$k)okD2rq6peY2BcxKf~S^4D6bm*FIap|6XWw_Bwg(6Ki8ehP_Nae^)+>;J^v1z#!gBdqr^HrSCllk5uFRSXh_s zq>g_&z;T&|jRR}~ZLw&01qBN^L^aGt8B{_j&W$k@r z%Oayy#>Y$@Erd*QmZ52K^Y6q4AGoh9(B?MM$*bkkYV3crd0=mariQGjlTiBPc7hRK zs{EZ%-V#i*pIJbRV%ziHBHbO>J?|`xtZ`ISvU;IolrI=x4DHe7)bwuiL>XiS;~J^H z3|Ux3-ty>G*x%f_ElOCvpFC2;iCKD|&ShylxJ8dPa)qP62UcUOXsZwnZoIQq4G7`_ z%q)Rj6;TIokJDk`o|$WjRTgS^5_Yov>VD1n%M%X-h%r78jkVmB7x<-z)*jz@9aUXC zY9>?5c7bN6S^o>o#=)&bLbM~gf*hJnWq78v0J?}W%HTqbL6sjnI9qk6O zk%z2~TD-G1b10vSwZCICj;(vSUi0rY8LBM)*-`W|Hb_E5d(P zt-!A>?R-X^N*apdEijJDeZm`cPSZPGqI!ngxj=lcm__|`L?QSLdu&YSH-kBml#&w;Uss)xDjK$@7d1`6@)bPX?F-JiOp24qu)P&R5dj)K(3PU$lWx8eS+vtRa6kOOd6~t1aS|flOKq-VBe1| z+N&3?u2M_GP~GUo29Eu3Jinz}fO3IN?bfW;IGIHmy=6i04oPR_rF2LYsB>Z&-j!}q)L-r@4(+0q-}!Jm=8#A!J}v+DO5PDWB0>}p8RUG= zNBm@HV4$qhVpWNazV4G+OCTNX>TCN`Wjj1EK2K8-+~jSabfXW-<-EGcE|2Np9(qRe zOwYf;QS=JwSpK%vGbi4k7(Z$EI$F1`Z1GQO2v9Vb2z+_M*KM^MErcss>~@tSLWjR! ze)4XiQTjw%;`51#BQvddQ<&}dFC7WaqU1K0RV!1Eu4OZKdlre6B@U2lRFkEnkpMWxM23JTp9cL*JaT_WUNI-6&|NWB7s zm~AD$c9FAS4~J4GFHv_dM=c=xKti8idR-HLIdWE4Ls#C2g!-5sT{|d*?t||(rP4R`s};qak4QpX@Ic(EgzVPsx6Rc=;(Ox{PGpv z<=R>HY97rtb$k`pDp$kPe1>&?UxD_TvR+sZzB?xZh~Z8VItWlqFM6bEfKQFY%^AQXGrZ7C7D*+ z$6$WRBz@8*j5=h_M;(Ynf?7KNqWkqEy~ZkCvjD2fORsAEzB6uiqY^M$3|DEUtfAf{ zua?2RN5=NovpnB?puVegw+C3eGU6 zb@%D;yV|`vFfWmp0JHR~b?9?xTK%M@=J&HW0Z2aPU|asUOVd;LA^#aF&VBmMXLEGYcgN+oZ3ex$467t%MJwydq7HR1+h+y*l7Ql(RUqd%>BnJ<9V3 z+*^{_hL+(^bebTiWgfBB3~siIsk<9bjbel99Tz^LvEs`)HOZNVmDXd1a-%NsS>@0TBIB_8Zmw{bZfSTPqwAgJm~X zXmIy1XNgY9s+!oWKEv!PUuF>nF9pUm)8A0O+Xc1#8_JK9ynbsGPa-{b0p+PVSgf3t zetyEtcV|ChJf9g^n|8H^{>R&WQb>^hcS<7cNkq{BU=2flwxWr*w4-ym7y>=t$+wA@?h%?C9CTpA>!Wbp}$F{N-JfJLH} zYZ-hGGsQ$6WkY$gQDsW&)!)j{;pI})X4Z9PJgz1yuqhPI8g&O^xVEQXQ z!Alj9B;)QARpnFTdmZQiqILc(-{3Cv8-ZK9yy(#C;X^tn*3qyWvm$Ol4emHrqcT}= z_vl?UQPGLU@*noOZN@uNF*K#5_*L12j2Pk2Qz{E4OIdphI68%OJ>lhhQS8caQk+>C z7xM3XijftM5Z50LS`L+2SbK&2lFJWk5EGFf^Ccec#zk0Ilr9{@ zs?;7;v*TmjAWvxK)XRHihJ)|C3WeCem-ii0={A0IwLMm2!z44Vf$uI-b{MXt@*l%= zb4sH2t$o=`M#w6o2Dw?Pl6c33vYi$>M3ArP(S9=3IL@O{h=iP#WY{~NKjUH?{r}^C zY5@N~hHxvKRdriZ7FXHmki}-zf=ko&iZg)B-R8p|qlLi3&2^_kJ*&Mn&oFojtX4RP7xtgX)19BOUjH2;vW| zWp<;sy?vt^K4dHk7RrA!o}YE$+FVJf8i^2_>bp72sL{3ft9mLMD3FKgvCbz4>#an8 zc7>o?8lA=-=8`2SxfMn}1mN_n@YMSZZDR&f!#<;Rky#$%M^|O)U7#c2?GO^k$gFNi z_ZKtWs1bgeP~&iyGLAnTdn_&kyeRbAB3FJmdeaDW!pXmd?0DL;*bLX^6%}#RmF(Ii z*nZCh323g#AC{&c_daQ~!Uaig$JjWs+h?SZt%)0Y`a;&A-_Z z1-3_QX0M+aXq@gz&mAejkao3*99!qLo8?)i|4kNGd~jVlu>mz*(8a}>xzL!S!gmwj zb6ULu3bx#tE5chy+*=?$S080TdT(08#02s>_Od zzsIPRn4s%5Y2Feq)tsS!J0=MX#1t%Ee+$SQA2nU&FdLub;bF(zBJnc$=?M}lk>{B< z33<0VeS=~xBS46>cr+j9ibOl~f5h~dD`lzK?>aH^-pZY#wmLeag&i@4I3P{JWc`E> zz6T3sT(hZFS+6L5vG&EYquYWFq1kK)&2*;dzXDq=XNIG?RY`(#=#-BgBke+;!9Vrx(fOyzqqLTZRbQ{?QvnH+)hjrl<)?-&~2AscP_{Q@4=FLsdrP z57My6(vD%~KUkhYNX0_H#jrIdqJA(#t8m=?FKIQEghfHZc(n3oyAYHeap~J1^a89_ zgFzU7&b3K>((FdeRYG^I`FKL^csBW&^+Ugh9vC@r)78@k4PD8ld-e#7T;=xBhE4)} z0c=GXD&y9E+oFPJv3nPcZeZFy>P7q0r)adhgoW8QT`z7Qx1Q%%f%Y!=B4}p|Lz4id z0CVIG6%omd-m0B7eNvaz98Pj{bCzSm4{)FNUe*+2+!_z^GB_iDdt&T}^(-Hq`jRaC&v z&Ag>bF@^N9M19kxRWhd)*xGFSuDCxtU6p&yjUjK?)RvB8B^EoD#~emRNE0+QmC;ru#C1uoH4}<6V$m=qx}5!W2hGQNnSENL(O+U za#{sr>z*bw%y+y^n^aglF;dg8ZucAP&Ymwj34hGY`gvk_GuEX7oUm0<1*)Xzb5H(A z*-ykIMNZ^qHU9ZUCppEwE91MYKn?|g0Ok>M#nX99x_`r_&T&0{?o)`51_9FHTg|BZ z9ZPvfHl0;zQa&>GCgoP(NxdnEhPRn`<)U}QCuIbEt8-PYh_dYcNqI_~xZht>J7Rl< zLvoBSW&QYe7G(Vw!Mh6(yu(rmYr{SmgMX>;kbOe-o*Cfg7`5Bpvg$VgnyOj7r`QcQ zi&)*o+c1~w%b|TW+s+fWpitYHyj{IA&Bq|d1^vtct?IzAd4;S#K z)@9lY4!r7W)hqL`@OJ9?NANR1nP&Z9#&QcJQ|>w4R11MiXyS?_#9cJ!8hpAK5tbwWGBC4@=mg{y*m}(bx=>@o!vpSG47dEPX197F z7;X@ozYyJNr}9+^gp4POz~nux@Xjgt!eCZ@O{4Y>tEWGy&oIlkf19DqF<&)HQ4NJnh)mIU?7`S(rR zR$oh;7fki|)0ST@8p%LsTCA?z=1N@8Dchae+bzaLXgn0a2nya$b5eBfYtgbj}@3joi) zA|1D885vwI$ecT#0sCc8sF)vN_dww*yYDu+Es1?niL*Ntwx3=L@psQub*yY$`asheT`_DHv`q*nZ=LO8z zXySaDyZX22UKNsrSdOgX&jmoq8I^#3u!M|Tw?FWqrbeA zD$3yv*fU}F$FW&K*_T+}MBMP+4k&nO%&NKl)oma0_#%hx9;fu7)Ps07O^F$4@-l|8 zkRkv6UuUk1Hhc*@4joGt>31+CWR^X1PKeGVkD-}&Gyfou)MuvrMXZd+)Bbe3_$ z`tD-D<$)wrH9vj8d(p18e>HFRA!R+-min4-WMgTN$vS14`wwX&`8m*}JDrLQc5T-( z7Qjlzi^wtmSC}<3;rgxTekKbATOTxkXvD~#qROAw4ARnoYd*H;Jnao5)aI?*wU`^V z)|ENEgJWJ1{Uw4)U+r(8Hn8|={!k_-8?CLC+*&g3UoZE*jkddA2(1G=lIS#A?x#p+M%NiE{4CVk`ypmHUa;758gF8Il(;(I63Bwj8cg%A(Z$I5SGR6kCA7SB)j3L&?y?zO!R=PP&Yp&aK<=@Ungjhw)tF zvMd4NFjRgFrX2FC5Qs|Jxo%%u7dl@{@tR4)%^t*qGqW}I%AY(V6?p4dsxu}~3oNd-6ocTu_jCTNk{JW;u`6Z+%fh+v$nC`&; zPkr%!{5Vf{0B$6JMhaWLx_>5HzBrnbm=*BQ52E<~^JE9to8`aEh}-@Fmv|c%*o;#w z<7|HMT}vwDTGRgJ|7cqO!8P+9?w3)oME-T7@bDVN9quX1Q=9!qQygEhg)LwIuOA18 z-T$vP#Lka6*B&2K2OJ5{f<;abVW+mo7mk%c>zg+Zj`n$Q*zFEaD#nff>uq6-B<^%P zCdNB>@>z%DF!uC-be0~^I4IzBKS0?3LU=84vVM9Jd$KKc`u^mo=@fdhA8Q?tmx`g`aUWmRQLo|wG;e=5=P=l}o! literal 0 HcmV?d00001 diff --git a/figures/cmd3.png b/figures/cmd3.png new file mode 100644 index 0000000000000000000000000000000000000000..75cc11c96e8842d0b72329f0bc000dad824eeb5b GIT binary patch literal 24588 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 (qCM1v6xZEuRriI#dXUWA7?uZwqb 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 literal 0 HcmV?d00001 diff --git a/figures/ds_build_haps.png b/figures/ds_build_haps.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6be46346ca966f99c8bdd7ceb6506f2743acce GIT binary patch literal 13633 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 Be;)t< literal 0 HcmV?d00001 diff --git a/figures/ds_hilog_window.png b/figures/ds_hilog_window.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0f2dbcedb2817685ee819d0f8e50c4a74697ed GIT binary patch literal 74859 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 YCnc^m_0dsH5Dcrr6P3q#($8M~FQ#a_-v9sr literal 0 HcmV?d00001 diff --git a/figures/screenshot-20210521-111223.png b/figures/screenshot-20210521-111223.png new file mode 100644 index 0000000000000000000000000000000000000000..789bedaf0cea86dce379c07770e03538e9523258 GIT binary patch literal 25883 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 A)Bpeg literal 0 HcmV?d00001 diff --git a/figures/signature_1.png b/figures/signature_1.png new file mode 100644 index 0000000000000000000000000000000000000000..42aeb4501069525d9d25636b70ce23389ce0d9ef GIT binary patch literal 20463 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 literal 0 HcmV?d00001 diff --git a/figures/signature_2.png b/figures/signature_2.png new file mode 100644 index 0000000000000000000000000000000000000000..941a90d87ef88bd30a953175610eb416a5441bdf GIT binary patch literal 37697 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 W-Dzi9Gkn+-CCDenoB3Gn)&BvStV)6a literal 0 HcmV?d00001 diff --git a/figures/signature_3.png b/figures/signature_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a29b6487d7cc62c9528df3ac57dace766925e574 GIT binary patch literal 73718 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

83||C~ajwez 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..f59159e --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://repo.huaweicloud.com/gradle/gradle-6.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..2fe81a7 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..62bd9b9 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..4773db7 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':entry' diff --git a/signature/mms.p7b b/signature/mms.p7b new file mode 100644 index 0000000000000000000000000000000000000000..cf56bc471aaf188a7961b4155f3dd76b60787407 GIT binary patch literal 3417 zcmcgvX>b$g8MY4FF(7PWz(6^SAeaEMzm+9hGEK;?w7T$0URkm&N5rh8)nQA!vb6Hb zq8t&0#+;!{jRP3WWgr34f)nGWAt`O3Bn=FKG9AiMLTL-7A%wGGpxw1S#%AD0Co|}W zcHZOr_W9oTd7p0B6?8L4ni}R!nWF#7(DH%nCNNI@_$_M#CI-}3+rahb+njs~^VVNfoWg-Dr zjNunBjbVNP9jysa4C#vyyq8-Uiv>KKUkT*JF14DJDZSjEqDbkHsg*z_Bh(~-3Kd>2 z390z^5W#>az%)ur=1D19Zi3+tCF6ex zsyCW*HK^5Q)EPCf4ejfpU~8 zvZId zI6zs0-)+WfQ5LI(8#xR%W87lH;+34&tgVY z9$bE`)JZ+@&bZzNSM{7TYC};qTV1I%I;u>JORiKJb=IJx62xa~;ZRQwW^+;o@I)4> zW8M0A*df;ef~$p5X9~Kw^Sb4Bw$cXM5TCoZx<-Vrw3F(oHHILpSp&m1m&2mL@o=Tm z>#1`X%nD@#s49dFL>!XWmLVQgOGkB9V>Luph2j=RqFnE!Of2S&8vJ&<8lbA65!k96 z)s#8p!=NbL5Oa}uJ#3>PBWu^fULLuj97FY5xYCE%T>gkV;G}eny_B}c3Jc3Ciep|> z=Ov7cH33_?vvCyydsQd`V;V#Ovj)DRR$xI82dXP$;*pp?=%n0M1dp0Lth>6tG^VD_ z_6i??!K_}Rsn?fd3N^P{i{P-9fMK>8H^yNTLx3_|9#&|Lv4U{aNtI%rQjOM!EA0j- z2oOb?-j4(^pC=$scvV!LIvOStC~hnORc1EqWmGt9WDVspSYAm6D*^?ylS;rr9Z+d0 zmnmYgFcu20SF#36Sy1ah6c)ywusBTIHg1}Upp+?YO6a5h0w>iy5~x}GlrecckG<03 zrbGGs4CaSIQ7*^}ikBpq7(eb(K2Q^Fj51`XhKoqK@#Y3M6o~TT6y>KmLh|C{W=M~0 zK;-o~TrQUv&GU`W~voN69_ zMJy6=(&&Z;gN!thU7VIJ)R>{+;6>gTls(uICMg3E3DHy|G#cda-oe>f{k*w0k_bVQ zz(hVI${y1{1c$>xUQamuxf&RZ&ymO>AO~_t&OMdYITD2$k{3d~CJ6sP5CG)&fXI6m zh_VRn4Ft(tYmZ(62gpuK?=FK-&|43YAYFu{h$~MB|JBvL|7*DZ(1>F{pSpgpu6VJe zWrE25*_&dH$t&T{lzbZzGdknq5~XAK0eMitm0DU2x@ZnFl!jXgU5I>*Y`8CDrnQSb+Zrwr(nz z($l&L&uX2OrkN*51Sud@KN5AD&k;!j$a+kk)ah@EQ=}qSiWn<8-?*kuvUuYSiRs9r zsq{B)I5c}+mu&FHhL5i~94BAju=Ta%_aB~ei1o`ceM`6**|DeXc2~^_N!FJ4M*rkWie=Bqmc0Ef)$GtO2X;^7O937sV5`|Y=*xTTu2Cb5Kq<|xj*&qay-<$k1dd{9n>DJ-fSKe-00Zg+R zwf~8sSHjyHS~uPX>*_6Q8qe&^IX%7oxPH{qRE|dk$D=E~JQ`1a`pQ5g&#`;`#0XLr z%KP((H=mCpK7&FNH+^%o_5B>>-esR}uldJS_@zAYAn{|KQkD#cjY1Bl4#JQV2rl-cT)mhq*$&6%k#ZimMaGP#im80{hh||PG9RB@zu36!#J@z@&e87E{SZhc21E!_@HXf zXU)x7hl4ZEk4%nz_|^sU%E*;f#O1JqS?T*+v3cg%d?+ceFA{G=hDXB8+G8< zMq2=k>igQr5J7|cjC27Q+h=5?LYe%v$lZZT?rtoS7gd9T$5AmP73X@Juy?AhYhMm- zes%qf-`tJOz3QSnZZc1^O_Fiwnus|W9-6M zhg!B`o;5t}4RR>CHYA*wvS?Iu({5qu;^uGH-@BN9W>f2kU!9nVFWJAldET8 EKWu4FjQ{`u literal 0 HcmV?d00001

_O_~WR4oe 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%0D94k`z&DlHys0IFU^?B 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 literal 0 HcmV?d00001 diff --git a/figures/ds_ohosbuild_output_dir_release.png b/figures/ds_ohosbuild_output_dir_release.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5d2f9e256462d638cefca921c648aba267b1fd GIT binary patch literal 17848 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 KC5vC11pR;UM(0%k literal 0 HcmV?d00001 diff --git a/figures/ds_ohosbuild_variants.png b/figures/ds_ohosbuild_variants.png new file mode 100644 index 0000000000000000000000000000000000000000..5d65b0b3183f6461f9347ef574a2e8a1fd458fb8 GIT binary patch literal 17602 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 literal 0 HcmV?d00001 diff --git a/figures/ds_ohosbuild_variants_release.png b/figures/ds_ohosbuild_variants_release.png new file mode 100644 index 0000000000000000000000000000000000000000..8aab29a708813761e8522d9e10ae9dca8042e88e GIT binary patch literal 13028 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 literal 0 HcmV?d00001 diff --git a/figures/importProject.png b/figures/importProject.png new file mode 100644 index 0000000000000000000000000000000000000000..f91ca8b18fc53e0083d810da6bd41a32dfa821a8 GIT binary patch literal 24539 zcmbrlcR1Ve`!||SRYj|{s^~)P+NyTdRvL*-)T~WWo3=`8@5H8+(8S)QMr)QJR;XR8 zL2P1&^U;2P&+~h(>p9Ok*ExT<^6}2+z3=h5U-z9boo6c4mv3GMfk4!1s!CuG=nNhN zIxBYRBGB@N-h2W0IO7ghQ3MtB+*$8fhz4g%46oc^7e zv|;xKfncs`N(vBfvz7XYt^4|(gvCZnOL3kGOF!FohZv#29&g*aDqBjlV#U#=txIc? z7t332Yo0uKC`vnB6;;a8hc$R@j8D#ca#p(<)NDT}bc6pYQ{bhrAr>^LT%P~lhW%Ck zL4L*g_6aEo;@sLC+FeB3#+n?Mlr$B+r*tB`CEHV<;wk6pq6awNkEc6viEar%H3{~pc)e7=FOn72{`5Aqo5 zl9|&JxsAX0zYg;Tg*r(6ka$H5Fuhqleyzc8np?z$8Q!w=s(UKrYQy!Wh~vRYGX~yO zaqlJcVUs6pcu(UmY20;@a3POBW7KR)`+>r5qg)QNi^ zR7t9Fod`N9OR2u1VUfxh@PboqcFHMF(Yr@8eJzX9qY>ph<%wvIP%HOzKWIf!r1<-_ z3U=-_u{(yOMM+s{`qAUcT&IkKJ;%=Z=pP`twPifrf2Gn!W;%SOamtFQUH2^OJkzKF zu52s#@q5#CB7kH`Am$1Rqqe#NhEy?G`%4l{IRBZ8r;vIGGzo6Z`hw z9i`uzPijdc>y1&e?8hXB)l0a5=85TJl}1Z=TvL2z+clPY$+S@vse92+Y-+_aqsXDx4Hh!5<^SidXs!ETizDNz) zSktqEmzx^-+SlXRw7g6Fbj2srL4!0lRe!ZeD!^;6!?=Md@L<*}BugehTe5_#vv=Tl z(j0V>u|7UL#T+#$Z@NtE32vH+P%OC`6Ba)F|g(nyBu(0H5 z0NUaMB%qh2Ft_}M;2{tGSHnnU>5N2_DS`(U>}i{x|20rt4|B4{=+zVxu;4!3e)4B$ z{kp`|wZP3m#^w`m$K5AtYmdnIb<5&LiKD$VwoAA>liopl#745wr$}MGFgpx#sV46r zokh`G6fS(C|D;xL{ALWqC-mo)sv=`1tGSNP!q&c@3+L$%FCmeDxG#_m45VEnrwA7Q59T9oR>!SK!;2q?|Q|E&f)cR}UrB7T^%AQft-=2A3RuZ<(wK zO4+Y3vJ-9g+*x+NPmlnWuK1Jf$nf#OGLv@Rd|c7j7h zx2KVeC#^l2xwP-Iyqn48DMa$L+^xXd>4&3UREuB(x&c03JRv=Nr1{X+B5JIhd?4${ ztT&$OZ?2s#%4R+nMu>Rc@O{1`d|z+dIZ9C7(7CF3&)NMB8!1|pJ@StoLyYZ)vCpV| z!m?kW(5sPGCF5F+^U-p-&jV10O2Zv?+co_85@WVmM2sxLF3sGOio1ZAyv2A?=3WM# zE8m&r(->nhV?Z>41oj_~J{m1_qnWRKVWz=ROsFjuOR1(blw)$aT=A0C&A_R!ZqnAr zDyTi6+}(4c&ZX0gHq)WEc5+lPleZe825%Hj`*ghSCwuJ}f9OJea?qw7l9k~k=Nq_@ zxmXW7e!YiIfn@nDG^{5Sr)`Y-HLo=cS6^{d(@Z$Xrqig>#PI1H=p^tZ*cS1P3Kx78 zlP*!;o0*GvlIeQ4vA0DH=KUh6?h@h$=5fQ%K`OnrW*-KDO>YHT!3V5@jlTr4=CKsK zac1y=8_ZslMRjY8W9SYGzFY)BomRG0b|cF;szAb-g)llmcolTL&KfnU{!?~yr^Bow zs+Sek`FhoS@#Hho@8^`|CFR<9Bv6V9{xwn0qt&VlV9e!ITy=Y+b zAHMC>?*9DMD*SEdA6a(|(!m(}6$E)di1q}#2ig1N6(D`I?k9K6x$cD5#%M;{<@hi~ zXN_7;?D~@S$*RnB9xOn6kKGFr7} z3G;?z3sM+ioX(n*8vL;whq#lU4XJw}jCLTAsj+7cVQ61ZiX=42kJMx-}S@*$vi^JpB1OMQ?K4h^@uog-C!}boU z1(Fw;0aGoGT#B>3%c@$OpQF{rfjjR$ z3m1B&YLy;j?pO;RSg;d<3z($m9xr?~?GwzDHN5&UZ!$Gl)z}qKaU>ty8d=+4)jbm* zTpLQUq8wSA2rJhEen&mYJOReg&wNE}VDq?gU{Vpr zH^zZyJR#*ZpLonYi3{4;iFwa{u$9(~$lS|K(JLc=uWrJ1Ssj!Y*YX~X4@CysHf8x| z`!oLnu8gF2p)6#$T$L^0?nTFL7BGdv2LmAR5K?lU*P{ho+eN{i5~R;$xFN^wdaZ z$9B=W3(SY}=-bqz>zOB`f;T#cPEFOJ0!NRaZNA&Z#~STp)&_141&opRSt`OAnOAbC z3>sn?VTt(xZmkhP$DTJd#--To^VrURR(i_feLHN5^2TAg?A?w^zfXAwnN#>qSu-Zl zKXwH_LV6e}4R<3}uj6V+gK1L3nX)jr2@i&KE(qdDY$q#26>Zx7=_Dv5nXQM3D4MNgEO^sNtKv4qn0 zGYYfJp31H?g2d=IJ}S}!Av)nU$jzn!t`^KF15S6QmJ>NB4W3_7 zOkcWXG_1TNmV3x0DB;%KV#%NBH6hN)XdWfGklH(}0EM|VDAr(3bc-o)VlOiys$vN} zWCc{#$#>RVoiJgvETPf=?$P#1fIa8n<7VEX`h1<-5ROvM=5Urb!r)-h1@^BD;w;sW zHUDK60KydmhWPLuZ3wLPU|^a!{ zody?1u`nT|YhYzhefPI>)>`*lSR=`v1Y6<}Xw7OGKe% zfMThbgtqW`TE6{@XWuAIu{Ynoyq9@*(!@#p{~sO>{QW1*g$4k|AcIVH?>{NFO;QR9 z7!arzb{h|W3poSI zZj{IHpF^Jo$p^iK7+(Zm0KIX3HQf~Ax-s)~EBUnFjxpx(?2Db-(|uOczdUNMw>7`@ zxdH+m^o*3-HcvNym^~SCqXmX7h=7FkSs6)QJRR(2{Nj&bihEqo(qD=?gg}gKSdmgp z(M=!c9x;VKHB${55uAHV=Dc?hR=zx?o`E~mc>YalI4c`v>)PDN1S z97rCas+J`AYEJdmY@t6Lu#F)#OwDZq_PY^=o7qNWSTmKc&!o$}gT{70bT%VoyX+Ql zI&|DT8 z9yq$Vq}l0in_&&s^{RqgpGxlhMui*^IiZs(rBR$! zkbJn47j`^j#Kxzb`Jo!Zwh*`yC=x>Kdd5)?$8bO_h=Zv0-=(}WQ^7y4=!am13pUA6kh{moS?edITdcF09|;2F@w2jr;LYo5hw2)i^xQL@_8 z2objHP4_z(25`1$^S^%_eTkKaRepC-uLU^~-Savd-m+Y26E9nh$L2%t~Agk@VoYgBxe9 zq)|{& zrOKCcbPt0@5!_wisH5cn$YIhAl#b=i(z<-P-t#~cD0bTj!-j-Zy7K>*5MMyA<>$Wn zkNi^Z5k(_y;p+b-*yq6*vrlw`pK$d8fEFy=`9I4%CkOsyi+=4g?oiu>ZyhUGFMc!^ z6fmSo3#`!(P>zIn9<}XG-eQyAat+(6-m6*1Qfl+b_SGi{iAT0ZiC z{H^V(t-w&Du{01{oBRAc181pK=(^Mt~;jJ_t;d% z*nB7p3iZy)8Te@EBKstBepYHPivu7Xekt9Ca$!|TK8^cEy0Kc>Wgh!iG_(Z{?LAT- zKo7VsbZp+RnD?tl7ep*b!y04`+rjN!OrTzgf4vYvhab6ra_Sh?`YT7^-i7##@$oyA zLr9L`o|lHn=^x_W4aHY>#`&B9nO}bk$>6((haF|?Cckq$n}ovJ-o!zYE?G+5S@8dp zx~Edsjl$TV0JD;Q>QG5P#d*KQB@@KDv;Jd4loHDGU9dZ>-YdQvc0{n0uvr*HUQ7kXr+Ppc9{-Qg&;; zK{7alu%#*%qcF!kb`kWZ=nPuQP#Ggfs@lrEohEO+xXEu|vzb-tj}_^6fcWyRD5fa( znxQ*Ip<{ryi~T!;nxF&i=}rR7TD^>+T=+{t$Rc|LhaOnO@$`86Wm8>gZ5O3}bnpk6jUykNkh z2G!>F=H6_K;8*M7g*J*LKwY=b!k5}*cZ774+4p~{GzHVjGRdCo<33onN2l01e_N@# zP`yll>OS67zC|4@m*YaU1D13z81~Z@zrHAVNax~%HEvp|o@$8A<@S)sCpV%)X0fis z!fJ-4-QH0dJjSo^?~FX1NcF7Mr1p;@wmoz0i$w8*J>lgzh+XbMo$JbqI)*-t7aP~C0FyGFCEdBLDZflY}1B~hicT_~}CFIat>N`3P&#(Gzm^7Lxu>6bw@1;&i2 zLQAi9!`r}xRHqk^efc#g;9wVkwlVQY4zq)+@o=sui+e<|A+Gnkbf^8kkKSfoFLVju z6(IFbY0Hs4Bm)jS6mqxeZ>ILW@;&fa*VUFua#^E@Lh=NaJv_V?Fs=*SR*5u}#`|z= zDpMoLrbI85jI4sp??Ps|0two=Kk|YAS2$(z)%C?9dqwdpkRauC_Py^EU809-=g_Nx z?4AiIsf@_W>@9agXIVv70?S0$1X><3U1|2Vwa=vhy@4vgZ10TlZ&kv1D5ST#L^kpT z&QEw%_Ahfq!Gm0CeXq)`@S-{o3$~T?0cf!Le#3Q$fg^X(gHAbk-tTK#e)*&UY^fIB(JGb7 zcWX?r!23~;XS(5a;DXb_5_$TphDMFiLntaR>8GlOqi`zD%&YB%BsQ(F<6+BVyj@Fy zMAjYL=5tn`)c3zrq`>_7a@r!eH1%>vmbpM1(|KCZmk)3rUE86{XsN~bker8|2rbW> z@%A@9Bw|gZ!37>MdIBAP&ZZJ(ow%79Oh&qX0pHa#I6Wn&D{DlL3TNUTjM<-CYu2QH z(|wl%I`cE`-bUb;B<+4Gv<_=Di@gKc_C(i2LMXIOql_6>NR_1C(E>sde9j z`i!Tee3!EF)WVAX)7c2~frj<+*w~oO=#BbVd(#E4x8>|1zvzi=Q@YUpa-fzv9%A zu*}?UaaY6BlfR%=*|7}yhh1-KK!Z@Z%UqW!>5dAECLBf0J0`x_Lz zpzc~tvf*ty?(3np$m>ay>iO8jeg|F5dBNe%&CVsT>{)YUr4ZXi85xbp99vmQtq=oBh_ISckY z`}g6q1bCj^`zOMew*i6q>-HdhEa)Znu9z6F{5yL888#L}@@pJv*rrGj{b%BQ@8dtq z69ZwM1ISTC7FR`PH?Y9`v)~CG^k#6yyng7M2zdA@=3qZpDa}m*1A0@BQ~_5urtyp< zuA$4mYzMb-<-A~8vpNI-w{UckYV1^n0j)a)Xd7XsT1j1d7r$sF>gQgc>~GtP{2rIS)#qVX6ZCAd?JthhWmT5omA~mX6TGK3iH0T^w}Q~*ObZY z<#~mA>9vLFZAN7~+m8Ty3%~)FFL>vvWk-BiKTBlO`~L0_ z>#+B&$QWoV64hC%`nJu0Aha&)(p6#V=-`=NW0lmx0i4@+;MB|d!2AiQWPGXPOu_Sy z4|CHH3hjL0%?&=(QVQpER7zE0)shr5PjP|c>Gd0IKf@fkhv2^L>@*$kQE70*1QXk2 z@Y~B;14@{E**l!t%+?0j##E?kB_uiX^lrX`z!~L~V2;o7gJASi1yM0Ln8SZ6t_7^J z5Dz$jYvt92ni;1r%J)A;i=%kK-D?y}Bi7?CxXG7kh!?2)NYU9H$BPnlpZi1<%de!8 zlE%{vsydy&vnpgK1NJz!lth z6*iyybsJGGS6sZCS=4>D(xz_ByCeay&Yb+~C3@0(Hfq|l*w0kbd)@p@Jif4c@+Mo* zk()@?(=;$Dxu|YaoiXUBJ;)LMx5oks0wZDcL#i7{h0}t^GlET|VOZn$JXsPtq-->v zC&{U!Jo4LG!x$eBPki?U%#EJgfL4TD?Nlg4(5#NhY%?Cgr@AE(I4fb1UhLED&{TYK zP%L;WXr33woEflVSl;FNLipzUAFj7v=X!VD1O>b}TzKnhPPCG&o*5>a;Ri0pVt!zd z>Km$t@tWEhQuGZcR|Mp0xoLy^KzSXV5nb6fuy{^pO4p zS2o{;J0kpU?W|t!&y`1H4V<2}%~#jycPV;`v;?**$}jE;T!~+HtBQk$Iu+3olDz7qcS z&J-(Mi`}z-r*`oh8+)ZdcY}p}Y=1~Dbc1m6NHJ*ZSnjY~j(5(7@OUbPz1(~nPyYq5 z(ck~bmr1&s>t}NBJjDoArHuDvTrm!-9fR`_V0zgMu^5FhaQ#}tVbfOD$V_gvi{|-mLRU_4y`A{hsCxdnTnG<$K#Qx}Ik6SZ3af zA4zIr*Y({vUtYsX)@HP;1*O^jAtknQbLVHF?D3U+f0u@0LISt1A87p=Tz*}~XD{p3 zC*g{i=m21o+;jJi=d_QJI#r=_$}`;8dBYqZGKFqDV+i)tu2|K?$J=vuXx75l4ZoK0 zvC0t=%GWxWcAd|x3-hO(u?LID#~UT0<9o}%_)=?)vIr4-Q*EASYEUv-oSzD5-&+MF zIcZNyZY!r&_H(^m{FM=O5<>+>1$aa@sPJxG3pyqQnLQZ${O~d4mGw0LPvIUD)Jp^c zlPId-w&946=eT2AqC*A~9=ne-06`n1s+tsAK3O$a z+Xp89RFS0%l2$nR45lCCt}U=e9{jS5X&pf)&JyHK_PrgY$RE}b)hF%(kb|_HKA{7v zlCG_HjCHsD0k|uWXsRqrOelk38*ak&dBIRcK~=Fk*bC^MYHo3UJCM9sp&CAx@NW4J z*y_2RRgDQE(Xiosfz?8ieZ~O?M3!}T+^fhU2c<5TD&I)<144SEalf^CDr^2j1(a7k z(e#2sKdsKs;(q^GbWr5FcoL}}(NGafc*1_56F9CRfWDk!H}n*h#&4pgwoXK?>MXIpAgnE|td8Z>a?Dg4EX%Ux(syY;o44hyrCwxhvU0)3mnRME#$ z;hwb51+Zlmsj8Kc$;DR6Kl`nI7?KR!hTal?3#Y;X#xJAd4)opXu+faB0@p#G3cDC~ zROz-NKqj7k#Q}ZS;9yTVIJ37gYr~wc)N_kNZ?tM7FcttvL)TRCYH48dABjfhXx7IJ zKnUrTD9jdP+PFIgefj8XNkP}H{KldgNM7Z1C~jy;L_=P3T6po-7CT1t|&fIz8xOf#d{xZQ4Y>rkoE7o3d`vDGUV1V@#2&xtd> zhkA{H=Z~P}9m-&_179eZqt0mqSkW(Sv=OYeZ(c(ajX9IWR;_HuxrLf(>Uu3;UQ>s8 z`eUEp&7CbkIya^L(}01-5M1(6(8%m`XJ^?cdA*!H#(L?XOMECYYd}BAl;FRR{C)Df z$PbLdu#wrEG+*V4&rP;*EHagPr!^(}LIf{NUF<$5kvl>ctS1-oMLqdeT7fRk+1hct zIx=GJpva4#T`(@*KCr8A7%GpU+0n(+7Vz|o;Qs>cmsexXRm5MP%1@-5S1=7%(0IE^ zt+YQBFM{C5ekyCV6676?6@IV-a=3JA3$S!d;woul#$4S2iz`Qh4&8eJd0n ziki}W-B5p3-?OokY+gCY?5Z0abmN22Z--B+nEMI~%nTZOxH*Ov{5#|&OqOj7RK#jB z&(e$?4M(h<0ekj}q03y8F$x*Knb90#GL}4-Y%{foJ9K=ktwlVMojSK5A0ne3Bw?JZ zRWQ`E#T@vS{a$j%;38LvG+?fodKupfvyU4>ZW;;fMLl&3YQ1GRdh{=^XS1|NUI8C%ble z0ffWQa506kqn(cOo~6N6{kx|g@218=J{%DINn!L-aw?#3fO*Z8P23*#I?=tsn}bD& z!tE77O8c8GQtY~1TGzv@`Tc7Rf>KDyswg-TtBj zbi!&$-D81ni>S$`Zm3T6%Ezk+aAtK)Syc3%jP%rqlUDbrv zK!hJ^JB9q9Z*K~=mn%hpE8)Jo7W;^4g{;0^UP@j$s@pi*#73Q}o6GYXi6(|O%5L!% zLiI2cd^XRt-3;y0TGqI~E&C^u@&lhducRJ*d(oz*1w#?^j>7&ON3Rmby2YR4>r_vjKkgg6}=N zX6~Z4E}i}@zuvBI1(3xJXSN3`wHisba_E%%0Qbn;1z`oMQlt#n)iGNNDCiT7^r85N zfLZj{>1Z`m_cV>$-I=4X1sax537K7u;!Evp+qh?^F(3#;Tc2P*Qjh-;F8k#?5aY0K zD`K#JWASysoSY^rK;8h5FQ5P2%3;oT0$6H;&`C8?KZ>Hcl=ouC8q(;m`Ip|-!E7s_ ze6!B~Wumyi?jGnw%v>3 zRJfeu8TVHNm+i$D^iHPi-bYiD1G?y5Yl*`)^WGlvC|CZ?Z=Dx;)fQjNc#+j zE1%~VY-j26eK+H!hxbW$dt|cY$X6!ooT_k1W9}v8s!{W8H*z zmc170I|Ghs$MB7E6VFV8nAw9bwX*!e=$_70gy4V?*t60L-tf?-%aVUtci&=!-f7$H z@gXI0DO&`b0gKI~ih}uv{BY0AqPVs{GctiN9Xz^QK50#q^hiAl;W2wC{dIv+Zdf1B z`G^T@=zBY|-PYQ8-sj+M(zEsz){msByqNo*Jz{aoFqJW41^3XMF)_jXf*?-IZ&6B1 zM}D}J`;X1)^u&atswW=LKA*2Ntt!OTb45X8@LcCmlF}|*?i%~}^EGU4T{SLplb}@adS)CyIRMQq5n^vvZq(NAfJ{9bP zj6G$Ui;Q!3+X`b019Iawe8vj|8guFFw zmv`!%<%JVgBb1~7cH!;UhuM;cs`2w`Sq=fw1;?J%^$KZLQpD8HuMO?QhW2;c>Rk&y z<1VGNjX6(p;S3F@h)%pVDWPM$ScHxo^58z{Cj95Hpp&~{B3DvlS-rCFgl&jh^FUkb za8F?06SVWH%SrCVGg?a*m|~dEWe2`pIAaV)kn11IC*nCu%{<`NoA}?AC5bM)d9)jnwO`#hs3oGN#Uw zo+nGm_{QU^;g<>5VxSUF&I#j`woASJ*>a>;qm0?_fraR5O|-x9-_ax0PZlL&W)DtPsyy!D+d+4>>ccD;F zH6SkcB0c$TxE(=IocK7~#&p|RH_@Sf!9t1<(H$N}O!BFbW{$`c{K%9ewD(+UM8&Xn z!r&|4i0p)!HoF~|klHJ>aFFclRP3xf&Sf!V{X9*1)4wa)c!SV>9XP&fn`+!33A_0` z0D^bU4-k#uA^O!jk={O=t&uG=$S>BWPAVMJay7OJ^zwrS)XKass>VcZdo7K2;MnsD zf0=QR6YXgO4-taB6IJ{)CP!!0P-p;PWVi6OnGIiKhe&6%B zp3tSZE0$9%sQt~_(Cvh;s0yX-T|_%l{oXUce#W8wK}1Yztx}*qutxOGpi_=x*0P9< z9@MEgeo~DdVAa0cmt5=-_;Jp6DT)Qe=F5ZcK3Rc*c2bKpl76SeW-gxljRJUTadLIg znP0Tx3K$TdhPExH^^oRDX5M9acYxmljPk#f()V-7CD5t+`TeOHEK>2HdGhHuZ#V$I5%zVE7dSa~iVyQJz*k~{ z-gLBV-#)J^pb~Zd=Cs~?m{hN%`8QN7=G-Zv2Q;ZxF7t}`Ym1Rgq5oRURK-YPFtwv? zmzf{)Y4@Sz!-Bo~A^Tnx&~`8tqrm$JM#0qfx@}d=&aicIndoVF@>B2$ZFmp+;8+=? zP)g#dqF&Y+ka$A5EiM#Dt+t;O&a(O5g&IwIc0nYRFrJwgM&J-@W>fmUzqHcrhBKwn z=Ro2t|GlJTB?Llwa9L|)*hYNb_VTa-rp3edRw(QB8_3J@jsNOe{O&;&PZplM2>cNP!$%xWji$6@kl;PuadF8XYb184;4T&(No7bJTN$#UrIyS$`m3O{ zKuts+SjJ;P=hx(<_yADD!Md%5;r7Y>=&AR!nQjDwG@=hGE4T?JZO7ekg`R*wJM7$e zsdC*@S1AGJH;m@bDTNpt96Ql9(o;>x+Xu_u-PqzAlA-|_(5hmz{^p((U_jkYB8=*G z&(}!p5n(NqdNPTb?(>mbTb^tpa=>RsyEUH9W zi0S=hd6zd3f@3&DB1!n#SBP zdU?@Cjk$>vTRg|VWRbOj{~B4)aB_po&adi;!@qS>Z#V%Ux%wdyhoU;wyO(E?QWU2e zS;AKz3ozlr30ED)u#M?J-dVnJAqo=aC~kkkbTEY8k^SQFr;8a-HW{Qon6&wWHt?bU z!9Z3|wa{r&_cstr{Y@F2qSG(DP~smkK;gP6{#)xm%nDpl#T~p?!&b&LwTpLf+SFnF z6cy}nbhxVw7`uQA2nNNG>YwX2J9!;8;t_S{Er3iIO&<^ve09Aez0q=gdc4N{xdG&3 z(zE_t2yCy3k--MZO~WRAsT8ObYX_E`6?m|?zTQmxAtvZ(cKRIqp1k+T;S_sgj4zOb z4^?3g5M`_0yym2ybX*UT!hYlrIvR^@y)txOoIHj9G+6R;ki zq%8tux8;6(bygf@rnNL_-iY?O1-@XumHe!_x$hiB6I9fU;=3qN&lS>8jW3jO%7lWTCe~bvepGNn~OyqBF{Hk)!b8sSHMAKSp5{z?|s$-l( z5(s4he5S=O5pg`N?*CZtjuflvXPLZ6ho&}l62FU&22J-fwJ$D#TWL9b^TKOfvKwJv zv!WXpwOn}SW<`OMho`G0L;bgN*bDjbe{=6YMlTJ%JI{`41TuJr1vwovRA+%*yWcis zl{`)E`Efvt@~Gb$ITk?FV!PIkSJy%d3kxM#P=-7cmh&D#ht)wW7u4JBxDEcCj_=7_ z2WE}r{NomC8?nDxl01@oK6h7}0515}atoW%+Ad^JstBaBFAgl$xW39aGM7$Ba%F=P zcBH8zDl{=Ek`W?(Go^-;Ib&4qqvn<JKDtK%@Pn`~hdXW-?T?&U#(&;3cgc*3X39(+o%_68JwqAsV_&p3 z-4R`Dz<36IwuD&|2N3-|BS7(j`evjsln%(D-G$n)02}3?mD$$$x>`$|36M@L%#?Jy ztI3(Lhfh6qGUV-!-#|*JrE7`kJT=1m@yp9+trR*rtbDTIF+}Sz&E$x8i3^AI ze1`QV)TdKffeZh`ZwLK3WKjoL?OE~pQ7W`7X;621dvRbIsN`_C@#RRJy4!5=?OgR# zpx@DpOT0nD$j-U)p%%y3)-=>el4;_UiG@*_?})zT#J#BfNYtW#DDM&{V3)*$hmiI^ zb=L@nLJ{DERDMFao^3i5P^ z%zFlX0f|SJH$?DX`Qdh?D-gC>DQO*6_?H zVibh=KwznUcamlG>uj{^33>N}O90W>MoJCf=x)Hh@MIlDK`h;Kt8znYX}x6Ap_BJ+ z0A*aVvOv-wAQx{5%@g9!J$L6PqHa`@;<_g!x zsjF4^zGlX%jW-siPT2Q70c3~fTlx2yP5Y`KFPOdFSQVt)Qjf2E)97n8P^q!dubE^U z|H=-E<1q|ZN=!=bSb7B(POzSvXIlLD;3>4>ezAjq_30v>1Ua?Ue&7z8R|RSmq9OU_ zZ?WFe8iQz^6xe;!4_-bFvZ36wzqj-@2?bcOLe9h(7belTw` z5eB=uaGJexCE@i|7F>KH`@uDODS*u%q5^2uG;q?Yr#^+n3d+7vp=K&lFA?i0z2qOw3QWBoM-g|GNb8v zc_?$_jr&U(61nh{oN|XNNQlw|s4pAEu`)OMVHe zj;?-+$;<^?Ut8Q9d|xWC<}c2#OwOQ=S>N6DoP&dnyZ9^5AG z-C{x$r^Rd{z%cG3x6^OBdY?4oWYcLQrN{0RC`1vl1Bq9xav@2olA#@SW+|B$x;(Gt zzVTq?$)dN!u$GY{fn+8|qQ)iAd2XZ3S5g~aV{YI$DWP}k!>YSLUO`XD*p-}84NRu{ z-LTu9+1p2W2rbKB(?1I%MD|`A(1t~9A^RBJ3~q`<6Kk( zMG{9d8O%_8A5VBZ8<#(2C8KAk)e~l8h}Oe*1Q>mVw=H^u9-Qg`VCO;%qZkJL<+)Yw z(@2eEC*7Qz`wq{0ZjJbaO2sPBez#w*xG1emTlMPUJX56!@~6y-YR9wB1M9bCZ;&19 z-WnLqysnJ?trK!=rU7f^rfm&b$1i4j${O#S_L2>f_<(&Ma z)zz|#$}$g#KjI$bYfvE{CiiSD0+kxL0h$;{n89ux&H~nb3@7uQ^bAC-fYI=Ds+z2y zqY!~F!gtgbl9$UdTQF{D`=hvdA?p5CWg7K7fRbn@rsh~S3 zNl0pl^v}K?9DmE3bh}O+tw(Jz1cK=yR4~>;wf&N)+OdX$lLrBMfkU=8()_P~8XHZ8 zTrXEuCWsySn<-DH#);sS8hubkctmR14qYv^7ICg3me=4SppGnHRB>~!W5T=vX{-Tm zu;}neZawA8`aXH0!9HFijCgx}40y^HRnRRSt0UzH@mJ1)k~m?y_u-IDx}^DsO((9>6@q_2w2`%BlL z{Ee;rAI6r{>q;1bdToNlR@{-&7-n>uHPQWTv<(^4$$n+=*uKhEG&YkKDhI;K=g ze7HN%5iaRq64=w!ADbvwcXX25g{o*5=bA);Q zbJqHm7R@BLA;zG<*Fvhjrlfb}u15nT3mX^#5O0P))*}GmsT|l&S3RBmB{iuQ- zzj-Ou@3pE!$l0>wOLF9uI1D0D`kUr0O^Giupf{_4^?Rv{QA$v0?2{SNL*2C1N!yA} zpSqveeIKZD#-9o>P(8SNXWqK84ua51!}o!?;42`|A)w9XQ1Arp-Xs_wP*8MxEvdr~ zFvTV8Ko@Z}3}BS?DE=!_|L?&5e?a*Ed-npMcYCtylL_`9V3d-{e@aAdxlJCtO`e#u zy?p9K1|L9*pqzlOBLQVky}1yMNtMPpgI&uudl^LsXa#xj7VEb> z{-b2^gO28+;C>T&Oplt$86N<7RI?aQv*!0wH+n*<6nRa=VrQ3ofEokljaun7^ZG<+eEUa(ggVN2C&8dCvRa+mM1vE0!oYW zA&*vGimJEi8)F=f9@KdsLzboU&6LAq?HkSA?82PcCoXg0tPc%p&HAeDJZ2c_`>&c3 zbV}x9<|>>0%9gybaweMP9TlJ)=~P4Jzo6-eivxLE6@Ud&wot2F}54%YU^XGX#RQg|L$(M z{hlqMG!RWw5)#INURQk%RX%5PXjTVIWo-newv}`7eq})WuLf(uin{YSroCx+QO$)$D+tuhjlFrswOCrwJ8Tv8WCQH4p zFD$jepp)y!-}im8ZU`Yd`gt9^QXu8RUbFC(ib+kaHjMTk5}37C%Uq;)^T9o_bNA6t zQ+THNd7-Q|;eUr|zZ6Phq$3&OF1oKKtk1Q#X z5@ECv`?8@PCPm3>pu~#QrOct??{mHtZGOK4T0H<#6SANQj?NL!7P}l0lXq6FRw!vTp?s zJquuU_2-)?lMu}wQ{whHU#&cQvR4)xL=lBGE^ei7S)#LBHH`e$q#v1CWU2ZS;oCm)z?4%xkz$?#< zhIcpI!P|JKW43jJJz$9(i{uo=Tr`Bzq1WosL*L(3=f4O0WU7RHjGb>ga(gJ)reuwM zrJS%iKgAT$C!mb;@Lbk227Y^>?tO6QkN!$&=e8Q;`ezMb+QZ8!W9{RfsU>BLf(w-Jv`Ygq>jP74r}WS- zxl^N~p7e5aL8A6AQ~TW)pyys1V>Bl|BqGS0r{#`hfaNLS`TIIh_WJ)O(D)xr(f@EL zB@lM+-*5jGLoNu;fw0u3r#~VAl>lYn|GN;T@)ps}5*kB`&Du!y9vsWfW-q?@x7hTw zfJEh`(>-DZ+ehb80q{JbWK%>XY%sVttz-(UB?CjmbiBSkO43R`1gPUT z=vUUjjJG#$JiD_ZERQ+;tq@Hu50qP=W{``bKk;hetAZmvX1$dALOtwQrYJ_FkzPz> zR@}KD&Z}|5FLg6to5iTyf;!>)t%B>IUds{j$2jblkFeqCYwAnm!k)-c(T1|EKlMeN zTfz%##>Ik-G@xHDz@kkNm|Nc7>y{~oBI0cFUKDN51JkjI!5FqWk~kGK{7rwaEH@tG zEBTuL#>7Qlmpk?LFy4dMJ1F%Bod}Du7fg>NMdGM88aAnx$7c@ zqJ$+9VKKvCXf;DKDk6$hSjzoADnemgQ!(zM?{lWzUc39-KX!kA)g0$M=Q+>i^L##^ z_xt@>6mp#pBYp`S_)(+c6XGs$#8_Ijc8qi@*irIKIKCPMC3q|GtXqY2$wvekRU>5^ z;b(%8&S+*V&wep`qCp;hjNPO!dg>j?xE-*bH3Ulk_z2b zYg?z=VS2?w6mf7+GdqLLQ#1%BK-ZCp6Sg~`A1>DUio$@`-ge`3Tftcn=@w~ONc=OId(d>A<<$Oe*GTfs7ZQ*(6el6|o60s_ZB->|l z@;5&^8>jU{tzO9T3w6}A4u;(o1V-(U8A+i0J>sd%mrcAQS9Ec@OO!re7(LYARGwx> zu<#AfU#PFtRAt*tlSe{t4>c}$t?Fx10^4S1f=*vP`qie+A}rA)bJ?NcF~?0u!P`mT zt@_Xx)txzFDfxc$fvIDqjhUaC3iEHAfm!o`piKhDHhQ_E_R;!~G-#m? zrn>2BFRTe7)sdQV0tCwbw!&W52T2wU%(GZcs<+h#!DHY>>Z|IC_+0E`DHY*85)MOe zwPV{*euU6dj>qEFES#r+@a!&^5k=dya#PVCRy6?p(Qq(&?Vs!^~|To_kBT^=lmLd`W(kiex3*`QZ-{)mk&hGFLce!ji}HbfxZ z_g)EjfcxWL?d@%*kD(lJye857|u6o|IQlff?k?c5uWG=gxY_5rJk4)+WE zUaHa`1shy6HV;$lbnSg&i`OYXnO=KXK<%VMMS3TBYnKS1A2(&22OSttq7|G(QKLE#GNCfKRUTNu@P{`g z??1o)Z6<8$F&IXpF&b*;hhqvm6cdayIuI?jQ%B! z^B^l@T4D_zk)Wd}ZKm_5b#~tM`8sr~r73Rtd|rAi8F)jT`LM6h4-7flC%%iRMb2pp+L4 z?-i*mR28Btme|IRI|YA;lwphZEPkRP%CQ(V4-fa3CDqP782`>^H88`J@XD_~BsxQ$ z;Pk`TY*VM5t>!8HGXNQWa}~p6jnOLF^l~bl;BH}Iu%eCL46Q)Vdyb?@JHwTh$?>Oq z8eP>`r%w!0OY0+0I^G!f_0(?nP%U*Ugq#1n1fRzru7tOhNtmRhha%_c74`yg$8bGr z#-knQ=gZ^*!Jw)#$kc5Ya|+gBw-RYIG(@;xscPIiQH+3NA+LEZpZ^juT0!UYt2AE@g&EanpH4#cwco&FT4SHIjrDD}@45=R zHASO^d|8?~xBev(VNBYbUo`V8{SH`ZZ>Nb7CKa)KYKNgf*OHB3?%m#@zIddlR*mUt;&7nVY`}XM&kGr zqgZ2FLQ$JmHhfc&1IwvqUK&Rm0io%NbU2Gkg0c}*-_}G#+NzFUfLU{~aQT;VRiJH1Ni552}=oC*@Hr(E~Qa!g85}kMT#Kri+I-an8y0Wb9Kv19RXE<-T zXO_WbT_6TIuE`HAHxJa1zP8mIBQknw4QV~Lr+)po{LHw2_+*~~Bgow0fz*T4=|?o>zKon>ThpF7J(iXX>j&>t{1Y_I zbPDHgCso#!DXkP9Gt4>AJLK%eFH;ndmXht#x@p5kRGV) zk9&brjkVYmQ5Gl4IBP@I_NW47qn zBOdW1LEC9-d3&0i^*uMXZaYPqn_I8IwQ%lS@{z535j+Ljzi))>f^)%qmug1^i=#tvbRi*=5_mJgK4{c_VYLOTc_PSYUjj^T_^lQhzYc_cZ=ik z@ea{8%&f$wJ#(tORDNT=TN{AeguzX#Snfefxdh{kL1Y0%A*}gmfpw-N@{UNMX}#Dc zP?iM3P$~x6XZMoj(qhPwf=!Ja`c!wZKFkFW_`#pD>sOP~%}XP{k@F|H?h(Y>1Q_^t zU*|hM1DqJHpbMxEcXg8{DM*MII=2Nhgz<(et2i)6V2`VlWE&uuIfAxG^ zIOXTw8$Z4@lN;PD$o*zg+YZvZ;M*|RiNDrk`Q3uVP$xn#0g!*<0(-*?>*4=1iRBvf zQPWWImmVP{LTTZLh-#*=w4S)%&ovNf#);EaisRY3@PWOv}655u>rUyE=lH`hWsd zboOt@b&)v|kg|h?qg^YluzS6V&l|R2^$f-yMePHR6muW({Bxxi?gT&$Et@fVfJhk3 z4xkY|OUzLJ%6!OR+bO;5ZF&x7<`!=f9;$`{48!qcU&{nVSv+&;gedFwB5?xXQL%to zvB3LHXAB(wArm?A2An8WxE@X#yIf6GGW|Fb0lkR z1flxAf8<(xUuP={(Bf$Ui|hNP@5|}GEF1v0`IWQ9C9Iu5b5npv<06J5S){4|)(FIc zE(W0exueXbSYyCP76#5|8qL?hf+gShC4vpTMH@IoMVlDe2A6xTksfVMW^Ny5dgxJq zs`1v)kUa^?5QRcu4;ioIJ@uQJ%*RSj>y9|WeUsnuvZF(hfcNYo0ovV(dkT=kX11dU z0F^h!h{y`duC&KA7b^nzYiVg$E~FNz2f4Bl%#(Dy-{ zM}`?o)HO9f-CulRioz5PKsb+F`=eX0Xv%4BY;4Lev)JjhrsrBh5XR~QO(-D#LjzwV z1%7}m?jd&*oV!`_9FIb|h4D*U8n#PB8Qcd(O^DkwrkpD|RD=ZJ)G1rZRYgL1ZS(2@ zKNhI^a(WZw&jjwjNmkYbT#-e;zyTnBg1z1jy(JlpF&8uj`IrGfTM>MoRonic0!PYO zI_}B_AyPY(@+FuNuEH3bRUp;sJVZHMT4yXpn5+dOE+u@}5eQ`XXK2V_BisMlo5gO@(P?|gaQ8anQB z@xe*5H%&|VS9C!w2x#fV{i--Y6ftx5>OE@+b1D6N;co1npaU4KRh$>+F#Nlo(E_&7!B+E9~sL_Q@-H=cB?{ZURHF}IsI4sOw zB3)t98qct2-Fv&&etJ5%O=67F+*iNsK@99GbaRvA_+OU{XMH2pftOXl2{J{&yIbA0 zL3lV+)tsBks~amPJZnrI2*~KhwkRjMsXh5>ugId#?DKP5_dKbl!n9h9__){4fl-EG zbOsSuA#qGAM{H7Bf-VU2&Pm0`${$NGk+oe`026oLoY3@AG*aiB*J>Qn-VY^+QD)3u z_w`Y0T}OM}w{&{rpJ3CYGF7n6CNPQ^>&KIZ#J+q@!=HuS_|no|7D1Dz7%EscHjbbHGt zd0=<>{}!X<(@@Se*lOM{dFDD{NV&lS*D1bl#RI*<;uK#?`IpKO3S@-x=^Xy@ABsZ0 z6{mu}$V^9qstKEN(|@O~Hr2|m#RcY-XwZ}QCEm%1C8Jqeib;oV_=#W8ho3Cm_6mnn zW$fj9ZaI4$)cui8_Dy-i0L!;sl40HabF*Zc=+@~tq`aK8AL=-Iw}O)D#>4|aFvGdv zJU;gpko$LTc1+u^rrOrMZa1BOX)M$nBvNET2S7oB2+zFVxqddZjD|L{aCKy*I9%v+ zv-e5$sgN!oTXa-v+*^xFG)p+)P;0E!y{=>21S%=_XdH5H8=ps-qiZ=SPPUP?!A zY2@l7Wpab}mad!d=~}=hY=rAMLLy%z)TnC6^ZMZ;2yTJ5IwhL>;im47$$) z0M^1PfST|Y2S>%Ag+C+g$}5!kVaD?l+!^8YwheV6%~exO$~6oof?nKqcSMoXJqKQ(W_-^xS`)0|Lv*PvxV^z)Vk@sZ zJ~0BU!?a^%VMTV(NRXM?^D||o50$U|O0VKQ(7(62PR0EmUz7K*FDbd{mSm%uBs1nn zqr2w$FGT%fYTd%}5NmtmmiZ3NH(r8kHYJ0B6%Ogk!KcN4?dIJrtb?+zsZF}l zB<1#XrPa%i&J0}A!7-Q1#&1^|E|@U`hXr7F#m!jNrsk~j&5~Wk*Wq)9P4Rpf_6BoO zs)~;?!5D4zoM(5y7n8e*Uav36Z3WK@hSttXEB$(kfm$^nB`l8NRFy$e5Gj!3MaND9i1mHQ3{IP00O#nN>JXwX~?rcpXF# zNR#J#*_q;zIWM^;vuakFvtWq|m6?1Y0<#4v$jIX<%GHs2w*~y+dgu0fnr9tSx2YSV zGKy1y;PVjC27%m!Hz#>ribWL+v1->@fwk-Hem{uQr4|paQWYEH;dT4Pu>DIQ7YELN zuo<9}5<*4(UngZZiAex{`(KH%cT`xQ1Qgijptu~9x0x&L0=oj-8_1FRJq`L_&f4$9 zu3Hv3>hDR-iEe%1UG0WwJQ!TRq{wd`X^v%8-Z<5UKPoH0w4v|QVU#J=aVeP*m_}e? zE^@yVGGpdZ;1fRF|v9>`m#YjZB&x$x`c@WY!F z;EOB)0~m0e84{!i*#h%q&n(NTp&fwv2!n(H0-4%Yig^czHE4>1)xht%F#&l%-olWv zgIp?zoaT~3Yh1MCu$@Wb01yfv{kBkW8G(oHL|K3;gNJp#or_^7l&;$Pz+3lWOGh%* z`F1)p8oIEi!Fow5pf)7b3ofl;K?HO&&y3LOpko~ZMtmNOGq%E gKpd7S67yB|Nvlr|JKU%qT!NV&{mJCMvCGf@1HcQR!Tc+y-sk=9 zy+6JhBamjS-h1uZYgNrTt5%4jyaX}=9s(2;6ta}0s4^53j42e4E5mxs;V zY%DFA^e58k)9)!B*RiFl@x;}Ow6y5gWPdD0qcBP0KOZEJOuzpzfL}He`oE?G#{wk% zGiC@X2q5~$aDOTW{TWRIJ=sio9cIiWd}8}#EU*yFx3j$t#H#FXvU?8Ir~32d9E;C^ z0Os%&KS!opzmzzUg7Ql-B4;wpC%4n&hpK}EeGZ|Pl#E%@Uza~pG=!$~ zsiVxxH2p(E5z<^&+;@t$aJc`>Y{E;L8F<%=%)Q%X$+1f~FmNBBuo|T{M}caZlA1a( zIcby-`_RYL5u#(;KF^>fGwDz4s{phuGA=j_UZ|JlzfLUHG`QtRlF;>UokOSpB--5V0uW^B! ztjbDM=Jv-}efdD=Jl&3wUjE9YUGpQphDmR|KkuU^@W*mnf%WA@CYZpE{()`IP<(cf zbKaaYUxPN+fcxZUS4L*(oMvA%`hm@K)ICNS&yn{@3q1H@v*FWlg19r!XWegyDF+wB zUr~RRR6OjXO{EFj9cK zguy3en7zBp^dtJCcei<>3`=c_R>t!Y^VPk+r{zC>axfWWI=LO?C(QWRquzqrBXNcAHFB^iQ0<|4h!Y6Zh}jXtfMk%hd^|YNz`3RflVb ziS{&nl)q^!g9*UCHygL$J8t>%JA?!S`|_rhcY_tQuz+i02kHV5_`BIS20P04(hJI)2>Z94?^6FE%&kEq_1pL%-#mk3uws5>ve?l#I2H$q{D_aDIn0O8( zE+KK23BJqZb&656xH(=I2jKZTK9dxiF~?Dz26-w z$wgfa+tefOuSsdCdK@p)F;hr|qQ=5_y|){?b(fFHou1Q<9a1oVJwP6{7D`|7v%F!& za`uD9uL0iq1nZW##dgl(Z+D9wPdWkyii&<48%6@YeYoa^57$Sx3v=xSzNC_{3S=Q; z_MNcUdp~z-hMA^bA^)?HCzPpeW>l$C1jd+T#wuhTNk^q|pX@lA-n{qFDi`v&Rp6e} z2sdWdG;SH8DwR=wJB%>&<#1K7qC3f0s0o|;`KG`6klgjtU7b1!`9t1Qr!2<6fJ3vt zinRyrlvivExBId_-~6?z)OWH^VbODXbcTo9s#0pmBFf*I?7LfvTMZ&nkd z{-k7^&ylp7gqpuW`AY59cl-DD^@D3|4zt^HD_^&Xn-Hmag(5Negd$CSy|EJv>|Wzu zIbNylgQOyyi|>n0FTQyC?8C`d>&2Vpf?`t}+ONvpHbSVK@ z@pSJhkK}7kR@yx6hZ!68o=m)OJ67%Lo8zp|90(moPEWrq!~-0L4?T~YB#4=Jo3>(Q zs_Zw#Yvcb74DS(ImXj@p#5MGs)pSXWYXfj0@n`#+vK%%rAnLyQAQpjRmq_z>l#0SL zjC-PpLXK!wwskwd~k6yh~A)A0tB)@ytS|Gqw)_)R+ATS=4n4w;Hx?!7BZc6 zLSkYKLsrs4MDk)MJZNzsa}$HM{Z&`I?XLt8VkswYE@-Gw%c$nzibVlzofW9LH!*X zAP>Gx=HmAis}UozIiR7})Vx`zB1pJlClz*xcYG;AC)BRL+w4z{v7m(y6y~*1*!^(j-sk21ma}T#Cv+6qwyc{N?`<3|M>m;6ughcI0BBeK@V?bl zHP!>$HWZMLp$+P|f#z35dng`*RCdqw*7+97YqrLR1cg_wD`8Q(M(RBLjyH^McKw)U zgNsv(@kujUJK%!2@BQd=GX0W}d zJ$bB9Io%KBReuI|@qb+pgrzXy@!+&1ng35+@g4Sb`*G~{ZmbDv}~v}DaJUz=v$VZkxGLHB|D@RAdu zb{)+j(NHE|b~XqgjCU#2)uL=!<{8YL9Is7NOETbGm_$H{&`s3-^q&7tsOHT3-`AF7 zO}ZQ-FRQQ#LM8riag5II+GqL`m)`!qxNw7`ka=o3#^gaJIBNZNc-;7^R3Rt7`7Lp? zEn`Bu1A@HT1J9^szU+PhsEYBFl3*+7El-YTTQb zrfw&xW8zO7yBkYb!(aAJ*#(!u3~-q~@cjn7-&-~M&$<;>{WzL-*Dj|NxXf!tY;P!w zeVWe1-u0+9aktQF79Rs|%5=HW?HSGS3oVc8NciMGqncq#3bhBUMTPs}jO|P`fZ)Y&djD?2$ zAE)Q=kY^7gGPn9Uj`2`4d7UjJd=JN-y1EeIzHYAjS))>I(N^Y`UQ zdsAty@{gU&1uUe9*jvV%)1qDW=I{C8?T>x>7#Iu{oYvZUdubw5m5aHPbujt{>VCt1 z5QwnUV&tDVTai>#RLFI1YY-w>S#^K9Pder8cN$*SggGJlH#^5tWDkciw|^%F-}bxR z?-#NP2-wtr7$4?^V7-C%VmFJ`lP?=17yc?`tVWS(Z`Z3=+d`qo2|GJA6pAi_vYxAp zydz7!AA&MC>2pTUmlO3xjm^>UK`VaBZD~;}i;nibh2i*^)kGhsAJ-_Y)^9pOOUtsY z9SM(di2A;C(blQ~=9Wq4eg&1#t@s2 z2I-Xs{2R9|NTUxDYsUrgHT2!{Z9(&$;ShGvjEv8@=dD~0yc_LIEdS{3SSBe}lV(gU zJiup#Yq?6cIh^(td~;dK?VxL;2zfLGA&?-$@Y0euEx-6kn1zDV4P{H|R2B2O8z4o1 zrAjL;B-zzK+Wrt79{RA)Qx-ex_px;HQ9JNJlP<_d|Kw*>9FZd|-ZS}Bz*d3Kv0P1y zsj1T;@xNO!g#)9D|6+vgwwKw*pT43|xYF|lBWOAfQYNkeRg^2WctAUqYukvGunC!F zvqjE@>0dkOc;67aUGUsa{v!EksPAVSa@p)(dd|c?ZuLGXac1hY)gxh-%y6H!K zq{j#ss%`88h7ea$c=iE#;Li!<8nQ-K7ZwwC8o3}Lc2Q_1DuaXAnb68isa4_Mc=gUq zqo4o22uoSlag@XD31pB7!Bn$cO99}qrgu~3We6I>Y2Np=w}unaWqc>>Klq){RG5k8 zKhNhRB(fKM>**u^O=vAxddY8pMR|f%5nlUy9qjHcV zJX+%p;aM0w40WBI$DoQkmfR!QipvI7T{GF~Ot&hu0exo@nLVCItme8^f5U-&j3E`; z+dcQp@kAFA@_HAc@W@QTuw1h&1N#G79>{zXjGH_juR4vnJ-U$S95<47KXlZh4W&iY zkLv|9x)Z6fhPK1HY|qCWONQ|PtL^d$9s4tjTA)p9s_p3XmW0V#WTJLC3eaUubA#p1?{y z{|7;b>XqG~7TN*XqkOaL=NB3q(<+Jk)mBT*GOYiR z5~SmtOk=-LxuoHwh6|B@lC@5xEW8ZH{VNt|Z%|lEy&HHtzk@aK_P<1jtQO{E_dh6v zEQPx4KiB(T(gb8wgu>$j!ynv?KA}sm>B!UnKZ9Xh4E|o^e|_=4H4W|pr1dCltR$YC zz+LAKLN3RD_Xr}QNHXl!Pk(5)?uyT~?4Bq-n{aFrKTgZ;*SyUlA@RrJ>|thSe*dt_ z7Avzi^rjZ1#{axtMl7C858+?{+vi&zsTL!u z?2*A|-JD+Qf>rcL+W&!YWk9VD7-~bU+%Dvoixw{`i(RR)K2butJ*|30hYa(gCank} zZVPiv;;*5b*K%N+1jtn0bE*%anKG*nF?_;kPIK&h^JOe>M$>)$Va5q_tZmQR(xWnE zC16g!tRT$xCy1${>r5kqUE&XhRH9-94*De;_~2Hy-`QK=Nj1`nv`#;ow^0J zELaR$yWrDaFaVs8LdYH~$-AUOE6uF_ks z0n5tL^2@^K!u9N6B4H5`=#-QcCl*qhym7A`Hji`x@0*s@nK;Mvwhr$x2r&cqROq!_ zo-5Z(XM%NO$8%cig`V~m>`&J|3JgAKblj`8*;J%mHq4-y_*|75tiRB6SZrOx`jN~j z1tCK74EF+`>>7@w7^{|t;}&NU<2XZcIx~6Bq-wZxInrpQixHFW0Fwi)cU}jy?DB1X zM?!F%?=x&Ue^Y!IeAE8)ji`rN;>dF?of@Bl@?I;sqD)HU)|qV>vLCjj7et~2u9Ke0 zo4ygtJ3b})q!Qvhf;yf{QPlES>0c>%d$+X5)B_xffv0$xfK4D-8FlK%Q8V_l|Zk7^R`7XVdXB0N>B?PA5eP>B|^?0hKpwp{NO7 zS4VyF@X&rkhw+O*z~deGX%$>fZ{TxXo4IdHA!)DPGq9yjOCCqqoMzvLtJ&m`pJ5Q1 zaDS0Wzqz^Dyk@-F7ok~iot$B!KRa081lUxhN_~yHXbs0kPENiD0(HNrU2P15Nte`d zSNq?QO$5(lqLLVYQF_&4j7ZMLDw7xsVK5RcPL^MPKN{Luj5hFn~vEE-Gm%3p)NPkq{9gG?*5`9PYF~&(C)=!+y zZRNI)>mYid0*LOS7XFPZQQxE32e{35+z4&(xPg7udT8u9?zs|BTG5P<%4Ij}%f8y~ z-GbtoCoDl{W|ID+J8d}!;SP6H{T;pK>@YO^<)i%oNSvmM%UKiTb7kuGs-OeLsk8rQq?5!#%*wsg87Iq~sM_(ugwl2AM92{M`np!P;n`aD(DPLQFS}+S^id3x)W}0fesMH@#el&DA_BtY zdFIo6=Dv8VX02HSiule$0fWm8C42&f+wB&$Q1PNTfSELa5TjhD0cFm>x6Rg0>igNW zib7y__}G~Iavx?*)FHmig2rOK&D5tT)ji4l$Zr6H+b-Imh{;Aki+YaX$k=l!bz(y4u@ZdMamm@l^jWAsL#HQ0B=pr5L^ZWCd80a6 z;8IWd`Fik1Vx{Hbq{HA1D`2p-thPhP@l#(s0HWn^InIMj=v`ONB3<`Lb|Av+y;8yy zWq!bk&rQqbYur@AkpaOuUB?J5KIlO@lj-y9VkHKh_SeA~jUtSgj40lAynGdB72QE! zHg)ANpptA>BD2o$$6vej2Ik_4HNTQe%2aE3W?%9>`4|qe{a9$cd?)b*{2QHcR#n=f zsu$&3S?D{y){yfs?9Iw2?2frPo$Jl1DwW6vda12eCB0O?F>mG+p5QC&A}hE9<9(~#p5V^6zyE`)LNn(fDN4XP|$cX+7M8w?5lQ;R+ymT%C z8XpsVq6-}&#ZyG1PaaFnUMENCBTu^3^#fyuAbLdoo|G_bu^TNN-DGC~gUs(W0u8aR zDDzaHLz0}55@`*jd_MJX7#??bcN)eBr?mv}y0Thu(n;O&pp8MQ6M3vlPP9;$f!A5D zhkl6$9X&lOH+NAtrMm!zlvAYRxPZnRPUT0ESIDE~5McT(jF$rG;m};DlsY+)3;`GM zbHxY^FoyYu*Wk)!0oT6i9n`AN!x3+U9Q$YjL_NLAi1R86bTW=by&8-q5g+O@!x;Fz zg?JcmDb2EZO{ow+_7eANp7+*;)^!b7BZ*S9#88wt7cLCUjZ14iM+RB+ESgzyiFfv( z*4WF2`QD_C`NFppMy^4P317wU8j_pLAKn~(1oA+Wa){B1rRht$9R)lon*u`GxwZ>A zaO}443X4JUR_yd$7+?mw10D~Qs#I&w&{q8$pcHI$>&k(Uwr%xm)*v=f(I05s0m;cQ z0AbsDGCd#_)drYY6%yv}8cD+(WpO_Rvt!8is1G$dU&Yv5x3Y~yOK7>)tbbEQlKLGZ zS#wlelNnG&Z+PfpS(5ieGsCKEbMbWI>#Lq2)D-t&2U2Eeu5j|`#$WNXs%(2-s$M=B zH!^JQ!Bh$~)1}=+GBf#=`T|C(nkP&mk-kuV-mr!RaPpOpXuI5Qpbre>wh9d=WM-V* zgjjGoKkuy}!PP{-VCM&#i#2m@rw4IF(nS^7aDQEX@QY|D6W%6{H2kISv#aHI+?*#V zCOy)~;!G?%jZD3>K$-L%=O1naA{aegkU9XIpa% z$8AgN>h1!Q#q^DeD}o=ChynZtH}8t)D&@ekxFlN5=IN1jFS4bDf7KtK1u_Q2O6Ny} z+Z)BXYf&$nWZqGc%0UVsjaD(W!hIDe=wk;s$tDJOxpi%a{7hKq{T{eP!gOlZlV zq!&U4>-pv%7NFatvGX#)kGmd%F}s<*M2Wf%Qn#ol4%W?^!O~FV{qvRCX$oU9we+0P zcfW!KVLDccE6!u@nvOX+Hx7qD5NC=xe->tl zjYgp#8%=vZPe`f-ISqEwAxUDV{I&^gkDG8W%(cs$@$Sn*jXBdPGZ+IUK|O&)`WuzIZU&3!x_=9TZ` z$rmIb{c_f&8ynfYOX2UiHS0sy@^=oB=gozp0w+(PqfB?&`o~WgJ`%3X5aeu4{b@w@ zHLm^h-R@=(zU|K#@&oXu>&dKf)&Rx7(K^{sV|?H?S^0@ah|$u5&h%R$R|41Fh#^-`h9*w`&3S=7SW*%>z~FHF9|K`ito%22J@5OG#qaaUfUx z#lArzU(u3)Egal&>SbwMckiH}pvyA{q9$aQnoOB}dqfk8pJ{eH*;e*2%;URvdR-Ou!F)M7P|_wt8<+2!7(b$brOzr#dB`G@YdaQ!d_`Om9xd z34L5Kozsb$6U>^`dUl&wLe>^#pHuff74)7<_rE|*@wdTFxNE%*eB>Qfwb=IbFBmXD z3W2a9!2Zrd>1bik@~1&6=)NHwoa?OiNmD606C-Hc&l(iG5@f|h;F!umzd$?k5PM=&uv zZ^Nj?7<$VSp;|gXBAHCm8NOs>Lz;A?xYGoA2ydyTR(Q)nf#{ekm5yiHbEb}2kJiX+ zBt{gBAxZ4y6~6Jl3|RO6^gpvl5`if1+On~MfZ~*4#UKmP7{i@WJD-a()d3TJV0Kd? z3(!4pa>)2wO7-rQj@6Sfk;p&{m{AC`DL-cMm=%~EID%mMed&dL=k$KdMpC*?*>~N_ z>jP#VR^69-bD!9l(JhBv442W~j1zr0u0!3ckXFXsY^g91;)VVz`VS#NcqB;(ovHl$ z7xwD8Y*!w03UTN6_k4d?CWQ90ctGtZs(66t zmJQ@5WPdLwT6{FVq5Ox8YZu|XjQYn+q5g}l|NnIz{P*w|5B*~~FSQ9;9;dxuQgSa4 zGnFT2y6tu&?Di$65P$xh3gL>5KXA^T^pSUd#ORrxneS$gej#tiDNf1*PgT0T!ksi zzmz=;?&Xr&%7n&mAW=369_F>#pK52}1nmOn~(I|kIc1YDujTif;_r*=e0 z%xvVQkKRsJ)rEY2-)w%CzL@Kao%cjY{LEQ@$#3=E=$o%EMM~K!eSJ|Tpd#GS! zM}Tskem6cr2Z;E{seO(WER=N<;gf#l^dNGZZVg(hbcr38x%3pD-*goq{Os#`^ zWgmS_i#FN`!Qge;i%zcPhEA%luW#Jeq}QmJjtWL4?hD1DzkEE50i%Jbe5@0U^juWP z7fQ#b!1k^n*8od7()y!&sEU|~$)ESCXbr!IMS(L^)YLJVnRW@f1FrX_KkKj~UvY7+ zl?yd=+@N5$;TyDU9yKcBeKAmfm|wZpXsonNx7`D)6Fxli*RDv7fdeikDz3w*kssgK zPY}+Y#0{LJStKrB+Un-aCMK`)VJso(&U{sPr?Z$?lXp^?V=&i`aOHXXaO!FL1pdj! z^@LTgUx$Jnw92OimI2iz+&t{s&7M@-wu0_1a#q+ec z8+Asi{g);5g9V~e%7+sEY=mXK`1l-f1b0Qe(O3?9a}=6Z*Mw!81mTxO{V z!dG&P(N|T4J}4FHiNoo>PU^^`dZgz;H?3QJ@DzPs`4HR6GEP(IAc6KteTf-&6#&2U``-oTxLAr!sdF#p!Bu+fG^^=j@otb zi7zIR5;zl_Di;Rw?1j`8b9zIvk@6`xfl_lzE(RFtxiWNSLp~MH-6-l@-`paVT{yt$ z85gHMQ*}~ciDfl#ev6>BUS9sVC}O%suBdMmu?m~UYMDs#D~^ZFOsV|vZ>%R>c7oe) zg=IDJSqST)=AMs(_k#9U@}7G$O)DYyF~*&+XNNy|4p81| zbtzjp@pdP}6(@}tJxxqqu_Rk;1eKoK(ZcJVT$}r3p z<_WTDlo_t=jedjrXXr73Xr&V-9qSO8h1MhK4{z=*!>%t9!8B+*zFDc z{9z-+b{EWFPsPOR8+`ex%H-`-dLdh`-`E!pkEJkvJRSz$?$7uJ;=#-`_0--*@b2mu z(_2wMMLYJ$jUC6JpLXv%`R_kD295HE56}S%| zJ~+0v@0iL5Y3G15vlz}8d>;6&p6=W?Dgrt{cjy^S`{~EoVfWw*ot1)Tun(LbDrAH2 zK;okI=@#?nbK>=Dzm#>j=w!0ZZvL>7M*_EgvGc@3*L5xf=N12MYYp(kcuN)Fp*mN>;JKU$hZYX$MStZhZO z9E=6IfLKAqqBnuQfi|~F)63Ic1w>tu{RrKgeN9aT$Cam%nci{W4tY^gt%&7B8p`?K z-h;=!KJ#Kt%`IO+zHX&pnucb?-+I86Kr7;hd|I_Apnw6|aU9b!!WQ!Zd|x_APPnvs zyPd08IG#$M6VF$oU|~8Y*+dHN=6cOweDxcgIaZ4;UD`-mV{l}s^ZX*hOyEwCFH;M% zm|I&1MhZ0^IaPw=2s-thSDrH$af({8Ye&pU)*aaBE~D9NSN9}#=dj&GebAF>b9`{^ z7b0N`q#k->Ed%)=WxTRgrOEtaw8hKi z^s<%@bq28f?(28ddj7T3qI9Ms6!8+++d&2zyPSN{)%3JSQgn32rL>zXu0t&J?|N-^ zJX3C51fX0G34fKHG-{n1u9k;E1Tq~+T|^nc&wsJ7I?UYRCI9Ar#ut`NFL6l}+{=E? zJkR-1396Xk6a{iXs%|0oOfqX^n@x?#$5yBd^vg+k>t;Tgdo83NBN4?lhPk8cw+SF^ zRjb@^2nnEDcP2}p!irv2Hx_zRGUXDOs#S%H3_Y9*YlrshV@=vPEvZ$5i;S0 znRBAyGuC)O7(6|MFubP@0sv#JQB5)6=njN_9UjXhBq{biM|lP|W04=K1xcRzCzU9AK8bs69EXbR2Yg3vtMQ_GbMK-5jRqpP(o&qk0MQ># zRZ2CD{~K=n7q;;$Lp0SFv^9g^sDJEzb$Ac}<0q0VVSl3U8Cm=7?~gwOFhpm#GFfy~ zSSBKC?geWN8_O}huLkUOqTqid&XC*6fKKS!}S@q4TuMm}!vn<6AS_^_7J{4{9uklp0a=Vk#<7ZJR{=htG639)( z%y-rV5;G#l=AVMikC3IO>H@|B3=5?TR_(0oe8 zEe!LdGS>OwwN|kUzPsK{=u}Qyu_R6EdR(N{S8C9AJasyq$K9bbz{;rM;^O#kILbbF`BLI)16s+Z}z zedOK7NjMDkwU=&P82o2pQca!+h?KFvvL)XvE9Po&peFIR2A6NAFOvL|p7fI68zvL~ zkzD$GylcI?a$_$iRZ4{5n z+um+qD z=_S-xirggFAMTfRQ<=B3*+V_dR?fIuhGIebgP(bd19|?g5cUxr8spX1Emspl*>;ca zUJn|~>+y;DU1F7j0iJY@_P5F2Zrj_5e$hN6a`%xEK3N(iMs%)5tsYzmY4Ob7R|R}3 z$SBsxfp(rY&Zadj3~EM&!qq4W(hsA$MC2DwlHN4$Jl_z^$=x3i zV@Sc?j^$>ZZ*5O|i!&LL%?Nn2_80y8uG*-|_C?y-GCMGxmGar( zB}ww4Xg`pbRL6)xbgX|&Mqgg?es-j`zH@bxytm0d;P%<*T#WyzP@{TZZa0+!$QTqH zJgR%Y<+A(22rm9I0{(v|KcSouqZss_=p|VGW3^!~;BQeR8N1(h8k%l6N%S6?G3r`k zk(C*Bc&zaq{oHDP;tSn`7$ETPSaG|bJlI|zMhE-d7o-g?(_5!=i3(}X|Il-UZ*GUhi97NKoHKmvNX#04`#d~$s;fe!(}ZlGYt*7424KXm}U@9 zkA6UVDo5TUVhalich0R7vUrbFS3$b(e?WcNKqVvud723+!y8Izsd`rfUUmm)b$z$E zlnWFSljo+w2MD{KwHe0N8CkEYzR&uCUtY5xt|VpRU0Wx{p@fwT)N>@>R!NYT%y`~>7H~Qzx8N58jv08e z1gd>=X^y7&=))l?dPqg@<{gjZujt!*Wj=}PXwXsM_$F_Evkt4;CrInto0$gz<#*ur zp6EGCJN>wR&yNtdJ2~JCDN5G}0Ns5W5q9-21^?-zf2>sy@Vi*y?8ufi@J6Yx#P5ev z!O7vt!`mxYDYBpow#@`(!4@4Aeax;XvFQ9#4G+kvrxdC%uYsYY6nT5QB!c_7^`y(J z&8Dp7RU7;vGzt+TF*H1`ncpKK{Bw)!?X;)Tm?(% zB&q@d;kNv=m)vQvp)~UAM;J%P@-Ols4_d5?FN;k6eLpa}_ah+j-RtCm+(g0YUCqso z0oC_JkCYzX^73uk#&I^L7Iu|UeDbexeW_V~YZ?-gFDGt9){TE2Q<_CV;Sq6)?GtB# zAwJK8B}6i;$s15QiwWZ=MoS9CwG!oyk_kM_Gzdrb0FxBF{;8+|jfZD)Aifk$q4dB9 zS!VQ#fuYGTB>LkDT?s+zn%yOCx(2+JN^sk@G~$L7K3R#?F;Jno`qQk3$ceKs6RY?i z)EwXN@=mMj7&$M-x^swqO;b9Ioy)H?AY7;Tn4;ZbRk`)gMym~ih)f9Torx(BRXls& z*n`vQk+SYk{51w7%0z%1hfLHOdMZ(`UOyLoF-41b;L=*`TlDM06G*b#9z*j0`6+uJ z%B!ZdG0wVASdHNxz`3}l*od+lV~9E-7rQj5U7-Uh$go)Z^Np-Uk50JsGN(I+Q)Rmi zG0#_=A1_HVBh2MJfT?k6KbEV_GvMVHzke>sCGxTdCrc7A;e>Jw(gtZIoG1!Q> zT62*%T*d25s4s*Ftg9Bhv(b^;sxc!kktx?w*lE4~bnwA?Ufp~r#DXesSW0A=B{Y?M z+14R{iyXdTGd7mRun0yB{(7A8CfCFPC)dR<+QJtenF=$L8h3oRFd*o*Lb=P`ySP<+ zo)mjKHH@`&7^S7}7vss|&K?QncO&ZxmT@Wl01CSjCs0jEFj*YZcYFHMz3LM`Y+PurR<{V=srZ72s^D9RLVK?Sj%nyv7%A-T)9)eXTPAVJC5 z`;^mLfb=Q~dk!AHg4y9pV)y5tY*_b5bLd_4=W5jxVp5qZ zwo{Gb*@2-gL5x~PPj*q)-t-YIC$1n^VS+C#{VXA^L@DUFMejxS z9MnaN1}zn25)^p2>Xonw%ris8E&or1NAj4lvd_nMcf_v|> zefDTX(b~>F79+K8EAAj;g<0}0LKCE&3zw3N3wk7{sVOa>_(h91v1`uxqAb=j(%XhG z&M;xLy4`ih5Tq$;(2<7A78XgJCvAeC&`=s$mltT&4caWZJv9g=C5=rPX8lSBt==8{ z!spTibzLtJgY!gi?R!&(PseJkE?ZUVS1}&ea(&90^Mps;VE_mA2ZNa;CpDn*ek)={ zP))R#Z9`@Et<)PqQTD{VvtyqyYuEi_g^7C|d=f4dx?(y0ov3!$`a_^y7gaIFLMpaU zM!1uCtYUw){tEH_%$Bo{C$XMsoQo+IBvC50!m<{OWE=A&sUIDv%*NC{i!NHrfgMS8?!Mho448m%$lC#Rz z{AsG6H++3$%G%I>?V9t$gB+r+lqJ|E=4$Qb{OFl?jW{0?b{J00X(6Y?Thk~pFq*|q zVKr?Xvpebj@S>=i$;3*MUqqH%U#w#?`G+SbQ17?1?;YA=uwk*Iq_pWe-FH7w($;Hz zq4@6ph}|(A2Lq6ZB;wFvsPXQE4?I0oL0y|Ke3;opJqxDx{U*eJMeL~ zWQ#xUy)&H!KA5AD+$_9t(#UTG5&4}o`#dG-+zU9GyoYc(=*V%(KT>{9KB-h*j27gm z!EaWK*1ZqnqYzPQ+52+^o$34H+Hu|~=Mfxula&kXlb(aQw%M{jrwwwNfOXj;Vf~I@ z_)P+t08%8F8jQJA+&$)K!^-;yQ0t^ZZh#W053%s^9j<3_jW3? zg9zK(ni{3u2`4xz{p}l;X5qfOqJp0l3L95-20c@HnLYS|U^JhrC_66m&}eDgmc~AABov;%N`_ZyDoZIwU|ZBe17H7I{da`OTqVP0>ATI_z>IuRB0?Cio9`=XggjIv(6<2SxiH@S`|GU@k5B@imp8W=>b`lFG z51-IW9O3oU*BCFldy+fLMjEYv2q5}6ZLfB9PhW9R6YqYe_l}WB9}pEH^4bwBYi`yU z{d*C4^=|;+Q;p#N*GbC1CqHvWczgLV7%kLmlK7)z+^tscIQ_2yR^d7K*Dk*B*s41`_&N8vL!P_ndM1LS<=2T0|y)5aKyQyMek|zXJiK4T;;n&9!7_q7iebzZOakv?G=5DS=lo~^7KTj z=tFC79q?+seX=pO45;K(db?rIm@&?r0lLa}kGwMzxItmp*aj(z?&KCMU~Fk{=v?eP zAw{AXPbQkTH5ilQq#S+>Q+*|M3z){Lct5Eo5y-J;VJlv{nPx9EY;8{RPtJm{HAa-! zy1aJ-zoYc?5PI>zVg)s)KN%-Ljt&Pic&WIX`E7#7+z;2FfC$)GR!l&F>|yma&nVB( z0y-`e)x;Iejf9WB{InknQNNol+a*U|Mx2Fzj5xQ~uR9SIzrk2CiQoTV>#Ep9i?K~* z(uZB_?jg;uNeGgjtH-ZRoIi(R)OB=gay7qJD@u|ISOwkfS17wQ5JC{>F2_*T5_0d` zMhdYpTj}@k9fy-CB=?@sMV6fF(l#N$mT%n&k~6<(Tn0gt3zd;y0L#rTM`A23`Y119 zdkwOLa}2M#R8(R=P_cWYA4!YudJmo$J%$ z$;ZkOuhhs4OKyE3i=yx>5Kcs{6&S89$j%XJI;^qw3)8j86x-YLm)1hiabs4OsrR<} zk9Zd&1@3rSu|;)Eqq6z$2g+8naXgjYNxWz}^)t!tloMAL@IDy?(1W+ z9PQ)T3HZkF?8hM}E5htGdUm4osfj!<=A&17w)9960HbDWR+R30S@C&Kc7As$?7)?(8ZS!G+n;fzv&p*be&HK`V3qm}Wdg z(JEN!Xi_HyLohxV4_To|YDSPVC#YH`NXh!QoO4-Jc0Et^J1>i;mc&XV*-Eet+tk2~ z!m?SroZKOoJmF6pO>U|5A%R`DV8`;6IqK{I0%o1ybl8JYHd6Mm7J4>SsQ{y%ehFGt zOU^)f#!*n?u02uSaEy!vYcstA3T~suYKj&o#c$$HT9`>(&EN6;7hy4{_mkWbRDmtH zgN)^JMat|(^bA(*8ku}9eJ8hgCES|>jl4JH6^A{4wtGZ zteatpRRXnRvQIoWXioEzA~Pn#IhVCk5>9WPQC`3 zWGx?oSbQe^QPD>!Keyi8rx3axpCueWzbo&kd*#4J*(BzilS74zE!pS)u^m1&Pujvx z|IrOFnJy(v*ze))o2L;scX#CN6fd_BulC~cvl>pIJ19MBExdJ4aVNgG@YEtSJKP(8 z0|-%_j{$7{*ENKie1;nDFSFYZq3T_rIba{E8IO;7WJKzN0pkJ({Rc8b>sXKzsl^81 zckYP>Rs#Bo$l2k;yQ52lwDGKl-)U52Z{8*NNCD)lI8usOlQZXEG~3GzSy-il;J0Jp z@TU3*{DIj!JP4*;M)cT5iP)LD&$rZsL*MCVb$9SaOg#Udg8A{wR%_zocPfwiNmo=r@7q7mUBc+uHF5fqM zc>rJlB3vJt^3a5}vOwg)GOYa!6XubrI#zf%{nUPxYVUNE@zK3EHwoYHZ(_t&=^coS zJ*yW_M7&%`4e30&|6G`TAA}(A;(v%i1pZJ~)8}VU)W(~K=WkPEymMu*R1#!^#ECJ+(qVZmE}9L_;Df z+^OvBUq=GJ!e zRYZ18=c8t{`jGX<9JyT7k{~4&|NLP%_i4gqWVpMAjj4C&%5~rLg)%{)oa|uAu?(M} z7xGHHFH9vr_Ag}f%6-bZ@s>#h6O0$mvwrr8u39Bs7w=@#Ccg+2Uu|*;mu2|>F!z=L zQ8((=w}FI+C?PO(mwi*u*IK`|u9Pbk<_>#;QU9xF3%+8lmddrxsCxe}#bKR$jnBse2V|N7Vk*a;)o73-ESX zjY*U(eEi3^3BIj8 zYVrt%xebh1TO+Xwe%07^{RmqODkXQgoV=aur|c-N`(p@z<$j3U_zfx+R0Qk+D9vVC zf+J7IWj3v(+}$6Z_o#4YgPu0CDWed2+jTQ=a6()f;!glvK3MCwl_M1FHoT5!@E5Th z(u$3I#=vktH|nN(I{|a(5Ay~XU3M`aIq$J`vfB&{mO8nG3LQ&=X0-&33GtQsr6>lO zgD?dh1u+VX=zkCVo)BXuVIYQcJv@W*xhV^_212+v!uWxOg0x~YkCF+|Z@Q_R>hnI^ zIkUJK=PQ@@LYd&hPwp>Km`EBM#|9#}SDjs!j;jYs_mm}-RA+x2^Pjqhp|v;B(XUp_ zBu%a!YCr6!DanOMMs1y>@t3z-&W$%-#MMEbk{!Swi{qP*F?fPxQ~}lqfSy176|dRJ zDybk5ZR?53=i6EN8VMCYfrRMnW3KwX38w)0jQ^hmaq{r7Wg70pytOCw->n3s1%g;t(6W-PJh9HLccF@|in(UfPF<&`zi2l6C{P zF*nr1Og@g`r0e zKWiMHvNGKi(ae4QZ>xb=#d|^OLOms}V!D(`3U3=$G~%C;Xdxjm`d+mEz8;KQ^!m_5 zKr;R*w$EpeU1_ON@Zqh{O!b;COV&rtmGR%K0Uk$();7JvBqbqbHsaJmA=)K87>rK8;?*bsUl}C&{W(^J ztEm}UZ){0(2Kk;C}<2(C6k@l5xh!VxIbLi>RxTb-~&1Oee3WuaZ5r zan2@_2^L!end~}|d`bym;OhW?F#TW7`+HB9I7;YZCMh^qGhJ=z{T!$DCNXQ*+-7lb zvti_d`_b3gyTReBQZc0tJA0C6Bu|M%AzyG5G)W&g%;7#@l@aFOpcQ+9rRH&RkoK{- z1XC0_WrqMk{uw~~&hv#Zas}$u-i)PlY6?ekm3$kdiK-Ed+;BqClAxMoiyQPdy%YOU zOZrpPUjzPiybV)!ktNsJ6jf@c(~v=|kp1Ohtf>c<1gsJ|Wm+dNTuMxvCmZm*?^;Gy zUHL&$eJ%gL8vOlbkN8CJNM%(kZ|rVA$&<|t7hmrcw!}W(%47_?>t;LHIrSMdH92Mw@B1B@cAROm`OdQhXZ(c%O0TNL<{zeC|a!a9NkZ!ruuUB zA4;WqVyI7VmVWq`0+~N<-lUg2+no>zsEBQy+Jslty^%eKYLse8enRieYgMx zJIvK|YSdmUl;2IjcJ)WEz8Mevl4z(&fCUG8NoF2NmC@jIxYGUJkqp5e2fB6}p)IAo zQFT77#PUH!`C*J|2LjrZ-DiLBaQ1rOg~@vgO(WVr0vB~c0n~X|GGUK~)*zu;;*Vzh zohrKKe8Gjjh?bm*yQuRfJ~ft}FZTy@^^n;l`JpkbP`hCUNBEc!DwrTjRm3IIwb9-O z4XZj0b9zB2dRKKLxf<&(v;Uh|7K%ntL+^22Nm^{9VO=zjE%ZA%_Wx?Vw>2@uTIcA2 z4OA(R;Gr=OPFn0Qz}z9LpAS-uEFbw)vH zt6zf@d|Y(nc4oInHKpt2Z)hBqBy!7h#11Ym!80m8NBEQYPE6PVrgk^!&uKS%N^{3L zbldIcHwRAO9GgF-XZ3~_5-D>>RTu|xgfXr;B|M$n0b2z+(T)+*Zj0JnYzKL24`U(l z$gGJ~$_Nf7Bu?eEdE#+C#6NG5e^5VqaO(*4o;B^eu`YSI->{fZj|7BIv%b#%Qfhe& zO}^P|BLE@lPsEL90c2MtvU=6+e4{1Kd>(&jR=IIz!wYs77DA?P&%k}P?LTXH@5E$e zB)Pi(fZ3+0hH5!|Om}vMp#8h1$2a>&#|QO^9_zjawesuSyj(u#H=D0m^2H>foZBRo zMtra?NP6`}X!Z>gu47{w{v(yvV0T?|hn~9?3kn*GAJyut-;9tZ%(3`PO>)?Ymt!%W zA{hL(KwkV2#@EG^kxs6y?lJP#P=u)9F;=?Be1A0lT}2!s7>Q z3>QrQ3N`m+JZ`CZ;<34Pbp87{()&jF=$FNvEL&Tv`%D^{V)4Wo{Q{)?eF{yNDXI9^ z`%l?yPV!Q#irnYHa&CgYYTpg7`I;W)@~149KR3g^aLwR@I_tUKa<0f1YI?-|Y5MDl zF2vb9KdJosjmXRyWKupm%IKUHU6##^E!SY>a>B-dx;xca0>aL+iQ(Dd$K8gVG;q@* zznPr`I@~VVF94-8BgX~7q4k46T zpo!&=E6}13z0gC5tywipNuHP_&~R46JT;;fGS7VWv)(O_ZYpGZZ_`@uYWuc1SBh_o z!+ah~z;xD~yHav&ijjddFIA0VfCno1Ygt7j^z3uFTTZDJH|8I~$GwcZ(%c-3aOD}x z+FM`$^v`&_oS%_ePH=gw;Dw$?6Z7piof4}BTPhAbF7*CIUL=hsm&658Dq{IcV?@|i z!d{0$?6AE`lB!;w&n)KlXCEPRSoxvW(uno)BATV^4BYJKjn=!ZNQP+8(Qt7BMvF74 zY~)k+)9uACc5c0;`x7xeG~crx2W%T@;hX#Dm4y>k7P}lz@4gggh zl~ML}M_Fpj)YNSd2Sz`RYxV6tHf^g2Tw;GASWPz$7?qlf>;Zc_i=Tve~NWV1`#DvPkt_E07sqq z4W1NUSDcF2D+@FAt>@xPqUY4IF}yynwMdq&lhrjA#ymqqL1>m+W(TTR&R^Vupjz7#g(F@wNpKjaU92J=_P_B9_buwd@sDy+hZHnK%cq&dd57U>{f(CXMf4Nv!!#uy@Cz zyuk_XK5+Mp3*D>i-63;rrg6#8FdIUfx0SNu#r@E>VyVn8OvA zt9)|9wx)*;l)E|QS~P|%etd0tV!HA_D0bXI3`%+tnG*i7$YT@Sh^ zq@-Pwh*_9tm#+u3QMzeFqv}}(dMJxtF*`S0Y4)umJ-p9~6F~PGPuA-8sjLNGV zf9l-jAn9C%+MF0H@w`@XYmYKzS6N+~&P9VOA`%REYlc5jxvR8?G6< zn|(uQsWDYmW>Gn+OFU3lg3cXo@f*jH{2y_gQG1GEr^rKBcMeli8zhqC$+#YHG_H+Y zV-4nyx}9&}7xPDr7NIZYy(l`?pC2c$GQU5{?NQ})a3pgv+e)xgL}$C_AmhGlb?BIO19RsNU0lMybEoDxMZQmmJDooZOKbg_lysONWA($t>b{))OV{eZ z?GHxX1PDS*1=)J@C| zTYzzRiy|n&w1j^}7nkMGQc`HTMKNQnR!OKUz2g6vz*)5axfuOl2^?|QLwi3edO-d0 zf6L$}N#~jbmW^UvcGvi2t*Qa_Id7i*6QD6kf9cZdee;H?Sk!8+s4S4e;Qu>$KES(7 z_W5rDmA2`|rckp+eh{C>6_Z-IaOk*f>lgAO1nYVBUy`H%@fpmt;NsRF%6a|?7`4Al zEY3WtNr;@w$a64QS+enNj!cC z4gAj%_`}Bmj|AYUmXF*8;)lN;!va4%-T#7P1O8Ka^XEcLh4lrOeP&xmTcFZ2p4~st zAsU@Yf9Nfl@|ViP$L4AVG^gVmfY|#AfTViWb+~(8nzw&$7)5EL|1<0xs{qVFaf|qK z6g=t-0ItUz+UfzI*@t&V$*IiA$w%`qjQ&;92La#cuSe!|jM9AEov{i<5v7vb=`&Lt z7>--^uI|#W4CONMxUtm_Qav{}{UHe+&Zn`$-m#kFoalK1xG+j4d$G^XedgyI>lU!=a6pWSuu(gE`e4)DPcZhs$ zCI#H2MOTXv#uF8-2yczzUjA_18U-%HzDCA-1 z(JL`LyRLF_5QadRJ4q7Xd?Fy`?^|iQ$VmnA#e}mM1>j!sEWDM|44xD!NTc&=bcMID zijWYNtg26BhV}_uzfG{N2Q>%;ijG8&%a1+HvXN_gTD3!dm^PBnp{p)wj_%h5QxyEWY%(bgr=!$=<}{V9tC zanJO$zSA4MiNMft#?rapL++C=e?W@%FM}MnOO5o6Y;*e7k^9ZLGPQJ?CUfM0Y{0JS z2IkFllq>qEGg(!$ z2^W8Bwzoy5TM10q(UCJ3;xEfQJ}5m}wB7?pk2w%nABz4Z*ed=OY$>fLQ~4U5EDZ0p zrf{56R_zy){BsYEkusa?>5dYU_cajA#;;X3r`|YGubyH77(;PvE%vLssZZS{0=5e5 z-#2qKn^9cvP8}g|XJ3hz94XA2HV3OW9Dl4-s~**0Qrg_OUaQ(RRu3Za;sd{M>dHzz zT&H6m28*6)OB>htZ9hNq-rd68e+kqH`{|1jrh8LGx4ae?_H!!2fX#*d<2r+FIC-7C zF^+|)kSBL)F#hH^I-N%8z|IyL_gOIac)|KrtK*rPN$tyZD0}I;R$>%Rw!E;hRrGzxnTnVx{oQ=dKAAe0eqAWwf#_>W?Y17a7-Mf6j$8NL>T{-_i1(F9I<-}}b@r3Phgp(iDg5k}R@P zASj&&#FMiG#@Mi%Mk<~?mK5uy{7awiaMpVUIr4v(Im`c>R~h*T`Gc!`UPg*AuA&<( zK)`EivXHbm80Vm7Oy(+XKL*-P8XB1fBXAYHC#SXEQ>E&Is-n1Qa%UqFv(@$TsK3t* zJt=tCYIz_LGxVxvjGhn;-r5)Zl4dM631Q*v6>hX|-XQUQMGbqbTtDkprHxlDZR-`n^-upF8y-swpnS z;tMx~(dZuVcOx2y3sv_r=EXPI=I)c%hp`fL?I(wdbqutcp8) zqa&0+j6`{nKC9aDh)m)Oj-Dv(kt-iT@p$e7U2gde{Wk)Wm+KlgPvLk8b{o5UX)wR} zoDJl@b>QqiVxO5Y9$dFsf$ya!)fULBgp%R7dOv0tv(Nb{PvGtW&4VzaCe2N2} zHbRPTvO?_AP(kOxTu{k!7#)5`pzL$OCA%x7A5+LCW$d-!Nc#fwUYHp$$a6a+$l3hW zb>-xUZ+B{24u(!1K1L8Rxd0o4Ov5>b!P|7MsasL0BI7qn^8{o5oJLc4T;nV9yTaY; znT{W`4Y1K4q`vZJEGJ_h74Wv~(X{;DeG;%hB$ zrwNZ8?p5Nj1No-4;I+;*QF*nYk02VvCBaw34t|=vk zql=6rOHC%NICGS)yehW04dMy%0VmG>8 z@F>Qxc`^Iv?OTF6rwt1Uxs@fo_P}!Jns<-XBbC=*y&l$&Va^Di6aGM^AOHX)1Y0!G zhJ{$RaVb41cvZErw+{OBbKzSC%&eXE8j&p?7}zER#PTJPgqgmQ9cQKp7fOPiq`#(n zQDv29bzfSK*^n7@t?d3FKRcdYCVhYL_$GzW;gh0oqISf}t=ZjtvQ3qZ@rn|#mLZ@3 zR=so53afkgZ-j&Dvim|(NJAC^=rzPL+232H(fj-}6XRPFa}c9fOg7sSaxJ1!pe}1W z#U$g32(=676GDJB%?0BpzXM_OUU?24+d!mzv7BW30*J$@qkJcdj?hp~>l2EW+*V@1 z`vVFI_DQC@)n(ag&Ykg;13A6SO9P0k*?f=YNpmv&Jn|0hQ|(SC8*D@(iU!rz-$cGO zKIeaH2cUaFrp=mSYYx_uL<*T=!8Tg8v|^@_&Zly(8sn|q0nGrkG#ta=@R59S<#;cZ zB&{eR6jg|_cV0I5CPVue3*#t79FL-BgZI@-!G^}V;mojOBCSj_Iihhj?H0+}6;;5b z$&3UB#sK3V!<@8XiN-Rd4rdeW9i))QkQDEpyxkRxDU5|iIPi2#py^!~Uxl?}?}v9< zn2IZ=w&+hB&b?{VC-C-v06&=#tq#(1Or$XCk#x8{B;=FC2dBVpTavn&Kj0Zi@^K-Hx3)9-QcE4*I5*Z=3Ty-Iq~s*t1+Pfy|2sH{ zXq?l8^!(D}Dl;J|!QO&_5lj26Y+oTC?KGA#mEm>dX~V__Ae6c&dD>U3G}8H>T}27_5po9(d6O7 z9@?0GJ&ZB_mS6r~cC&Or>gXCCI!xD8?*YDKjeUJhZyGC3f9kj)@ zqA}Wfdfbh2F7oW9Vd3ufQuav(&#w$%#2co3zt`krD}ksCDMO>yj0gz&3pV3QKqn+# zgQSoU;+!fg2mqa*0GrrwYZS1p_`6#JF~AG=@m7`=iB>*i&>;7y|M+CGB+yCm8z>KX+1T0xQvP%xIBpP;YW;RQF@a2N{KTZ5B^&lHwF?uJif!g`&^h0J z(=SdajI|H2hq~-{>S(M8*>$qt(Lh_7bG=iI>#-Y2`e-pxfYWhYoDV_vxDZ@|#EarP zp@s2W!525KgEX_qZt3NradaAfbwD{FljVn@>-Ho*7q!P{R)~6E8MTI5+TG11&^WSR z^_+}vG>2*X;E<=9(h0WgZRf4DLTfz}%LTBYGuV@&_rci!W~)yWvRq7979Ix4>!@Y= zS*L3eGQIAU{4Eqok-3vOnRz}Oxw!kWLZsentGWw2xD6ySqp69cRzFGmo7k}~Q9kRxaz>BmDJW1@8yZl{aFLLed3PNV>fqd9N0#&s_vxa^P) zsdxeAdV0C_NfPl~pw*s}R?y^eP%MxkqwVjS8K%v~z_tMGg6mG$pckOsT&sluU#UkiVvn^R=qAgh> zwl17)^`U=?1`)U~@rzL*B}Q7n89NsjOz0T^U; z>U&~$1rb~RyQW$MQfx4TrCrXzWwJE)9X(6Yrk_2~CMM}{*%t4_)nnd_YTm7aY@PR+|^!ZE(de?iUB$b6oXzxRPbvc^R zB45+*>qIH;m(YeeJT<8Xd$Vb*;uo3L_hjJNPuSv|RY{&6q>6_IIZpp758ZakiAWnr=Q;PoD79ouVb0~bXmN7Y1w#bymPtd`0Z$?Z2Zc9 z%q7Edc)zzh2x0do#kirLG+v|Z^>|L`qg*Rw4k(Krv{v43hO(#ac8a?i4@?>r(Gz!I zB0aEy4kOKH!hk)QZWDEtY-ObaHWz!+lb41{J$+2lqd(H+gOlfE#RG$8-8S&!p%$dTpv+n_&aPpF6*NBff3gd!`~WmdHs%*%LxIW@))c0;t(-(uWyp zdLe~YBDQ4>VeBROpTw#t(`p6AzKI*Zlp+e>afu3tal_NX`{9L&n;LvQhw^%OBmyv^ z$5oa8B_Gf*e#%j+plAt{8kBuW2a>7%%JaIF#`Xp^zn{oOBa$ zKzM$-Ttfj10@V#)32wdb5co8dp>TIVc5wSkIV|=#T>DGit24VyONE@P3&kwE#mCe_ zSc_pTwNePRk4T?CiD|?&6=JsYlv*Pj6INPPt$!-c+MP-cSR=m-hN2?a0;UNC6kAQI z4w11t_qrtu6`|k$!hrZoQUEnFYd)?0o5PTco|)HH{4?Sw#mGlI+%v*TizI3LAMwse zM{-_Ni||+1by82c+`mIig?L=gw!Haw=8g8t5T}4usfy3|I~`??)x7P@H}d*gx&&MSDvo!7b!<0-k?P=1yqhbaM6GYOp8 z>xlom^Wel2qp#(eaQZ;@*Byd$%RAvR%2l-@1t?r?31Qu@P$ju;vFq0ci#xkeWtM9g z=~{H|PjyymCL11yh1|(E;dhU*d%<&yk;Y6L`#U(0k!N#|_R)+n5%O8~EUVm*%CugV-VrN|mEPoE#`$hSrG@RF8i2z~!Mer&+DD&8%MV%bTG zz9YIXE2jBMxA!4`JTm-@X!tG{IwX0ox_5a4U|C~JJh~;n!VU~Hn4e$rKMxXrXLzL~ zHi=w7^uEE5$0R3=RDM1^*JnPi4Kr8vg%kQwPtYrPGc!_n{J~6=NlM*IWpvUs9?b^y8j2#{BWzrKu|APKy1#zzh$u%k z10G^i^_SW+f`45*lKz@`V2^M>9ENUv3OBUFQpfH47Z?t;(QRA8G?WCM3l;n}+ihOM z`<2E0_CY)+G>=jTboZ07puGBJuA4h#kFjgxzQhVu-fH}n5h=0p9)5HzIu-J|VwxSZD!MnpK2L*ni62D-r(84`<2XtQ`65y5fgI>$Mo^(d1 zBa&aKy_>n1J5{I0cm>C{qZUu9;}#1v9HNR4MfQ~ccIHZ7o(6%r)!=(q^tbECnJN#M zsc;jTJjcvj*iDvgY6Qu1hG29VnAZs3MT@YCVE8g`A3rau&7$1!Jf#vZ|1Luj+B+2s|+qdkgOP#n8^ugKPB;9J9Mg2ThCq( z;k~@b{*r_0;;<98D(+O8_yLB5V?u#KnuUqIOo=+G7DALfUw&sCWm&B- zsY|NRbjO3k6hpAd&uLIgHl+m%#79X*OBe|O^`Ymb#2xP#qW3utta>83 zcsJr15K0E2IBJA>iA87N1Vo+24{hRtwPcey&`2M$d=>m>OF>v0q8;E;(B?lD$(Ks2 zWih(R1PBqDz3*BJ2ZdvT6%16m-{)l~?pIuKNH%A6HXYVKPkel73De4-KY2bAWalEk zAEjvG^o(&U)Br%YgTx(_dNw_r;25stlxM@b&1beu^EiIIM$k^K`k@U}1PvHX@0qXW zTJI#%V1C5Gwg(#}qK=}JtKJK_z5O!T^t!~&lJ^RKvolHB4G$x=iHhs4uP^^xC#+i^ z&I(AVlxfJAzpH`+<7y??JsO=3JauN$5q$EhqS*F!2F4UAQKI1%xdaG5zje_gih)8Li*h7oA2Z?cCL{#=}WBurG}Mgl4pY zj8^Cbo$KQ?OG_4T>=Sp4fORiBr!N-OPGY}(x98@Tt$xGG^C?{lVl-yMz7d)6r5f30 zrdD`~RJlV`E4^K{d7LEODJdj7dCiIiw)F{^m!!4gIeC;L;j#3AJJ3i-?9@4Xy_S|n zSqTO(u5)$9L<|PG-459H9xA^wn7340%;cNe#PE5 z!$o_sMWYWK_0o7cwjEe`d3nviRnvaC-~OUd0uVTRFc|w-8!x5iY>t6chRwCz?0?*y zfvSffuYbLg>H|Y>RkKYs=cp3~pkbNMEDN!b<_(NJfv?kasT(5xtLaBeCcCwz*bZJN z_3sJi(Yf9;@dV(sARPY9PdIx5)bBjp6DI#}%Q2{IJ6ozet5BB}(h2v?XhIqU2D$;B zO*PT@q{JAHn~QI-3pMz;U`;ypwU3UIt0oT^gyb8=;`831NU zB(;B~uHpO{qK<~_NO*S;f15%=vVEFSlaE6imz4*#ND&b3bEp~6nhMU1C#TPX0zDL& z&qxad5-|SJOGGNAu@%I%Jz;;c(qgjr15)5J&eiV^{2cch>#*_f4*Xk{=)-u9DDd1) zUTeDbGgpg9U1eoW007?$N4GU<)47rK^Po6_?4hOBhjsbIe_ofPpCBR7R2pdQxZCtI z^HrJ1Mw?L>>`qqmTwO)!QwSbQf!crPEaXD$KQueG%z(=JkJhU$pI>elRMA zLl?A>6qq-4- z9JhLPzRpZ~`Btdd-nT5Y2EEO^Pf zC>n${HhK5nZt>VY+14HJ=6WAovi%+I@d@8+MD zbNipJJI|3H3MD2Ar@cIfG?lxv^&Wg0N^#EfJQ-`y_bv7zlys1!e9q9Y=gR~$x6Kb* z%3xonZ$%x7Htv2kmo~giOx9 ztvV}k{J}70w7(yR$?E`O1ZhWnsHCvO=sw7K7tha?MYvVmpw(ubKQ zFP^kZA<4wHV7SxR8+rpCQ}dS`a6OZvOU+^~5-$UFusyGD&>jd7m9Lfz6Du160-y{hM$%8FN=J0@reWxbB3eRa1vGMeY z@)1hElO~nn{f)jVmc%QC$0qjP5;i+EQqp!kJmIcdNL28S^>&7nlwhQe0vGM_+IA{h| zxGYM0v-WkJ9-J*BdOp{2@!Ufv5yPG>urx}DKFo<7Hj=Ma-gM<%8t$6q3q|;4z%T-l zo#@y~J+5-pB*T^56nG1c&u0kvibHk1kB379!^9J=8s7(?VoXgbSmBD#b`)KDrc6;@ z`=c+!9i!M4GJuj?f9M}hOpr&b=E+HR*xb0>G_D;kSeZ&(&SK23FBXJu<##<|&$ zfjf<786|5zL{Y*bRp2My3HyRhcJa9LnwDMLr@}4m_AcpMqqQkyJOa>EWXQK!l=S;M z%%W%J6FbfgzF8`Gl`6mvS9?U+OP{I<7)XgLsm%y+nt>(@Bq~eTon2$4n}VnHEAz=m zw;W+8AB;h>&E=FHsl1>qOH!^d$Cw>v5)QFn6$6zOl$#^<>{X(2e<`+h$C%v`yoRD-~vmM&*b!>CQu|4LH?;!ZT5uIbGyp5_y| z&5VSWurF$hK2+B0ldy%oZN`rb`Nqyqfa*k7bZd;(0Z1;H;l5RE4lwixPq4duSoEbFC~3sFV+QK+?aZpdw-v+8{G1o~!7o^l!@0tZPR&~>rTNlsUkv22N>;Q; zU62B$yRuXph!)yN-3_{>_1J-Z&}j5d9Nd1~8xOOX()XhSl$Xos7)h2P7a zren#T$T0`EW3R14RU((0?@;#N%LZnWvHwLiXf61M4SO}WX)7VCuguZuACX_jJHp*# zrzXC}NVamHp4V|zQ#>DMm zE(f^Q^6(=f!_>7adck7`nhotiGkF(j8VO0D7-3te;;zl$91h*RmNep5#Xn1bY3~g! zZIosXU87|@V`d|dMeGZBu|S;$|9>DE^iAyn@8Fuc`G$3<>gdG;|~(q!}V(eDw%*bop-A zqMwnRCcK=<%~tp9$rK~%7=)>?leJo0DIkGZg=)2Y?CyTrZ>d<(#Y5?Jy%gXtjv|#s zd^q=P{7c1Oa^qAnWi3OF%~$j< zKAj12k}AX-&iT24dwS)t8np$bbscynS;(h0h(G@sfY^qCezX6|u~>QQY>u^IzZtk< z))#O(J5i36dV@7=P_Z-ZdApQOhMTLQs2E3h%C4A}^U=3gh;!yt zWXqX6ZEf=vIah87!?3n@M+=8}e%m1iE zhzsw*o^EZo&~pA9X~K{`a>?hxU6a~&i`;%&qDwY!T?h;Va@~!45)VPdzqhKawOwuF zjz4n#JkNkLwQa5m=~m1Yg5{6l4N0)5&1-%sS$H}zML@q=*|ZdH#5obtsk|xq^HFA< znUFwwd|(U%BLfY8&}mqzc{_A5V3MZ_{}%aVMd~Y07~-G~I-ZB|IuMKxOIp4#SL9q| zt#GSHx^A64*DYFkn(;J#K)P@;>k@<_pJ$%}ofPqP%8xt@aL#!`edAQoQI6oDJ#J#R zi|3;87&Lh<;u~Z?Wl$-`93RYWU@sb3ED?acBI1>^37i=?4E*(z;p^}T_z&_1@(a-7 zPrQGz=C$apN01o8HZX{nPIIh7CE?G`^(i#fh(fePm7+8zNpY!25u|XQ_l~+0+i-g> zBQ12kpQN9hl-+Ay3!2;N37P#oR7R3$gB&a2xof>>SZz5h%&HBzf+=qs_!LX+-v29J8ze~F`k>02t;xJZ zeP09?Wj@p`#~TwTnx0NzN^L0gd){LW=+HzZ^7Z6PAy6K}M37byASW+u&rfAlTFE1+ z*BC^CDTr}8x6;;Th?FK3fm(%zz2fWv1qWU5a#|GOj~_pbY2APuo9xQPn)w?>>GSB+ z%A1$d4@`Y)5q<-DXDEJ^^803^eqr|0u{G0M;OyDfx^bDGbm*L0{-f(E(yKmH8tsv_ z{K>eT0jk&k85VE|QbgMA7gT6RQ#W$OQp2$KC#flm^7$t#Af%Fy#w-jPVIYfe(~=)Y zx#sb&DgcAePW6Gd*o|t2Bd5}mMJG%4h3EQ(vouf*JO9ZC!&@LqE2GcAy?!q;gyYlj z<6sE_;;!_?A zB9s3vU>?sUxk0*?L)f3%fr7YdOnKuAR%*u^56yKW7mCrlHM$jpss*#ydN&|O;JQ9K z+lP{Z2{rbIu%yy@xrgV#HT z!4|!zyuwk{`&L?GzInBB@@lv+idKS4brote>$8V3+?TuOLb}%)5!*&jR%fl?DC>#J@4_zxaVcZut*u^aA}; z$5$vt9(@Mz>_<&&CPY;yF3$Lg8vnR?o2Uh>aI$B>ZvXo~WvcrQ`KKf#-y#mcZNt9E(XAWk|z>`T1-||TfO%i+m>NvKbxYh0abn_n#9l#eCDdYK^E%MdX)j_KS-8S$q)VsVktt|M?=M@lh#w^<4yVWd%WRZye1JEuG8f zpeiQSq-DwUhKJNw4$y1T9LsE6u~{HGaAuE*Kjn3>{fB*jGTaG3@6C%J`bG1h!a&+` zq0w!g4K~x`)wb;oJihT+h-Om7jJ*HCkaU+ak-VZobq2WW?P?aJ24StnSPnGwKX*2J z{GW6-zl->1XER+pG8LP^EjIq_RpnBQqbTWe@h`s?UWeqfb%zQ)9-Yzj1{O zgg0hg)@$E+?z|P=10(7#Gyqc}&G&&lQ1w`JdH10a{GHpCDnh4y5bpIbO2=P%9&kza zU?~yg>M@8{)-fN#+6ag1=!TVMYR&}KS8M6KJGI}O!$56r^JDnFvxtGa5Fc*rW(Ch7 ziV&4w&jUXN2n+U<44|rn6X(pRjfT#XW z6Xyey=-;aFrb6~G2Ra&=s#`;jVNm>@hJGaHi8}nd_7M(2k7Ft09PcWk!4pyW0=KF% zp82VoI^?+E{E;B04N#dpUbrx<1rT_{a!i?m2?sXIJ|XKdlaAaXV~+G8E76;>BDmmP zoR=T;o4h%)JtaOpY;xW{4AaZL!`K4;?sDiHO!DZ?+PO=Rp)@}h_0d6Azq^ZS9T_6Q`H$3%L(cRd&20-eC`v0JZU$#ZRb+~rfFn*Gi35< zUWb&O?Heq-jj?A{CRcR9vi@!;p3X6Ma9ET~SJQ>uLTLJL2B#MyY~ zd~T7!X`o^@eBJB5w^31(rbEIzf#OK>fvd@fm$+z>!ZsJLdh|9?WMBH=4)f}A{!J~- zHhYHz^u}g@6JNGOG1zcYKute)vAwM`u&eaD&dq+v)P9NUx@B)A9SDfLBo%@bM6{3x zYJNUt+h{c_tUtIlt3~+L2;QI~wci4!Qyvv&{b`S(vUEW$lb97SX43iM1RO?;n&3R- z(!@Pqavm|LW&{3~Q-@^wmd`CsZEdUyE+xleYFoKfz6Qa5%Ks^x z&uTY*miJ@HSTy!KNXoBbY#XfeAAhL<=0n$T^yrWLYC%Io1PZLnek6f2i+Y9FTAoyj zeXC(>Kr!~+^5W2QZ~*GxI{bp$kWUy`Q24Cpg3J&zJ>q7xW5RBz@I|;_zld$z08Pp7 z0`-7aY&i(|2^f-FObEajK5^`glCk0^S~6!^l3R{Gim6U^PA?FDH4_UnUM>TNG4;c> zp5AU(e!r1m{$~F}4K%Y&k9M3_RRBjf5<)@_$1VosS2#g~BPk@suW9E+lR4!k5?J_q zJ0Mix8P#V^wntV%If-rM2p=QWfs+~*Ih!YwKWO5_3Linm;YvN`-VS`1Zdy5pCStyh zcuA!AqdI$HTl>|&^!asqcL_TIr%pKv^J}O+7sq?*0yWzCu$m>aS7X^XH$YLzsjZ>v z9xNK1vs9O1-gy!0PZT>WgLxYG3-C97It#uKJ34W+=`A~4nv3VG+`?{A(-rG zHpJFfU`5sf%q{I-VJwnnF+Bp-6&w zvE3Vkc`ZJ<*Wvqu!cuS?H;>DwVi*R*n152%eR7}VZVcMG2@QYj1$N^$wXWlgBQkj9 z>&}tD+b3#Z7vrVyUsFlUSt2S>tK1A7G@)P7l zBaP@5OFU*gB)@z#%y|Q|bwv0BP|c@V$FeJ%R&}Zht zdPVeZ%@jv%{*!C&z30D}(X}n<5Tdo?>Z4EYlu04BeQ*egt%UD^8e_5Zh&FFpj0w9< z-Q1QUYK4*Gf=RN<+Kg{xBV7)_>7Z_^?nY=}V-VvduAJ&XrORM?l|9w0d7d!*iuXrARzMJ%8q{0$XDM9ZJaL^wEL7rX7AO~;niiM z#yMp|b@cWe`xaV(MYUiB$!hZX^^^H1W1A#1_OCAt zP;I3h(ul=F9?Au;Q62PrEpc`$W@zv37DAr7HTUg@t6!=?9&$Z!oil$8%( zy=3o<7W?F;z0qYB1z*i%Ttq8@YuYo5U929VfhSrUQmzlld|I(-gKXS7H;@)|l$c=8 zob^KdN=xQIEBSCAev4K$C^Ca2t<>%pcq>d=U>SJ(P~z1zSTL#YoH_d)Z2kaplfHHKu_6fYzISbU#e97+Q&lkCekxtprGPW*9kM|3`=5W zL0Il9wAs$@J@oaM@wB+Vpe!Scts!-ov-nzc8e$sMC{=lEn-e3lNW}TJT|*zyR%7Q| z-e7^!DSE`_#%mh>E0&5wE#YizPfH0gwqc^DW!n`Iv(sdp1K;Xed-t{TzMT_4qAzk%>%-R*7QV?zg9GhdSNb~q zs`?t+yTNJchMWc*^PDGCV~j+pbniQy#~id3=I^!c3ojG>ZIUW z@is7fT+flr$b1_9@{l94dQva*CbnTmlXhXn@!m7#*Z%7&lj38#b^Q^?cc)g)>~@t z*+NJ6&tZaDdw51IK(A~sIlwC)6{ww6%xyn3ot~wj{TN4#h~GcJpF6@njMwzNyvdMcl|pGqKHIZW$0g_OX?roH5a!FbT0 zQsnOoXJ1!h-G*A2ic2O{?GxC3oVB){dQ`h!>C3k|A3sjRFJV{Zx4*CQf$mQmCJ!A@ z2b2(Rx?56Tqu5Ii2!fnar+M8e;9&XsX_nyUN!fLS#MaE)s_An<1}C)D#NqRN+%%yN zv+q-y1zO#P0#o_JyRBzcwif@*?N$tcs*&rAif5NFknmdBrE9<2@oq_kRj8g%DWfs> zZvM;z;=gR$cYB-G>gcP^65JnUQ$s6Hmt;2dviqVu$mR4ABENQcZ zq5z!z|G;sxNPeMAcKPWoUMq+Nn$UG7QBuF7Fcs%N)m$_cqGJ0&rp214Pw=S3BDep; z!`W@#D1d>yk+7E?kO=*I1)$K*1iR28z5FB_{K26A?;A2NLX>+TCTBZcW?x~h2fitd zs<{C91;8y?K^#ZC&cq7PcWhn#Wnl;~G+F~nuZ+>rE zjTEJmfbIS7ly$Y$XAmjzE6p~A=r-)D^p#t25C6!u5Rv~|-=pI*nUM>=YOn&kxtg}U zA;q}geE~T`M$c&g+0T69{dUP=`h5cf`q(0fBg!tSTGBB6E=iKA1)!|*BO)x}gaw;_ zhqm)T)7iI;?y7!PzZT#IuN+AKe5ovcpH3!x4m=Sm;$YumqO4EC5{bCU} zCEWx4+}QqA28P6QdP8~c%}+y1PoHe%NB!f64^fsh0JUs24%%(C5{&k;D)#UZOv#$n z@I1E%?P9n2-d{NWej@gR<_Lg_B`x(Utho>D2m^Vv!EU6!DRFP$u>HB~$YZzl2~vJ& z9{)FBb$Ves(H}xpH?t5H<4j|3%qHgU-G?e%L zFMJkEGj|R}fX2gBhncP8$+i(}qoQM@S+SCTX*_Hjn4Ta!)xtrTFNHUK?@YVL$H%7= zqse;PRVJQ74}9<#5fTMOWIT{em>8Ylw5(jDJDw!HH<+_cQ>M~0-yoh$hwxSjSi67d zOL{Nv%4_Da1IDBJd~xc=tD1Jo)yeegwZz5Aj!}P+ynv{$%<{jt33dW9Lu3GRUXNyk zc=^nVo_UF&hAzz8igr3-*RjkG&~|&R-0VENv=dud-_GF!6IRn}y!$Xd&?>M^RugOD zW~#(>tVA|uCx6P?jvWP94_s&w(9tgQ^ZjpewUGQ@Rt@y?dnY-o(o(E0ZQou0t(lNN zRLwc~+1|WjNS4vl<*t!I8hkf?er+0~y2x+cl)d>w>n6kbC6F+e%zbMXPCoq8Z_MI+ ztc6i~y;k;B2i$0Ab!?%40FVF4PyDS-l{I&@YakLV*!pG|<%DNc2B)qz%Uyt@*nA2N z^v1;#0Qn#$N};>0YW(Bs#j#0Na!PYvyMdBJl`2YZ3nBcY?S<^bI_j zP^4*$yhHx&4gZlSK=D2$-v0#Yem`SI+1Dk*EPx*-5Wv+E^(NRt_RYIu8dOyk`M{8l zib9VgA~Mh*c-G!y(yz2ScM*A|&Xk2d>!7;R=;!ok9>W3}?dXF@2P)=jnx@*ns=bl%KyEG1cqwFqaz`pd1RDki8IW6h)QD0tMGr-EJbs$w2 zzm`&LwJza%{J1apJrYbO_#NQ6wpV2=cSf1Dy9#yR z?=AUDGb4!*LJO5y$zW&?%s0pkzb$7STbD+HsV&T_>gw{ zF_xP^#qI1GA)Wz?zdYT@*JC1@ME9?MbNb&Gp{hy=p5;t-MlNg98%Pv}JlZ2aN{JJX zmxn|q69EdaW{HyA^Nb+GC9c7oY*TE*E6>hX%yx^}o@8T(kbtcq;@ODuo^ie6BR&xyNzc_16OZE*8UNjDme zeyG9lW6v{{j`cdE9OcXI{G(ei>{~0j%gB74i$V0jMs)!~f-NRIM`H%Wh^1%Oa#w^;+= z$c=&WEx67Vpqw2{(C0*tW&6u?Ra~8GbxO{-Th>_4aN-AMZ?{&yO8Ie#K&n ze6PHI%#N^xGqTif_X(eLED_lO&4#@Y{>KSPppaFId$pbwbYImr;^4;xul#RI@3$~M z(PH_xRBU{r1GaBY@1_ie9mm*40tE99a7sACoXy|ZKRw>29h;c{4|ve;0`i41E^(b% zV=onkGIN&6b7mrXn`VBYo8j&EPsvn%8&tHCrW>%MXx%LoE0N0of(C7}<-n2$@*zW! z#L=3xppFMTLr`WQqT1;fn+`%bC^1q+UDY};*6{c~DxITladR}#LFr+A10Oyi;fLB? z1K-01omwY&nuPanF0DeHOtj@^^!f683ww*RtxXB*MT@6z8UO*;yZzttHYNL;gIt2LJub><4ssJ`> z!@{fD8nk9_*h&LEssee)zN!XV;l#AT0H`41tWtFPG}uZ&UZ+a1gn92%J>c;#>fW0n z67hWWmJBU_{IQYkCe)Fxy6ZPhE^Evbx~6z+uu-9nGiED13}$Bv3H!Ysl$d< zx_$4fdBIfYs|)BV@UdW9wGS@(obdQH*y<=T4WH6afj!SmY_zx(Y1&rcp55YDKgX|+ z%{8MHQfFA%E4qRN#8jDdZu;CzYoZL(X$}i}iSfp1g+0f|e3<`NjfaJ#s5=aNh5%2V z+X9H%jgMfZex4*z4iOtw&sn5fPjy_C@QLtPS@chJLzoic&_VR)6v6@CoMcPJ?cQBWWD-J z(1|rlzLx-U@1w3A1)tJ)Qqu^`|TIc4{a9`fS?j zb@&at2(BQeACHpMUgSxc3`WcV2F+af)B`wnRuv#abdh~(3Q_#oIjt*xA+AghUyVU|2 zBI9DW+Uf=;r~%?_y|KvMr@+MZLNBUL05o~C$>m^r`uDFO36kQF(pIt$|7$tM;{A0J zfB;-f{1y9-0B(gp&jm79%IqO@UWk~UCTtSZ-MPpRi%yma&HN99GH*_;>~LCU)!t5> zX;tiklkpW5*oAFyd*7Jsa~9!#7wPi}i=H6(LPZpHsRSf70JO-6$jNrXP^(e^IZPqQ z*|5CZHqU64N;=JPZ6}%wenTvVqhD~tlAdmC2rs>TRbX^F1c7S{^AOMX?UPqKLHn11 zvo;MYfCkV|5+U)ReaivwF>~1Ov9OL3#W`MCpq)SofQjAdjl8`=L0|&DLVT}Ww5Yzd zm#4PT%PKg47_=p%5wC&IVExqHB||D#kJ?MG4y8wf?@+)^+RQ%gh;L=}K&{B9u@&;t zjJQ8vY34v9O=dKG%QK#lM#ga`&&t!`2oc}d+qSB%xt6Z#g;rl$c zT4R9&(F;_Ydf}k00gxf<|76uuR2rz=WuAEU1xnO%@YwDt=ga){Y; zNebo<4_0u4o;Xf_VEU|nDE7S#7oUE~rPJcGlh5G=?NdDMMcnWW>$DA_+ z%1k99Mm^#e7rR=wll~r0MfDgRBcq%ObpI7gY5UjGcE2cRo%SvgeyUJ$xi@x4mU2}A ze#J394L-(QXx@HAp@9LM9hH9Hv(HK26Ly}GKSq1>d~1@ZAy=9aMBe!88Jh548CzNu z4YPzU^*|l8MK7tzD-n@aFA;oyN*-4&TOzSb(2NF*HrjuR z@=YafNK^atL5aUXQ2VMFduMxqV+TO9@CxL_FF^DTXXbHexro}03z5(`gHIazw5P?b zufw&+9_TUA##zp6T3&KMJ90)`B)nf;&^Onq%f`s@BcSyjvUvUZK1#26c`wLR6mE)K z(v>q5y|x!Qg?&^o`jG6kI#Ncd3b0Dt99XYYdV_bNBC0<*!gpuVG9QpC^76i4X+X#o zbKKrOeoac%Qz0ON$(aE)Q=khle7p^5#^60woXp3@kZ zQt)$yJDCNK3z5P93!5P^A|vvm6v9!z8gduVHzHsDS7LJ|Kqs`okm$NG&O&Q~MDWuW zGqL*N0B8LcgwN1PFyqO9tt2NM@waX{59zhPjK2(GXos{whuaNo2$IX zk^Ki#c*$&60E&)l&97>tdt0jYBmur9;S9H$w2?&_Tr{?hzTm^5T|-7L)f1!kCQJg< zYf0_kso%1Pga0s~fA~#FqcBV55?=)%+P<^HR#0crrBB-36@0~yt(SbN0cj+eDv+wW zu|&`{K7wn<1Rjs+0UGs2;Vx>JAValngx3sh+*mA=D^FyRSophX=p$`K@#vQ#9L(0< zg!JTCvJ<~C%1HJf87Kb1{iVB%Ex)Ap7`>!l(M5b@AmUP>6I|d)@c#YWD5ke=QcJrF z9fkYB^mb5tb`-bt2-?corRAP9w}5uyn9fX0tb}>R9fbq|fII>K!*Xcp1^GqT{OQn5^@Y69w1zK)50 zZKC47SWIwTzV3A5_JSy#1q2XSS_-Vx6t9`}L42ILJJfOIi0=JrA|Hi-7>LsmyB8Y7H-FL``dcujP zilrf@>iXLrl;}=7ws()-ga@K@+_gtMcsI=CF2qy+3w2}Q9{J)VJ;(OcPx1!08(X^G7cLz!CV@&&wGu9A$FE{#0HKE!0q@A3u{=Car#D4#z6TS);}0E69CB3 zT5+9yR3fVDK`*XV3hi8f4WO|y%~Ke>T&Gd)=i^1npfF+*u}l>E_L>;>dw>|xz-!>$ zwQ}|&w3aE_gJS=%$W91I)(TYF$jqkc5sqe6jb(Ed?Vzrp!Z$#Ulg=M4W3ngXDE4;7 zHcAgTpUxc_E@j%yKVPXE6};!)53kq5e{q$UEZLPuwa8{-iGwY?(*{o$MR*nVO277f z+4QeH(Z07XLQXjBvhFf{G*|}$L4M)KXGa9UTpj^ig`3FGi2Oo#+G1$V;kOMPR-U5A z&sBg2u9m*CZs}!QNO2l>bqm2}jOl&;0*V;jU&aOr$+97>m*nx`?rO9+H*LW;63VZ! z@Z^Rj&zns~9bJaeHS_t{1#)&ROi5-d|%)Zu7D~k!3~hkk zr(T!ttEb+}oS6+CS_!j;lq_+m!B<-{O{}aHtGfr;T-37IXs6W+kq=59ekDh@4N@`> zUTGdm1tdm*D@T9%gD(098x@DaMh$0%B_{yQbC_BP8WazJ=vfllem&uZ+s!FpZ@We! z$$bR#>f{dqoa)6#k>Y~%@?Vfq`2Q3e?n1BpC6A=dx(&!qU?KzQ*sK3=(fm8vWe-61 zGV850OtO*ddNlo*u(S5 z`h(w3x`ofrH|v*a#GdN)|#pcJM|^74F!hI`H_bf z6Aft|uEocE2lFbk5&e6$!iGvqpI?jB`I)7=?JI7&FpeCdeN*?|+KZhH&A&;CoQ+}M|UJZ@Rb$p-?Q-}Nlx=>39O{svt-9$!KUJz zRpoeN5bNQUiw~D}j}6m~%E6wMiD6niM^!}+)#7ldA$`SBg2763+k8hfRC?hP*P zB8PDKD2pN$5HySOt|zNDqC;q#<&NvySgWV&3*t9YVM>oQI4TJO+2~!DKPd#QoZ5dQ z#_LL;I`Ka#J6WB6n~Cf_7~k9?z;TtuesXzlFPFqHJ36$)9KjYiYaWvpmpv;Zv^23TLT~Wf&RCUkQQqiP9a5 z{otqEzFn|#^>Q@MlZ631?-xNuM!H$B<_1-x!^uOvvXAZ=>I@M6ofZ9^-O)*dqtz;o z%8K^AgY$B^$^9B5uIGa+5U=5DiK_3(3s@`az7(|G6TA{!r0txe`IU?(i6$fjLXLo( z>eMRez8!V(m`AWfWR${^6<6l*u-9jks20D07eb-q2Qni%8ywm!4zWJpISjV*1%7f^ z(&k?d%(ySPQkCJ?q@j<6-ShL+QG0;ssBU31ektQdqh6JcJr^DQy`JGAPtS?^ayi)S z@@PScJ3?GkuNEAo1tGxZ>I8&9NsExNf|Z5L6Pfa^GJ0P@$vUd8VF;FF9{vigdYZ1K zQ^OQ`jTs`(HBTT@$nwD!CH|4G3o`nhO{1)tqt?3=oDo)D16=TPF=5KAOc$(T=%yB_T-2> z7w~Rt!H6#kAT5M?Csc_ce@mEAgBH10gJMmyfXIGED$ujoClcXTM5uoyif(?6t0_=V z%5PB{dm8rE7LFZo!lD8hNZbsI&$rjXGQAuNS9Px?bNCbUG+qKDZk3=SoqXz( zCOIPyhqQRMb?2k*C!nOY{+YuamoD!2B!Va&k$RM!UwD_U+el`fJ#AUOio~AuQBV>Lo{TY=@HvNQYYEILCLRv zSWt}8^GsP#WVnKan16p#>&;x*ii=q$C19Bzy63<@D?N(AwOA`Hf~B36(Pctp@LUI? zJ(bIicC6d18QHa`ieiO!YD5q8d6+e1T(k97L~<&i(iTZ-W}rr4>^I4diI1St&`^C( zGie*hq)rjPa)?H5AU~xIM{rl6IE%gkVv%KsBf)y@!}I!ie+jJaMDW1eMk@*QnErAg ziw(LsQ1P9OLt*dQxQDFR5}T7L12<&i33P3e&lEvBG1;7cX&h(Yh}f&$mg?~0>t~~r zh+FsskbI3F9CQPa>&{{DuTsa2p}9=sHG<>s#%^oeh|yA*^JliM=Z@oNN~yDwO#EdN z_c-G6c2^j_C?-0ElZ{$7|IpTlGgj?c$sKqz{+4gt&yobmaYk(%gPPCEvQ@NZuCb@h zX8(M1c=SaLhqB3B%PE`NfBwML#+o^R)OyDop?YAiDdyoUKJYOVHbE1kZvNz-TPqLpwP z%Dr(c!awUaY&#my*;_r!HygdZrb67Ov%!@@=x%>4DYdclW1BzE>3-rpn&wk+R=dO& zxY~kLpYC?h)G@xp(?My#7>OB4{BFn-Fin?-jo#Pn@x<&IV^d)KWUTt!W8mMWNHe$H z8h{#%H0+ccSL5!S#>*7G$MY(9dPsdJ?%U{W2x{N22&)}OCUqA|Qb0bGMk&zB@ATdZ zb14S%QOP86L33`C_c+Ex3@;sn5brz-KwgtnSO-ZzX6hY!w&_5w^lJQTtK`}8MWXR? z$|j+ouRrrW{(!%8iooonmiZn-rWpDCaIztlHmcl+9$Uw1$+kv|H)PJ~WDE^S@8pZx z4HPv?2rRADQWdjss{2C=O1+J7)N>a=olphqp#)C+T_i&F{X)X55l5v!2k|bx!S;2` zR=iq%uj@&#H?ey4X%e|3?8P*D%)&K531E3MKd=%TlM#zp z($F@2wt=g7IU7si%O}Wa;q(=eDG+9TW4Kr|LlJJ)%?_y(V*O;dL+b)H=aJ zjsEP_5nI3g@$}PX{XBm$b3)bz<()O|1;r$*AkCi&eeJqU=CW_w@f}T5Z8+JfN(Py1WHAB#ui#`rhf;GCH-Nu=&6o?ferwH_d`zE`+T5yoGR}uHKjs z(R^qhX?;k9cccl=&BXVkv^dDQ2YDQQ0MFTQC_7gYXFL#7Qb+xQgB4Ik!B|brV14}$ zA|D!BTO~3Hr^q7oFD@_x6{FE zDcZNU3Hg*yYS?IU;8?xql;IUZdy5<~Rr^VEsxp$zlB)qIzZ=UhTf7?qHM-b9=F~vt5y8oJ1h>jq1kDTFWSQe;&-_OMs`; zreDmL7R+YZ+Cv+Q@dUg|y>W;onJyQoWj8sFy%giRaFP7KJ5^KYJO_kj zvk*wZJ90>qO8@18zQR&d_UCD5*Uj3A5Y{siF@bZ4@5__2>t`MA?2N1$3c78Et@d*^ zBVlP_%lqgv1~OKI z7c%@mKEc*M6g1M88AaYJ)7c)89nrDx_jz`_9(afkQP-G&5vkp1Se(XZao)f@RA;q5 z{v$EBAChrJOp)jLQZ7G!+$^vfr=4zID5*oE1ou1=;MI$qQTM<(j0(WJ^Y)XRu1w{~ z%yJ+-Su8)(UHtq;?^xXUNTa5VW0yjWb@*2n3Zjw6B={aN&s1vKeCu({MUi3BnyX~D z?b*6hGuu6)ZAA76zP0)%CB8=`f*DIsBV!7a|IA87IfzGN zk?)(5R!)WHW0GPr-e@vy-OuE%9w*z?e8`G#XT@3M{1AZx7Ra-h+(Mc{6#X(O_x`UD z79vC(qwAVh@8zR^Rf}#RfQHzRxD}|g=oMBNa++-k%Wx&dAu=I0FAB8+>N$}4xe9T; z_BVRDuzak*0in*hdPP_eo=)Hxik-o{XFW1E-I##8WI|9tXhY2!hl486iqqqleWp}c zK7A(W6CAT_Ks@@3HYHL5f^SARygG(s5xCi+2}ka^{CO!kx|UTJ*PDC;4qOyUUc`8L zO_dXy$8*5#;3RmXh(QtA??l_(EDqWkoqWrb0jH@Dz>>OF*^t*ibI_G4+ba3YrpxmQ zZ0ovRQwOoon3$&h6>K}8NTWOs!{C+Wpm z$zT~A9n+g=oC|Liw}-gG@`e)>@T?B|&+goZq_A-|r`EyQPeZSZyO=RTkHt1>}1WNUMaih5I(3{6Zj zadB}|JVmLr&q&;dF8#LePa}yldk(VuSEB^0S5axc3%&i-?OCN#WW4tlR)2pcRFmm+ ztUD}>nRaLe)BHUv7o?eDhH7Eek|oVWvyDKw=2aA$*|R10FgN7DOB0ZKRTiv8G7XK&ZIDt2vv>ZMJ6 zwH!CBZ;G*65A$z9FPHF2*(=PyUU`J~|M068#cxxdS_baZu6=0W&js&rbSoaGi?~L= ziA7~)Wo>yUD;t~UvuCe)BiiQxnI8AW%RBZ!g&@o^xH<&q^M0X1p~3##r5P$`k+6)5 z^UwD8uN$P!oAPCw&izSfxvBIm%ocmq+1aVe;P7dPW-eB#$ZP$Rt*iHBL}ibYeUd7Z zhGw}e5`?GPa8-sFC+TO#ycMJp#w-@9mZL@0tsa*geISFityN7Re!o~PY6s&_w=@A4 zTwDne@LAU|q4epn72eD@THfXLD;6n+DKq-~#xZc~I(OY5T-60*C!FMew9Rp4}Yfl%Zi^nTY9NncMJ5NbkoG3|j8_*uF>BnDZ`4dFhE zuUPd}dxUw+xgh009?KL`$k#WsOCahd75(rRC{(i%!kN`;{ycrob<=3maf3`SHu%N@ zt3w527z?#~quSt8Xm8}8>JP)4mqSW46e8>L&L~#8FGfB%PO-QO--A``Mx}akrgZwRKs+VG%~d%egPt`xgk6&?52zy@j{GwDi5_IgI_=&$>j$py}vGx2)kt$_&7 zBb$!H41G)v7eABr`;}xWcfY)dWQ{?mWCS#^$LQz%LF;TU4~XnafW} zrF#$G@6w30jI7^}1H!_AKJCdkzxmp}Qf`E58=K6wi=F2cdz*fHW1_6k{pP5~2 z#9@&g`I7u3zLq9jj?#9`j4^||AY;w5LfUmV1!I#m%;|dsq=X)kmQA^i865RZQ0yIr zr-r-$)WIU)gs#5IlSVU{mN0go-y;RPn}kzHJkExJTE8Ju-fxWmQy8kNtkw0!P*k#{ z!8y@wVkE=j?G zMo#`YK7j2~>5YSV-o=kFr`(l}YkwTfS8V^UzxsIL-|<&ZyL}Lu6ihJmLWqEX#2p#| z`6Bi(^&$e~m+8!ooK*+ONa8~~&Ez^bjnFm$8iN0G46fVf&qMY$4(Gw1E^*h$eb%)c zR_+@3cFh1gEZaIU|b?iHPDA*JSgl_%g&e zW41gJw;^T5qNVhN?91ci92P;%Ef+ulfLYzO;JC+%?s;}?eI({VfP+$Sq4xDVdZ#~| z?FX<3PrwlpRO)_4&x0r*`|Of*lQB};E`OneyHhfxs#(>lgwg9V&uLaCjshDNp7piJ z1EC!RW5m3AFS-z_7CVa)1&uogUJY}CAr)d7lbff6Uj@Vv?rv_(M+vDDjrAZg12JK% zrV74(z^6edCgop4#a0P%?D=sZ-d?tTb1{Wqo$PEgd;Ve&^=RAubm#QscUhmHU<+yO z?m0s;mfSwKav8UY#=dtf-(4Lr8#WPJh_vgWQ|k@k`QIw58QEIPAL%#;j%Rmd4rdNz z;$Y2L{b_p;14B1BhXh*E=es}g$gIeqU7XZ*9;D&7QY}bLZ843jbk9Z$t~JPoIVXBP z0tK<@jm0NxQn;A<%SoC)wV(j%w49X#hpn z6milQlHDYN788{8Y1xV*NpDSgbZv>@*B{tndv-U=s;UIs1v~=+0$7;jH%u;bEfRw) znCC_CT!^>}{Iv;NIPuBfAWs_zAUb^hiQ!UKm@(#pOZ)#U$@HY2)78zbE~rKR>({Sq zO_!O17QSqC%-Z}%N5To2*E1I(QG6yX8GPnDE&)0{-4`8{c-iN@$f=j(-h4bQyp-{F zDvxV;2{V|M-ELq%s6>e6f+P-v4&)WTnZX*2y6@BDc_n|?9I(zy&6POWiV)rt+oVZM zqW?RY<`lgqbEHYA_;GnjiP0=UGlJ1*x?rYB-10#XrCVYjz{IyVqM;(vPFyXcl#r5R zD_9dmW;aloz&GwrQ2s;DV2JN08)l=6cNeKLnAn*0NPC&D8crWgDWiY!656YzRZM%W z7U2d+PE=Y}JBvE9LR^m{;H;d3(%W(PV`;HM@5WyiDR+@fVU7f_q%vT`eU{&Q zIjcm7d!kwUYHxCg>fPwuhD)#bC8sCkQJ*czv2cp?*D?}okUD>k+4$t4+^lndm0&u` z?R-ViaYS+zV3Y|Zzf3aE&4+&P^fSU5l9cGc#>987( zqXpZ#ong5pqqK?DnJAapJc2<&Uyt{FoSg3cq4uC*`lDr>YFp`W)A+}BO_J5xMJ_7e zs`!?p3*ZzECF&F7JqLX>|F*Dh+Imed)6RAe&0JT0;8kvQ`&t=T-~wC!puU&4N@vIFE?7a zPcfe8g-y?%m3iIUMa^S4^3&MnF;>*;Gu}B}&-gCkF@klva=3!6NH-r}%y>qSODTtM znaWfs@?W(ycrDxh;&phN9(?lmfyE3VZ) zEQsaK1WOW%|9a{q`ummhS-SqcrJK#V8GcQcnOf%ulIS!X?XCx`1un-=JIb^I2&alO z*G;Od%8Lg{mwhb7y-qt=$XNc&m9Mi@G0E4`9qugdxzWOP6})UhXuI4H zFlDweEvRBM{4Smg*j}d}7n?A{;AN_2fljR?1W|b#8z*W=97Sxd_-*JGY@RLYAC0F< zxNIa@WzXV|)pdtc30r1NETjZQqh%ew)qfpVhjo;}M~n}NF0Yh`T?=70dvovD&oX_d z^RXe&wZ7r}`DXW@BnRI|qN=_=S#fe>Fv}%VNf?>;ZH))`Nn@uLA@Tpo3xeo+gH9Vxf1Kie%q*UBX-?fw(dy?}#fh8FZ(zTim7 z&O~R@;9o9z%NdKMRMMHhxuVCAT(cMh%RJyb5I;PNJdVAqF@PTXo)mck)JID*ytR%z zFMs2ePr_to&qtF!B~4waR$m663gpCDiED?DJ6~)PNjttZkQm`ZPT{}6-cHUU4GZ*D7-OR~BcQTodt3~pT0u?Uf62q;`AyuJ zHEb(2r;}4e%&Zndd0YASi7zjC<=Fn*X4m#CDXS|tpXGxX9n!$`nNb;TZiAW)8+BpG zmK@~yM6t4Sx%EC!Ho=SnTdOtJ*L+;!>?ESD`qYm7xj@ar-Ww=u1=ISsrHM)d1Cd#` zh@8erBkixShyf*tWu0XkQS_{hTEHZ6n?F~Y9`haif;M&-H+tp$XT9m96TVZw;ePE3 z9UBCfj|Bk3kNy`s$@Fq@%j5as;bGrpj`~$C8zT$!Z2i6E%J8NkjqS6h_=m1#tjX#uonB&>mcI1CqaXrR@o=N`dbxe5H*l%1sD$ezqO^?Oc;(8WC8=uRR=hZc}3+Hv+=Qfx)U1X&@>dXnm zG4B(v0|~0|M|LvR;%Str=PKGL=0Ee*O(TG42^4hk-6E*WFRe(FZN40kv7%G)Uaw!)&ybl+ESN4YM2 zl~;()VA^5iCy5p`p*=ZsG3DTOs0}-~{_xZw3}~E-LcV%ajPaN0?&s5cWRxtNgF^s44@x1#`)dE&6=EWv3I z_x_X!!>n_p*m3(dJ*eX0ZFH>S@H*+5zoOb)StqfUcn>n@2r?yv$U#x#sE@?Zi| zF3SBF)wZF}CFtet*$pQZ@Kd$0)?k04U@gexd8P2q$j5$9tPtTH?6}$p00$xHO(wje zn6=>y#E`Xum?42boeeJuI=mjWODpN7p4v!D%;za0s3_nl`a(a?nJ_xSq|x*fKj&KF zr@IWn7|(Y2#rZAh%oK7iVLTmgyV71may5;j*_2_4qR?e)L^hC3pQk&Ky!&Q}{@MJs zTq`+g_*d(z;0}qGm;=dJcwI1#N2NHLgSCS3J)!zXJGt%o2R5xz1qN*o@hz@ufK%5E z<2<4;q@~)xq%UFbCcst2<_gJmhNE#PSvr1|~ zyVZ=XWNJKab+m>3WU1N7N=_*WPytE*_m}m>x%KWUi;nSm%#sQfxTS;r4 zxtlTqH@)quzV4S&3t)~FhGPS!a;RlVpD;te7`ajIbgX)IPMQ3*j{|aMpE_OxsOKx%)*vM=V;z#WivAGyB6x=6hhGOoskLk86H86HcvqHi2 zVB|rl2DjOp58JX3?c1x28lz7mFjj{PDuh}(sLO*pNX${?>>hwhnlru#$`u%WdXX{6 zc{!(H)&p2qL%E%L9QWnVSB~ET;fRe&RG)C6_QY{`#j29^q=kVN)AZ>$&I>=x)BZ@^ z30T1n12&_}H`CZ_-Tj|z;I03MslWe_Gc;BX;Gt=z2kbp&NFB7SCeCPGv(w?v8!u)b zpY`i*ym-M7%k1DnIHXz4pg9auCRr-?H0E=EO9&2-Db8i+56KJ z-jn@Q%se#8jr@5;yrM~Y5KkHS!Cbt4Da|bu@485^pyWUt-`Kr?&ty{!Bp8$F6*qi} zP@VM3!O{h5%$L925*tQrZEob=OtRU1r=!NKN0CfFXOy>a2>Q~)hHk@vj4z&WO7Mpv zFXmpveEp|A3c11-u!x20JjHX{F7@*d?rNEwYF9{@+@8SlexA7rCrv+wGDRGFL{1cuvew zPIhreX0g+uVngPBMGA&jj_s1i9*<&6`5H&zD%AT1E(iPOj+P3n+J@VTi7Ejnq3uL710VCx%1(g zwO|{(7v+@u9~G14wI&v_tT5pskek4Po~c`(@4S2q(D7;-Eiuqa#7ya6WL3;JI}O z1629H#sFW*a_h)zp7qb5SsGzWQYUkAdgt3RYe8|7EY+JhR**F;gWsJ2SN& zT1ZZxp@4J9uB$b{^#i1K0q%-+CLXBJWV#FF#g9WxuBFZMVsLlo;W++$eLGUV2{`UU zO?00f1e#rYxc)$e>QZh&4MPv=%a?f{_}(T^v6GI{>wmXHjLW8XvT-V&G}%o~r1&@s z*P{_vn%IWDD6YN9e#WF(n(8uH-f0;K>DH{C=$FOXzQ~959ON{0H=6L3W+0PUN$r?G zR3E-~uq5;xz?<^2pkHP+M(;qN&T%{SmmBt}eMhh=gX8|QKKb;#@B@gNk_T5l*JuAn zeQ`FGx#`t%HL|!zY`P0!(Zo45q^$P&rf=e9kE1<{D<=+#v^6Q=wwfCAfqaXUsG`oz zN{3zStj@!aHe_;uwYC+WPa3Gp&r$U$QXI=^Vtw3v3R7x{>9TqV#owRhJ+YHP>S`b- zj)I%8{_`A>Kfl6oRBN+zG;Q0K$>wNYt zM3w0U_I9dCr(&t=8+27VAC-|0z|xX?lzJM2KiOz-E9Gr%vflcbr6BJKerI+saKV;* z~3-l1Xzr zF%sF;)nkWXPw}HS!UFa~&VJ!5<7k1EWy|!jn0}X~;JgVGN^C2Qm!=uWG?Q0!3F*ND zZ-cx8xgcy(Ak(2(dH%#7^+?A2k(Ns0q7ya*vaTJ^PF0d;yg)#{|bbH`_w$T(O6H9 zJoQ!XbK44Jxo%jlyOL-9wPiRPO>@`e^vXTrp~R3BHFryLhEarD$?--o*C%z_HMSzf z?ffs3#mb5pC$a-a=x*18&9$kbVvmHr=TikG>=CQy22Jga(c{X;XM!`{-C|vj7k7iX zU-xuSv362%F(i`N2El1qqT@J%UzV=0H=nSpyXtW(1uQcUlfRTqG?)00e+?C<7w1)} zt85<6n#9o3=R^-nv}nO70h~t2gBE$J?PyMChnYAV^_s%QpINr>j_~xc8 z39)?-C(*OSokO5~Zgq>X$3s%3q7t!=5D+^Y(eOG-%G+Bj?`Ntzq(4}WiU!3K;ocu( z#JU5!J?+z(*N4KXM0#6s&Fy+@F@Ia8B1CHy7TQ~>2EbUDEhIDwlk+8XUlZ$>gh!he z9n^|J)j?TP;`{*Sj;ILf=5E5%XxkQVxU8Owx{4T$85L~11)q^9%nLo7-XOUgrnwPd zeJ88zh8x{y5$Eb-chV3Tpl(7G#o`K(EYC2&eb-gInwm@-eIvJcsMD_fP zWL-6<;@k99<}AGk#LFn*w|he@$GK&=aRMdUADg5A8VnW=JI!hHc!e+|m=tx_HHSaI zk;O?5v_2boJ2hocJ*t$a<8T^rhH?8Itrq$#Fgdl92ukmkw^gpJtf;%YAG9njFFTT7 z`4IJlJu`+vMQc9fUHpl4uubzJyMfxC=K)3A{Y!{WPv+NK7Ka)2=Yiq{i_kPD%FCwXPywofRC{WzEaih-? zs1E!3Ht}B8(Tq7JOC*z;n#8}VM6hnEcq&(Rn@c5Oy~c?brL>hD&txvwET0PwP)qs; z59q`ID1)xrdYNcwo}S{+A04C8m#QUVy2Fpwf1H4Ktk2OW{b}g{!cIda>6fo`;@=ue zt~T)4I_&;t?n+XucQHp6SHk~Ue)oU+Ul&N6Ekox06{=HLSbE*@RLtd8xpMQ?g}*06 zGeak1G?6)s7P^l-?v_t>~173xBefjEejOPMzXm)Mx8d1 zv&laLU$s9uM`+1)(fvlXkguAiBh&Kp;WHoZ9awQPQq zmh}goETgf5I3Iw-1wwQN5`Lup*!(zOZDhKkBw=~@=8t1%>=zFd>%&tW8%x(I*>xLK z4W`BP8a$%*+v@k~83iV^*=4F5kTWyl>l2M2*xG8d&Uvic`m(aPXmRAp^6Nkap@(!> zk(vY1y1+?~lhm3eodrQ{=yn!7<#Y9Y>2DjdW=l51ZJ(iDq;(*Y1>oBId_j*^eBF=g zd7UL6qBm2fX05K}ZnZwXTs|%_C)(J~@|+;wWB-b3(AaO*-9tQaWV6tbDy8eUPe7)* z#M?3@i_j|u@QPBASGyTzYUi+PGptJxVt!T-~g3A9=P4z8;uvAB*n8_~O z0}e0Hyh7iI+9ri}+Z6AehMb#18vrl)nmgcshKzV&w?==O9a%cTcJ7;s;qh>&^=W^w zcA(9#&2mv#PW(NqgE7Aym=iS76F5QHbRzRCvpJWB9Hz6iS3;uHFXO6QHi?deEeo6?NRo=6`%QZD72cQ+ae$Ubf46Agy6Q~O}3-Ok_ zZ2hvnrKgWAkcu}}`MfTE?wqHmw~4YXu^V!fqs;nDU{IVYa)8Wp54B5@WVgXs+oX3{ z5ag}^l3t4A?&=F|>rx8$*n4?5s2O@9yL`k^m3fWBh!F*L3i5~9ke{JTlx7j1LdZ2} zh}DYP8{-|xG%w<4MnQ6oqgg8!7~8C|YiOSI%zmF^ybi_-M|6cPfOZzG51)ZtzGU89 z^?}PAX|#jtGAxSR>}HE6^(IFSPpJ7MN($nMPuWnb~9(sfeOt znWBPQ25O38j;Xm9xMpZcnn1W02?3YH`Q_gG`P@I?`#I;l@8^4-_j#Y^J>dt!w4B&Z zA(|1+5n&fD<)q_nuZUl4&)tXVRaia0?I&bq1;9AQi2%*OmxZ0lW{r{}zP|F(mIYgv zx_3~n#cl%kW}ROu25v1o!_NH#gi41M{~1x=!qn?bAw;0$t+n=~hrz9J9=Vvb4txYg z( zUAyc+JeH->n4NC`t!v;U`+12B7z*`cP2dTu4`|&cF2&J80T9a(Bwve0_@Y(4S3e`H z+&qd|e-cNX{_vBMxTk#T?-Esd)DU(sPjTz@hpXQKY)@uUjb`6YkGTX9e0oW5DQG_+ z$^R?ed@6_lu`i*wOXp@uBe20oR|i)}Un%0z6^uqGz-JaXH?1!{BEg=(ACjBO!9m(C zM{m56sBhK>Z5n`ha2Y&Qq}|LG-S|_)*L;-SATU!hPPmhQf_I{P} z4H#V~nAe(r9oFdpu;%NX#c)*C%%H#IFRsDV*n&u@@Q1Z}zBCclMv!o4Ft1fge=1@-F-A0r&v4%YhO_Pf2#ZGkS4 zGw|SERQ2A9))OPqkgW*D!y;hWv-0ydZKAy;RV<+InFz`Id^zBBnoyVuOXRObb^`_i zo_aZ%5^cJVHd!D|Vv!WV#Kn=uYID{Ut}PDx#F7G0NO<`nU(dq{W6&R2&0%_FA3W=j z;T;V2+^^tjgL)Ryy%*XL{liE$^dA;q-5ekw5MyfUgexzsSojvD?cd^@Ssp;05rTM} zkUOkm?DS|s_f!S0?_S)}IlJ8#y54I|=3n?NB=39?a0d`GJUZG;EVeR|xQfzxF}9cw zVrW}qRYnuq+5)VPUik}s!dt5^i@5#bR7+t`)?CJi93Xy4b)S^}BdfBj$K5xl65I#N zj@(<7W2Q2YE+6i8GarZA74{yYA#R@qG?u0u(vUQ{^9l>AQRkw1hTQ;e`?B%2U5_PV zaB{J_QM<_z#TOX|Uu~o|Ia4b1lq&wWw6h!RKejk848ie!wH&^{XLk_R!C4QpM zP{;7}W+Jn`u9qq3l!k*c^CzR7zmVU_%I=elJ}64A`iZRLC>t3w`#hld$$5*d=r~z8 zB;O39w&t)n022~mbnfjE`cE`Mr~7(LY(qZcN0X95tfx| zm83!!z6;|Q6l~-K<}3QN^*S>QD_-`Vll(~{;ApRXU3tcCUCLudD*`om)k*r)Sk}1# z^sAF=GxxihX?CNmv4s&AgPZ+IaqS#WJa3QQe0j6?C(+CSZZLIXOlamCRXd!RuKDGu zfIjUTX37wxc)&c_M%Z8B6PSYOGdH=CFl-Zx7F5hrRd{K}wWQP5RSyT@k8pcTBAIYC zTgz^hA!(&-olfVuOW<1mZT}2E9FW_eoU2G{#rngQ!3L|DL#+Inzs!&T8Qs{e7zp+T zBe1h~Vr-P1a>oNH1+j|RCNH~1)w)$+!p+ybA{ub?(v7VemBubONGgN23mWdOAJ?hvl@q~1Q{=$*InE*nid$Q4Hqh-P2g#>Qy?APMm`l?9d5eVFP?O=u3WNU zu4`jD4$#c!zKK(Fq-A8%V@1>)*8N+S$@^<0C=m zR>AU9NtZ8q+oa41h33>tq$!;etdc`gJHI}L$scZQw74_(sJP`DIc_FBN5hX|rnz#k z;v(0MHxMF2hC224YX<=RzeT)_E%78VcQ8NZFv+?OE*FV|D@o@*)gGzpO=wTDUbf{1 z9@^|d#=Ot(DFXIA(C<)O94qclI-9Udu5$h(a{j%!$U2!YgQ>b&$U=@>U|R8RSbq+P|0xvoLgiQ2MY-?+*F$&eKrm*f=>yzs@)6` z@J89LxWa1$+ag#O9(`PV5h?RJOVJvkhN5+TV|YkTHz=D_3)Yj}omQre!bHjL4So0C z+EaQ@YUG?z;m*GSc?ogV4@4YH$y!Z<<^5dxvGY!wZeU>`$r+$}px552%ozfhjoj4H zPUYJd_s9IBrO_gC9JzkwJ0<7*pBM~fP>z?6Rj3|{ca literal 0 HcmV?d00001 diff --git a/figures/screenshot-20210521-110433.png b/figures/screenshot-20210521-110433.png new file mode 100644 index 0000000000000000000000000000000000000000..88bee3c36a129322c1b5f969ed57258448905801 GIT binary patch literal 71270 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