• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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_send_manager.h"
17 
18 #include "adapter/dnetwork_adapter.h"
19 #include "adapter/mmi_adapter.h"
20 #include "datetime_ex.h"
21 #include "distributed_sched_adapter.h"
22 #include "dtbschedmgr_device_info_storage.h"
23 #include "dtbschedmgr_log.h"
24 #include "parcel_helper.h"
25 #include "softbus_adapter/softbus_adapter.h"
26 #include <sys/prctl.h>
27 
28 namespace OHOS {
29 namespace DistributedSchedule {
30 namespace {
31 constexpr int32_t INDEX_2 = 2;
32 constexpr int32_t INDEX_3 = 3;
33 constexpr int32_t INDEX_4 = 4;
34 constexpr int32_t CANCEL_FOCUSED_DELAYED = 60000;
35 constexpr int32_t SCREEN_OFF_DELAY_TIME = 10000;
36 constexpr int64_t TIME_DELAYED = 250; // determines whether normal unfocused or lockoff
37 const std::string TAG = "DMSContinueSendMgr";
38 const std::string TIMEOUT_UNFOCUSED_TASK = "timeout_unfocused_task";
39 const std::string SCREEN_OFF_UNFOCUSED_TASK = "screen_off_unfocused_task";
40 }
41 
42 IMPLEMENT_SINGLE_INSTANCE(DMSContinueSendMgr);
43 
Init()44 void DMSContinueSendMgr::Init()
45 {
46     HILOGI("Init start");
47     {
48         missionFocusedListener_ = new DistributedMissionFocusedListener();
49         int32_t ret = DistributedSchedAdapter::GetInstance().RegisterMissionListener(missionFocusedListener_);
50         if (ret != ERR_OK) {
51             HILOGE("get RegisterMissionListener failed, ret: %{public}d", ret);
52             return;
53         }
54         MMIAdapter::GetInstance().Init();
55         screenOffHandler_ = std::make_shared<ScreenOffHandler>();
56 
57         eventThread_ = std::thread(&DMSContinueSendMgr::StartEvent, this);
58         std::unique_lock<std::mutex> lock(eventMutex_);
59         eventCon_.wait(lock, [this] {
60             return eventHandler_ != nullptr;
61         });
62     }
63 
64     int32_t missionId = GetCurrentMissionId();
65     if (missionId <= 0) {
66         HILOGW("GetCurrentMissionId failed, init end. ret: %{public}d", missionId);
67         return;
68     }
69     NotifyMissionFocused(missionId, FocusedReason::INIT);
70     HILOGI("Init end");
71 }
72 
UnInit()73 void DMSContinueSendMgr::UnInit()
74 {
75     HILOGI("UnInit start");
76     MMIAdapter::GetInstance().UnInit();
77     if (eventHandler_ != nullptr) {
78         eventHandler_->GetEventRunner()->Stop();
79         eventThread_.join();
80         eventHandler_ = nullptr;
81     } else {
82         HILOGE("eventHandler_ is nullptr");
83     }
84     HILOGI("UnInit end");
85 }
86 
GetCurrentMissionId()87 int32_t DMSContinueSendMgr::GetCurrentMissionId()
88 {
89     HILOGI("GetCurrentMission begin");
90     sptr<IRemoteObject> token;
91     int ret = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility(token);
92     if (ret != ERR_OK || token == nullptr) {
93         HILOGE("GetTopAbility failed, ret: %{public}d", ret);
94         return INVALID_MISSION_ID;
95     }
96     int32_t missionId = INVALID_MISSION_ID;
97     AAFwk::AbilityManagerClient::GetInstance()->GetMissionIdByToken(token, missionId);
98     return missionId;
99 }
100 
PostUnfocusedTaskWithDelay(const int32_t missionId,UnfocusedReason reason)101 void DMSContinueSendMgr::PostUnfocusedTaskWithDelay(const int32_t missionId, UnfocusedReason reason)
102 {
103     HILOGI("called, missionId: %{public}d, reason: %{public}d", missionId, reason);
104     if (eventHandler_ == nullptr) {
105         HILOGE("eventHandler_ is nullptr");
106         return;
107     }
108     if (reason == UnfocusedReason::TIMEOUT) {
109         auto funcOut = [this, missionId]() {
110             DealUnfocusedBusiness(missionId, UnfocusedReason::TIMEOUT);
111         };
112         eventHandler_->RemoveTask(TIMEOUT_UNFOCUSED_TASK);
113         eventHandler_->PostTask(funcOut, TIMEOUT_UNFOCUSED_TASK, CANCEL_FOCUSED_DELAYED);
114     } else if (reason == UnfocusedReason::SCREENOFF) {
115         auto funcOff = [this]() {
116             SendScreenOffEvent(DMS_UNFOCUSED_TYPE);
117         };
118         eventHandler_->RemoveTask(SCREEN_OFF_UNFOCUSED_TASK);
119         eventHandler_->PostTask(funcOff, SCREEN_OFF_UNFOCUSED_TASK, SCREEN_OFF_DELAY_TIME);
120     }
121 }
122 
NotifyMissionFocused(const int32_t missionId,FocusedReason reason)123 void DMSContinueSendMgr::NotifyMissionFocused(const int32_t missionId, FocusedReason reason)
124 {
125     HILOGI("NotifyMissionFocused called, missionId: %{public}d, reason: %{public}d", missionId, reason);
126     if (reason <= FocusedReason::MIN || reason >= FocusedReason::MAX) {
127         HILOGI("Unknown focusedReason, no need to deal NotifyMissionFocused");
128         return;
129     }
130     auto feedfunc = [this, missionId, reason]() {
131         if (reason == FocusedReason::NORMAL) {
132             screenOffHandler_->ClearScreenOffInfo();
133         }
134         DealFocusedBusiness(missionId);
135         if (missionId == info_.currentMissionId && info_.currentIsContinuable) {
136             PostUnfocusedTaskWithDelay(missionId, UnfocusedReason::TIMEOUT);
137         }
138     };
139 
140     if (eventHandler_ == nullptr) {
141         HILOGE("eventHandler_ is nullptr");
142         return;
143     }
144     eventHandler_->RemoveTask(TIMEOUT_UNFOCUSED_TASK);
145     eventHandler_->RemoveTask(SCREEN_OFF_UNFOCUSED_TASK);
146     eventHandler_->PostTask(feedfunc);
147 }
148 
NotifyMissionUnfocused(const int32_t missionId,UnfocusedReason reason)149 void DMSContinueSendMgr::NotifyMissionUnfocused(const int32_t missionId, UnfocusedReason reason)
150 {
151     HILOGI("NotifyMissionUnfocused start, missionId: %{public}d, reason: %{public}d", missionId, reason);
152     if (reason <= UnfocusedReason::MIN || reason >= UnfocusedReason::MAX) {
153         HILOGE("unknown unfocused reason!");
154         return;
155     }
156     auto feedfunc = [this, missionId, reason]() {
157         DealUnfocusedBusiness(missionId, reason);
158     };
159     if (eventHandler_ != nullptr) {
160         eventHandler_->RemoveTask(TIMEOUT_UNFOCUSED_TASK);
161         eventHandler_->PostTask(feedfunc);
162     } else {
163         HILOGE("eventHandler_ is nullptr");
164     }
165 }
166 
GetMissionIdByBundleName(const std::string & bundleName,int32_t & missionId)167 int32_t DMSContinueSendMgr::GetMissionIdByBundleName(const std::string& bundleName, int32_t& missionId)
168 {
169     HILOGI("start, bundleName: %{public}s", bundleName.c_str());
170     std::lock_guard<std::mutex> focusedMissionMapLock(eventMutex_);
171     auto iterItem = focusedMission_.find(bundleName);
172     if (iterItem != focusedMission_.end()) {
173         missionId = iterItem->second;
174         HILOGI("get missionId end, missionId: %{public}d", missionId);
175         return ERR_OK;
176     }
177     HILOGW("get iterItem failed from focusedMission_, try screenOffHandler_");
178     if (bundleName == screenOffHandler_->GetBundleName()) {
179         missionId = screenOffHandler_->GetMissionId();
180         HILOGI("get missionId end, missionId: %{public}d", missionId);
181         return ERR_OK;
182     }
183     HILOGE("get bundleName failed from screenOffHandler_");
184     return INVALID_PARAMETERS_ERR;
185 }
186 
StartEvent()187 void DMSContinueSendMgr::StartEvent()
188 {
189     HILOGI("StartEvent start");
190     prctl(PR_SET_NAME, CONTINUE_MANAGER.c_str());
191     auto runner = AppExecFwk::EventRunner::Create(false);
192     {
193         std::lock_guard<std::mutex> lock(eventMutex_);
194         eventHandler_ = std::make_shared<OHOS::AppExecFwk::EventHandler>(runner);
195     }
196     eventCon_.notify_one();
197     runner->Run();
198     HILOGI("StartEvent end");
199 }
200 
SendSoftbusEvent(uint32_t accessTokenId,uint8_t type)201 int32_t DMSContinueSendMgr::SendSoftbusEvent(uint32_t accessTokenId, uint8_t type)
202 {
203     HILOGD("SendSoftbusEvent start, accessTokenId: %{public}u", accessTokenId);
204     uint8_t data[DMS_SEND_LEN];
205     uint8_t len = sizeof(uint32_t);
206     data[0] = (type << CONTINUE_SHIFT_04) | len;
207     data[1] = (accessTokenId >> CONTINUE_SHIFT_24) & DMS_0XFF;
208     data[INDEX_2] = (accessTokenId >> CONTINUE_SHIFT_16) & DMS_0XFF;
209     data[INDEX_3] = (accessTokenId >> CONTINUE_SHIFT_08) & DMS_0XFF;
210     data[INDEX_4] = accessTokenId & DMS_0XFF;
211     int32_t ret = SoftbusAdapter::GetInstance().SendSoftbusEvent(data, DMS_SEND_LEN);
212     HILOGD("SendSoftbusEvent end. Result: %{public}d", ret);
213     return ret;
214 }
215 
AddMMIListener()216 void DMSContinueSendMgr::AddMMIListener()
217 {
218     if (mmiMonitorId_ >= 0) {
219         HILOGD("MMI listener already exist, monitor id: %{public}d", mmiMonitorId_);
220         return;
221     }
222     mmiMonitorId_ = MMIAdapter::GetInstance().AddMMIListener();
223     if (mmiMonitorId_ < 0) {
224         HILOGW("Add MMI listener failed, ret: %{public}d", mmiMonitorId_);
225         return;
226     }
227     HILOGD("MMI listener has been added, monitor id: %{public}d", mmiMonitorId_);
228 }
229 
RemoveMMIListener()230 void DMSContinueSendMgr::RemoveMMIListener()
231 {
232     if (mmiMonitorId_ < 0) {
233         HILOGI("No MMI listener to be removed, monitor id: %{public}d", mmiMonitorId_);
234         return;
235     }
236     MMIAdapter::GetInstance().RemoveMMIListener(mmiMonitorId_);
237     HILOGI("MMI listener has been removed, monitor id: %{public}d", mmiMonitorId_);
238 
239     mmiMonitorId_ = INVALID_MISSION_ID;
240     return;
241 }
242 
DealFocusedBusiness(const int32_t missionId)243 int32_t DMSContinueSendMgr::DealFocusedBusiness(const int32_t missionId)
244 {
245     HILOGI("DealFocusedBusiness start, missionId: %{public}d", missionId);
246     AAFwk::MissionInfo info;
247     int32_t ret = AAFwk::AbilityManagerClient::GetInstance()->GetMissionInfo("", missionId, info);
248     if (ret != ERR_OK) {
249         HILOGE("get missionInfo failed, missionId: %{public}d, ret: %{public}d", missionId, ret);
250         return ret;
251     }
252     bool isMissionContinuable = info.continuable;
253     {
254         std::lock_guard<std::mutex> currentMissionIdLock(eventMutex_);
255         info_.currentMissionId = missionId;
256         info_.currentIsContinuable = isMissionContinuable;
257     }
258     if (!isMissionContinuable) {
259         HILOGI("Mission is not continuable, task abort, missionId: %{public}d", missionId);
260         return REMOTE_DEVICE_BIND_ABILITY_ERR;
261     }
262     std::string bundleName = info.want.GetBundle();
263     focusedMission_[bundleName] = missionId;
264 
265     if (info.continueState != AAFwk::ContinueState::CONTINUESTATE_ACTIVE) {
266         HILOGE("Mission continue state set to INACTIVE. Broadcast task abort.");
267         return INVALID_PARAMETERS_ERR;
268     }
269 #ifdef SUPPORT_MULTIMODALINPUT_SERVICE
270     AddMMIListener();
271 #endif
272     uint32_t accessTokenId;
273     ret = BundleManagerInternal::GetBundleIdFromBms(bundleName, accessTokenId);
274     if (ret != ERR_OK) {
275         HILOGE("Get focused accessTokenId failed, accessTokenId: %{public}u, ret: %{public}d", accessTokenId, ret);
276         return ret;
277     }
278     HILOGI("Get focused accessTokenId success, accessTokenId: %{public}u", accessTokenId);
279     uint8_t type = DMS_FOCUSED_TYPE;
280     ret = SendSoftbusEvent(accessTokenId, type);
281     if (ret != ERR_OK) {
282         HILOGE("SendSoftbusEvent focused failed, ret: %{public}d", ret);
283         return ret;
284     }
285     HILOGI("DealFocusedBusiness end");
286     return ERR_OK;
287 }
288 
CheckContinueState(const int32_t missionId)289 int32_t DMSContinueSendMgr::CheckContinueState(const int32_t missionId)
290 {
291     AAFwk::MissionInfo info;
292     int32_t ret = AAFwk::AbilityManagerClient::GetInstance()->GetMissionInfo("", missionId, info);
293     if (ret != ERR_OK) {
294         HILOGE("get missionInfo failed, missionId: %{public}d, ret: %{public}d", missionId, ret);
295         return ERR_OK;
296     }
297     if (info.continueState != AAFwk::ContinueState::CONTINUESTATE_ACTIVE) {
298         HILOGE("Mission continue state set to INACTIVE. Broadcast task abort.");
299         return INVALID_PARAMETERS_ERR;
300     }
301     return ERR_OK;
302 }
303 
DealUnfocusedBusiness(const int32_t missionId,UnfocusedReason reason)304 int32_t DMSContinueSendMgr::DealUnfocusedBusiness(const int32_t missionId, UnfocusedReason reason)
305 {
306     HILOGI("DealUnfocusedBusiness start, missionId: %{public}d", missionId);
307     std::string bundleName;
308     int32_t ret = GetBundleNameByMissionId(missionId, bundleName);
309     if (ret != ERR_OK) {
310         HILOGI("Get bundleName failed, mission is not continuable, missionId: %{public}d, ret: %{public}d",
311             missionId, ret);
312         return ret;
313     }
314     HILOGI("Get bundleName success, mission is continuable, missionId: %{public}d, bundleName: %{public}s",
315         missionId, bundleName.c_str());
316 
317     if (reason != UnfocusedReason::TIMEOUT) {
318         bool isContinue = IsContinue(missionId, bundleName);
319         if (!isContinue) {
320             HILOGE("Not current mission to be continued, missionId: %{public}d", missionId);
321             return NO_MISSION_INFO_FOR_MISSION_ID;
322         }
323 #ifdef SUPPORT_MULTIMODALINPUT_SERVICE
324         RemoveMMIListener();
325 #endif
326     }
327 
328     ret = CheckContinueState(missionId);
329     if (ret != ERR_OK) {
330         HILOGE("Continue state is inactive or can't be obtained, mission id : %{public}d, ret: %{public}d",
331             missionId, ret);
332         return ret;
333     }
334 
335     uint32_t accessTokenId;
336     ret = BundleManagerInternal::GetBundleIdFromBms(bundleName, accessTokenId);
337     if (ret != ERR_OK) {
338         HILOGE("Get unfocused accessTokenId failed, accessTokenId: %{public}u, ret: %{public}d", accessTokenId, ret);
339         return ret;
340     }
341 
342     if (screenOffHandler_->IsDeviceScreenOn()) {
343         uint8_t type = DMS_UNFOCUSED_TYPE;
344         ret = SendSoftbusEvent(accessTokenId, type);
345         if (ret != ERR_OK) {
346             HILOGE("SendSoftbusEvent unfocused failed, ret: %{public}d", ret);
347         }
348     }
349 
350     if (reason != UnfocusedReason::TIMEOUT) {
351         std::lock_guard<std::mutex> focusedMissionMapLock(eventMutex_);
352         focusedMission_.erase(bundleName);
353     }
354 
355     if (reason == UnfocusedReason::NORMAL) {
356         screenOffHandler_->SetScreenOffInfo(missionId, bundleName, accessTokenId);
357     }
358     HILOGI("DealUnfocusedBusiness end");
359     return ERR_OK;
360 }
361 
SendScreenOffEvent(uint8_t type)362 int32_t DMSContinueSendMgr::SendScreenOffEvent(uint8_t type)
363 {
364     int32_t missionId = screenOffHandler_->GetMissionId();
365     std::string bundleName = screenOffHandler_->GetBundleName();
366     uint32_t accessTokenId = screenOffHandler_->GetAccessTokenId();
367 
368     HILOGI("start, type: %{public}d, missionId: %{public}d, bundleName: %{public}s, accessTokenId: %{public}u",
369         type, missionId, bundleName.c_str(), accessTokenId);
370 
371     int32_t ret = SendSoftbusEvent(accessTokenId, type);
372     if (ret != ERR_OK) {
373         HILOGE("SendSoftbusEvent unfocused failed, ret: %{public}d", ret);
374     }
375     HILOGI("end");
376     return ERR_OK;
377 }
378 
GetBundleNameByMissionId(const int32_t missionId,std::string & bundleName)379 int32_t DMSContinueSendMgr::GetBundleNameByMissionId(const int32_t missionId, std::string& bundleName)
380 {
381     for (auto iterItem = focusedMission_.begin(); iterItem != focusedMission_.end(); iterItem++) {
382         if (iterItem->second == missionId) {
383             bundleName = iterItem->first;
384             return ERR_OK;
385         }
386     }
387     return INVALID_PARAMETERS_ERR;
388 }
389 
IsContinue(const int32_t & missionId,const std::string & bundleName)390 bool DMSContinueSendMgr::IsContinue(const int32_t& missionId, const std::string& bundleName)
391 {
392     if (missionId != info_.currentMissionId && info_.currentIsContinuable) {
393         /*missionId and currentMissionId are not equal but currentMission can change,
394             continue to not send unfocus broadcast*/
395         std::lock_guard<std::mutex> focusedMissionMapLock(eventMutex_);
396         focusedMission_.erase(bundleName);
397         HILOGI("mission is not continue, missionId: %{public}d, currentMissionId: %{public}d",
398             missionId, info_.currentMissionId);
399         return false;
400     }
401     /*missionId and currentMissionId are equal, or missionId and currentMissionId are not equal
402         and currentIsContinuable not change, continue to send unfocus broadcast*/
403     HILOGI("mission is continue, missionId: %{public}d, currentMissionId: %{public}d",
404         missionId, info_.currentMissionId);
405     return true;
406 }
407 
SetMissionContinueState(const int32_t missionId,const AAFwk::ContinueState & state)408 int32_t DMSContinueSendMgr::SetMissionContinueState(const int32_t missionId,
409     const AAFwk::ContinueState &state)
410 {
411     HILOGI("SetMissionContinueState start, missionId: %{public}d, state: %{public}d", missionId, state);
412     auto feedfunc = [this, missionId, state]() {
413         DealSetMissionContinueStateBusiness(missionId, state);
414         if (state == AAFwk::ContinueState::CONTINUESTATE_ACTIVE && missionId == info_.currentMissionId &&
415             info_.currentIsContinuable) {
416             PostUnfocusedTaskWithDelay(missionId, UnfocusedReason::TIMEOUT);
417         }
418     };
419     if (eventHandler_ != nullptr) {
420         eventHandler_->RemoveTask(TIMEOUT_UNFOCUSED_TASK);
421         eventHandler_->PostTask(feedfunc);
422     } else {
423         HILOGE("eventHandler_ is nullptr");
424         return ERR_NULL_OBJECT;
425     }
426     HILOGI("SetMissionContinueState end");
427     return ERR_OK;
428 }
429 
DealSetMissionContinueStateBusiness(const int32_t missionId,const AAFwk::ContinueState & state)430 int32_t DMSContinueSendMgr::DealSetMissionContinueStateBusiness(const int32_t missionId,
431     const AAFwk::ContinueState &state)
432 {
433     HILOGI("DealSetMissionContinueStateBusiness start, missionId: %{public}d, state: %{public}d", missionId, state);
434 
435     if (info_.currentMissionId != missionId) {
436         HILOGE("mission is not focused, broadcast task abort, missionId: %{public}d", missionId);
437         return INVALID_PARAMETERS_ERR;
438     }
439 
440     if (!info_.currentIsContinuable) {
441         HILOGI("mission is not continuable, broadcast task abort, missionId: %{public}d", missionId);
442         return INVALID_PARAMETERS_ERR;
443     }
444 
445     std::string bundleName;
446     int32_t ret = GetBundleNameByMissionId(missionId, bundleName);
447     if (ret != ERR_OK) {
448         HILOGE("get bundleName failed, broadcast task abort, missionId: %{public}d, ret: %{public}d",
449             missionId, ret);
450         return ret;
451     }
452     HILOGI("get bundleName success, missionId: %{public}d, bundleName: %{public}s", missionId, bundleName.c_str());
453 
454     uint32_t accessTokenId;
455     ret = BundleManagerInternal::GetBundleIdFromBms(bundleName, accessTokenId);
456     if (ret != ERR_OK) {
457         HILOGE("get setContinueState accessTokenId failed, accessTokenId: %{public}u, ret: %{public}d",
458             accessTokenId, ret);
459         return ret;
460     }
461 
462     uint8_t type = DMS_FOCUSED_TYPE;
463     if (state == AAFwk::ContinueState::CONTINUESTATE_INACTIVE) {
464         type = DMS_UNFOCUSED_TYPE;
465         RemoveMMIListener();
466     } else {
467         AddMMIListener();
468     }
469 
470     ret = SendSoftbusEvent(accessTokenId, type);
471     if (ret != ERR_OK) {
472         HILOGE("SendSoftbusEvent setContinueState failed, ret: %{public}d", ret);
473         return ret;
474     }
475 
476     HILOGI("DealSetMissionContinueStateBusiness end. ContinueState set to: %{public}d", state);
477     return ERR_OK;
478 }
479 
OnMMIEvent()480 void DMSContinueSendMgr::OnMMIEvent()
481 {
482     HILOGD("OnMMIEvent, missionId = %{public}d", info_.currentMissionId);
483     DMSContinueSendMgr::GetInstance().NotifyMissionFocused(info_.currentMissionId, FocusedReason::MMI);
484 }
485 
OnDeviceScreenOff()486 void DMSContinueSendMgr::OnDeviceScreenOff()
487 {
488     HILOGI("OnDeviceScreenOff called");
489     if (!info_.currentIsContinuable) {
490         HILOGW("current mission is not continuable, ignore");
491         return;
492     }
493     int32_t missionId = info_.currentMissionId;
494     auto feedfunc = [this, missionId]() {
495         screenOffHandler_->OnDeviceScreenOff(missionId);
496     };
497     if (eventHandler_ == nullptr) {
498         HILOGE("eventHandler_ is nullptr");
499         return;
500     }
501     eventHandler_->PostTask(feedfunc);
502 }
503 
OnDeviceScreenOn()504 void DMSContinueSendMgr::OnDeviceScreenOn()
505 {
506     HILOGI("OnDeviceScreenOn called");
507     auto feedfunc = [this]() {
508         screenOffHandler_->OnDeviceScreenOn();
509     };
510     if (eventHandler_ == nullptr) {
511         HILOGE("eventHandler_ is nullptr");
512         return;
513     }
514     eventHandler_->PostTask(feedfunc);
515 }
516 
GetMissionId()517 int32_t DMSContinueSendMgr::ScreenOffHandler::GetMissionId()
518 {
519     return unfoInfo_.missionId;
520 }
521 
GetBundleName()522 std::string DMSContinueSendMgr::ScreenOffHandler::GetBundleName()
523 {
524     return unfoInfo_.bundleName;
525 }
526 
GetAccessTokenId()527 uint32_t DMSContinueSendMgr::ScreenOffHandler::GetAccessTokenId()
528 {
529     return unfoInfo_.accessToken;
530 }
531 
IsDeviceScreenOn()532 bool DMSContinueSendMgr::ScreenOffHandler::IsDeviceScreenOn()
533 {
534     return isScreenOn_;
535 }
536 
537 
OnDeviceScreenOff(int32_t missionId)538 void DMSContinueSendMgr::ScreenOffHandler::OnDeviceScreenOff(int32_t missionId)
539 {
540     HILOGI("ScreenOffHandler::OnDeviceScreenOff called");
541     isScreenOn_ = false;
542     if (unfoInfo_.missionId != INVALID_MISSION_ID && (GetTickCount()- unfoInfo_.unfoTime) < TIME_DELAYED) {
543         // handle unfocus before screen off
544         DMSContinueSendMgr::GetInstance().SendScreenOffEvent(DMS_FOCUSED_TYPE);
545     }
546     DMSContinueSendMgr::GetInstance().PostUnfocusedTaskWithDelay(missionId, UnfocusedReason::SCREENOFF);
547 }
548 
OnDeviceScreenOn()549 void DMSContinueSendMgr::ScreenOffHandler::OnDeviceScreenOn()
550 {
551     HILOGI("ScreenOffHandler::OnDeviceScreenOn called");
552     isScreenOn_ = true;
553 }
554 
ClearScreenOffInfo()555 void DMSContinueSendMgr::ScreenOffHandler::ClearScreenOffInfo()
556 {
557     HILOGI("clear last unfocused info");
558     unfoInfo_.missionId = INVALID_MISSION_ID;
559     unfoInfo_.unfoTime = 0;
560     unfoInfo_.bundleName = "";
561     unfoInfo_.accessToken = 0;
562 }
563 
SetScreenOffInfo(int32_t missionId,std::string bundleName,uint32_t accessTokenId)564 void DMSContinueSendMgr::ScreenOffHandler::SetScreenOffInfo(int32_t missionId, std::string bundleName,
565     uint32_t accessTokenId)
566 {
567     HILOGI("set last unfocused info, missionId: %{public}d, bundleName: %{public}s, accessTokenId: %{public}u",
568         missionId, bundleName.c_str(), accessTokenId);
569     unfoInfo_.missionId = missionId;
570     unfoInfo_.unfoTime = GetTickCount();
571     unfoInfo_.bundleName = bundleName;
572     unfoInfo_.accessToken = accessTokenId;
573 }
574 } // namespace DistributedSchedule
575 } // namespace OHOS
576