Properly battery blame throttled location requests
Bug: 37552457
Fixes: 37552457
Test: manual
Change-Id: Iba980eb885b5a6465bafc12c9ee35831b7a4ff31
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index b4270cf..7275461 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -1729,7 +1729,7 @@
record.mReceiver.mIdentity.mUid,
record.mReceiver.mIdentity.mPackageName,
record.mReceiver.mAllowedResolutionLevel)) {
- LocationRequest locationRequest = record.mRequest;
+ LocationRequest locationRequest = record.mRealRequest;
long interval = locationRequest.getInterval();
if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
@@ -1742,6 +1742,7 @@
}
}
+ record.mRequest = locationRequest;
providerRequest.locationRequests.add(locationRequest);
if (interval < providerRequest.interval) {
providerRequest.reportLocation = true;
@@ -1834,7 +1835,8 @@
private class UpdateRecord {
final String mProvider;
- final LocationRequest mRequest;
+ final LocationRequest mRealRequest; // original request from client
+ LocationRequest mRequest; // possibly throttled version of the request
final Receiver mReceiver;
boolean mIsForegroundUid;
Location mLastFixBroadcast;
@@ -1845,6 +1847,7 @@
*/
UpdateRecord(String provider, LocationRequest request, Receiver receiver) {
mProvider = provider;
+ mRealRequest = request;
mRequest = request;
mReceiver = receiver;
mIsForegroundUid = isImportanceForeground(
@@ -1894,7 +1897,7 @@
public String toString() {
return "UpdateRecord[" + mProvider + " " + mReceiver.mIdentity.mPackageName
+ "(" + mReceiver.mIdentity.mUid + (mIsForegroundUid ? " foreground" : " background")
- + ")" + " " + mRequest + "]";
+ + ")" + " " + mRealRequest + "]";
}
}
@@ -2535,7 +2538,7 @@
}
// Check whether sufficient time has passed
- long minTime = record.mRequest.getFastestInterval();
+ long minTime = record.mRealRequest.getFastestInterval();
long delta = (loc.getElapsedRealtimeNanos() - lastLoc.getElapsedRealtimeNanos())
/ NANOS_PER_MILLI;
if (delta < minTime - MAX_PROVIDER_SCHEDULING_JITTER_MS) {
@@ -2543,7 +2546,7 @@
}
// Check whether sufficient distance has been traveled
- double minDistance = record.mRequest.getSmallestDisplacement();
+ double minDistance = record.mRealRequest.getSmallestDisplacement();
if (minDistance > 0.0) {
if (loc.distanceTo(lastLoc) <= minDistance) {
return false;
@@ -2551,12 +2554,12 @@
}
// Check whether sufficient number of udpates is left
- if (record.mRequest.getNumUpdates() <= 0) {
+ if (record.mRealRequest.getNumUpdates() <= 0) {
return false;
}
// Check whether the expiry date has passed
- return record.mRequest.getExpireAt() >= now;
+ return record.mRealRequest.getExpireAt() >= now;
}
private void handleLocationChangedLocked(Location location, boolean passive) {
@@ -2674,7 +2677,7 @@
Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver);
receiverDead = true;
}
- r.mRequest.decrementNumUpdates();
+ r.mRealRequest.decrementNumUpdates();
}
}
@@ -2690,7 +2693,7 @@
}
// track expired records
- if (r.mRequest.getNumUpdates() <= 0 || r.mRequest.getExpireAt() < now) {
+ if (r.mRealRequest.getNumUpdates() <= 0 || r.mRealRequest.getExpireAt() < now) {
if (deadUpdateRecords == null) {
deadUpdateRecords = new ArrayList<>();
}