1 /*
2 * Copyright (c) 2021 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 "timer_call_back.h"
17
18 namespace OHOS {
19 namespace MiscServices {
20 namespace {
21 const int WANTAGENT_CODE_ELEVEN = 11;
22 }
23 std::mutex TimerCallback::instanceLock_;
24 sptr<TimerCallback> TimerCallback::instance_;
25
26 std::map<uint64_t, std::shared_ptr<ITimerInfo>> TimerCallback::TimerInfoMap_;
27 std::mutex TimerCallback::timerInfoMutex_;
28
TimerCallback()29 TimerCallback::TimerCallback()
30 {
31 }
32
~TimerCallback()33 TimerCallback::~TimerCallback()
34 {
35 TimerInfoMap_.clear();
36 }
37
GetInstance()38 sptr<TimerCallback> TimerCallback::GetInstance()
39 {
40 if (instance_ == nullptr) {
41 std::lock_guard<std::mutex> autoLock(instanceLock_);
42 if (instance_ == nullptr) {
43 instance_ = new TimerCallback;
44 }
45 }
46 return instance_;
47 }
48
InsertTimerCallbackInfo(const uint64_t timerId,const std::shared_ptr<ITimerInfo> & timerInfo)49 bool TimerCallback::InsertTimerCallbackInfo(const uint64_t timerId,
50 const std::shared_ptr<ITimerInfo> &timerInfo)
51 {
52 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
53 if (timerInfo == nullptr) {
54 return false;
55 }
56
57 std::lock_guard<std::mutex> lock(timerInfoMutex_);
58 auto info = TimerInfoMap_.find(timerId);
59 if (info != TimerInfoMap_.end()) {
60 TIME_HILOGE(TIME_MODULE_CLIENT, "timer info already insert.");
61 return false;
62 } else {
63 TimerInfoMap_[timerId] = timerInfo;
64 }
65 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
66 return true;
67 }
68
RemoveTimerCallbackInfo(const uint64_t timerId)69 bool TimerCallback::RemoveTimerCallbackInfo(const uint64_t timerId)
70 {
71 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
72 std::lock_guard<std::mutex> lock(timerInfoMutex_);
73 auto info = TimerInfoMap_.find(timerId);
74 if (info != TimerInfoMap_.end()) {
75 TimerInfoMap_.erase(info);
76 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
77 return true;
78 }
79 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
80 return false;
81 }
82
NotifyTimer(const uint64_t timerId)83 void TimerCallback::NotifyTimer(const uint64_t timerId)
84 {
85 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
86 std::lock_guard<std::mutex> lock(timerInfoMutex_);
87 auto it = TimerInfoMap_.find(timerId);
88 if (it != TimerInfoMap_.end()) {
89 TIME_HILOGD(TIME_MODULE_SERVICE, "ontrigger.");
90 it->second->OnTrigger();
91
92 if (it->second->wantAgent != nullptr) {
93 TIME_HILOGD(TIME_MODULE_SERVICE, "trigger wantagent.");
94 std::shared_ptr<AAFwk::Want> want =
95 OHOS::AbilityRuntime::WantAgent::WantAgentHelper::GetWant(it->second->wantAgent);
96 OHOS::AbilityRuntime::WantAgent::TriggerInfo paramsInfo("", nullptr, want, WANTAGENT_CODE_ELEVEN);
97 OHOS::AbilityRuntime::WantAgent::WantAgentHelper::TriggerWantAgent(
98 it->second->wantAgent, nullptr, paramsInfo);
99 }
100 }
101 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
102 }
103 } // namespace MiscServices
104 } // namespace OHOS
105