1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "mission/notification/dms_continue_send_strategy.h"
17
18 #include "datetime_ex.h"
19 #include "dtbschedmgr_log.h"
20 #include "mission/notification/dms_continue_send_manager.h"
21
22 namespace OHOS {
23 namespace DistributedSchedule {
24 namespace {
25 const std::string TAG = "DmsContinueSendStrategy";
26 }
27
SetStrategy(std::shared_ptr<ContinueSendStrategy> strategy)28 void ContinueSendContext::SetStrategy(std::shared_ptr<ContinueSendStrategy> strategy)
29 {
30 strategy_ = strategy;
31 }
32
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const33 int32_t ContinueSendContext::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
34 {
35 CHECK_POINTER_RETURN_VALUE(strategy_, ERR_NULL_OBJECT, "strategy_");
36 return strategy_->ExecuteSendStrategy(status, sendType);
37 }
38
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const39 int32_t SendStrategyFocused::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
40 {
41 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
42 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
43
44 sendMgr->AddMMIListener();
45 sendMgr->SendContinueBroadcastAfterDelay(status.missionId);
46
47 CHECK_POINTER_RETURN_VALUE(sendMgr->screenLockedHandler_, ERR_OK, "screenLockedHandler_");
48 sendMgr->screenLockedHandler_->ResetScreenLockedInfo();
49 sendType = BROADCAST_TYPE_APPEAR;
50 return ERR_OK;
51 }
52
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const53 int32_t SendStrategyUnfocused::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
54 {
55 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
56 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
57
58 sendMgr->RemoveMMIListener();
59 sendType = BROADCAST_TYPE_DISAPPEAR;
60
61 DMSContinueSendMgr::ScreenLockedHandler::LastUnfoInfo info = { status.missionId, GetTickCount(), status };
62 CHECK_POINTER_RETURN_VALUE(sendMgr->screenLockedHandler_, ERR_OK, "screenLockedHandler_");
63 sendMgr->screenLockedHandler_->SetScreenLockedInfo(info);
64 if (DmsContinueConditionMgr::GetInstance().IsScreenLocked()) {
65 HILOGW("already screenLocked, task abort");
66 return DMS_PERMISSION_DENIED;
67 }
68 return ERR_OK;
69 }
70
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const71 int32_t SendStrategyDestoryed::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
72 {
73 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
74 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
75
76 sendMgr->RemoveMMIListener();
77 sendType = BROADCAST_TYPE_DISAPPEAR;
78 return ERR_OK;
79 }
80
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const81 int32_t SendStrategyActive::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
82 {
83 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
84 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
85
86 sendMgr->AddMMIListener();
87 sendMgr->SendContinueBroadcastAfterDelay(status.missionId);
88 sendType = BROADCAST_TYPE_APPEAR;
89 return ERR_OK;
90 }
91
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const92 int32_t SendStrategyInactive::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
93 {
94 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
95 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
96
97 sendMgr->RemoveMMIListener();
98 sendType = BROADCAST_TYPE_DISAPPEAR;
99 if (status.missionId == sendMgr->screenLockedHandler_->GetMissionId()) {
100 sendMgr->screenLockedHandler_->SetMissionContinueStateInfo(status);
101 HILOGW("ScreenLocked MissionContinueState already refreshed.");
102 }
103 return ERR_OK;
104 }
105
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const106 int32_t SendStrategyTimeout::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
107 {
108 sendType = BROADCAST_TYPE_DISAPPEAR;
109 return ERR_OK;
110 }
111
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const112 int32_t SendStrategyMMI::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
113 {
114 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
115 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
116
117 sendType = BROADCAST_TYPE_APPEAR;
118 sendMgr->SendContinueBroadcastAfterDelay(status.missionId);
119 return ERR_OK;
120 }
121 } // namespace DistributedSchedule
122 } // namespace OHOS
123