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