Loading location/java/android/location/ILocationManager.aidl +11 −8 Original line number Diff line number Diff line Loading @@ -42,20 +42,23 @@ import com.android.internal.location.ProviderProperties; */ interface ILocationManager { Location getLastLocation(in LocationRequest request, String packageName); Location getLastLocation(in LocationRequest request, String packageName, String featureId); boolean getCurrentLocation(in LocationRequest request, in ICancellationSignal cancellationSignal, in ILocationListener listener, String packageName, String listenerIdentifier); String packageName, String featureId, String listenerIdentifier); void requestLocationUpdates(in LocationRequest request, in ILocationListener listener, in PendingIntent intent, String packageName, String listenerIdentifier); in PendingIntent intent, String packageName, String featureId, String listenerIdentifier); void removeUpdates(in ILocationListener listener, in PendingIntent intent, String packageName); void requestGeofence(in LocationRequest request, in Geofence geofence, in PendingIntent intent, String packageName, String listenerIdentifier); in PendingIntent intent, String packageName, String featureId, String listenerIdentifier); void removeGeofence(in Geofence fence, in PendingIntent intent, String packageName); boolean registerGnssStatusCallback(IGnssStatusListener callback, String packageName); boolean registerGnssStatusCallback(IGnssStatusListener callback, String packageName, String featureId); void unregisterGnssStatusCallback(IGnssStatusListener callback); boolean geocoderIsPresent(); Loading @@ -69,14 +72,14 @@ interface ILocationManager boolean sendNiResponse(int notifId, int userResponse); boolean addGnssMeasurementsListener(in IGnssMeasurementsListener listener, String packageName, String listenerIdentifier); String packageName, String featureId, String listenerIdentifier); void injectGnssMeasurementCorrections(in GnssMeasurementCorrections corrections, in String packageName); long getGnssCapabilities(in String packageName); void removeGnssMeasurementsListener(in IGnssMeasurementsListener listener); boolean addGnssNavigationMessageListener(in IGnssNavigationMessageListener listener, String packageName, String listenerIdentifier); String packageName, String featureId, String listenerIdentifier); void removeGnssNavigationMessageListener(in IGnssNavigationMessageListener listener); int getGnssYearOfHardware(); Loading @@ -84,7 +87,7 @@ interface ILocationManager int getGnssBatchSize(String packageName); boolean addGnssBatchingCallback(in IBatchedLocationCallback callback, String packageName, String listenerIdentifier); String featureId, String listenerIdentifier); void removeGnssBatchingCallback(); boolean startGnssBatch(long periodNanos, boolean wakeOnFifoFull, String packageName); void flushGnssBatch(String packageName); Loading location/java/android/location/LocationManager.java +17 −11 Original line number Diff line number Diff line Loading @@ -515,7 +515,8 @@ public class LocationManager { @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public Location getLastLocation() { try { return mService.getLastLocation(null, mContext.getPackageName()); return mService.getLastLocation(null, mContext.getPackageName(), mContext.getFeatureId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -547,7 +548,8 @@ public class LocationManager { provider, 0, 0, true); try { return mService.getLastLocation(request, mContext.getPackageName()); return mService.getLastLocation(request, mContext.getPackageName(), mContext.getFeatureId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -641,7 +643,7 @@ public class LocationManager { try { if (mService.getCurrentLocation(currentLocationRequest, remoteCancellationSignal, listenerTransport, mContext.getPackageName(), listenerTransport, mContext.getPackageName(), mContext.getFeatureId(), getListenerIdentifier(consumer))) { listenerTransport.register(mContext.getSystemService(AlarmManager.class), remoteCancellationSignal); Loading Loading @@ -1085,7 +1087,8 @@ public class LocationManager { boolean registered = false; try { mService.requestLocationUpdates(locationRequest, transport, null, mContext.getPackageName(), getListenerIdentifier(listener)); mContext.getPackageName(), mContext.getFeatureId(), getListenerIdentifier(listener)); registered = true; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); Loading Loading @@ -1130,7 +1133,8 @@ public class LocationManager { try { mService.requestLocationUpdates(locationRequest, null, pendingIntent, mContext.getPackageName(), getListenerIdentifier(pendingIntent)); mContext.getPackageName(), mContext.getFeatureId(), getListenerIdentifier(pendingIntent)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -1594,7 +1598,7 @@ public class LocationManager { LocationRequest request = new LocationRequest().setExpireIn(expiration); try { mService.requestGeofence(request, fence, intent, mContext.getPackageName(), getListenerIdentifier(intent)); mContext.getFeatureId(), getListenerIdentifier(intent)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -1672,7 +1676,7 @@ public class LocationManager { try { mService.requestGeofence(request, fence, intent, mContext.getPackageName(), getListenerIdentifier(intent)); mContext.getFeatureId(), getListenerIdentifier(intent)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -2748,7 +2752,7 @@ public class LocationManager { mListenerTransport = new GnssStatusListener(); return mService.registerGnssStatusCallback(mListenerTransport, mContext.getPackageName()); mContext.getPackageName(), mContext.getFeatureId()); } @Override Loading Loading @@ -2808,7 +2812,8 @@ public class LocationManager { mListenerTransport = new GnssMeasurementsListener(); return mService.addGnssMeasurementsListener(mListenerTransport, mContext.getPackageName(), "gnss measurement callback"); mContext.getPackageName(), mContext.getFeatureId(), "gnss measurement callback"); } @Override Loading Loading @@ -2844,7 +2849,8 @@ public class LocationManager { mListenerTransport = new GnssNavigationMessageListener(); return mService.addGnssNavigationMessageListener(mListenerTransport, mContext.getPackageName(), "gnss navigation callback"); mContext.getPackageName(), mContext.getFeatureId(), "gnss navigation callback"); } @Override Loading Loading @@ -2880,7 +2886,7 @@ public class LocationManager { mListenerTransport = new BatchedLocationCallback(); return mService.addGnssBatchingCallback(mListenerTransport, mContext.getPackageName(), "batched location callback"); mContext.getFeatureId(), "batched location callback"); } @Override Loading services/core/java/com/android/server/GnssManagerService.java +12 −6 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppOpsManager; import android.content.Context; Loading Loading @@ -300,7 +301,7 @@ public class GnssManagerService { * @return true if callback is successfully added, false otherwise */ public boolean addGnssBatchingCallback(IBatchedLocationCallback callback, String packageName, @NonNull String listenerIdentity) { @Nullable String featureId, @NonNull String listenerIdentity) { mContext.enforceCallingPermission( android.Manifest.permission.LOCATION_HARDWARE, "Location Hardware permission not granted to access hardware batching"); Loading @@ -319,7 +320,7 @@ public class GnssManagerService { CallerIdentity callerIdentity = new CallerIdentity(Binder.getCallingUid(), Binder.getCallingPid(), packageName, listenerIdentity); featureId, listenerIdentity); synchronized (mGnssBatchingLock) { mGnssBatchingCallback = callback; mGnssBatchingDeathCallback = Loading Loading @@ -497,6 +498,7 @@ public class GnssManagerService { private <TListener extends IInterface> boolean addGnssDataListenerLocked( TListener listener, String packageName, @Nullable String featureId, @NonNull String listenerIdentifier, RemoteListenerHelper<TListener> gnssDataProvider, ArrayMap<IBinder, Loading @@ -517,7 +519,7 @@ public class GnssManagerService { CallerIdentity callerIdentity = new CallerIdentity(Binder.getCallingUid(), Binder.getCallingPid(), packageName, listenerIdentifier); featureId, listenerIdentifier); LinkedListener<TListener> linkedListener = new LocationManagerServiceUtils.LinkedListener<>( listener, listenerIdentifier, callerIdentity, binderDeathCallback); Loading Loading @@ -605,11 +607,13 @@ public class GnssManagerService { * @param packageName name of requesting package * @return true if listener is successfully registered, false otherwise */ public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName) { public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName, @Nullable String featureId) { synchronized (mGnssStatusListeners) { return addGnssDataListenerLocked( listener, packageName, featureId, "Gnss status", mGnssStatusProvider, mGnssStatusListeners, Loading @@ -636,12 +640,13 @@ public class GnssManagerService { * @return true if listener is successfully added, false otherwise */ public boolean addGnssMeasurementsListener( IGnssMeasurementsListener listener, String packageName, IGnssMeasurementsListener listener, String packageName, @Nullable String featureId, @NonNull String listenerIdentifier) { synchronized (mGnssMeasurementsListeners) { return addGnssDataListenerLocked( listener, packageName, featureId, listenerIdentifier, mGnssMeasurementsProvider, mGnssMeasurementsListeners, Loading Loading @@ -695,11 +700,12 @@ public class GnssManagerService { */ public boolean addGnssNavigationMessageListener( IGnssNavigationMessageListener listener, String packageName, @NonNull String listenerIdentifier) { @Nullable String featureId, @NonNull String listenerIdentifier) { synchronized (mGnssNavigationMessageListeners) { return addGnssDataListenerLocked( listener, packageName, featureId, listenerIdentifier, mGnssNavigationMessageProvider, mGnssNavigationMessageListeners, Loading services/core/java/com/android/server/LocationManagerService.java +42 −35 Original line number Diff line number Diff line Loading @@ -1233,9 +1233,9 @@ public class LocationManagerService extends ILocationManager.Stub { PowerManager.WakeLock mWakeLock; private Receiver(ILocationListener listener, PendingIntent intent, int pid, int uid, String packageName, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { super(new CallerIdentity(uid, pid, packageName, listenerIdentifier), String packageName, @Nullable String featureId, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { super(new CallerIdentity(uid, pid, packageName, featureId, listenerIdentifier), "LocationListener"); mListener = listener; mPendingIntent = intent; Loading Loading @@ -1360,7 +1360,8 @@ public class LocationManagerService extends ILocationManager.Stub { if (!currentlyMonitoring) { if (allowMonitoring) { return mAppOps.startOpNoThrow(op, mCallerIdentity.mUid, mCallerIdentity.mPackageName) == AppOpsManager.MODE_ALLOWED; mCallerIdentity.mPackageName, false, mCallerIdentity.mFeatureId, null) == AppOpsManager.MODE_ALLOWED; } } else { if (!allowMonitoring Loading Loading @@ -1545,11 +1546,11 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean addGnssBatchingCallback(IBatchedLocationCallback callback, String packageName, String listenerIdentifier) { String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); return mGnssManagerService == null ? false : mGnssManagerService.addGnssBatchingCallback( callback, packageName, listenerIdentifier); callback, packageName, featureId, listenerIdentifier); } @Override Loading Loading @@ -1712,10 +1713,10 @@ public class LocationManagerService extends ILocationManager.Stub { } private boolean reportLocationAccessNoThrow(int pid, int uid, String packageName, int allowedResolutionLevel, @Nullable String message) { @Nullable String featureId, int allowedResolutionLevel, @Nullable String message) { int op = resolutionLevelToOp(allowedResolutionLevel); if (op >= 0) { if (mAppOps.noteOpNoThrow(op, uid, packageName, null, message) if (mAppOps.noteOpNoThrow(op, uid, packageName, featureId, message) != AppOpsManager.MODE_ALLOWED) { return false; } Loading Loading @@ -2149,12 +2150,12 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") private Receiver getReceiverLocked(ILocationListener listener, int pid, int uid, String packageName, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { String packageName, @Nullable String featureId, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { IBinder binder = listener.asBinder(); Receiver receiver = mReceivers.get(binder); if (receiver == null) { receiver = new Receiver(listener, null, pid, uid, packageName, workSource, receiver = new Receiver(listener, null, pid, uid, packageName, featureId, workSource, hideFromAppOps, listenerIdentifier); if (!receiver.linkToListenerDeathNotificationLocked( receiver.getListener().asBinder())) { Loading @@ -2167,10 +2168,11 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") private Receiver getReceiverLocked(PendingIntent intent, int pid, int uid, String packageName, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { @Nullable String featureId, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { Receiver receiver = mReceivers.get(intent); if (receiver == null) { receiver = new Receiver(null, intent, pid, uid, packageName, workSource, receiver = new Receiver(null, intent, pid, uid, packageName, featureId, workSource, hideFromAppOps, listenerIdentifier); mReceivers.put(intent, receiver); } Loading Loading @@ -2233,7 +2235,8 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public void requestLocationUpdates(LocationRequest request, ILocationListener listener, PendingIntent intent, String packageName, String listenerIdentifier) { PendingIntent intent, String packageName, String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); synchronized (mLock) { Loading Loading @@ -2289,11 +2292,11 @@ public class LocationManagerService extends ILocationManager.Stub { Receiver receiver; if (intent != null) { receiver = getReceiverLocked(intent, pid, uid, packageName, workSource, hideFromAppOps, listenerIdentifier); receiver = getReceiverLocked(intent, pid, uid, packageName, featureId, workSource, hideFromAppOps, listenerIdentifier); } else { receiver = getReceiverLocked(listener, pid, uid, packageName, workSource, hideFromAppOps, listenerIdentifier); receiver = getReceiverLocked(listener, pid, uid, packageName, featureId, workSource, hideFromAppOps, listenerIdentifier); } requestLocationUpdatesLocked(sanitizedRequest, receiver, uid, packageName); } finally { Loading Loading @@ -2362,9 +2365,10 @@ public class LocationManagerService extends ILocationManager.Stub { synchronized (mLock) { Receiver receiver; if (intent != null) { receiver = getReceiverLocked(intent, pid, uid, packageName, null, false, ""); receiver = getReceiverLocked(intent, pid, uid, packageName, null, null, false, ""); } else { receiver = getReceiverLocked(listener, pid, uid, packageName, null, false, ""); receiver = getReceiverLocked(listener, pid, uid, packageName, null, null, false, ""); } long identity = Binder.clearCallingIdentity(); Loading Loading @@ -2408,7 +2412,7 @@ public class LocationManagerService extends ILocationManager.Stub { } @Override public Location getLastLocation(LocationRequest r, String packageName) { public Location getLastLocation(LocationRequest r, String packageName, String featureId) { synchronized (mLock) { LocationRequest request = r != null ? r : DEFAULT_LOCATION_REQUEST; int allowedResolutionLevel = getCallerAllowedResolutionLevel(); Loading Loading @@ -2483,8 +2487,8 @@ public class LocationManagerService extends ILocationManager.Stub { } // Don't report location access if there is no last location to deliver. if (lastLocation != null) { if (!reportLocationAccessNoThrow(pid, uid, packageName, allowedResolutionLevel, null)) { if (!reportLocationAccessNoThrow(pid, uid, packageName, featureId, allowedResolutionLevel, null)) { if (D) { Log.d(TAG, "not returning last loc for no op app: " + packageName); } Loading @@ -2501,9 +2505,9 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean getCurrentLocation(LocationRequest locationRequest, ICancellationSignal remoteCancellationSignal, ILocationListener listener, String packageName, String listenerIdentifier) { String packageName, String featureId, String listenerIdentifier) { // side effect of validating locationRequest and packageName Location lastLocation = getLastLocation(locationRequest, packageName); Location lastLocation = getLastLocation(locationRequest, packageName, featureId); if (lastLocation != null) { long locationAgeMs = TimeUnit.NANOSECONDS.toMillis( SystemClock.elapsedRealtimeNanos() - lastLocation.getElapsedRealtimeNanos()); Loading Loading @@ -2538,7 +2542,8 @@ public class LocationManagerService extends ILocationManager.Stub { } } requestLocationUpdates(locationRequest, listener, null, packageName, listenerIdentifier); requestLocationUpdates(locationRequest, listener, null, packageName, featureId, listenerIdentifier); CancellationSignal cancellationSignal = CancellationSignal.fromTransport( remoteCancellationSignal); if (cancellationSignal != null) { Loading Loading @@ -2588,7 +2593,7 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public void requestGeofence(LocationRequest request, Geofence geofence, PendingIntent intent, String packageName, String listenerIdentifier) { String packageName, String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); if (request == null) request = DEFAULT_LOCATION_REQUEST; Loading Loading @@ -2636,7 +2641,7 @@ public class LocationManagerService extends ILocationManager.Stub { } mGeofenceManager.addFence(sanitizedRequest, geofence, intent, allowedResolutionLevel, uid, packageName, listenerIdentifier); uid, packageName, featureId, listenerIdentifier); } finally { Binder.restoreCallingIdentity(identity); } Loading Loading @@ -2672,9 +2677,10 @@ public class LocationManagerService extends ILocationManager.Stub { } @Override public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName) { public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName, String featureId) { return mGnssManagerService == null ? false : mGnssManagerService.registerGnssStatusCallback( listener, packageName); listener, packageName, featureId); } @Override Loading @@ -2684,11 +2690,11 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean addGnssMeasurementsListener(IGnssMeasurementsListener listener, String packageName, String listenerIdentifier) { String packageName, String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); return mGnssManagerService == null ? false : mGnssManagerService.addGnssMeasurementsListener(listener, packageName, : mGnssManagerService.addGnssMeasurementsListener(listener, packageName, featureId, listenerIdentifier); } Loading Loading @@ -2717,12 +2723,12 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean addGnssNavigationMessageListener(IGnssNavigationMessageListener listener, String packageName, String listenerIdentifier) { String packageName, String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); return mGnssManagerService == null ? false : mGnssManagerService.addGnssNavigationMessageListener(listener, packageName, listenerIdentifier); featureId, listenerIdentifier); } @Override Loading Loading @@ -3028,6 +3034,7 @@ public class LocationManagerService extends ILocationManager.Stub { receiver.mCallerIdentity.mPid, receiver.mCallerIdentity.mUid, receiver.mCallerIdentity.mPackageName, receiver.mCallerIdentity.mFeatureId, receiver.mAllowedResolutionLevel, "Location sent to " + receiver.mCallerIdentity.mListenerIdentifier)) { if (D) { Loading services/core/java/com/android/server/location/CallerIdentity.java +4 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.location; import android.annotation.NonNull; import android.annotation.Nullable; /** * Represents the calling process's uid, pid, and package name. Loading @@ -25,13 +26,15 @@ public class CallerIdentity { public final int mUid; public final int mPid; public final String mPackageName; public final @Nullable String mFeatureId; public final @NonNull String mListenerIdentifier; public CallerIdentity(int uid, int pid, String packageName, public CallerIdentity(int uid, int pid, String packageName, @Nullable String featureId, @NonNull String listenerIdentifier) { mUid = uid; mPid = pid; mPackageName = packageName; mFeatureId = featureId; mListenerIdentifier = listenerIdentifier; } } Loading
location/java/android/location/ILocationManager.aidl +11 −8 Original line number Diff line number Diff line Loading @@ -42,20 +42,23 @@ import com.android.internal.location.ProviderProperties; */ interface ILocationManager { Location getLastLocation(in LocationRequest request, String packageName); Location getLastLocation(in LocationRequest request, String packageName, String featureId); boolean getCurrentLocation(in LocationRequest request, in ICancellationSignal cancellationSignal, in ILocationListener listener, String packageName, String listenerIdentifier); String packageName, String featureId, String listenerIdentifier); void requestLocationUpdates(in LocationRequest request, in ILocationListener listener, in PendingIntent intent, String packageName, String listenerIdentifier); in PendingIntent intent, String packageName, String featureId, String listenerIdentifier); void removeUpdates(in ILocationListener listener, in PendingIntent intent, String packageName); void requestGeofence(in LocationRequest request, in Geofence geofence, in PendingIntent intent, String packageName, String listenerIdentifier); in PendingIntent intent, String packageName, String featureId, String listenerIdentifier); void removeGeofence(in Geofence fence, in PendingIntent intent, String packageName); boolean registerGnssStatusCallback(IGnssStatusListener callback, String packageName); boolean registerGnssStatusCallback(IGnssStatusListener callback, String packageName, String featureId); void unregisterGnssStatusCallback(IGnssStatusListener callback); boolean geocoderIsPresent(); Loading @@ -69,14 +72,14 @@ interface ILocationManager boolean sendNiResponse(int notifId, int userResponse); boolean addGnssMeasurementsListener(in IGnssMeasurementsListener listener, String packageName, String listenerIdentifier); String packageName, String featureId, String listenerIdentifier); void injectGnssMeasurementCorrections(in GnssMeasurementCorrections corrections, in String packageName); long getGnssCapabilities(in String packageName); void removeGnssMeasurementsListener(in IGnssMeasurementsListener listener); boolean addGnssNavigationMessageListener(in IGnssNavigationMessageListener listener, String packageName, String listenerIdentifier); String packageName, String featureId, String listenerIdentifier); void removeGnssNavigationMessageListener(in IGnssNavigationMessageListener listener); int getGnssYearOfHardware(); Loading @@ -84,7 +87,7 @@ interface ILocationManager int getGnssBatchSize(String packageName); boolean addGnssBatchingCallback(in IBatchedLocationCallback callback, String packageName, String listenerIdentifier); String featureId, String listenerIdentifier); void removeGnssBatchingCallback(); boolean startGnssBatch(long periodNanos, boolean wakeOnFifoFull, String packageName); void flushGnssBatch(String packageName); Loading
location/java/android/location/LocationManager.java +17 −11 Original line number Diff line number Diff line Loading @@ -515,7 +515,8 @@ public class LocationManager { @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public Location getLastLocation() { try { return mService.getLastLocation(null, mContext.getPackageName()); return mService.getLastLocation(null, mContext.getPackageName(), mContext.getFeatureId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -547,7 +548,8 @@ public class LocationManager { provider, 0, 0, true); try { return mService.getLastLocation(request, mContext.getPackageName()); return mService.getLastLocation(request, mContext.getPackageName(), mContext.getFeatureId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -641,7 +643,7 @@ public class LocationManager { try { if (mService.getCurrentLocation(currentLocationRequest, remoteCancellationSignal, listenerTransport, mContext.getPackageName(), listenerTransport, mContext.getPackageName(), mContext.getFeatureId(), getListenerIdentifier(consumer))) { listenerTransport.register(mContext.getSystemService(AlarmManager.class), remoteCancellationSignal); Loading Loading @@ -1085,7 +1087,8 @@ public class LocationManager { boolean registered = false; try { mService.requestLocationUpdates(locationRequest, transport, null, mContext.getPackageName(), getListenerIdentifier(listener)); mContext.getPackageName(), mContext.getFeatureId(), getListenerIdentifier(listener)); registered = true; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); Loading Loading @@ -1130,7 +1133,8 @@ public class LocationManager { try { mService.requestLocationUpdates(locationRequest, null, pendingIntent, mContext.getPackageName(), getListenerIdentifier(pendingIntent)); mContext.getPackageName(), mContext.getFeatureId(), getListenerIdentifier(pendingIntent)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -1594,7 +1598,7 @@ public class LocationManager { LocationRequest request = new LocationRequest().setExpireIn(expiration); try { mService.requestGeofence(request, fence, intent, mContext.getPackageName(), getListenerIdentifier(intent)); mContext.getFeatureId(), getListenerIdentifier(intent)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -1672,7 +1676,7 @@ public class LocationManager { try { mService.requestGeofence(request, fence, intent, mContext.getPackageName(), getListenerIdentifier(intent)); mContext.getFeatureId(), getListenerIdentifier(intent)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -2748,7 +2752,7 @@ public class LocationManager { mListenerTransport = new GnssStatusListener(); return mService.registerGnssStatusCallback(mListenerTransport, mContext.getPackageName()); mContext.getPackageName(), mContext.getFeatureId()); } @Override Loading Loading @@ -2808,7 +2812,8 @@ public class LocationManager { mListenerTransport = new GnssMeasurementsListener(); return mService.addGnssMeasurementsListener(mListenerTransport, mContext.getPackageName(), "gnss measurement callback"); mContext.getPackageName(), mContext.getFeatureId(), "gnss measurement callback"); } @Override Loading Loading @@ -2844,7 +2849,8 @@ public class LocationManager { mListenerTransport = new GnssNavigationMessageListener(); return mService.addGnssNavigationMessageListener(mListenerTransport, mContext.getPackageName(), "gnss navigation callback"); mContext.getPackageName(), mContext.getFeatureId(), "gnss navigation callback"); } @Override Loading Loading @@ -2880,7 +2886,7 @@ public class LocationManager { mListenerTransport = new BatchedLocationCallback(); return mService.addGnssBatchingCallback(mListenerTransport, mContext.getPackageName(), "batched location callback"); mContext.getFeatureId(), "batched location callback"); } @Override Loading
services/core/java/com/android/server/GnssManagerService.java +12 −6 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppOpsManager; import android.content.Context; Loading Loading @@ -300,7 +301,7 @@ public class GnssManagerService { * @return true if callback is successfully added, false otherwise */ public boolean addGnssBatchingCallback(IBatchedLocationCallback callback, String packageName, @NonNull String listenerIdentity) { @Nullable String featureId, @NonNull String listenerIdentity) { mContext.enforceCallingPermission( android.Manifest.permission.LOCATION_HARDWARE, "Location Hardware permission not granted to access hardware batching"); Loading @@ -319,7 +320,7 @@ public class GnssManagerService { CallerIdentity callerIdentity = new CallerIdentity(Binder.getCallingUid(), Binder.getCallingPid(), packageName, listenerIdentity); featureId, listenerIdentity); synchronized (mGnssBatchingLock) { mGnssBatchingCallback = callback; mGnssBatchingDeathCallback = Loading Loading @@ -497,6 +498,7 @@ public class GnssManagerService { private <TListener extends IInterface> boolean addGnssDataListenerLocked( TListener listener, String packageName, @Nullable String featureId, @NonNull String listenerIdentifier, RemoteListenerHelper<TListener> gnssDataProvider, ArrayMap<IBinder, Loading @@ -517,7 +519,7 @@ public class GnssManagerService { CallerIdentity callerIdentity = new CallerIdentity(Binder.getCallingUid(), Binder.getCallingPid(), packageName, listenerIdentifier); featureId, listenerIdentifier); LinkedListener<TListener> linkedListener = new LocationManagerServiceUtils.LinkedListener<>( listener, listenerIdentifier, callerIdentity, binderDeathCallback); Loading Loading @@ -605,11 +607,13 @@ public class GnssManagerService { * @param packageName name of requesting package * @return true if listener is successfully registered, false otherwise */ public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName) { public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName, @Nullable String featureId) { synchronized (mGnssStatusListeners) { return addGnssDataListenerLocked( listener, packageName, featureId, "Gnss status", mGnssStatusProvider, mGnssStatusListeners, Loading @@ -636,12 +640,13 @@ public class GnssManagerService { * @return true if listener is successfully added, false otherwise */ public boolean addGnssMeasurementsListener( IGnssMeasurementsListener listener, String packageName, IGnssMeasurementsListener listener, String packageName, @Nullable String featureId, @NonNull String listenerIdentifier) { synchronized (mGnssMeasurementsListeners) { return addGnssDataListenerLocked( listener, packageName, featureId, listenerIdentifier, mGnssMeasurementsProvider, mGnssMeasurementsListeners, Loading Loading @@ -695,11 +700,12 @@ public class GnssManagerService { */ public boolean addGnssNavigationMessageListener( IGnssNavigationMessageListener listener, String packageName, @NonNull String listenerIdentifier) { @Nullable String featureId, @NonNull String listenerIdentifier) { synchronized (mGnssNavigationMessageListeners) { return addGnssDataListenerLocked( listener, packageName, featureId, listenerIdentifier, mGnssNavigationMessageProvider, mGnssNavigationMessageListeners, Loading
services/core/java/com/android/server/LocationManagerService.java +42 −35 Original line number Diff line number Diff line Loading @@ -1233,9 +1233,9 @@ public class LocationManagerService extends ILocationManager.Stub { PowerManager.WakeLock mWakeLock; private Receiver(ILocationListener listener, PendingIntent intent, int pid, int uid, String packageName, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { super(new CallerIdentity(uid, pid, packageName, listenerIdentifier), String packageName, @Nullable String featureId, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { super(new CallerIdentity(uid, pid, packageName, featureId, listenerIdentifier), "LocationListener"); mListener = listener; mPendingIntent = intent; Loading Loading @@ -1360,7 +1360,8 @@ public class LocationManagerService extends ILocationManager.Stub { if (!currentlyMonitoring) { if (allowMonitoring) { return mAppOps.startOpNoThrow(op, mCallerIdentity.mUid, mCallerIdentity.mPackageName) == AppOpsManager.MODE_ALLOWED; mCallerIdentity.mPackageName, false, mCallerIdentity.mFeatureId, null) == AppOpsManager.MODE_ALLOWED; } } else { if (!allowMonitoring Loading Loading @@ -1545,11 +1546,11 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean addGnssBatchingCallback(IBatchedLocationCallback callback, String packageName, String listenerIdentifier) { String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); return mGnssManagerService == null ? false : mGnssManagerService.addGnssBatchingCallback( callback, packageName, listenerIdentifier); callback, packageName, featureId, listenerIdentifier); } @Override Loading Loading @@ -1712,10 +1713,10 @@ public class LocationManagerService extends ILocationManager.Stub { } private boolean reportLocationAccessNoThrow(int pid, int uid, String packageName, int allowedResolutionLevel, @Nullable String message) { @Nullable String featureId, int allowedResolutionLevel, @Nullable String message) { int op = resolutionLevelToOp(allowedResolutionLevel); if (op >= 0) { if (mAppOps.noteOpNoThrow(op, uid, packageName, null, message) if (mAppOps.noteOpNoThrow(op, uid, packageName, featureId, message) != AppOpsManager.MODE_ALLOWED) { return false; } Loading Loading @@ -2149,12 +2150,12 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") private Receiver getReceiverLocked(ILocationListener listener, int pid, int uid, String packageName, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { String packageName, @Nullable String featureId, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { IBinder binder = listener.asBinder(); Receiver receiver = mReceivers.get(binder); if (receiver == null) { receiver = new Receiver(listener, null, pid, uid, packageName, workSource, receiver = new Receiver(listener, null, pid, uid, packageName, featureId, workSource, hideFromAppOps, listenerIdentifier); if (!receiver.linkToListenerDeathNotificationLocked( receiver.getListener().asBinder())) { Loading @@ -2167,10 +2168,11 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") private Receiver getReceiverLocked(PendingIntent intent, int pid, int uid, String packageName, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { @Nullable String featureId, WorkSource workSource, boolean hideFromAppOps, @NonNull String listenerIdentifier) { Receiver receiver = mReceivers.get(intent); if (receiver == null) { receiver = new Receiver(null, intent, pid, uid, packageName, workSource, receiver = new Receiver(null, intent, pid, uid, packageName, featureId, workSource, hideFromAppOps, listenerIdentifier); mReceivers.put(intent, receiver); } Loading Loading @@ -2233,7 +2235,8 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public void requestLocationUpdates(LocationRequest request, ILocationListener listener, PendingIntent intent, String packageName, String listenerIdentifier) { PendingIntent intent, String packageName, String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); synchronized (mLock) { Loading Loading @@ -2289,11 +2292,11 @@ public class LocationManagerService extends ILocationManager.Stub { Receiver receiver; if (intent != null) { receiver = getReceiverLocked(intent, pid, uid, packageName, workSource, hideFromAppOps, listenerIdentifier); receiver = getReceiverLocked(intent, pid, uid, packageName, featureId, workSource, hideFromAppOps, listenerIdentifier); } else { receiver = getReceiverLocked(listener, pid, uid, packageName, workSource, hideFromAppOps, listenerIdentifier); receiver = getReceiverLocked(listener, pid, uid, packageName, featureId, workSource, hideFromAppOps, listenerIdentifier); } requestLocationUpdatesLocked(sanitizedRequest, receiver, uid, packageName); } finally { Loading Loading @@ -2362,9 +2365,10 @@ public class LocationManagerService extends ILocationManager.Stub { synchronized (mLock) { Receiver receiver; if (intent != null) { receiver = getReceiverLocked(intent, pid, uid, packageName, null, false, ""); receiver = getReceiverLocked(intent, pid, uid, packageName, null, null, false, ""); } else { receiver = getReceiverLocked(listener, pid, uid, packageName, null, false, ""); receiver = getReceiverLocked(listener, pid, uid, packageName, null, null, false, ""); } long identity = Binder.clearCallingIdentity(); Loading Loading @@ -2408,7 +2412,7 @@ public class LocationManagerService extends ILocationManager.Stub { } @Override public Location getLastLocation(LocationRequest r, String packageName) { public Location getLastLocation(LocationRequest r, String packageName, String featureId) { synchronized (mLock) { LocationRequest request = r != null ? r : DEFAULT_LOCATION_REQUEST; int allowedResolutionLevel = getCallerAllowedResolutionLevel(); Loading Loading @@ -2483,8 +2487,8 @@ public class LocationManagerService extends ILocationManager.Stub { } // Don't report location access if there is no last location to deliver. if (lastLocation != null) { if (!reportLocationAccessNoThrow(pid, uid, packageName, allowedResolutionLevel, null)) { if (!reportLocationAccessNoThrow(pid, uid, packageName, featureId, allowedResolutionLevel, null)) { if (D) { Log.d(TAG, "not returning last loc for no op app: " + packageName); } Loading @@ -2501,9 +2505,9 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean getCurrentLocation(LocationRequest locationRequest, ICancellationSignal remoteCancellationSignal, ILocationListener listener, String packageName, String listenerIdentifier) { String packageName, String featureId, String listenerIdentifier) { // side effect of validating locationRequest and packageName Location lastLocation = getLastLocation(locationRequest, packageName); Location lastLocation = getLastLocation(locationRequest, packageName, featureId); if (lastLocation != null) { long locationAgeMs = TimeUnit.NANOSECONDS.toMillis( SystemClock.elapsedRealtimeNanos() - lastLocation.getElapsedRealtimeNanos()); Loading Loading @@ -2538,7 +2542,8 @@ public class LocationManagerService extends ILocationManager.Stub { } } requestLocationUpdates(locationRequest, listener, null, packageName, listenerIdentifier); requestLocationUpdates(locationRequest, listener, null, packageName, featureId, listenerIdentifier); CancellationSignal cancellationSignal = CancellationSignal.fromTransport( remoteCancellationSignal); if (cancellationSignal != null) { Loading Loading @@ -2588,7 +2593,7 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public void requestGeofence(LocationRequest request, Geofence geofence, PendingIntent intent, String packageName, String listenerIdentifier) { String packageName, String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); if (request == null) request = DEFAULT_LOCATION_REQUEST; Loading Loading @@ -2636,7 +2641,7 @@ public class LocationManagerService extends ILocationManager.Stub { } mGeofenceManager.addFence(sanitizedRequest, geofence, intent, allowedResolutionLevel, uid, packageName, listenerIdentifier); uid, packageName, featureId, listenerIdentifier); } finally { Binder.restoreCallingIdentity(identity); } Loading Loading @@ -2672,9 +2677,10 @@ public class LocationManagerService extends ILocationManager.Stub { } @Override public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName) { public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName, String featureId) { return mGnssManagerService == null ? false : mGnssManagerService.registerGnssStatusCallback( listener, packageName); listener, packageName, featureId); } @Override Loading @@ -2684,11 +2690,11 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean addGnssMeasurementsListener(IGnssMeasurementsListener listener, String packageName, String listenerIdentifier) { String packageName, String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); return mGnssManagerService == null ? false : mGnssManagerService.addGnssMeasurementsListener(listener, packageName, : mGnssManagerService.addGnssMeasurementsListener(listener, packageName, featureId, listenerIdentifier); } Loading Loading @@ -2717,12 +2723,12 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean addGnssNavigationMessageListener(IGnssNavigationMessageListener listener, String packageName, String listenerIdentifier) { String packageName, String featureId, String listenerIdentifier) { Preconditions.checkNotNull(listenerIdentifier); return mGnssManagerService == null ? false : mGnssManagerService.addGnssNavigationMessageListener(listener, packageName, listenerIdentifier); featureId, listenerIdentifier); } @Override Loading Loading @@ -3028,6 +3034,7 @@ public class LocationManagerService extends ILocationManager.Stub { receiver.mCallerIdentity.mPid, receiver.mCallerIdentity.mUid, receiver.mCallerIdentity.mPackageName, receiver.mCallerIdentity.mFeatureId, receiver.mAllowedResolutionLevel, "Location sent to " + receiver.mCallerIdentity.mListenerIdentifier)) { if (D) { Loading
services/core/java/com/android/server/location/CallerIdentity.java +4 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.location; import android.annotation.NonNull; import android.annotation.Nullable; /** * Represents the calling process's uid, pid, and package name. Loading @@ -25,13 +26,15 @@ public class CallerIdentity { public final int mUid; public final int mPid; public final String mPackageName; public final @Nullable String mFeatureId; public final @NonNull String mListenerIdentifier; public CallerIdentity(int uid, int pid, String packageName, public CallerIdentity(int uid, int pid, String packageName, @Nullable String featureId, @NonNull String listenerIdentifier) { mUid = uid; mPid = pid; mPackageName = packageName; mFeatureId = featureId; mListenerIdentifier = listenerIdentifier; } }