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