• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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