• 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 "report_manager.h"
17 
18 #include <cmath>
19 #include "privacy_kit.h"
20 #include "common_utils.h"
21 #include "fusion_controller.h"
22 #include "i_locator_callback.h"
23 #include "location_log.h"
24 #include "locator_ability.h"
25 #include "locator_background_proxy.h"
26 #include "location_log_event_ids.h"
27 #include "location_data_rdb_manager.h"
28 #include "common_hisysevent.h"
29 #include "permission_manager.h"
30 #include "hook_utils.h"
31 
32 namespace OHOS {
33 namespace Location {
34 const long NANOS_PER_MILLI = 1000000L;
35 const int MAX_SA_SCHEDULING_JITTER_MS = 200;
36 static constexpr double MAXIMUM_FUZZY_LOCATION_DISTANCE = 40.0; // Unit m
37 static constexpr double MINIMUM_FUZZY_LOCATION_DISTANCE = 30.0; // Unit m
38 static constexpr int CACHED_TIME = 25;
39 static constexpr int LONG_CACHE_DURATION = 60;
40 static constexpr int MAX_LOCATION_REPORT_DELAY_TIME = 30000; // Unit ms
41 static constexpr int MIN_RESET_TIME_THRESHOLD = 1 * 60 * 60 * 1000; // Unit ms
42 
GetInstance()43 ReportManager* ReportManager::GetInstance()
44 {
45     static ReportManager data;
46     return &data;
47 }
48 
ReportManager()49 ReportManager::ReportManager()
50 {
51     clock_gettime(CLOCK_REALTIME, &lastUpdateTime_);
52     offsetRandom_ = CommonUtils::DoubleRandom(0, 1);
53     lastResetRecordTime_ = CommonUtils::GetSinceBootTime();
54 }
55 
~ReportManager()56 ReportManager::~ReportManager() {}
57 
OnReportLocation(const std::unique_ptr<Location> & location,std::string abilityName)58 bool ReportManager::OnReportLocation(const std::unique_ptr<Location>& location, std::string abilityName)
59 {
60     auto fusionController = FusionController::GetInstance();
61     UpdateCacheLocation(location, abilityName);
62     auto locatorAbility = LocatorAbility::GetInstance();
63     auto requestMap = locatorAbility->GetRequests();
64     if (requestMap == nullptr) {
65         return false;
66     }
67     auto requestListIter = requestMap->find(abilityName);
68     if (requestListIter == requestMap->end()) {
69         return false;
70     }
71     auto requestList = requestListIter->second;
72     auto deadRequests = std::make_unique<std::list<std::shared_ptr<Request>>>();
73     for (auto iter = requestList.begin(); iter != requestList.end(); iter++) {
74         auto request = *iter;
75         WriteNetWorkReportEvent(abilityName, request, location);
76         if (abilityName == NETWORK_ABILITY) {
77             if (request->GetUuid() == location->GetUuid() || location->GetIsFromMock()) {
78                 ProcessRequestForReport(request, deadRequests, location, abilityName);
79                 break;
80             }
81         } else if (abilityName == GNSS_ABILITY || abilityName == PASSIVE_ABILITY) {
82             ProcessRequestForReport(request, deadRequests, location, abilityName);
83         }
84     }
85     for (auto iter = deadRequests->begin(); iter != deadRequests->end(); ++iter) {
86         auto request = *iter;
87         if (request == nullptr) {
88             continue;
89         }
90         auto requestManger = RequestManager::GetInstance();
91         if (requestManger != nullptr) {
92             requestManger->UpdateRequestRecord(request, false);
93             requestManger->UpdateUsingPermission(request, false);
94         }
95     }
96     if (deadRequests->size() > 0) {
97         locatorAbility->ApplyRequests(1);
98         deadRequests->clear();
99     }
100     return true;
101 }
102 
UpdateLocationByRequest(const uint32_t tokenId,const uint64_t tokenIdEx,std::unique_ptr<Location> & location)103 void ReportManager::UpdateLocationByRequest(const uint32_t tokenId, const uint64_t tokenIdEx,
104     std::unique_ptr<Location>& location)
105 {
106     if (location == nullptr) {
107         return;
108     }
109     if (!PermissionManager::CheckSystemPermission(tokenId, tokenIdEx)) {
110         location->SetIsSystemApp(0);
111     } else {
112         location->SetIsSystemApp(1);
113     }
114 }
115 
ProcessRequestForReport(std::shared_ptr<Request> & request,std::unique_ptr<std::list<std::shared_ptr<Request>>> & deadRequests,const std::unique_ptr<Location> & location,std::string abilityName)116 bool ReportManager::ProcessRequestForReport(std::shared_ptr<Request>& request,
117     std::unique_ptr<std::list<std::shared_ptr<Request>>>& deadRequests,
118     const std::unique_ptr<Location>& location, std::string abilityName)
119 {
120     if (location == nullptr ||
121         request == nullptr || request->GetRequestConfig() == nullptr || !request->GetIsRequesting()) {
122         return false;
123     }
124     std::unique_ptr<Location> fuseLocation;
125     std::unique_ptr<Location> finalLocation;
126     if (IsRequestFuse(request)) {
127         if (request->GetBestLocation() == nullptr ||
128             request->GetBestLocation()->GetLocationSourceType() == 0) {
129             request->SetBestLocation(std::make_unique<Location>(cacheGnssLocation_));
130         }
131         fuseLocation = FusionController::GetInstance()->GetFuseLocation(location, request->GetBestLocation());
132         if (request->GetLastLocation() != nullptr && request->GetLastLocation()->LocationEqual(fuseLocation)) {
133             return false;
134         }
135         request->SetBestLocation(fuseLocation);
136     }
137     if (LocationDataRdbManager::QuerySwitchState() != ENABLED &&
138         !LocatorAbility::GetInstance()->GetLocationSwitchIgnoredFlag(request->GetTokenId())) {
139         LBSLOGE(REPORT_MANAGER, "QuerySwitchState is DISABLED");
140         return false;
141     }
142     auto locatorAbility = LocatorAbility::GetInstance();
143     finalLocation = GetPermittedLocation(request, IsRequestFuse(request) ? fuseLocation : location);
144     if (!ResultCheck(finalLocation, request)) {
145         // add location permission using record
146         int permUsedType = request->GetPermUsedType();
147         locatorAbility->UpdatePermissionUsedRecord(request->GetTokenId(),
148             ACCESS_APPROXIMATELY_LOCATION, permUsedType, 0, 1);
149         return false;
150     }
151     LocationReportDelayTimeCheck(finalLocation, request);
152     UpdateLocationByRequest(request->GetTokenId(), request->GetTokenIdEx(), finalLocation);
153     finalLocation = ExecuteReportProcess(request, finalLocation, abilityName);
154     if (finalLocation == nullptr) {
155         LBSLOGE(REPORT_MANAGER, "%{public}s no need report location", __func__);
156         return false;
157     }
158     request->SetLastLocation(finalLocation);
159     if (!ReportLocationByCallback(request, finalLocation)) {
160         return false;
161     }
162     int fixTime = request->GetRequestConfig()->GetFixNumber();
163     if (fixTime > 0 && !request->GetRequestConfig()->IsRequestForAccuracy()) {
164         deadRequests->push_back(request);
165         return false;
166     }
167     return true;
168 }
169 
ReportLocationByCallback(std::shared_ptr<Request> & request,const std::unique_ptr<Location> & finalLocation)170 bool ReportManager::ReportLocationByCallback(std::shared_ptr<Request>& request,
171     const std::unique_ptr<Location>& finalLocation)
172 {
173     auto locatorCallback = request->GetLocatorCallBack();
174     if (locatorCallback != nullptr) {
175         // add location permission using record
176         auto locatorAbility = LocatorAbility::GetInstance();
177         int ret = locatorAbility->UpdatePermissionUsedRecord(request->GetTokenId(),
178             ACCESS_APPROXIMATELY_LOCATION, request->GetPermUsedType(), 1, 0);
179         if (ret != ERRCODE_SUCCESS && locatorAbility->IsHapCaller(request->GetTokenId())) {
180             LBSLOGE(REPORT_MANAGER, "UpdatePermissionUsedRecord failed ret=%{public}d", ret);
181             RequestManager::GetInstance()->ReportLocationError(LOCATING_FAILED_LOCATION_PERMISSION_DENIED, request);
182             return false;
183         }
184         LBSLOGW(REPORT_MANAGER, "report location to %{public}d, uuid : %{public}s, " \
185             "TimeSinceBoot : %{public}s, SourceType : %{public}d",
186             request->GetTokenId(), request->GetUuid().c_str(),
187             std::to_string(finalLocation->GetTimeSinceBoot()).c_str(), finalLocation->GetLocationSourceType());
188         locatorCallback->OnLocationReport(finalLocation);
189         RequestManager::GetInstance()->UpdateLocationError(request);
190     }
191     return true;
192 }
193 
LocationReportDelayTimeCheck(const std::unique_ptr<Location> & location,const std::shared_ptr<Request> & request)194 void ReportManager::LocationReportDelayTimeCheck(const std::unique_ptr<Location>& location,
195     const std::shared_ptr<Request>& request)
196 {
197     if (location == nullptr || request == nullptr) {
198         return;
199     }
200     int64_t currentTime = CommonUtils::GetSinceBootTime();
201     long deltaMs = (currentTime - location->GetTimeSinceBoot()) / NANOS_PER_MILLI;
202     if (deltaMs > MAX_LOCATION_REPORT_DELAY_TIME) {
203         long recordDeltaMs = (currentTime - lastResetRecordTime_) / NANOS_PER_MILLI;
204         if (recordDeltaMs < MIN_RESET_TIME_THRESHOLD) {
205             return;
206         }
207         LBSLOGE(REPORT_MANAGER, "%{public}s: %{public}d check fail, current deltaMs = %{public}ld", __func__,
208             request->GetTokenId(), deltaMs);
209         lastResetRecordTime_ = currentTime;
210         _exit(0);
211     }
212 }
213 
ExecuteReportProcess(std::shared_ptr<Request> & request,std::unique_ptr<Location> & location,std::string abilityName)214 std::unique_ptr<Location> ReportManager::ExecuteReportProcess(std::shared_ptr<Request>& request,
215     std::unique_ptr<Location>& location, std::string abilityName)
216 {
217     LocationSupplicantInfo reportStruct;
218     reportStruct.request = *request;
219     reportStruct.location = *location;
220     reportStruct.abilityName = abilityName;
221     reportStruct.retCode = true;
222     HookUtils::ExecuteHook(
223         LocationProcessStage::LOCATOR_SA_LOCATION_REPORT_PROCESS, (void *)&reportStruct, nullptr);
224     if (!reportStruct.retCode) {
225         return nullptr;
226     }
227     return std::make_unique<Location>(reportStruct.location);
228 }
229 
ExecuteLocationProcess(const std::shared_ptr<Request> & request,const std::unique_ptr<Location> & location)230 std::unique_ptr<Location> ReportManager::ExecuteLocationProcess(const std::shared_ptr<Request>& request,
231     const std::unique_ptr<Location>& location)
232 {
233     LocationSupplicantInfo reportStruct;
234     reportStruct.request = *request;
235     reportStruct.location = *location;
236     HookUtils::ExecuteHook(
237         LocationProcessStage::LOCATION_REPORT_PROCESS, (void *)&reportStruct, nullptr);
238     return std::make_unique<Location>(reportStruct.location);
239 }
240 
GetPermittedLocation(const std::shared_ptr<Request> & request,const std::unique_ptr<Location> & location)241 std::unique_ptr<Location> ReportManager::GetPermittedLocation(const std::shared_ptr<Request>& request,
242     const std::unique_ptr<Location>& location)
243 {
244     if (location == nullptr) {
245         return nullptr;
246     }
247     std::string bundleName = request->GetPackageName();
248     auto tokenId = request->GetTokenId();
249     auto firstTokenId = request->GetFirstTokenId();
250     auto tokenIdEx = request->GetTokenIdEx();
251     auto uid =  request->GetUid();
252     if (bundleName.length() == 0) {
253         if (!CommonUtils::GetBundleNameByUid(uid, bundleName)) {
254             LBSLOGD(REPORT_MANAGER, "Fail to Get bundle name: uid = %{public}d.", uid);
255         }
256     }
257     if (request->GetRequestConfig()->GetFixNumber() == 0 &&
258         IsAppBackground(bundleName, tokenId, tokenIdEx, uid, request->GetPid()) &&
259         !PermissionManager::CheckBackgroundPermission(tokenId, firstTokenId)) {
260         //app background, no background permission, not ContinuousTasks
261         RequestManager::GetInstance()->ReportLocationError(LOCATING_FAILED_BACKGROUND_PERMISSION_DENIED, request);
262         return nullptr;
263     }
264     AppIdentity identity;
265     identity.SetUid(request->GetUid());
266     identity.SetTokenId(request->GetTokenId());
267     identity.SetBundleName(bundleName);
268     int currentUserId = LocatorBackgroundProxy::GetInstance()->getCurrentUserId();
269     if (!CommonUtils::IsAppBelongCurrentAccount(identity, currentUserId)) {
270         //app is not in current user, not need to report
271         LBSLOGI(REPORT_MANAGER, "GetPermittedLocation uid: %{public}d CheckAppForUser fail", tokenId);
272         auto locationErrorCallback = request->GetLocationErrorCallBack();
273         if (locationErrorCallback != nullptr) {
274             locationErrorCallback->OnErrorReport(LOCATING_FAILED_LOCATION_PERMISSION_DENIED);
275         }
276         return nullptr;
277     }
278     std::unique_ptr<Location> finalLocation = ExecuteLocationProcess(request, location);
279     // for api8 and previous version, only ACCESS_LOCATION permission granted also report original location info.
280     if (PermissionManager::CheckLocationPermission(tokenId, firstTokenId)) {
281         return finalLocation;
282     }
283     if (PermissionManager::CheckApproximatelyPermission(tokenId, firstTokenId)) {
284         LBSLOGI(REPORT_MANAGER, "%{public}d has ApproximatelyLocation permission", tokenId);
285         finalLocation = ApproximatelyLocation(location, bundleName);
286         return finalLocation;
287     }
288     LBSLOGE(REPORT_MANAGER, "%{public}d has no location permission failed", tokenId);
289     RequestManager::GetInstance()->ReportLocationError(LOCATING_FAILED_LOCATION_PERMISSION_DENIED, request);
290     return nullptr;
291 }
292 
ReportRemoteCallback(sptr<ILocatorCallback> & locatorCallback,int type,int result)293 bool ReportManager::ReportRemoteCallback(sptr<ILocatorCallback>& locatorCallback, int type, int result)
294 {
295     switch (type) {
296         case ILocatorCallback::RECEIVE_LOCATION_STATUS_EVENT: {
297             locatorCallback->OnLocatingStatusChange(result);
298             break;
299         }
300         case ILocatorCallback::RECEIVE_ERROR_INFO_EVENT: {
301             locatorCallback->OnErrorReport(result);
302             break;
303         }
304         default:
305             return false;
306     }
307     return true;
308 }
309 
ResultCheck(const std::unique_ptr<Location> & location,const std::shared_ptr<Request> & request)310 bool ReportManager::ResultCheck(const std::unique_ptr<Location>& location,
311     const std::shared_ptr<Request>& request)
312 {
313     if (request == nullptr || location == nullptr) {
314         return false;
315     }
316     if (ProxyFreezeManager::GetInstance()->IsProxyPid(request->GetPid())) {
317         LBSLOGE(REPORT_MANAGER, "pid:%{public}d is proxy by freeze, no need to report", request->GetPid());
318         return false;
319     }
320     int permissionLevel = PermissionManager::GetPermissionLevel(request->GetTokenId(), request->GetFirstTokenId());
321     if (request->GetLastLocation() == nullptr || request->GetRequestConfig() == nullptr) {
322         return true;
323     }
324     float maxAcc = request->GetRequestConfig()->GetMaxAccuracy();
325     LBSLOGD(REPORT_MANAGER, "acc ResultCheck :  %{public}f - %{public}f", maxAcc, location->GetAccuracy());
326     if ((permissionLevel == PERMISSION_ACCURATE) &&
327         (maxAcc > 0) && (location->GetAccuracy() > maxAcc)) {
328         auto locatorCallback = request->GetLocatorCallBack();
329         if (locatorCallback != nullptr) {
330             ReportRemoteCallback(locatorCallback, ILocatorCallback::RECEIVE_ERROR_INFO_EVENT,
331                 LocationErrCode::ERRCODE_LOCATING_ACC_FAIL);
332         } else {
333             LBSLOGE(REPORT_MANAGER, "ReportManager null LocatorCallback");
334         }
335         LBSLOGE(REPORT_MANAGER, "accuracy check fail, do not report location");
336         return false;
337     }
338     if (CommonUtils::DoubleEqual(request->GetLastLocation()->GetLatitude(), MIN_LATITUDE - 1) ||
339         request->GetLastLocation()->GetIsFromMock() != location->GetIsFromMock()) {
340         LBSLOGD(REPORT_MANAGER, "no valid cache location, no need to check");
341         return true;
342     }
343     int minTime = request->GetRequestConfig()->GetTimeInterval();
344     long deltaMs = (location->GetTimeSinceBoot() - request->GetLastLocation()->GetTimeSinceBoot()) / NANOS_PER_MILLI;
345     if (deltaMs < (minTime * MILLI_PER_SEC - MAX_SA_SCHEDULING_JITTER_MS)) {
346         LBSLOGE(REPORT_MANAGER,
347             "%{public}d timeInterval check fail, do not report location, current deltaMs = %{public}ld",
348             request->GetTokenId(), deltaMs);
349         return false;
350     }
351 
352     double distanceInterval = request->GetRequestConfig()->GetDistanceInterval();
353     double deltaDis = CommonUtils::CalDistance(location->GetLatitude(), location->GetLongitude(),
354         request->GetLastLocation()->GetLatitude(), request->GetLastLocation()->GetLongitude());
355     if (deltaDis - distanceInterval < 0) {
356         LBSLOGE(REPORT_MANAGER, "%{public}d distanceInterval check fail, do not report location",
357             request->GetTokenId());
358         return false;
359     }
360     return true;
361 }
362 
UpdateCacheLocation(const std::unique_ptr<Location> & location,std::string abilityName)363 void ReportManager::UpdateCacheLocation(const std::unique_ptr<Location>& location, std::string abilityName)
364 {
365     if (abilityName == GNSS_ABILITY) {
366         if (HookUtils::CheckGnssLocationValidity(location)) {
367             cacheGnssLocation_ = *location;
368             UpdateLastLocation(location);
369         }
370     } else if (abilityName == NETWORK_ABILITY) {
371         cacheNlpLocation_ = *location;
372         UpdateLastLocation(location);
373         if (location->GetLocationSourceType() == INDOOR_TYPE) {
374             cacheIndoorLocation_ = *location;
375         }
376     } else {
377         UpdateLastLocation(location);
378     }
379 }
380 
UpdateLastLocation(const std::unique_ptr<Location> & location)381 void ReportManager::UpdateLastLocation(const std::unique_ptr<Location>& location)
382 {
383     auto locatorBackgroundProxy = LocatorBackgroundProxy::GetInstance();
384     int currentUserId = locatorBackgroundProxy->getCurrentUserId();
385     std::unique_lock<std::mutex> lock(lastLocationMutex_);
386     lastLocationsMap_[currentUserId] = std::make_shared<Location>(*location);
387 }
388 
GetLastLocation()389 std::unique_ptr<Location> ReportManager::GetLastLocation()
390 {
391     auto locatorBackgroundProxy = LocatorBackgroundProxy::GetInstance();
392     int currentUserId = locatorBackgroundProxy->getCurrentUserId();
393     LBSLOGI(LOCATOR_STANDARD, "GetCacheLocation GetLastLocation currentUserId = %{public}d ", currentUserId);
394     std::unique_lock<std::mutex> lock(lastLocationMutex_);
395     auto iter = lastLocationsMap_.find(currentUserId);
396     if (iter == lastLocationsMap_.end()) {
397         return nullptr;
398     }
399     std::unique_ptr<Location> lastLocation = std::make_unique<Location>(*(iter->second));
400     if (CommonUtils::DoubleEqual(lastLocation->GetLatitude(), MIN_LATITUDE - 1)) {
401         return nullptr;
402     }
403     return lastLocation;
404 }
405 
GetCacheLocation(const std::shared_ptr<Request> & request)406 std::unique_ptr<Location> ReportManager::GetCacheLocation(const std::shared_ptr<Request>& request)
407 {
408     int64_t curTime = CommonUtils::GetCurrentTimeStamp();
409     std::unique_ptr<Location> cacheLocation = nullptr;
410     std::string packageName = request->GetPackageName();
411     int cachedTime = 0;
412     if (HookUtils::ExecuteHookReportManagerGetCacheLocation(packageName)) {
413         cachedTime = LONG_CACHE_DURATION;
414     } else {
415         cachedTime = CACHED_TIME;
416     }
417     if (!CommonUtils::DoubleEqual(cacheIndoorLocation_.GetLatitude(), MIN_LATITUDE - 1) &&
418         (curTime - cacheIndoorLocation_.GetTimeStamp() / MILLI_PER_SEC) <= cachedTime) {
419         cacheLocation = std::make_unique<Location>(cacheIndoorLocation_);
420     } else if (!CommonUtils::DoubleEqual(cacheGnssLocation_.GetLatitude(), MIN_LATITUDE - 1) &&
421         (curTime - cacheGnssLocation_.GetTimeStamp() / MILLI_PER_SEC) <= cachedTime) {
422         cacheLocation = std::make_unique<Location>(cacheGnssLocation_);
423     } else if (!CommonUtils::DoubleEqual(cacheNlpLocation_.GetLatitude(), MIN_LATITUDE - 1) &&
424         (curTime - cacheNlpLocation_.GetTimeStamp() / MILLI_PER_SEC) <= cachedTime) {
425         cacheLocation = std::make_unique<Location>(cacheNlpLocation_);
426     }
427     std::unique_ptr<Location> finalLocation = GetPermittedLocation(request, cacheLocation);
428     if (!ResultCheck(finalLocation, request)) {
429         return nullptr;
430     }
431     UpdateLocationByRequest(request->GetTokenId(), request->GetTokenIdEx(), finalLocation);
432     return finalLocation;
433 }
434 
UpdateRandom()435 void ReportManager::UpdateRandom()
436 {
437     auto locatorAbility = LocatorAbility::GetInstance();
438     int num = locatorAbility->GetActiveRequestNum();
439     if (num > 0) {
440         LBSLOGD(REPORT_MANAGER, "Exists %{public}d active request, cannot refresh offset", num);
441         return;
442     }
443     struct timespec now;
444     clock_gettime(CLOCK_REALTIME, &now);
445     if (abs(now.tv_sec - lastUpdateTime_.tv_sec) > LONG_TIME_INTERVAL) {
446         offsetRandom_ = CommonUtils::DoubleRandom(0, 1);
447     }
448 }
449 
ApproximatelyLocation(const std::unique_ptr<Location> & location,std::string bundleName)450 std::unique_ptr<Location> ReportManager::ApproximatelyLocation(
451     const std::unique_ptr<Location>& location, std::string bundleName)
452 {
453     std::unique_ptr<Location> coarseLocation = std::make_unique<Location>(*location);
454     double startLat = coarseLocation->GetLatitude();
455     double startLon = coarseLocation->GetLongitude();
456     double brg = offsetRandom_ * DIS_FROMLL_PARAMETER * M_PI; // 2PI
457     double dist = offsetRandom_ * (MAXIMUM_FUZZY_LOCATION_DISTANCE -
458         MINIMUM_FUZZY_LOCATION_DISTANCE) + MINIMUM_FUZZY_LOCATION_DISTANCE;
459     double perlat = (DIS_FROMLL_PARAMETER * M_PI * EARTH_RADIUS) / DEGREE_DOUBLE_PI; // the radian value of per degree
460 
461     double lat = startLat + (dist * sin(brg)) / perlat;
462     double lon;
463     if (cos(brg) < 0) {
464         lon = startLon - (dist * DEGREE_DOUBLE_PI) / (DIS_FROMLL_PARAMETER * M_PI * EARTH_RADIUS);
465     } else {
466         lon = startLon + (dist * DEGREE_DOUBLE_PI) / (DIS_FROMLL_PARAMETER * M_PI * EARTH_RADIUS);
467     }
468     if (lat < -MAX_LATITUDE) {
469         lat = -MAX_LATITUDE;
470     } else if (lat > MAX_LATITUDE) {
471         lat = MAX_LATITUDE;
472     } else {
473         lat = std::round(lat * std::pow(10, 8)) / std::pow(10, 8); // 8 decimal
474     }
475     if (lon < -MAX_LONGITUDE) {
476         lon = -MAX_LONGITUDE;
477     } else if (lon > MAX_LONGITUDE) {
478         lon = MAX_LONGITUDE;
479     } else {
480         lon = std::round(lon * std::pow(10, 8)) / std::pow(10, 8); // 8 decimal
481     }
482     bool needApproximate = HookUtils::ExecuteHookWhenApproximatelyLocation(bundleName);
483     if (needApproximate) {
484         coarseLocation->SetLatitude(lat);
485         coarseLocation->SetLongitude(lon);
486         coarseLocation->SetAccuracy(DEFAULT_APPROXIMATELY_ACCURACY); // approximately location acc
487         std::vector<std::string> emptyAdds;
488         coarseLocation->SetAdditions(emptyAdds, false);
489         coarseLocation->SetAdditionSize(0);
490     }
491     return coarseLocation;
492 }
493 
IsRequestFuse(const std::shared_ptr<Request> & request)494 bool ReportManager::IsRequestFuse(const std::shared_ptr<Request>& request)
495 {
496     if (request == nullptr || request->GetRequestConfig() == nullptr) {
497         return false;
498     }
499     if (request->GetRequestConfig()->GetFixNumber() == 1 && request->GetRequestConfig()->IsRequestForAccuracy()) {
500         return false;
501     }
502     if ((request->GetRequestConfig()->GetScenario() == SCENE_UNSET &&
503         request->GetRequestConfig()->GetPriority() == PRIORITY_LOW_POWER) ||
504         request->GetRequestConfig()->GetScenario() == SCENE_NO_POWER ||
505         request->GetRequestConfig()->GetScenario() == SCENE_DAILY_LIFE_SERVICE ||
506         request->GetRequestConfig()->GetScenario() == LOCATION_SCENE_DAILY_LIFE_SERVICE ||
507         request->GetRequestConfig()->GetScenario() == LOCATION_SCENE_LOW_POWER_CONSUMPTION ||
508         request->GetRequestConfig()->GetScenario() == LOCATION_SCENE_NO_POWER_CONSUMPTION) {
509         return false;
510     }
511     return true;
512 }
513 
WriteNetWorkReportEvent(std::string abilityName,const std::shared_ptr<Request> & request,const std::unique_ptr<Location> & location)514 void ReportManager::WriteNetWorkReportEvent(std::string abilityName, const std::shared_ptr<Request>& request,
515     const std::unique_ptr<Location>& location)
516 {
517     if (abilityName == NETWORK_ABILITY && request != nullptr) {
518         WriteLocationInnerEvent(RECEIVE_NETWORK_LOCATION, {
519             "PackageName", request->GetPackageName(),
520             "abilityName", abilityName,
521             "requestAddress", request->GetUuid(),
522             "latitude", std::to_string(location->GetLatitude()),
523             "longitude", std::to_string(location->GetLongitude()),
524             "accuracy", std::to_string(location->GetAccuracy())
525         });
526     }
527 }
528 
IsAppBackground(std::string bundleName,uint32_t tokenId,uint64_t tokenIdEx,pid_t uid,pid_t pid)529 bool ReportManager::IsAppBackground(std::string bundleName, uint32_t tokenId, uint64_t tokenIdEx, pid_t uid, pid_t pid)
530 {
531     auto locatorBackgroundProxy = LocatorBackgroundProxy::GetInstance();
532     if (!locatorBackgroundProxy->IsAppBackground(uid, bundleName)) {
533         return false;
534     }
535     if (locatorBackgroundProxy->IsAppHasFormVisible(tokenId, tokenIdEx)) {
536         return false;
537     }
538     if (locatorBackgroundProxy->IsAppInLocationContinuousTasks(uid, pid)) {
539         return false;
540     }
541     return true;
542 }
543 
IsCacheGnssLocationValid()544 bool ReportManager::IsCacheGnssLocationValid()
545 {
546     int64_t curTime = CommonUtils::GetCurrentTimeStamp();
547     if (!CommonUtils::DoubleEqual(cacheGnssLocation_.GetLatitude(), MIN_LATITUDE - 1) &&
548         (curTime - cacheGnssLocation_.GetTimeStamp() / MILLI_PER_SEC) <= CACHED_TIME) {
549         return true;
550     }
551     return false;
552 }
553 } // namespace OHOS
554 } // namespace Location
555