Fix an issue that appOps was called before location delivery check.
noteOp notes a location delivery to appOps and will cause an icon to
show up. It should only be called when LocationManagerService is ready
to deliver a location to the client.
Bug: 122559674
Test: Manual
Change-Id: I5c13b35e492638186ba22ba4e6ba8abcd21027d6
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index bbd51ad..c2a0611 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -3210,18 +3210,6 @@
continue;
}
- if (!reportLocationAccessNoThrow(
- receiver.mCallerIdentity.mPid,
- receiver.mCallerIdentity.mUid,
- receiver.mCallerIdentity.mPackageName,
- receiver.mAllowedResolutionLevel)) {
- if (D) {
- Log.d(TAG, "skipping loc update for no op app: " +
- receiver.mCallerIdentity.mPackageName);
- }
- continue;
- }
-
Location notifyLocation;
if (receiver.mAllowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
notifyLocation = coarseLocation; // use coarse location
@@ -3238,6 +3226,20 @@
} else {
lastLoc.set(notifyLocation);
}
+ // Report location access before delivering location to the client. This will
+ // note location delivery to appOps, so it should be called only when a
+ // location is really being delivered to the client.
+ if (!reportLocationAccessNoThrow(
+ receiver.mCallerIdentity.mPid,
+ receiver.mCallerIdentity.mUid,
+ receiver.mCallerIdentity.mPackageName,
+ receiver.mAllowedResolutionLevel)) {
+ if (D) {
+ Log.d(TAG, "skipping loc update for no op app: "
+ + receiver.mCallerIdentity.mPackageName);
+ }
+ continue;
+ }
if (!receiver.callLocationChangedLocked(notifyLocation)) {
Slog.w(TAG, "RemoteException calling onLocationChanged on "
+ receiver);