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 HILOGD("Skip unfocused event.");
60 return SKIP_UNFOCUSED_TYPE;
61 }
62
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const63 int32_t SendStrategyBackground::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
64 {
65 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
66 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
67
68 sendType = BROADCAST_TYPE_DISAPPEAR;
69
70 DMSContinueSendMgr::ScreenLockedHandler::LastUnfoInfo info = { status.missionId, GetTickCount(), status };
71 CHECK_POINTER_RETURN_VALUE(sendMgr->screenLockedHandler_, ERR_OK, "screenLockedHandler_");
72 sendMgr->screenLockedHandler_->SetScreenLockedInfo(info);
73 if (DmsContinueConditionMgr::GetInstance().IsScreenLocked()) {
74 HILOGW("already screenLocked, task abort");
75 return DMS_PERMISSION_DENIED;
76 }
77 return ERR_OK;
78 }
79
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const80 int32_t SendStrategyDestoryed::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
81 {
82 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
83 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
84
85 sendMgr->RemoveMMIListener();
86 sendType = BROADCAST_TYPE_DISAPPEAR;
87 return ERR_OK;
88 }
89
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const90 int32_t SendStrategyActive::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
91 {
92 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
93 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
94
95 sendMgr->AddMMIListener();
96 sendMgr->SendContinueBroadcastAfterDelay(status.missionId);
97 sendType = BROADCAST_TYPE_APPEAR;
98 return ERR_OK;
99 }
100
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const101 int32_t SendStrategyInactive::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
102 {
103 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
104 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
105
106 sendMgr->RemoveMMIListener();
107 sendType = BROADCAST_TYPE_DISAPPEAR;
108 if (status.missionId == sendMgr->screenLockedHandler_->GetMissionId()) {
109 sendMgr->screenLockedHandler_->SetMissionContinueStateInfo(status);
110 HILOGW("ScreenLocked MissionContinueState already refreshed.");
111 }
112 return ERR_OK;
113 }
114
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const115 int32_t SendStrategyTimeout::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
116 {
117 sendType = BROADCAST_TYPE_DISAPPEAR;
118 return ERR_OK;
119 }
120
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const121 int32_t SendStrategyMMI::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
122 {
123 std::shared_ptr<DMSContinueSendMgr> sendMgr = dmsContinueSendMgr_.lock();
124 CHECK_POINTER_RETURN_VALUE(sendMgr, ERR_NULL_OBJECT, "dmsContinueSendMgr_");
125
126 sendType = BROADCAST_TYPE_APPEAR;
127 sendMgr->SendContinueBroadcastAfterDelay(status.missionId);
128 return ERR_OK;
129 }
130
ExecuteSendStrategy(const MissionStatus & status,uint8_t & sendType) const131 int32_t SendStrategyContinueSwitchOff::ExecuteSendStrategy(const MissionStatus& status, uint8_t &sendType) const
132 {
133 sendType = BROADCAST_TYPE_DISAPPEAR;
134 return ERR_OK;
135 }
136 } // namespace DistributedSchedule
137 } // namespace OHOS
138