• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/dms_continue_condition_manager.h"
17 
18 #include "ability_manager_client.h"
19 #include "datashare_manager.h"
20 #include "dtbschedmgr_log.h"
21 #include "mission_info.h"
22 #include "mission/bluetooth_state_adapter.h"
23 #include "mission/dsched_sync_e2e.h"
24 #include "mission/wifi_state_adapter.h"
25 #include "multi_user_manager.h"
26 
27 
28 namespace OHOS {
29 namespace DistributedSchedule {
30 namespace {
31 const std::string TAG = "DmsContinueConditionMgr";
32 constexpr int32_t GET_MAX_MISSIONS = 50;
33 constexpr int32_t CONDITION_INVALID_MISSION_ID = -1;
34 }
35 
36 IMPLEMENT_SINGLE_INSTANCE(DmsContinueConditionMgr);
37 
Init()38 void DmsContinueConditionMgr::Init()
39 {
40     InitConditionFuncs();
41     InitSystemCondition();
42     InitMissionCondition();
43 }
44 
UnInit()45 void DmsContinueConditionMgr::UnInit()
46 {
47     std::lock_guard<std::mutex> missionlock(missionMutex_);
48     missionMap_.clear();
49 }
50 
InitConditionFuncs()51 void DmsContinueConditionMgr::InitConditionFuncs()
52 {
53     sysFuncMap_[SYS_EVENT_CONTINUE_SWITCH] = &DmsContinueConditionMgr::SetIsContinueSwitchOn;
54     sysFuncMap_[SYS_EVENT_WIFI] = &DmsContinueConditionMgr::SetIsWifiActive;
55     sysFuncMap_[SYS_EVENT_BLUETOOTH] = &DmsContinueConditionMgr::SetIsBtActive;
56     sysFuncMap_[SYS_EVENT_SCREEN_LOCK] = &DmsContinueConditionMgr::SetIsScreenLocked;
57 
58     missionFuncMap_[MISSION_EVENT_FOCUSED] = &DmsContinueConditionMgr::OnMissionFocused;
59     missionFuncMap_[MISSION_EVENT_UNFOCUSED] = &DmsContinueConditionMgr::OnMissionUnfocused;
60     missionFuncMap_[MISSION_EVENT_DESTORYED] = &DmsContinueConditionMgr::OnMissionDestory;
61     missionFuncMap_[MISSION_EVENT_ACTIVE] = &DmsContinueConditionMgr::OnMissionActive;
62     missionFuncMap_[MISSION_EVENT_INACTIVE] = &DmsContinueConditionMgr::OnMissionInactive;
63 
64     conditionFuncMap_[MISSION_EVENT_FOCUSED] = &DmsContinueConditionMgr::CheckSendFocusedCondition;
65     conditionFuncMap_[MISSION_EVENT_UNFOCUSED] = &DmsContinueConditionMgr::CheckSendUnfocusedCondition;
66     conditionFuncMap_[MISSION_EVENT_DESTORYED] = &DmsContinueConditionMgr::CheckSendUnfocusedCondition;
67     conditionFuncMap_[MISSION_EVENT_ACTIVE] = &DmsContinueConditionMgr::CheckSendActiveCondition;
68     conditionFuncMap_[MISSION_EVENT_INACTIVE] = &DmsContinueConditionMgr::CheckSendInactiveCondition;
69     conditionFuncMap_[MISSION_EVENT_TIMEOUT] = &DmsContinueConditionMgr::CheckSendUnfocusedCondition;
70     conditionFuncMap_[MISSION_EVENT_MMI] = &DmsContinueConditionMgr::CheckSendFocusedCondition;
71 }
72 
InitSystemCondition()73 void DmsContinueConditionMgr::InitSystemCondition()
74 {
75     isCfgDevice_ = !DmsKvSyncE2E::GetInstance()->CheckCtrlRule();
76     isSwitchOn_ = DataShareManager::GetInstance().IsCurrentContinueSwitchOn();
77     isWifiActive_ = WifiStateAdapter::GetInstance().IsWifiActive();
78 #ifdef DMS_CHECK_BLUETOOTH
79     isBtActive_ = BluetoothStateAdapter::GetInstance().IsBluetoothActive();
80 #endif
81 
82     HILOGI("end. cfg %{public}d, switch: %{public}d, wifi: %{public}d, bt: %{public}d",
83         isCfgDevice_.load(), isSwitchOn_.load(), isWifiActive_.load(), isBtActive_.load());
84 }
85 
InitMissionCondition()86 void DmsContinueConditionMgr::InitMissionCondition()
87 {
88     int32_t currentAccountId = MultiUserManager::GetInstance().GetForegroundUser();
89     InitMissionStatus(currentAccountId);
90 }
91 
UpdateSystemStatus(SysEventType type,bool value)92 int32_t DmsContinueConditionMgr::UpdateSystemStatus(SysEventType type, bool value)
93 {
94     auto iterFunc = sysFuncMap_.find(type);
95     if (iterFunc == sysFuncMap_.end()) {
96         HILOGE("invalid system status %{public}d", type);
97         return INVALID_PARAMETERS_ERR;
98     }
99 
100     auto memberFunc = iterFunc->second;
101     int32_t ret = (this->*memberFunc)(value);
102     if (ret != ERR_OK) {
103         HILOGE("update system status %{public}d failed, ret: %{public}d", type, ret);
104     }
105     return ret;
106 }
107 
SetIsContinueSwitchOn(bool isSwitchOn)108 int32_t DmsContinueConditionMgr::SetIsContinueSwitchOn(bool isSwitchOn)
109 {
110     HILOGI("isSwitchOn changed, before: %{public}d, after: %{public}d", isSwitchOn_.load(), isSwitchOn);
111     isSwitchOn_.store(isSwitchOn);
112     return ERR_OK;
113 }
114 
SetIsWifiActive(bool isWifiActive)115 int32_t DmsContinueConditionMgr::SetIsWifiActive(bool isWifiActive)
116 {
117     HILOGI("isWifiActive changed, before: %{public}d, after: %{public}d", isWifiActive_.load(), isWifiActive);
118     isWifiActive_.store(isWifiActive);
119     return ERR_OK;
120 }
121 
SetIsBtActive(bool isBtActive)122 int32_t DmsContinueConditionMgr::SetIsBtActive(bool isBtActive)
123 {
124     HILOGI("isBtActive changed, before: %{public}d, after: %{public}d", isBtActive_.load(), isBtActive);
125     isBtActive_.store(isBtActive);
126     return ERR_OK;
127 }
128 
SetIsScreenLocked(bool isScreenLocked)129 int32_t DmsContinueConditionMgr::SetIsScreenLocked(bool isScreenLocked)
130 {
131     HILOGI("isScreenLocked changed, before: %{public}d, after: %{public}d", isScreenLocked_.load(), isScreenLocked);
132     isScreenLocked_.store(isScreenLocked);
133     return ERR_OK;
134 }
135 
OnUserSwitched(int32_t accountId)136 void DmsContinueConditionMgr::OnUserSwitched(int32_t accountId)
137 {
138     HILOGI("OnUserSwitched init mission status for new user: %{public}d", accountId);
139     InitMissionStatus(accountId);
140     return;
141 }
142 
OnUserRemoved(int32_t accountId)143 void DmsContinueConditionMgr::OnUserRemoved(int32_t accountId)
144 {
145     HILOGI("OnUserRemoved delete mission status for user: %{public}d", accountId);
146     std::lock_guard<std::mutex> missionlock(missionMutex_);
147     if (missionMap_.empty()) {
148         return;
149     }
150     auto it = missionMap_.find(accountId);
151     if (it != missionMap_.end()) {
152         missionMap_.erase(it);
153     }
154     return;
155 }
156 
UpdateMissionStatus(int32_t accountId,int32_t missionId,MissionEventType type)157 int32_t DmsContinueConditionMgr::UpdateMissionStatus(int32_t accountId, int32_t missionId, MissionEventType type)
158 {
159     HILOGI("user %{public}d, missionId %{public}d, type %{public}s", accountId, missionId,
160         TypeEnumToString(type).c_str());
161     {
162         std::lock_guard<std::mutex> missionlock(missionMutex_);
163         auto missionList = missionMap_.find(accountId);
164         if (missionList == missionMap_.end()) {
165             HILOGW("no mission status records for user %{public}d", accountId);
166             return INVALID_PARAMETERS_ERR;
167         }
168     }
169 
170     auto iterFunc = missionFuncMap_.find(type);
171     if (iterFunc == missionFuncMap_.end()) {
172         HILOGE("invalid mission status %{public}d", type);
173         return INVALID_PARAMETERS_ERR;
174     }
175 
176     auto memberFunc = iterFunc->second;
177     int32_t ret = (this->*memberFunc)(accountId, missionId);
178     if (ret != ERR_OK) {
179         HILOGE("update mission status %{public}s failed, accountId %{public}d, missionId %{public}d, ret: %{public}d",
180             TypeEnumToString(type).c_str(), accountId, missionId, ret);
181     }
182     return ret;
183 }
184 
InitMissionStatus(int32_t accountId)185 void DmsContinueConditionMgr::InitMissionStatus(int32_t accountId)
186 {
187     HILOGI("InitMissionStatus for user %{public}d start", accountId);
188     std::vector<AAFwk::MissionInfo> missions;
189     int32_t ret = GetMissionInfos(missions);
190     if (ret != ERR_OK) {
191         HILOGE("GetMissionInfos failed, ret %{public}d", ret);
192     }
193 
194     if (missions.empty()) {
195         HILOGW("no running mission under current user");
196     }
197     HILOGI("GetMissionInfos ret size %{public}zu", missions.size());
198 
199     int32_t focusedMissionId = GetCurrentMissionId();
200     {
201         std::lock_guard<std::mutex> missionlock(missionMutex_);
202         if (!missionMap_.empty() && missionMap_.find(accountId) != missionMap_.end()) {
203             HILOGI("mission list for user %{public}d has already been inited", accountId);
204             return;
205         }
206 
207         std::map<int32_t, MissionStatus> missionList;
208         for (auto mission : missions) {
209             MissionStatus status;
210             ConvertToMissionStatus(mission, status);
211             HILOGD("mission %{public}d status: %{public}s", mission.id, status.ToString().c_str());
212             missionList[mission.id] = status;
213         }
214 
215         if (focusedMissionId > 0 && missionList.count(focusedMissionId) != 0) {
216             missionList[focusedMissionId].isFocused = true;
217         }
218         missionMap_[accountId] = missionList;
219     }
220 
221     HILOGI("InitMissionStatus for user %{public}d end", accountId);
222     return;
223 }
224 
GetMissionInfos(std::vector<AAFwk::MissionInfo> & missions)225 int32_t DmsContinueConditionMgr::GetMissionInfos(std::vector<AAFwk::MissionInfo>& missions)
226 {
227     auto abilityMgr = AAFwk::AbilityManagerClient::GetInstance();
228     if (abilityMgr == nullptr) {
229         HILOGE("abilityMgr is null");
230         return INVALID_PARAMETERS_ERR;
231     }
232     int32_t ret = abilityMgr->Connect();
233     if (ret != ERR_OK) {
234         HILOGE("get ability server failed, ret = %{public}d", ret);
235         return ret;
236     }
237     return abilityMgr->GetMissionInfos("", GET_MAX_MISSIONS, missions);
238 }
239 
OnMissionFocused(int32_t accountId,int32_t missionId)240 int32_t DmsContinueConditionMgr::OnMissionFocused(int32_t accountId, int32_t missionId)
241 {
242     HILOGI("accountId %{public}d, missionId %{public}d", accountId, missionId);
243 
244     AAFwk::MissionInfo info;
245     int32_t ret = GetMissionInfo(missionId, info);
246     {
247         std::lock_guard<std::mutex> missionlock(missionMutex_);
248         if (IsMissionStatusExistLocked(accountId, missionId)) {
249             HILOGI("found mission %{public}d, update status: isFocused", missionId);
250             CleanLastFocusedFlagLocked(accountId, missionId);
251             missionMap_[accountId][missionId].isFocused = true;
252             return ERR_OK;
253         }
254 
255         if (ret != ERR_OK) {
256             HILOGE("GetMissionInfo failed, missionId %{public}d, ret %{public}d", missionId, ret);
257             return ret;
258         }
259 
260         HILOGI("new mission %{public}d focused, add record", missionId);
261         MissionStatus status;
262         ConvertToMissionStatus(info, status);
263         CleanLastFocusedFlagLocked(accountId, missionId);
264         status.isFocused = true;
265 
266         HILOGD("mission %{public}d status: %{public}s", missionId, status.ToString().c_str());
267         missionMap_[accountId][missionId] = status;
268     }
269     return ERR_OK;
270 }
271 
GetMissionInfo(int32_t missionId,AAFwk::MissionInfo & info)272 int32_t DmsContinueConditionMgr::GetMissionInfo(int32_t missionId, AAFwk::MissionInfo& info)
273 {
274     auto abilityMgr = AAFwk::AbilityManagerClient::GetInstance();
275     if (abilityMgr == nullptr) {
276         HILOGE("abilityMgr is null");
277         return INVALID_PARAMETERS_ERR;
278     }
279     int32_t ret = abilityMgr->Connect();
280     if (ret != ERR_OK) {
281         HILOGE("get ability server failed, ret = %{public}d", ret);
282         return ret;
283     }
284     return abilityMgr->GetMissionInfo("", missionId, info);
285 }
286 
ConvertToMissionStatus(const AAFwk::MissionInfo & missionInfo,MissionStatus & status)287 void DmsContinueConditionMgr::ConvertToMissionStatus(const AAFwk::MissionInfo& missionInfo,
288     MissionStatus& status)
289 {
290     status.missionId = missionInfo.id;
291     status.bundleName = missionInfo.want.GetElement().GetBundleName();
292     status.moduleName = missionInfo.want.GetElement().GetModuleName();
293     status.abilityName = missionInfo.want.GetElement().GetAbilityName();
294     status.isContinuable = missionInfo.continuable;
295     status.launchFlag = missionInfo.want.GetFlags();
296     status.continueState = missionInfo.continueState;
297     return;
298 }
299 
CleanLastFocusedFlagLocked(int32_t accountId,int32_t missionId)300 void DmsContinueConditionMgr::CleanLastFocusedFlagLocked(int32_t accountId, int32_t missionId)
301 {
302     for (auto& record : missionMap_[accountId]) {
303         if (record.first != missionId && record.second.isFocused) {
304             HILOGI("new mission %{public}d focused, mission %{public}d lose focus", missionId, record.first);
305             record.second.isFocused = false;
306         }
307     }
308     return;
309 }
310 
OnMissionUnfocused(int32_t accountId,int32_t missionId)311 int32_t DmsContinueConditionMgr::OnMissionUnfocused(int32_t accountId, int32_t missionId)
312 {
313     HILOGI("accountId %{public}d, missionId %{public}d", accountId, missionId);
314 
315     std::lock_guard<std::mutex> missionlock(missionMutex_);
316     if (!IsMissionStatusExistLocked(accountId, missionId)) {
317         HILOGW("mission %{public}d under user %{public}d not exist", missionId, accountId);
318         return CONDITION_INVALID_MISSION_ID;
319     }
320     missionMap_[accountId][missionId].isFocused = false;
321     lastFocusMission_.first = accountId;
322     lastFocusMission_.second = missionMap_[accountId][missionId];
323     HILOGI("missionMap update finished! status: %{public}s", missionMap_[accountId][missionId].ToString().c_str());
324     return ERR_OK;
325 }
326 
OnMissionDestory(int32_t accountId,int32_t missionId)327 int32_t DmsContinueConditionMgr::OnMissionDestory(int32_t accountId, int32_t missionId)
328 {
329     HILOGI("accountId %{public}d, missionId %{public}d", accountId, missionId);
330 
331     std::lock_guard<std::mutex> missionlock(missionMutex_);
332     if (!IsMissionStatusExistLocked(accountId, missionId)) {
333         HILOGW("mission %{public}d under user %{public}d not exist", missionId, accountId);
334         return ERR_OK;
335     }
336     missionMap_[accountId].erase(missionId);
337     HILOGI("missionMap update finished!");
338     return ERR_OK;
339 }
340 
OnMissionActive(int32_t accountId,int32_t missionId)341 int32_t DmsContinueConditionMgr::OnMissionActive(int32_t accountId, int32_t missionId)
342 {
343     HILOGI("accountId %{public}d, missionId %{public}d", accountId, missionId);
344 
345     std::lock_guard<std::mutex> missionlock(missionMutex_);
346     if (!IsMissionStatusExistLocked(accountId, missionId)) {
347         HILOGW("mission %{public}d under user %{public}d not exist", missionId, accountId);
348         return ERR_OK;
349     }
350     missionMap_[accountId][missionId].continueState = AAFwk::ContinueState::CONTINUESTATE_ACTIVE;
351     HILOGI("missionMap update finished! status: %{public}s", missionMap_[accountId][missionId].ToString().c_str());
352     return ERR_OK;
353 }
354 
OnMissionInactive(int32_t accountId,int32_t missionId)355 int32_t DmsContinueConditionMgr::OnMissionInactive(int32_t accountId, int32_t missionId)
356 {
357     HILOGI("accountId %{public}d, missionId %{public}d", accountId, missionId);
358 
359     std::lock_guard<std::mutex> missionlock(missionMutex_);
360     if (!IsMissionStatusExistLocked(accountId, missionId)) {
361         HILOGW("mission %{public}d under user %{public}d not exist", missionId, accountId);
362         return ERR_OK;
363     }
364     missionMap_[accountId][missionId].continueState = AAFwk::ContinueState::CONTINUESTATE_INACTIVE;
365     HILOGI("missionMap update finished! status: %{public}s", missionMap_[accountId][missionId].ToString().c_str());
366     return ERR_OK;
367 }
368 
CheckSystemSendCondition()369 bool DmsContinueConditionMgr::CheckSystemSendCondition()
370 {
371     HILOGI("CheckSystemSendCondition start. cfg %{public}d, switch: %{public}d, wifi: %{public}d, bt: %{public}d",
372         isCfgDevice_.load(), isSwitchOn_.load(), isWifiActive_.load(), isBtActive_.load());
373 
374     std::string reason = "";
375     do {
376         if (isCfgDevice_) {
377             reason = "CFG_DEVICE";
378             break;
379         }
380         if (!isSwitchOn_) {
381             reason = "CONTINUE_SWITCH_OFF";
382             break;
383         }
384 #ifdef DMS_CHECK_WIFI
385         if (!isWifiActive_) {
386             reason = "WIFI_INACTIVE";
387             break;
388         }
389 #endif
390 #ifdef DMS_CHECK_BLUETOOTH
391         if (!isBtActive_) {
392             reason = "BLUETOOTH_INACTIVE";
393             break;
394         }
395 #endif
396         HILOGI("PASS");
397         return true;
398     } while (0);
399 
400     HILOGE("FAILED, Reason: %{public}s", reason.c_str());
401     return false;
402 }
403 
CheckMissionSendCondition(const MissionStatus & status,MissionEventType type)404 bool DmsContinueConditionMgr::CheckMissionSendCondition(const MissionStatus& status, MissionEventType type)
405 {
406     HILOGI("missionId %{public}d, type %{public}s", status.missionId, TypeEnumToString(type).c_str());
407 
408     auto iterFunc = conditionFuncMap_.find(type);
409     if (iterFunc == conditionFuncMap_.end()) {
410         HILOGE("invalid system status %{public}d", type);
411         return false;
412     }
413 
414     auto memberFunc = iterFunc->second;
415     return (this->*memberFunc)(status);
416 }
417 
CheckSendFocusedCondition(const MissionStatus & status)418 bool DmsContinueConditionMgr::CheckSendFocusedCondition(const MissionStatus& status)
419 {
420     HILOGI("missionId %{public}d", status.missionId);
421 
422     std::string reason = "";
423     do {
424         if (!status.isContinuable) {
425             reason = "NOT_CONTINUABLE";
426             break;
427         }
428         if (status.continueState != AAFwk::ContinueState::CONTINUESTATE_ACTIVE) {
429             reason = "CONTINUE_STATE_INACTIVE";
430             break;
431         }
432         if (!DmsKvSyncE2E::GetInstance()->CheckBundleContinueConfig(status.bundleName)) {
433             reason = "BUNDLE_NOT_ALLOWED_IN_CFG";
434             break;
435         }
436         HILOGI("PASS");
437         return true;
438     } while (0);
439 
440     HILOGE("FAILED, Reason: %{public}s", reason.c_str());
441     return false;
442 }
443 
CheckSendUnfocusedCondition(const MissionStatus & status)444 bool DmsContinueConditionMgr::CheckSendUnfocusedCondition(const MissionStatus& status)
445 {
446     HILOGI("missionId %{public}d", status.missionId);
447 
448     std::string reason = "";
449     do {
450         if (!status.isFocused) {
451             reason = "NOT_FOCUSED";
452             break;
453         }
454         if (!status.isContinuable) {
455             reason = "NOT_CONTINUABLE";
456             break;
457         }
458         if (status.continueState != AAFwk::ContinueState::CONTINUESTATE_ACTIVE) {
459             reason = "CONTINUE_STATE_INACTIVE";
460             break;
461         }
462         if (!DmsKvSyncE2E::GetInstance()->CheckBundleContinueConfig(status.bundleName)) {
463             reason = "BUNDLE_NOT_ALLOWED_IN_CFG";
464             break;
465         }
466         HILOGI("PASS");
467         return true;
468     } while (0);
469 
470     HILOGE("FAILED, Reason: %{public}s", reason.c_str());
471     return false;
472 }
473 
CheckSendActiveCondition(const MissionStatus & status)474 bool DmsContinueConditionMgr::CheckSendActiveCondition(const MissionStatus& status)
475 {
476     HILOGI("missionId %{public}d", status.missionId);
477 
478     std::string reason = "";
479     do {
480         if (!status.isFocused) {
481             reason = "NOT_FOCUSED";
482             break;
483         }
484         if (!status.isContinuable) {
485             reason = "NOT_CONTINUABLE";
486             break;
487         }
488         if (!DmsKvSyncE2E::GetInstance()->CheckBundleContinueConfig(status.bundleName)) {
489             reason = "BUNDLE_NOT_ALLOWED_IN_CFG";
490             break;
491         }
492         HILOGI("PASS");
493         return true;
494     } while (0);
495 
496     HILOGE("FAILED, Reason: %{public}s", reason.c_str());
497     return false;
498 }
499 
CheckSendInactiveCondition(const MissionStatus & status)500 bool DmsContinueConditionMgr::CheckSendInactiveCondition(const MissionStatus& status)
501 {
502     HILOGI("missionId %{public}d", status.missionId);
503 
504     std::string reason = "";
505     do {
506         if (!status.isContinuable) {
507             reason = "NOT_CONTINUABLE";
508             break;
509         }
510         if (!DmsKvSyncE2E::GetInstance()->CheckBundleContinueConfig(status.bundleName)) {
511             reason = "BUNDLE_NOT_ALLOWED_IN_CFG";
512             break;
513         }
514         HILOGI("PASS");
515         return true;
516     } while (0);
517 
518     HILOGE("FAILED, Reason: %{public}s", reason.c_str());
519     return false;
520 }
521 
GetMissionStatus(int32_t accountId,int32_t missionId,MissionStatus & status)522 int32_t DmsContinueConditionMgr::GetMissionStatus(int32_t accountId, int32_t missionId, MissionStatus& status)
523 {
524     std::lock_guard<std::mutex> missionlock(missionMutex_);
525     if (!IsMissionStatusExistLocked(accountId, missionId)) {
526         HILOGE("mission %{public}d under user %{public}d not exist", missionId, accountId);
527         return INVALID_PARAMETERS_ERR;
528     }
529 
530     status = missionMap_[accountId][missionId];
531     return ERR_OK;
532 }
533 
IsMissionStatusExistLocked(int32_t accountId,int32_t missionId)534 bool DmsContinueConditionMgr::IsMissionStatusExistLocked(int32_t accountId, int32_t missionId)
535 {
536     if (missionMap_.count(accountId) == 0 || missionMap_[accountId].count(missionId) == 0) {
537         return false;
538     }
539     return true;
540 }
541 
IsScreenLocked()542 bool DmsContinueConditionMgr::IsScreenLocked()
543 {
544     return isScreenLocked_.load();
545 }
546 
GetMissionIdByBundleName(int32_t accountId,const std::string & bundleName,int32_t & missionId)547 int32_t DmsContinueConditionMgr::GetMissionIdByBundleName(
548     int32_t accountId, const std::string& bundleName, int32_t& missionId)
549 {
550     std::lock_guard<std::mutex> missionlock(missionMutex_);
551     if (missionMap_.count(accountId) == 0) {
552         HILOGE("user %{public}d not exist!", accountId);
553         return MISSION_NOT_FOCUSED;
554     }
555 
556     for (const auto& record : missionMap_[accountId]) {
557         if (record.second.isFocused) {
558             missionId = record.first;
559             break;
560         }
561     }
562     HILOGI("GetMissionIdByBundleName current focused missionId: %{public}d", missionId);
563     MissionStatus missionStatus = missionMap_[accountId][missionId];
564     if (missionStatus.bundleName == bundleName && missionStatus.isContinuable) {
565         HILOGI("GetMissionIdByBundleName got missionId: %{public}d", missionId);
566         return ERR_OK;
567     }
568     HILOGW("GetMissionIdByBundleName current focused missionId(%{public}d) "
569         "is not belong to bundle: %{public}s; or it's isContinuable is %{public}s. "
570         "try to get last focused mission id",
571         missionId, bundleName.c_str(), missionStatus.isContinuable ? "true" : "false");
572 
573     if (lastFocusMission_.second.bundleName == bundleName && lastFocusMission_.second.isContinuable) {
574         missionId = lastFocusMission_.second.missionId;
575         HILOGI("GetMissionIdByBundleName got missionId: %{public}d", missionId);
576         return ERR_OK;
577     }
578     HILOGE("GetMissionIdByBundleName last focused missionId(%{public}d) "
579            "is not belong to bundle: %{public}s; or it's isContinuable is %{public}s.",
580            missionId, bundleName.c_str(), lastFocusMission_.second.isContinuable ? "true" : "false");
581     return MISSION_NOT_FOCUSED;
582 }
583 
GetCurrentFocusedMission(int32_t accountId)584 int32_t DmsContinueConditionMgr::GetCurrentFocusedMission(int32_t accountId)
585 {
586     int32_t missionId = CONDITION_INVALID_MISSION_ID;
587     {
588         std::lock_guard<std::mutex> missionlock(missionMutex_);
589         if (missionMap_.count(accountId) == 0) {
590             HILOGE("user %{public}d not exist!", accountId);
591             return missionId;
592         }
593         for (const auto& record : missionMap_[accountId]) {
594             if (record.second.isFocused) {
595                 missionId = record.first;
596                 break;
597             }
598         }
599     }
600     return missionId;
601 }
602 
TypeEnumToString(MissionEventType type)603 std::string DmsContinueConditionMgr::TypeEnumToString(MissionEventType type)
604 {
605     switch (type) {
606         case MISSION_EVENT_FOCUSED:
607             return "FOCUSED";
608         case MISSION_EVENT_UNFOCUSED:
609             return "UNFOCUSED";
610         case MISSION_EVENT_DESTORYED:
611             return "DESTORYED";
612         case MISSION_EVENT_ACTIVE:
613             return "ACTIVE";
614         case MISSION_EVENT_INACTIVE:
615             return "INACTIVE";
616         case MISSION_EVENT_TIMEOUT:
617             return "TIMEOUT";
618         case MISSION_EVENT_MMI:
619             return "MMI";
620         default:
621             return "UNDEFINED";
622     }
623 }
624 } // namespace DistributedSchedule
625 } // namespace OHOS
626