diff options
9 files changed, 135 insertions, 178 deletions
diff --git a/Android.bp b/Android.bp index cc9cfe95ff0a..85d812464ac4 100644 --- a/Android.bp +++ b/Android.bp @@ -439,7 +439,6 @@ java_defaults { "location/java/android/location/IGeocodeProvider.aidl", "location/java/android/location/IGeofenceProvider.aidl", "location/java/android/location/IGnssStatusListener.aidl", - "location/java/android/location/IGnssStatusProvider.aidl", "location/java/android/location/IGnssMeasurementsListener.aidl", "location/java/android/location/IGnssNavigationMessageListener.aidl", "location/java/android/location/ILocationListener.aidl", diff --git a/location/java/android/location/IGnssStatusProvider.aidl b/location/java/android/location/IGnssStatusProvider.aidl deleted file mode 100644 index 006b5d3c0c20..000000000000 --- a/location/java/android/location/IGnssStatusProvider.aidl +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.location; - -import android.location.IGnssStatusListener; - -/** - * An interface for location providers that provide GNSS status information. - * - * {@hide} - */ -interface IGnssStatusProvider { - void registerGnssStatusCallback(IGnssStatusListener callback); - void unregisterGnssStatusCallback(IGnssStatusListener callback); -} diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index cc7bf3373bdd..da19e27b5b82 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -47,7 +47,6 @@ import android.location.IBatchedLocationCallback; import android.location.IGnssMeasurementsListener; import android.location.IGnssNavigationMessageListener; import android.location.IGnssStatusListener; -import android.location.IGnssStatusProvider; import android.location.IGpsGeofenceHardware; import android.location.ILocationListener; import android.location.ILocationManager; @@ -92,6 +91,7 @@ import com.android.server.location.GnssBatchingProvider; import com.android.server.location.GnssLocationProvider; import com.android.server.location.GnssMeasurementsProvider; import com.android.server.location.GnssNavigationMessageProvider; +import com.android.server.location.GnssStatusListenerHelper; import com.android.server.location.LocationBlacklist; import com.android.server.location.LocationFudger; import com.android.server.location.LocationProviderInterface; @@ -182,7 +182,7 @@ public class LocationManagerService extends ILocationManager.Stub { private ActivityManager mActivityManager; private UserManager mUserManager; private GeocoderProxy mGeocodeProvider; - private IGnssStatusProvider mGnssStatusProvider; + private GnssStatusListenerHelper mGnssStatusProvider; private INetInitiatedListener mNetInitiatedListener; private LocationWorkerHandler mLocationHandler; private PassiveProvider mPassiveProvider; // track passive provider for special cases @@ -463,14 +463,16 @@ public class LocationManagerService extends ILocationManager.Stub { } for (Entry<IBinder, Identity> entry : mGnssMeasurementsListeners.entrySet()) { - if (entry.getValue().mUid == uid) { + Identity callerIdentity = entry.getValue(); + if (callerIdentity.mUid == uid) { if (D) { Log.d(TAG, "gnss measurements listener from uid " + uid + " is now " + (foreground ? "foreground" : "background)")); } if (foreground || isThrottlingExemptLocked(entry.getValue())) { mGnssMeasurementsProvider.addListener( - IGnssMeasurementsListener.Stub.asInterface(entry.getKey())); + IGnssMeasurementsListener.Stub.asInterface(entry.getKey()), + callerIdentity.mUid, callerIdentity.mPackageName); } else { mGnssMeasurementsProvider.removeListener( IGnssMeasurementsListener.Stub.asInterface(entry.getKey())); @@ -479,7 +481,8 @@ public class LocationManagerService extends ILocationManager.Stub { } for (Entry<IBinder, Identity> entry : mGnssNavigationMessageListeners.entrySet()) { - if (entry.getValue().mUid == uid) { + Identity callerIdentity = entry.getValue(); + if (callerIdentity.mUid == uid) { if (D) { Log.d(TAG, "gnss navigation message listener from uid " + uid + " is now " @@ -487,13 +490,16 @@ public class LocationManagerService extends ILocationManager.Stub { } if (foreground || isThrottlingExemptLocked(entry.getValue())) { mGnssNavigationMessageProvider.addListener( - IGnssNavigationMessageListener.Stub.asInterface(entry.getKey())); + IGnssNavigationMessageListener.Stub.asInterface(entry.getKey()), + callerIdentity.mUid, callerIdentity.mPackageName); } else { mGnssNavigationMessageProvider.removeListener( IGnssNavigationMessageListener.Stub.asInterface(entry.getKey())); } } } + + // TODO(b/120449926): The GNSS status listeners should be handled similar to the above. } } @@ -2444,31 +2450,20 @@ public class LocationManagerService extends ILocationManager.Stub { } } - @Override public boolean registerGnssStatusCallback(IGnssStatusListener callback, String packageName) { if (!hasGnssPermissions(packageName) || mGnssStatusProvider == null) { return false; } - try { - mGnssStatusProvider.registerGnssStatusCallback(callback); - } catch (RemoteException e) { - Slog.e(TAG, "mGpsStatusProvider.registerGnssStatusCallback failed", e); - return false; - } - return true; + // TODO(b/120449926): The GNSS status listeners should be handled similar to the GNSS + // measurements listeners. + return mGnssStatusProvider.addListener(callback, Binder.getCallingUid(), packageName); } @Override public void unregisterGnssStatusCallback(IGnssStatusListener callback) { - synchronized (mLock) { - try { - mGnssStatusProvider.unregisterGnssStatusCallback(callback); - } catch (Exception e) { - Slog.e(TAG, "mGpsStatusProvider.unregisterGnssStatusCallback failed", e); - } - } + mGnssStatusProvider.removeListener(callback); } @Override @@ -2481,13 +2476,15 @@ public class LocationManagerService extends ILocationManager.Stub { synchronized (mLock) { Identity callerIdentity = new Identity(Binder.getCallingUid(), Binder.getCallingPid(), packageName); + // TODO(b/120481270): Register for client death notification and update map. mGnssMeasurementsListeners.put(listener.asBinder(), callerIdentity); long identity = Binder.clearCallingIdentity(); try { if (isThrottlingExemptLocked(callerIdentity) || isImportanceForeground( mActivityManager.getPackageImportance(packageName))) { - return mGnssMeasurementsProvider.addListener(listener); + return mGnssMeasurementsProvider.addListener(listener, + callerIdentity.mUid, callerIdentity.mPackageName); } } finally { Binder.restoreCallingIdentity(identity); @@ -2518,13 +2515,15 @@ public class LocationManagerService extends ILocationManager.Stub { synchronized (mLock) { Identity callerIdentity = new Identity(Binder.getCallingUid(), Binder.getCallingPid(), packageName); + // TODO(b/120481270): Register for client death notification and update map. mGnssNavigationMessageListeners.put(listener.asBinder(), callerIdentity); long identity = Binder.clearCallingIdentity(); try { if (isThrottlingExemptLocked(callerIdentity) || isImportanceForeground( mActivityManager.getPackageImportance(packageName))) { - return mGnssNavigationMessageProvider.addListener(listener); + return mGnssNavigationMessageProvider.addListener(listener, + callerIdentity.mUid, callerIdentity.mPackageName); } } finally { Binder.restoreCallingIdentity(identity); diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index d5e4681a0d90..787a2d03c38c 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -31,8 +31,6 @@ import android.location.FusedBatchOptions; import android.location.GnssMeasurementsEvent; import android.location.GnssNavigationMessage; import android.location.GnssStatus; -import android.location.IGnssStatusListener; -import android.location.IGnssStatusProvider; import android.location.IGpsGeofenceHardware; import android.location.ILocationManager; import android.location.INetInitiatedListener; @@ -382,7 +380,7 @@ public class GnssLocationProvider extends LocationProviderInterface private final Context mContext; private final ILocationManager mILocationManager; private final LocationExtras mLocationExtras = new LocationExtras(); - private final GnssStatusListenerHelper mListenerHelper; + private final GnssStatusListenerHelper mGnssStatusListenerHelper; private final GnssSatelliteBlacklistHelper mGnssSatelliteBlacklistHelper; private final GnssMeasurementsProvider mGnssMeasurementsProvider; private final GnssNavigationMessageProvider mGnssNavigationMessageProvider; @@ -443,20 +441,8 @@ public class GnssLocationProvider extends LocationProviderInterface // GNSS Metrics private GnssMetrics mGnssMetrics; - private final IGnssStatusProvider mGnssStatusProvider = new IGnssStatusProvider.Stub() { - @Override - public void registerGnssStatusCallback(IGnssStatusListener callback) { - mListenerHelper.addListener(callback); - } - - @Override - public void unregisterGnssStatusCallback(IGnssStatusListener callback) { - mListenerHelper.removeListener(callback); - } - }; - - public IGnssStatusProvider getGnssStatusProvider() { - return mGnssStatusProvider; + public GnssStatusListenerHelper getGnssStatusProvider() { + return mGnssStatusListenerHelper; } public IGpsGeofenceHardware getGpsGeofenceProxy() { @@ -730,7 +716,7 @@ public class GnssLocationProvider extends LocationProviderInterface mNetInitiatedListener, mSuplEsEnabled); - mListenerHelper = new GnssStatusListenerHelper(mHandler) { + mGnssStatusListenerHelper = new GnssStatusListenerHelper(mContext, mHandler) { @Override protected boolean isAvailableInPlatform() { return isSupported(); @@ -749,7 +735,7 @@ public class GnssLocationProvider extends LocationProviderInterface } }; - mGnssNavigationMessageProvider = new GnssNavigationMessageProvider(mHandler) { + mGnssNavigationMessageProvider = new GnssNavigationMessageProvider(mContext, mHandler) { @Override protected boolean isGpsEnabled() { return isEnabled(); @@ -1473,7 +1459,7 @@ public class GnssLocationProvider extends LocationProviderInterface } // notify status listeners - mListenerHelper.onFirstFix(mTimeToFirstFix); + mGnssStatusListenerHelper.onFirstFix(mTimeToFirstFix); } if (mSingleShot) { @@ -1527,7 +1513,7 @@ public class GnssLocationProvider extends LocationProviderInterface } if (wasNavigating != mNavigating) { - mListenerHelper.onStatusChanged(mNavigating); + mGnssStatusListenerHelper.onStatusChanged(mNavigating); // send an intent to notify that the GPS has been enabled or disabled Intent intent = new Intent(LocationManager.GPS_ENABLED_CHANGE_ACTION); @@ -1563,7 +1549,7 @@ public class GnssLocationProvider extends LocationProviderInterface } private void handleReportSvStatus(SvStatusInfo info) { - mListenerHelper.onSvStatusChanged( + mGnssStatusListenerHelper.onSvStatusChanged( info.mSvCount, info.mSvidWithFlags, info.mCn0s, @@ -1636,7 +1622,7 @@ public class GnssLocationProvider extends LocationProviderInterface if (!mItarSpeedLimitExceeded) { int length = native_read_nmea(mNmeaBuffer, mNmeaBuffer.length); String nmea = new String(mNmeaBuffer, 0 /* offset */, length); - mListenerHelper.onNmeaReceived(timestamp, nmea); + mGnssStatusListenerHelper.onNmeaReceived(timestamp, nmea); } } diff --git a/services/core/java/com/android/server/location/GnssMeasurementsProvider.java b/services/core/java/com/android/server/location/GnssMeasurementsProvider.java index 0add86315487..3e2ba87a033e 100644 --- a/services/core/java/com/android/server/location/GnssMeasurementsProvider.java +++ b/services/core/java/com/android/server/location/GnssMeasurementsProvider.java @@ -38,7 +38,6 @@ public abstract class GnssMeasurementsProvider extends private static final String TAG = "GnssMeasurementsProvider"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private final Context mContext; private final GnssMeasurementProviderNative mNative; private boolean mIsCollectionStarted; @@ -51,8 +50,7 @@ public abstract class GnssMeasurementsProvider extends @VisibleForTesting GnssMeasurementsProvider(Context context, Handler handler, GnssMeasurementProviderNative aNative) { - super(handler, TAG); - mContext = context; + super(context, handler, TAG); mNative = aNative; } @@ -98,9 +96,13 @@ public abstract class GnssMeasurementsProvider extends } public void onMeasurementsAvailable(final GnssMeasurementsEvent event) { - ListenerOperation<IGnssMeasurementsListener> operation = - listener -> listener.onGnssMeasurementsReceived(event); - foreach(operation); + foreach((IGnssMeasurementsListener listener, int uid, String packageName) -> { + if (!hasPermission(uid, packageName)) { + logPermissionDisabledEventNotReported(TAG, packageName, "GNSS measurements"); + return; + } + listener.onGnssMeasurementsReceived(event); + }); } public void onCapabilitiesUpdated(boolean isGnssMeasurementsSupported) { @@ -149,7 +151,8 @@ public abstract class GnssMeasurementsProvider extends } @Override - public void execute(IGnssMeasurementsListener listener) throws RemoteException { + public void execute(IGnssMeasurementsListener listener, + int uid, String packageName) throws RemoteException { listener.onStatusChanged(mStatus); } } diff --git a/services/core/java/com/android/server/location/GnssNavigationMessageProvider.java b/services/core/java/com/android/server/location/GnssNavigationMessageProvider.java index 1b4fd187051a..679919f8fc67 100644 --- a/services/core/java/com/android/server/location/GnssNavigationMessageProvider.java +++ b/services/core/java/com/android/server/location/GnssNavigationMessageProvider.java @@ -16,6 +16,7 @@ package com.android.server.location; +import android.content.Context; import android.location.GnssNavigationMessage; import android.location.IGnssNavigationMessageListener; import android.os.Handler; @@ -39,13 +40,14 @@ public abstract class GnssNavigationMessageProvider private final GnssNavigationMessageProviderNative mNative; private boolean mCollectionStarted; - protected GnssNavigationMessageProvider(Handler handler) { - this(handler, new GnssNavigationMessageProviderNative()); + protected GnssNavigationMessageProvider(Context context, Handler handler) { + this(context, handler, new GnssNavigationMessageProviderNative()); } @VisibleForTesting - GnssNavigationMessageProvider(Handler handler, GnssNavigationMessageProviderNative aNative) { - super(handler, TAG); + GnssNavigationMessageProvider(Context context, Handler handler, + GnssNavigationMessageProviderNative aNative) { + super(context, handler, TAG); mNative = aNative; } @@ -84,15 +86,10 @@ public abstract class GnssNavigationMessageProvider } public void onNavigationMessageAvailable(final GnssNavigationMessage event) { - ListenerOperation<IGnssNavigationMessageListener> operation = - new ListenerOperation<IGnssNavigationMessageListener>() { - @Override - public void execute(IGnssNavigationMessageListener listener) - throws RemoteException { - listener.onGnssNavigationMessageReceived(event); - } - }; - foreach(operation); + foreach((IGnssNavigationMessageListener listener, int uid, String packageName) -> { + listener.onGnssNavigationMessageReceived(event); + } + ); } public void onCapabilitiesUpdated(boolean isGnssNavigationMessageSupported) { @@ -138,7 +135,8 @@ public abstract class GnssNavigationMessageProvider } @Override - public void execute(IGnssNavigationMessageListener listener) throws RemoteException { + public void execute(IGnssNavigationMessageListener listener, + int uid, String packageName) throws RemoteException { listener.onStatusChanged(mStatus); } } diff --git a/services/core/java/com/android/server/location/GnssStatusListenerHelper.java b/services/core/java/com/android/server/location/GnssStatusListenerHelper.java index 124220f17f1f..454dbddc406a 100644 --- a/services/core/java/com/android/server/location/GnssStatusListenerHelper.java +++ b/services/core/java/com/android/server/location/GnssStatusListenerHelper.java @@ -16,16 +16,20 @@ package com.android.server.location; +import android.content.Context; import android.location.IGnssStatusListener; import android.os.Handler; -import android.os.RemoteException; +import android.util.Log; /** * Implementation of a handler for {@link IGnssStatusListener}. */ -abstract class GnssStatusListenerHelper extends RemoteListenerHelper<IGnssStatusListener> { - protected GnssStatusListenerHelper(Handler handler) { - super(handler, "GnssStatusListenerHelper"); +public abstract class GnssStatusListenerHelper extends RemoteListenerHelper<IGnssStatusListener> { + private static final String TAG = "GnssStatusListenerHelper"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + protected GnssStatusListenerHelper(Context context, Handler handler) { + super(context, handler, TAG); setSupported(GnssLocationProvider.isSupported()); } @@ -43,33 +47,22 @@ abstract class GnssStatusListenerHelper extends RemoteListenerHelper<IGnssStatus } public void onStatusChanged(boolean isNavigating) { - Operation operation; if (isNavigating) { - operation = new Operation() { - @Override - public void execute(IGnssStatusListener listener) throws RemoteException { - listener.onGnssStarted(); - } - }; + foreach((IGnssStatusListener listener, int uid, String packageName) -> { + listener.onGnssStarted(); + }); } else { - operation = new Operation() { - @Override - public void execute(IGnssStatusListener listener) throws RemoteException { - listener.onGnssStopped(); - } - }; + foreach((IGnssStatusListener listener, int uid, String packageName) -> { + listener.onGnssStopped(); + }); } - foreach(operation); } public void onFirstFix(final int timeToFirstFix) { - Operation operation = new Operation() { - @Override - public void execute(IGnssStatusListener listener) throws RemoteException { - listener.onFirstFix(timeToFirstFix); - } - }; - foreach(operation); + foreach((IGnssStatusListener listener, int uid, String packageName) -> { + listener.onFirstFix(timeToFirstFix); + } + ); } public void onSvStatusChanged( @@ -79,30 +72,23 @@ abstract class GnssStatusListenerHelper extends RemoteListenerHelper<IGnssStatus final float[] elevations, final float[] azimuths, final float[] carrierFreqs) { - Operation operation = new Operation() { - @Override - public void execute(IGnssStatusListener listener) throws RemoteException { - listener.onSvStatusChanged( - svCount, - prnWithFlags, - cn0s, - elevations, - azimuths, - carrierFreqs); + foreach((IGnssStatusListener listener, int uid, String packageName) -> { + if (!hasPermission(uid, packageName)) { + logPermissionDisabledEventNotReported(TAG, packageName, "GNSS status"); + return; } - }; - foreach(operation); + listener.onSvStatusChanged(svCount, prnWithFlags, cn0s, elevations, azimuths, + carrierFreqs); + }); } public void onNmeaReceived(final long timestamp, final String nmea) { - Operation operation = new Operation() { - @Override - public void execute(IGnssStatusListener listener) throws RemoteException { - listener.onNmeaReceived(timestamp, nmea); + foreach((IGnssStatusListener listener, int uid, String packageName) -> { + if (!hasPermission(uid, packageName)) { + logPermissionDisabledEventNotReported(TAG, packageName, "NMEA"); + return; } - }; - foreach(operation); + listener.onNmeaReceived(timestamp, nmea); + }); } - - private interface Operation extends ListenerOperation<IGnssStatusListener> {} } diff --git a/services/core/java/com/android/server/location/RemoteListenerHelper.java b/services/core/java/com/android/server/location/RemoteListenerHelper.java index fcdb9d1a87ca..37d43fc1da69 100644 --- a/services/core/java/com/android/server/location/RemoteListenerHelper.java +++ b/services/core/java/com/android/server/location/RemoteListenerHelper.java @@ -17,6 +17,8 @@ package com.android.server.location; import android.annotation.NonNull; +import android.app.AppOpsManager; +import android.content.Context; import android.os.Handler; import android.os.IBinder; import android.os.IInterface; @@ -46,6 +48,9 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { private final Map<IBinder, LinkedListener> mListenerMap = new HashMap<>(); + protected final Context mContext; + protected final AppOpsManager mAppOps; + private volatile boolean mIsRegistered; // must access only on handler thread, or read-only private boolean mHasIsSupported; @@ -53,10 +58,12 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { private int mLastReportedResult = RESULT_UNKNOWN; - protected RemoteListenerHelper(Handler handler, String name) { + protected RemoteListenerHelper(Context context, Handler handler, String name) { Preconditions.checkNotNull(name); mHandler = handler; mTag = name; + mContext = context; + mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); } // read-only access for a dump() thread assured via volatile @@ -64,10 +71,10 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { return mIsRegistered; } - public boolean addListener(@NonNull TListener listener) { + public boolean addListener(@NonNull TListener listener, int uid, String packageName) { Preconditions.checkNotNull(listener, "Attempted to register a 'null' listener."); IBinder binder = listener.asBinder(); - LinkedListener deathListener = new LinkedListener(listener); + LinkedListener deathListener = new LinkedListener(listener, uid, packageName); synchronized (mListenerMap) { if (mListenerMap.containsKey(binder)) { // listener already added @@ -102,7 +109,7 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { // asynchronously in the future return true; } - post(listener, getHandlerOperation(result)); + post(deathListener, getHandlerOperation(result)); } return true; } @@ -130,7 +137,7 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { protected abstract ListenerOperation<TListener> getHandlerOperation(int result); protected interface ListenerOperation<TListener extends IInterface> { - void execute(TListener listener) throws RemoteException; + void execute(TListener listener, int uid, String packageName) throws RemoteException; } protected void foreach(ListenerOperation<TListener> operation) { @@ -170,15 +177,28 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { } } + protected boolean hasPermission(int uid, String packageName) { + return mAppOps.noteOpNoThrow(AppOpsManager.OP_FINE_LOCATION, uid, packageName) + == AppOpsManager.MODE_ALLOWED; + } + + protected void logPermissionDisabledEventNotReported(String tag, String packageName, + String event) { + if (Log.isLoggable(tag, Log.DEBUG)) { + Log.d(tag, "Location permission disabled. Skipping " + event + " reporting for app: " + + packageName); + } + } + private void foreachUnsafe(ListenerOperation<TListener> operation) { for (LinkedListener linkedListener : mListenerMap.values()) { - post(linkedListener.getUnderlyingListener(), operation); + post(linkedListener, operation); } } - private void post(TListener listener, ListenerOperation<TListener> operation) { + private void post(LinkedListener linkedListener, ListenerOperation<TListener> operation) { if (operation != null) { - mHandler.post(new HandlerRunnable(listener, operation)); + mHandler.post(new HandlerRunnable(linkedListener, operation)); } } @@ -193,13 +213,9 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { } if (!mIsRegistered) { // post back a failure - mHandler.post(new Runnable() { - @Override - public void run() { - synchronized (mListenerMap) { - ListenerOperation<TListener> operation = getHandlerOperation(registrationState); - foreachUnsafe(operation); - } + mHandler.post(() -> { + synchronized (mListenerMap) { + foreachUnsafe(getHandlerOperation(registrationState)); } }); } @@ -208,16 +224,14 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { } private void tryUnregister() { - mHandler.post(new Runnable() { - @Override - public void run() { - if (!mIsRegistered) { - return; + mHandler.post(() -> { + if (!mIsRegistered) { + return; + } + unregisterFromService(); + mIsRegistered = false; } - unregisterFromService(); - mIsRegistered = false; - } - }); + ); } private int calculateCurrentResultUnsafe() { @@ -240,14 +254,13 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { private class LinkedListener implements IBinder.DeathRecipient { private final TListener mListener; + private final int mUid; + private final String mPackageName; - public LinkedListener(@NonNull TListener listener) { + LinkedListener(@NonNull TListener listener, int uid, String packageName) { mListener = listener; - } - - @NonNull - public TListener getUnderlyingListener() { - return mListener; + mUid = uid; + mPackageName = packageName; } @Override @@ -258,18 +271,19 @@ abstract class RemoteListenerHelper<TListener extends IInterface> { } private class HandlerRunnable implements Runnable { - private final TListener mListener; + private final LinkedListener mLinkedListener; private final ListenerOperation<TListener> mOperation; - public HandlerRunnable(TListener listener, ListenerOperation<TListener> operation) { - mListener = listener; + HandlerRunnable(LinkedListener linkedListener, ListenerOperation<TListener> operation) { + mLinkedListener = linkedListener; mOperation = operation; } @Override public void run() { try { - mOperation.execute(mListener); + mOperation.execute(mLinkedListener.mListener, mLinkedListener.mUid, + mLinkedListener.mPackageName); } catch (RemoteException e) { Log.v(mTag, "Error in monitored listener.", e); } diff --git a/services/robotests/src/com/android/server/location/GnssNavigationMessageProviderTest.java b/services/robotests/src/com/android/server/location/GnssNavigationMessageProviderTest.java index 59e9a15efb53..aa2a96e6fad4 100644 --- a/services/robotests/src/com/android/server/location/GnssNavigationMessageProviderTest.java +++ b/services/robotests/src/com/android/server/location/GnssNavigationMessageProviderTest.java @@ -16,6 +16,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; /** * Unit tests for {@link GnssNavigationMessageProvider}. @@ -33,8 +34,8 @@ public class GnssNavigationMessageProviderTest { when(mMockNative.startNavigationMessageCollection()).thenReturn(true); when(mMockNative.stopNavigationMessageCollection()).thenReturn(true); - mTestProvider = new GnssNavigationMessageProvider(new Handler(Looper.myLooper()), - mMockNative) { + mTestProvider = new GnssNavigationMessageProvider(RuntimeEnvironment.application, + new Handler(Looper.myLooper()), mMockNative) { @Override public boolean isGpsEnabled() { return true; |