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