1 /*
2 * Copyright (C) 2022 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 "request_manager.h"
17
18 #include "privacy_kit.h"
19
20 #include "common_utils.h"
21 #include "constant_definition.h"
22 #ifdef FEATURE_GNSS_SUPPORT
23 #include "gnss_ability_proxy.h"
24 #endif
25 #include "fusion_controller.h"
26 #include "location_log.h"
27 #include "location_sa_load_manager.h"
28 #include "locator_ability.h"
29 #include "locator_background_proxy.h"
30 #include "locator_event_manager.h"
31 #ifdef FEATURE_NETWORK_SUPPORT
32 #include "network_ability_proxy.h"
33 #endif
34 #ifdef FEATURE_PASSIVE_SUPPORT
35 #include "passive_ability_proxy.h"
36 #endif
37 #include "request_config.h"
38 #include "location_log_event_ids.h"
39 #include "common_hisysevent.h"
40
41 namespace OHOS {
42 namespace Location {
43 std::mutex RequestManager::requestMutex_;
RequestManager()44 RequestManager::RequestManager()
45 {
46 auto locatorDftManager = DelayedSingleton<LocatorDftManager>::GetInstance();
47 if (locatorDftManager != nullptr) {
48 locatorDftManager->Init();
49 }
50 }
51
~RequestManager()52 RequestManager::~RequestManager()
53 {
54 }
55
InitSystemListeners()56 bool RequestManager::InitSystemListeners()
57 {
58 LBSLOGI(REQUEST_MANAGER, "Init system listeners.");
59 return true;
60 }
61
UpdateUsingPermission(std::shared_ptr<Request> request)62 void RequestManager::UpdateUsingPermission(std::shared_ptr<Request> request)
63 {
64 std::unique_lock<std::mutex> lock(permissionRecordMutex_, std::defer_lock);
65 lock.lock();
66 if (request == nullptr) {
67 LBSLOGE(REQUEST_MANAGER, "request is null");
68 lock.unlock();
69 return;
70 }
71 LBSLOGD(REQUEST_MANAGER, "UpdateUsingPermission : tokenId = %{public}d, firstTokenId = %{public}d",
72 request->GetTokenId(), request->GetFirstTokenId());
73 UpdateUsingApproximatelyPermission(request);
74 lock.unlock();
75 }
76
UpdateUsingApproximatelyPermission(std::shared_ptr<Request> request)77 void RequestManager::UpdateUsingApproximatelyPermission(std::shared_ptr<Request> request)
78 {
79 uint32_t callingTokenId = request->GetTokenId();
80 uint32_t callingFirstTokenid = request->GetFirstTokenId();
81 int32_t uid = request->GetUid();
82 if (IsUidInProcessing(uid) &&
83 CommonUtils::CheckApproximatelyPermission(callingTokenId, callingFirstTokenid)) {
84 if (!request->GetApproximatelyPermState()) {
85 PrivacyKit::StartUsingPermission(callingTokenId, ACCESS_APPROXIMATELY_LOCATION);
86 request->SetApproximatelyPermState(true);
87 }
88 } else {
89 if (request->GetApproximatelyPermState()) {
90 PrivacyKit::StopUsingPermission(callingTokenId, ACCESS_APPROXIMATELY_LOCATION);
91 request->SetApproximatelyPermState(false);
92 }
93 }
94 }
95
HandleStartLocating(std::shared_ptr<Request> request)96 void RequestManager::HandleStartLocating(std::shared_ptr<Request> request)
97 {
98 auto locatorAbility = DelayedSingleton<LocatorAbility>::GetInstance();
99 auto locatorDftManager = DelayedSingleton<LocatorDftManager>::GetInstance();
100 if (locatorAbility == nullptr || locatorDftManager == nullptr) {
101 return;
102 }
103 // restore request to all request list
104 bool isNewRequest = RestorRequest(request);
105 // update request map
106 if (isNewRequest) {
107 locatorAbility->RegisterPermissionCallback(request->GetTokenId(),
108 {ACCESS_APPROXIMATELY_LOCATION, ACCESS_LOCATION, ACCESS_BACKGROUND_LOCATION});
109 UpdateRequestRecord(request, true);
110 UpdateUsingPermission(request);
111 locatorDftManager->LocationSessionStart(request);
112 }
113 // process location request
114 HandleRequest();
115 }
116
RestorRequest(std::shared_ptr<Request> newRequest)117 bool RequestManager::RestorRequest(std::shared_ptr<Request> newRequest)
118 {
119 std::unique_lock lock(requestMutex_);
120
121 auto locatorAbility = DelayedSingleton<LocatorAbility>::GetInstance();
122 if (locatorAbility == nullptr) {
123 return false;
124 }
125 auto receivers = locatorAbility->GetReceivers();
126 if (receivers == nullptr) {
127 LBSLOGE(REQUEST_MANAGER, "receivers is empty");
128 return false;
129 }
130 if (newRequest == nullptr) {
131 LBSLOGE(REQUEST_MANAGER, "newRequest is empty");
132 return false;
133 }
134 newRequest->SetRequesting(true);
135 sptr<IRemoteObject> newCallback = newRequest->GetLocatorCallBack()->AsObject();
136
137 LBSLOGI(REQUEST_MANAGER, "add request:%{public}s", newRequest->ToString().c_str());
138 // if callback and request config type is same, take new request configuration over the old one in request list
139 // otherwise, add restore the new request in the list.
140 auto iterator = receivers->find(newCallback);
141 if (iterator == receivers->end()) {
142 std::list<std::shared_ptr<Request>> requestList;
143 requestList.push_back(newRequest);
144 receivers->insert(make_pair(newCallback, requestList));
145 LBSLOGD(REQUEST_MANAGER, "add new receiver with new callback");
146 return true;
147 }
148
149 sptr<RequestConfig> newConfig = newRequest->GetRequestConfig();
150 std::list<std::shared_ptr<Request>> requestWithSameCallback = iterator->second;
151 for (auto iter = requestWithSameCallback.begin(); iter != requestWithSameCallback.end(); ++iter) {
152 auto request = *iter;
153 if (request == nullptr) {
154 continue;
155 }
156 auto requestConfig = request->GetRequestConfig();
157 if (requestConfig == nullptr || newConfig == nullptr) {
158 continue;
159 }
160 if (newConfig->IsSame(*requestConfig)) {
161 request->SetRequestConfig(*newConfig);
162 LBSLOGI(REQUEST_MANAGER, "find same type request, update request configuration");
163 return false;
164 }
165 }
166 requestWithSameCallback.push_back(newRequest);
167 LBSLOGD(REQUEST_MANAGER, "add new receiver with old callback");
168 return true;
169 }
170
UpdateRequestRecord(std::shared_ptr<Request> request,bool shouldInsert)171 void RequestManager::UpdateRequestRecord(std::shared_ptr<Request> request, bool shouldInsert)
172 {
173 std::shared_ptr<std::list<std::string>> proxys = std::make_shared<std::list<std::string>>();
174 request->GetProxyName(proxys);
175 if (proxys->empty()) {
176 LBSLOGE(REQUEST_MANAGER, "can not get proxy name according to request configuration");
177 return;
178 }
179
180 for (std::list<std::string>::iterator iter = proxys->begin(); iter != proxys->end(); ++iter) {
181 std::string abilityName = *iter;
182 UpdateRequestRecord(request, abilityName, shouldInsert);
183 }
184 }
185
UpdateRequestRecord(std::shared_ptr<Request> request,std::string abilityName,bool shouldInsert)186 void RequestManager::UpdateRequestRecord(std::shared_ptr<Request> request, std::string abilityName, bool shouldInsert)
187 {
188 auto locatorAbility = DelayedSingleton<LocatorAbility>::GetInstance();
189 if (locatorAbility == nullptr) {
190 LBSLOGE(REQUEST_MANAGER, "locatorAbility is null");
191 return;
192 }
193 std::unique_lock lock(requestMutex_);
194 auto requests = locatorAbility->GetRequests();
195 if (requests == nullptr) {
196 LBSLOGE(REQUEST_MANAGER, "requests map is empty");
197 return;
198 }
199 auto mapIter = requests->find(abilityName);
200 if (mapIter == requests->end()) {
201 LBSLOGE(REQUEST_MANAGER, "can not find %{public}s ability request list.", abilityName.c_str());
202 return;
203 }
204
205 auto list = &(mapIter->second);
206 LBSLOGD(REQUEST_MANAGER, "%{public}s ability current request size %{public}s",
207 abilityName.c_str(), std::to_string(list->size()).c_str());
208 if (shouldInsert) {
209 list->push_back(request);
210 HandleChrEvent(*list);
211 UpdateRunningUids(request, abilityName, true);
212 } else {
213 for (auto iter = list->begin(); iter != list->end();) {
214 auto findRequest = *iter;
215 if (request == findRequest) {
216 iter = list->erase(iter);
217 UpdateRunningUids(findRequest, abilityName, false);
218 LBSLOGD(REQUEST_MANAGER, "find request");
219 } else {
220 ++iter;
221 }
222 }
223 }
224 LBSLOGD(REQUEST_MANAGER, "%{public}s ability request size %{public}s",
225 abilityName.c_str(), std::to_string(list->size()).c_str());
226 }
227
HandleChrEvent(std::list<std::shared_ptr<Request>> requests)228 void RequestManager::HandleChrEvent(std::list<std::shared_ptr<Request>> requests)
229 {
230 if (requests.size() > LBS_REQUEST_MAX_SIZE) {
231 std::vector<std::string> names;
232 std::vector<std::string> values;
233 int index = 0;
234 for (auto it = requests.begin(); it != requests.end(); ++it, ++index) {
235 auto request = *it;
236 if (request == nullptr) {
237 continue;
238 }
239 names.push_back(std::to_string(index));
240 std::string packageName = request->GetPackageName();
241 values.push_back(packageName);
242 }
243 WriteLocationInnerEvent(LBS_REQUEST_TOO_MUCH, names, values);
244 }
245 }
246
HandleStopLocating(sptr<ILocatorCallback> callback)247 void RequestManager::HandleStopLocating(sptr<ILocatorCallback> callback)
248 {
249 if (callback == nullptr) {
250 LBSLOGE(REQUEST_MANAGER, "stop locating but callback is null");
251 return;
252 }
253 auto locatorAbility = DelayedSingleton<LocatorAbility>::GetInstance();
254 if (locatorAbility == nullptr) {
255 LBSLOGE(REQUEST_MANAGER, "locatorAbility is null");
256 return;
257 }
258 std::unique_lock<std::mutex> lock(requestMutex_, std::defer_lock);
259 lock.lock();
260 auto receivers = locatorAbility->GetReceivers();
261 if (receivers == nullptr) {
262 LBSLOGE(REQUEST_MANAGER, "receivers map is empty");
263 lock.unlock();
264 return;
265 }
266 sptr<IRemoteObject> deadCallback = callback->AsObject();
267 // get dead request list
268 LBSLOGD(REQUEST_MANAGER, "stop callback");
269 auto iterator = receivers->find(deadCallback);
270 if (iterator == receivers->end()) {
271 LBSLOGD(REQUEST_MANAGER, "this callback has no record in receiver map");
272 lock.unlock();
273 return;
274 }
275
276 auto requests = iterator->second;
277 auto deadRequests = std::make_shared<std::list<std::shared_ptr<Request>>>();
278 for (auto iter = requests.begin(); iter != requests.end(); ++iter) {
279 auto request = *iter;
280 locatorAbility->UnregisterPermissionCallback(request->GetTokenId());
281 deadRequests->push_back(request);
282 LBSLOGI(REQUEST_MANAGER, "remove request:%{public}s", request->ToString().c_str());
283 }
284 LBSLOGD(REQUEST_MANAGER, "get %{public}s dead request", std::to_string(deadRequests->size()).c_str());
285 // update request map
286 if (deadRequests->size() == 0) {
287 lock.unlock();
288 return;
289 }
290 iterator->second.clear();
291 receivers->erase(iterator);
292 lock.unlock();
293 DeleteRequestRecord(deadRequests);
294 deadRequests->clear();
295 // process location request
296 HandleRequest();
297 }
298
DeleteRequestRecord(std::shared_ptr<std::list<std::shared_ptr<Request>>> requests)299 void RequestManager::DeleteRequestRecord(std::shared_ptr<std::list<std::shared_ptr<Request>>> requests)
300 {
301 for (auto iter = requests->begin(); iter != requests->end(); ++iter) {
302 auto request = *iter;
303 UpdateRequestRecord(request, false);
304 UpdateUsingPermission(request);
305 auto locatorBackgroundProxy = DelayedSingleton<LocatorBackgroundProxy>::GetInstance();
306 if (locatorBackgroundProxy == nullptr) {
307 LBSLOGE(REQUEST_MANAGER, "DeleteRequestRecord: LocatorBackgroundProxy is nullptr.");
308 break;
309 }
310 locatorBackgroundProxy.get()->OnDeleteRequestRecord(request);
311 }
312 }
313
HandleRequest()314 void RequestManager::HandleRequest()
315 {
316 auto locatorAbility = DelayedSingleton<LocatorAbility>::GetInstance();
317 if (locatorAbility == nullptr) {
318 LBSLOGE(REQUEST_MANAGER, "locatorAbility is null");
319 return;
320 }
321 std::unique_lock<std::mutex> lock(requestMutex_, std::defer_lock);
322 lock.lock();
323 auto requests = locatorAbility->GetRequests();
324 lock.unlock();
325 if (requests == nullptr) {
326 LBSLOGE(REQUEST_MANAGER, "requests map is empty");
327 return;
328 }
329 std::map<std::string, std::list<std::shared_ptr<Request>>>::iterator iter;
330 for (iter = requests->begin(); iter != requests->end(); ++iter) {
331 std::string abilityName = iter->first;
332 std::list<std::shared_ptr<Request>> requestList = iter->second;
333 HandleRequest(abilityName, requestList);
334 }
335 }
336
HandleRequest(std::string abilityName,std::list<std::shared_ptr<Request>> list)337 void RequestManager::HandleRequest(std::string abilityName, std::list<std::shared_ptr<Request>> list)
338 {
339 // generate work record, and calculate interval
340 std::shared_ptr<WorkRecord> workRecord = std::make_shared<WorkRecord>();
341 for (auto iter = list.begin(); iter != list.end(); iter++) {
342 auto request = *iter;
343 if (!AddRequestToWorkRecord(request, workRecord)) {
344 continue;
345 }
346 if (!ActiveLocatingStrategies(request)) {
347 continue;
348 }
349 LBSLOGD(REQUEST_MANAGER, "add pid:%{public}d uid:%{public}d %{public}s", request->GetPid(), request->GetUid(),
350 request->GetPackageName().c_str());
351 }
352 LBSLOGD(REQUEST_MANAGER, "detect %{public}s ability requests(size:%{public}s) work record:%{public}s",
353 abilityName.c_str(), std::to_string(list.size()).c_str(), workRecord->ToString().c_str());
354
355 ProxySendLocationRequest(abilityName, *workRecord);
356 }
357
ActiveLocatingStrategies(const std::shared_ptr<Request> & request)358 bool RequestManager::ActiveLocatingStrategies(const std::shared_ptr<Request>& request)
359 {
360 if (request == nullptr) {
361 return false;
362 }
363 auto requestConfig = request->GetRequestConfig();
364 if (requestConfig == nullptr) {
365 return false;
366 }
367 int requestType = requestConfig->GetScenario();
368 if (requestType == SCENE_UNSET) {
369 requestType = requestConfig->GetPriority();
370 }
371 auto fusionController = DelayedSingleton<FusionController>::GetInstance();
372 if (fusionController != nullptr) {
373 fusionController->ActiveFusionStrategies(requestType);
374 }
375 return true;
376 }
377
378 /**
379 * determine whether the request is valid.
380 */
IsRequestAvailable(std::shared_ptr<Request> & request)381 bool RequestManager::IsRequestAvailable(std::shared_ptr<Request>& request)
382 {
383 std::set<int32_t> proxyUids = DelayedSingleton<LocatorAbility>::GetInstance()->GetProxyUid();
384 for (auto iter = proxyUids.begin(); iter != proxyUids.end(); iter++) {
385 int32_t uid = *iter;
386 // for frozen app, do not add to workRecord
387 if (uid == request->GetUid()) {
388 LBSLOGD(LOCATOR, "%{public}d is freezed.", uid);
389 return false;
390 }
391 // for once_request app, if it has timed out, do not add to workRecord
392 int64_t curTime = CommonUtils::GetCurrentTime();
393 if (request->GetRequestConfig()->GetFixNumber() == 1 &&
394 fabs(curTime - request->GetRequestConfig()->GetTimeStamp()) >
395 (request->GetRequestConfig()->GetTimeOut() / SEC_TO_MILLI_SEC)) {
396 LBSLOGE(LOCATOR, "%{public}d has timed out.", request->GetUid());
397 return false;
398 }
399 }
400 return true;
401 }
402
AddRequestToWorkRecord(std::shared_ptr<Request> & request,std::shared_ptr<WorkRecord> & workRecord)403 bool RequestManager::AddRequestToWorkRecord(std::shared_ptr<Request>& request,
404 std::shared_ptr<WorkRecord>& workRecord)
405 {
406 if (request == nullptr) {
407 return false;
408 }
409 UpdateUsingPermission(request);
410 if (!request->GetIsRequesting()) {
411 return false;
412 }
413 if (!IsRequestAvailable(request)) {
414 return false;
415 }
416 uint32_t tokenId = request->GetTokenId();
417 uint32_t firstTokenId = request->GetFirstTokenId();
418 // if location access permission granted, add request info to work record
419 if (!CommonUtils::CheckLocationPermission(tokenId, firstTokenId) &&
420 !CommonUtils::CheckApproximatelyPermission(tokenId, firstTokenId)) {
421 LBSLOGI(LOCATOR, "CheckLocationPermission return false, tokenId=%{public}d", tokenId);
422 return false;
423 }
424 auto requestConfig = request->GetRequestConfig();
425 if (requestConfig == nullptr) {
426 return false;
427 }
428 // add request info to work record
429 if (workRecord != nullptr) {
430 workRecord->Add(request->GetUid(), request->GetPid(), request->GetPackageName(),
431 requestConfig->GetTimeInterval(), request->GetUuid());
432 }
433 return true;
434 }
435
ProxySendLocationRequest(std::string abilityName,WorkRecord & workRecord)436 void RequestManager::ProxySendLocationRequest(std::string abilityName, WorkRecord& workRecord)
437 {
438 int systemAbilityId = CommonUtils::AbilityConvertToId(abilityName);
439 if (!CommonUtils::InitLocationSa(systemAbilityId)) {
440 return ;
441 }
442 sptr<IRemoteObject> remoteObject = CommonUtils::GetRemoteObject(systemAbilityId, CommonUtils::InitDeviceId());
443 if (remoteObject == nullptr) {
444 LBSLOGE(LOCATOR, "%{public}s: remote obj is nullptr", __func__);
445 return;
446 }
447 workRecord.SetDeviceId(CommonUtils::InitDeviceId());
448 if (abilityName == GNSS_ABILITY) {
449 #ifdef FEATURE_GNSS_SUPPORT
450 std::unique_ptr<GnssAbilityProxy> gnssProxy = std::make_unique<GnssAbilityProxy>(remoteObject);
451 gnssProxy->SendLocationRequest(workRecord);
452 #endif
453 } else if (abilityName == NETWORK_ABILITY) {
454 #ifdef FEATURE_NETWORK_SUPPORT
455 std::unique_ptr<NetworkAbilityProxy> networkProxy = std::make_unique<NetworkAbilityProxy>(remoteObject);
456 networkProxy->SendLocationRequest(workRecord);
457 #endif
458 } else if (abilityName == PASSIVE_ABILITY) {
459 #ifdef FEATURE_PASSIVE_SUPPORT
460 std::unique_ptr<PassiveAbilityProxy> passiveProxy = std::make_unique<PassiveAbilityProxy>(remoteObject);
461 passiveProxy->SendLocationRequest(workRecord);
462 #endif
463 }
464 auto fusionController = DelayedSingleton<FusionController>::GetInstance();
465 if (fusionController != nullptr) {
466 fusionController->Process(abilityName);
467 }
468 }
469
GetRemoteObject(std::string abilityName)470 sptr<IRemoteObject> RequestManager::GetRemoteObject(std::string abilityName)
471 {
472 sptr<IRemoteObject> remoteObject = nullptr;
473 auto locatorAbility = DelayedSingleton<LocatorAbility>::GetInstance();
474 if (locatorAbility == nullptr) {
475 LBSLOGE(REQUEST_MANAGER, "locatorAbility is null");
476 return remoteObject;
477 }
478 auto remoteManagerMap = locatorAbility->GetProxyMap();
479 if (remoteManagerMap == nullptr) {
480 LBSLOGE(REQUEST_MANAGER, "proxy map is empty");
481 return remoteObject;
482 }
483 auto remoteObjectIter = remoteManagerMap->find(abilityName);
484 if (remoteObjectIter == remoteManagerMap->end()) {
485 LBSLOGE(REQUEST_MANAGER, "sa init fail!");
486 return remoteObject;
487 }
488 remoteObject = remoteObjectIter->second;
489 return remoteObject;
490 }
491
HandlePowerSuspendChanged(int32_t pid,int32_t uid,int32_t state)492 void RequestManager::HandlePowerSuspendChanged(int32_t pid, int32_t uid, int32_t state)
493 {
494 if (!IsUidInProcessing(uid)) {
495 LBSLOGD(REQUEST_MANAGER, "Current uid : %{public}d is not locating.", uid);
496 return;
497 }
498 auto locatorAbility = DelayedSingleton<LocatorAbility>::GetInstance();
499 if (locatorAbility == nullptr) {
500 LBSLOGE(REQUEST_MANAGER, "locatorAbility is null");
501 return;
502 }
503 auto requests = locatorAbility->GetRequests();
504 if (requests == nullptr || requests->empty()) {
505 LBSLOGE(REQUEST_MANAGER, "requests map is empty");
506 return;
507 }
508 bool isActive = (state == static_cast<int>(AppExecFwk::ApplicationState::APP_STATE_FOREGROUND));
509 for (auto mapIter = requests->begin(); mapIter != requests->end(); mapIter++) {
510 auto list = mapIter->second;
511 for (auto request : list) {
512 std::string uid1 = std::to_string(request->GetUid());
513 std::string uid2 = std::to_string(uid);
514 std::string pid1 = std::to_string(request->GetPid());
515 std::string pid2 = std::to_string(pid);
516 if ((uid1.compare(uid2) != 0) || (pid1.compare(pid2) != 0)) {
517 continue;
518 }
519 auto locatorBackgroundProxy = DelayedSingleton<LocatorBackgroundProxy>::GetInstance();
520 if (locatorBackgroundProxy != nullptr) {
521 locatorBackgroundProxy.get()->OnSuspend(request, isActive);
522 }
523 }
524 }
525 if (DelayedSingleton<LocatorAbility>::GetInstance() != nullptr) {
526 DelayedSingleton<LocatorAbility>::GetInstance().get()->ApplyRequests(1);
527 }
528 }
529
HandlePermissionChanged(uint32_t tokenId)530 void RequestManager::HandlePermissionChanged(uint32_t tokenId)
531 {
532 auto locatorAbility = DelayedSingleton<LocatorAbility>::GetInstance();
533 if (locatorAbility == nullptr) {
534 LBSLOGE(REQUEST_MANAGER, "HandlePermissionChanged locatorAbility is null");
535 return;
536 }
537 auto requests = locatorAbility->GetRequests();
538 if (requests == nullptr || requests->empty()) {
539 LBSLOGE(REQUEST_MANAGER, "HandlePermissionChanged requests map is empty");
540 return;
541 }
542 for (auto mapIter = requests->begin(); mapIter != requests->end(); mapIter++) {
543 auto list = mapIter->second;
544 for (auto request : list) {
545 if (request == nullptr || tokenId != request->GetTokenId()) {
546 continue;
547 }
548 auto backgroundProxy = DelayedSingleton<LocatorBackgroundProxy>::GetInstance();
549 if (backgroundProxy != nullptr) {
550 backgroundProxy.get()->UpdateListOnRequestChange(request);
551 }
552 }
553 }
554 }
555
IsUidInProcessing(int32_t uid)556 bool RequestManager::IsUidInProcessing(int32_t uid)
557 {
558 std::unique_lock<std::mutex> lock(runningUidsMutex_);
559 auto iter = runningUidMap_.find(uid);
560 if (iter == runningUidMap_.end()) {
561 return false;
562 }
563 return true;
564 }
565
UpdateRunningUids(const std::shared_ptr<Request> & request,std::string abilityName,bool isAdd)566 void RequestManager::UpdateRunningUids(const std::shared_ptr<Request>& request, std::string abilityName, bool isAdd)
567 {
568 std::unique_lock<std::mutex> lock(runningUidsMutex_);
569 auto uid = request->GetUid();
570 auto pid = request->GetPid();
571 int32_t uidCount = 0;
572 auto iter = runningUidMap_.find(uid);
573 if (iter != runningUidMap_.end()) {
574 uidCount = iter->second;
575 runningUidMap_.erase(uid);
576 }
577 if (isAdd) {
578 auto requestConfig = request->GetRequestConfig();
579 WriteLocationInnerEvent(ADD_REQUEST, {
580 "PackageName", request->GetPackageName(),
581 "abilityName", abilityName,
582 "requestAddress", request->GetUuid(),
583 "scenario", std::to_string(requestConfig->GetScenario()),
584 "priority", std::to_string(requestConfig->GetPriority()),
585 "timeInterval", std::to_string(requestConfig->GetTimeInterval()),
586 "maxAccuracy", std::to_string(requestConfig->GetMaxAccuracy())});
587 uidCount += 1;
588 if (uidCount == 1) {
589 WriteAppLocatingStateEvent("start", pid, uid);
590 }
591 } else {
592 WriteLocationInnerEvent(REMOVE_REQUEST, {"PackageName", request->GetPackageName(),
593 "abilityName", abilityName, "requestAddress", request->GetUuid()});
594 uidCount -= 1;
595 if (uidCount == 0) {
596 WriteAppLocatingStateEvent("stop", pid, uid);
597 }
598 }
599 if (uidCount > 0) {
600 runningUidMap_.insert(std::make_pair(uid, uidCount));
601 }
602 }
603 } // namespace Location
604 } // namespace OHOS
605