Loading location/java/android/location/util/listeners/AbstractListenerManager.java +57 −33 Original line number Diff line number Diff line Loading @@ -78,13 +78,6 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, return mRequest; } /** * Returns the listener, or null if this registration is no longer registered. */ protected @Nullable TListener getListener() { return mListener; } boolean register() { Preconditions.checkState(mListener != null); return onRegister(); Loading Loading @@ -145,6 +138,9 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, @GuardedBy("mRegistrations") private final ReentrancyGuard mReentrancyGuard = new ReentrancyGuard(); @GuardedBy("mRegistrations") private boolean mActiveRegistrations = false; @GuardedBy("mRegistrations") private boolean mServiceRegistered = false; Loading Loading @@ -216,12 +212,12 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, updateService(); } @GuardedBy("mRegistrations") private void updateService() { if (Build.IS_DEBUGGABLE) { Preconditions.checkState(Thread.holdsLock(mRegistrations)); } /** * Forces a re-evalution of the active state of all registrations, the merged request for all * active registrations, and service registration state. */ protected void updateService() { synchronized (mRegistrations) { ArrayList<TRegistration> actives = new ArrayList<>(mRegistrations.size()); for (int i = 0; i < mRegistrations.size(); i++) { TRegistration registration = mRegistrations.valueAt(i); Loading @@ -236,7 +232,17 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, mServiceRegistered = false; } mCurrentRequest = null; if (mActiveRegistrations) { mActiveRegistrations = false; onInactive(); } return; } else { if (!mActiveRegistrations) { mActiveRegistrations = true; onActive(); } } TMergedRequest merged = mergeRequests(actives); Loading @@ -248,6 +254,7 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, mServiceRegistered = registerService(mCurrentRequest); } } } /** * Defines whether a registration is currently active or not. Only active registrations will be Loading @@ -264,7 +271,8 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, /** * Performs some function on all (not just active) registrations. The function should return * true if the active state of the registration has changed, or if the change to the * registration may have changed the result of {@link #mergeRequests(List)}. * registration may have changed the result of {@link #mergeRequests(List)}. If the function * returns true for any registration, {@link #updateService()} will be invoked. */ protected final void updateRegistrations(@NonNull Function<TRegistration, Boolean> function) { synchronized (mRegistrations) { Loading Loading @@ -307,6 +315,22 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, */ protected abstract void unregisterService(); /** * Invoked when the listener goes from having no active registrations to having some active * registrations. This is a convenient entry point for registering listeners, etc, which only * need to be present while there are active registrations. This method will always be invoked * before a corrosponding call to {@link #registerService(Object)}. */ protected void onActive() {} /** * Invoked when the listener goes from having some active registrations to having no active * registrations. This is a convenient entry point for unregistering listeners, etc, which only * need to be present while there are active registrations. This method will always be invoked * after a corrosponding call to {@link #unregisterService()}. */ protected void onInactive() {} /** * Invoked when a registration is added. */ Loading services/core/java/com/android/server/location/GnssMeasurementsProvider.java +20 −2 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.server.location.gnss.GnssManagerService; import com.android.server.location.util.listeners.GnssListenerManager; import java.util.List; import java.util.Objects; /** * An base implementation for GNSS measurements provider. It abstracts out the responsibility of Loading @@ -37,7 +38,8 @@ import java.util.List; * @hide */ public class GnssMeasurementsProvider extends GnssListenerManager<GnssRequest, IGnssMeasurementsListener, Boolean> { GnssListenerManager<GnssRequest, IGnssMeasurementsListener, Boolean> implements SettingsHelper.GlobalSettingChangedListener { private final LocationUsageLogger mLogger; private final GnssMeasurementProviderNative mNative; Loading Loading @@ -94,6 +96,22 @@ public class GnssMeasurementsProvider extends } } @Override protected void onActive() { mSettingsHelper.addOnGnssMeasurementsFullTrackingEnabledChangedListener(this); } @Override protected void onInactive() { mSettingsHelper.removeOnGnssMeasurementsFullTrackingEnabledChangedListener(this); } @Override public void onSettingChanged() { // GNSS Measurements Full Tracking dev setting changed updateService(); } @Override protected Boolean mergeRequests(List<GnssRegistration> registrations) { if (mSettingsHelper.isGnssMeasurementsFullTrackingEnabled()) { Loading @@ -101,7 +119,7 @@ public class GnssMeasurementsProvider extends } for (GnssRegistration registration : registrations) { if (registration.getRequest().isFullTracking()) { if (Objects.requireNonNull(registration.getRequest()).isFullTracking()) { return true; } } Loading services/core/java/com/android/server/location/SettingsHelper.java +59 −19 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ public class SettingsHelper { private final IntegerSecureSetting mLocationMode; private final LongGlobalSetting mBackgroundThrottleIntervalMs; private final BooleanGlobalSetting mGnssMeasurementFullTracking; private final StringListCachedSecureSetting mLocationPackageBlacklist; private final StringListCachedSecureSetting mLocationPackageWhitelist; private final StringSetCachedGlobalSetting mBackgroundThrottlePackageWhitelist; Loading @@ -110,6 +111,8 @@ public class SettingsHelper { mLocationMode = new IntegerSecureSetting(context, LOCATION_MODE, handler); mBackgroundThrottleIntervalMs = new LongGlobalSetting(context, LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS, handler); mGnssMeasurementFullTracking = new BooleanGlobalSetting(context, ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, handler); mLocationPackageBlacklist = new StringListCachedSecureSetting(context, LOCATION_PACKAGE_BLACKLIST, handler); mLocationPackageWhitelist = new StringListCachedSecureSetting(context, Loading Loading @@ -245,6 +248,30 @@ public class SettingsHelper { mBackgroundThrottlePackageWhitelist.removeListener(listener); } /** * Retrieve the gnss measurements full tracking enabled setting. */ public boolean isGnssMeasurementsFullTrackingEnabled() { return mGnssMeasurementFullTracking.getValue(false); } /** * Add a listener for changes to the background throttle package whitelist. Callbacks occur on * an unspecified thread. */ public void addOnGnssMeasurementsFullTrackingEnabledChangedListener( GlobalSettingChangedListener listener) { mGnssMeasurementFullTracking.addListener(listener); } /** * Remove a listener for changes to the background throttle package whitelist. */ public void removeOnGnssMeasurementsFullTrackingEnabledChangedListener( GlobalSettingChangedListener listener) { mGnssMeasurementFullTracking.removeListener(listener); } /** * Retrieve the ignore settings package whitelist. */ Loading Loading @@ -283,19 +310,6 @@ public class SettingsHelper { } } /** * Retrieve the gnss measurements full tracking enabled setting. */ public boolean isGnssMeasurementsFullTrackingEnabled() { long identity = Binder.clearCallingIdentity(); try { return Settings.Global.getInt(mContext.getContentResolver(), ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, 0) == 1; } finally { Binder.restoreCallingIdentity(identity); } } /** * Retrieve the accuracy for coarsening location, ie, the grid size used for snap-to-grid * coarsening. Loading Loading @@ -395,7 +409,7 @@ public class SettingsHelper { @GuardedBy("this") private boolean mRegistered; private ObservingSetting(Handler handler) { ObservingSetting(Handler handler) { super(handler); mListeners = new CopyOnWriteArrayList<>(); } Loading Loading @@ -439,13 +453,13 @@ public class SettingsHelper { private final Context mContext; private final String mSettingName; private IntegerSecureSetting(Context context, String settingName, Handler handler) { IntegerSecureSetting(Context context, String settingName, Handler handler) { super(handler); mContext = context; mSettingName = settingName; } private void register() { void register() { register(mContext, Settings.Secure.getUriFor(mSettingName)); } Loading @@ -470,7 +484,7 @@ public class SettingsHelper { @GuardedBy("this") private List<String> mCachedValue; private StringListCachedSecureSetting(Context context, String settingName, StringListCachedSecureSetting(Context context, String settingName, Handler handler) { super(handler); mContext = context; Loading Loading @@ -524,12 +538,38 @@ public class SettingsHelper { } } private static class BooleanGlobalSetting extends ObservingSetting { private final Context mContext; private final String mSettingName; BooleanGlobalSetting(Context context, String settingName, Handler handler) { super(handler); mContext = context; mSettingName = settingName; } public void register() { register(mContext, Settings.Global.getUriFor(mSettingName)); } public boolean getValue(boolean defaultValue) { long identity = Binder.clearCallingIdentity(); try { return Settings.Global.getInt(mContext.getContentResolver(), mSettingName, defaultValue ? 1 : 0) != 0; } finally { Binder.restoreCallingIdentity(identity); } } } private static class LongGlobalSetting extends ObservingSetting { private final Context mContext; private final String mSettingName; private LongGlobalSetting(Context context, String settingName, Handler handler) { LongGlobalSetting(Context context, String settingName, Handler handler) { super(handler); mContext = context; mSettingName = settingName; Loading Loading @@ -561,7 +601,7 @@ public class SettingsHelper { @GuardedBy("this") private ArraySet<String> mCachedValue; private StringSetCachedGlobalSetting(Context context, String settingName, StringSetCachedGlobalSetting(Context context, String settingName, Supplier<ArraySet<String>> baseValuesSupplier, Handler handler) { super(handler); mContext = context; Loading services/core/java/com/android/server/location/gnss/GnssManagerService.java +2 −3 Original line number Diff line number Diff line Loading @@ -313,9 +313,8 @@ public class GnssManagerService { /** * Adds a GNSS measurements listener. */ public void addGnssMeasurementsListener(@Nullable GnssRequest request, IGnssMeasurementsListener listener, String packageName, @Nullable String featureId) { public void addGnssMeasurementsListener(GnssRequest request, IGnssMeasurementsListener listener, String packageName, @Nullable String featureId) { mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION, null); if (request.isFullTracking()) { mContext.enforceCallingOrSelfPermission(Manifest.permission.LOCATION_HARDWARE, null); Loading services/tests/mockingservicestests/src/com/android/server/location/util/listeners/AbstractListenerManagerTest.java +29 −3 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(0); mListenerManager.notifyListeners(); Loading @@ -69,6 +70,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener); mListenerManager.removeListener(listener); assertThat(mListenerManager.mRegistered).isFalse(); assertThat(mListenerManager.mActive).isFalse(); mListenerManager.notifyListeners(); verify(listener, never()).run(); Loading @@ -83,6 +85,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener1); mListenerManager.addListener(1, listener2); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(1); mListenerManager.notifyListeners(); Loading @@ -92,6 +95,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener3); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(1); mListenerManager.notifyListeners(); Loading @@ -101,6 +105,7 @@ public class AbstractListenerManagerTest { mListenerManager.removeListener(listener2); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(0); mListenerManager.notifyListeners(); Loading @@ -111,6 +116,7 @@ public class AbstractListenerManagerTest { mListenerManager.removeListener(listener1); mListenerManager.removeListener(listener3); assertThat(mListenerManager.mRegistered).isFalse(); assertThat(mListenerManager.mActive).isFalse(); } @Test Loading @@ -133,12 +139,14 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener); mListenerManager.setActive(0, false); assertThat(mListenerManager.mRegistered).isFalse(); assertThat(mListenerManager.mActive).isFalse(); mListenerManager.notifyListeners(); verify(listener, never()).run(); mListenerManager.setActive(0, true); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(0); mListenerManager.notifyListeners(); Loading @@ -155,6 +163,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(2, listener2); mListenerManager.addListener(1, listener3); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(2); mListenerManager.notifyListeners(); Loading @@ -164,6 +173,7 @@ public class AbstractListenerManagerTest { mListenerManager.setActive(2, false); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(1); mListenerManager.notifyListeners(); Loading @@ -173,6 +183,7 @@ public class AbstractListenerManagerTest { mListenerManager.setActive(2, true); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(2); mListenerManager.notifyListeners(); Loading @@ -184,12 +195,13 @@ public class AbstractListenerManagerTest { mListenerManager.setActive(1, false); mListenerManager.setActive(2, false); assertThat(mListenerManager.mRegistered).isFalse(); assertThat(mListenerManager.mActive).isFalse(); } private static class TestRegistration extends AbstractListenerManager.Registration<Integer, Runnable> { private boolean mActive = true; boolean mActive = true; protected TestRegistration(Integer integer, Runnable runnable) { super(integer, DIRECT_EXECUTOR, runnable); Loading @@ -199,8 +211,12 @@ public class AbstractListenerManagerTest { private static class TestListenerManager extends AbstractListenerManager<Runnable, Integer, Runnable, TestRegistration, Integer> { private boolean mRegistered; private int mMergedRequest; boolean mActive; boolean mRegistered; int mMergedRequest; TestListenerManager() { } public void addListener(Integer request, Runnable listener) { addRegistration(listener, new TestRegistration(request, listener)); Loading Loading @@ -245,6 +261,16 @@ public class AbstractListenerManagerTest { return registration.mActive; } @Override protected void onActive() { mActive = true; } @Override protected void onInactive() { mActive = false; } @Override protected Integer mergeRequests(List<TestRegistration> testRegistrations) { int max = Integer.MIN_VALUE; Loading Loading
location/java/android/location/util/listeners/AbstractListenerManager.java +57 −33 Original line number Diff line number Diff line Loading @@ -78,13 +78,6 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, return mRequest; } /** * Returns the listener, or null if this registration is no longer registered. */ protected @Nullable TListener getListener() { return mListener; } boolean register() { Preconditions.checkState(mListener != null); return onRegister(); Loading Loading @@ -145,6 +138,9 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, @GuardedBy("mRegistrations") private final ReentrancyGuard mReentrancyGuard = new ReentrancyGuard(); @GuardedBy("mRegistrations") private boolean mActiveRegistrations = false; @GuardedBy("mRegistrations") private boolean mServiceRegistered = false; Loading Loading @@ -216,12 +212,12 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, updateService(); } @GuardedBy("mRegistrations") private void updateService() { if (Build.IS_DEBUGGABLE) { Preconditions.checkState(Thread.holdsLock(mRegistrations)); } /** * Forces a re-evalution of the active state of all registrations, the merged request for all * active registrations, and service registration state. */ protected void updateService() { synchronized (mRegistrations) { ArrayList<TRegistration> actives = new ArrayList<>(mRegistrations.size()); for (int i = 0; i < mRegistrations.size(); i++) { TRegistration registration = mRegistrations.valueAt(i); Loading @@ -236,7 +232,17 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, mServiceRegistered = false; } mCurrentRequest = null; if (mActiveRegistrations) { mActiveRegistrations = false; onInactive(); } return; } else { if (!mActiveRegistrations) { mActiveRegistrations = true; onActive(); } } TMergedRequest merged = mergeRequests(actives); Loading @@ -248,6 +254,7 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, mServiceRegistered = registerService(mCurrentRequest); } } } /** * Defines whether a registration is currently active or not. Only active registrations will be Loading @@ -264,7 +271,8 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, /** * Performs some function on all (not just active) registrations. The function should return * true if the active state of the registration has changed, or if the change to the * registration may have changed the result of {@link #mergeRequests(List)}. * registration may have changed the result of {@link #mergeRequests(List)}. If the function * returns true for any registration, {@link #updateService()} will be invoked. */ protected final void updateRegistrations(@NonNull Function<TRegistration, Boolean> function) { synchronized (mRegistrations) { Loading Loading @@ -307,6 +315,22 @@ public abstract class AbstractListenerManager<TKey, TRequest, TListener, */ protected abstract void unregisterService(); /** * Invoked when the listener goes from having no active registrations to having some active * registrations. This is a convenient entry point for registering listeners, etc, which only * need to be present while there are active registrations. This method will always be invoked * before a corrosponding call to {@link #registerService(Object)}. */ protected void onActive() {} /** * Invoked when the listener goes from having some active registrations to having no active * registrations. This is a convenient entry point for unregistering listeners, etc, which only * need to be present while there are active registrations. This method will always be invoked * after a corrosponding call to {@link #unregisterService()}. */ protected void onInactive() {} /** * Invoked when a registration is added. */ Loading
services/core/java/com/android/server/location/GnssMeasurementsProvider.java +20 −2 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.server.location.gnss.GnssManagerService; import com.android.server.location.util.listeners.GnssListenerManager; import java.util.List; import java.util.Objects; /** * An base implementation for GNSS measurements provider. It abstracts out the responsibility of Loading @@ -37,7 +38,8 @@ import java.util.List; * @hide */ public class GnssMeasurementsProvider extends GnssListenerManager<GnssRequest, IGnssMeasurementsListener, Boolean> { GnssListenerManager<GnssRequest, IGnssMeasurementsListener, Boolean> implements SettingsHelper.GlobalSettingChangedListener { private final LocationUsageLogger mLogger; private final GnssMeasurementProviderNative mNative; Loading Loading @@ -94,6 +96,22 @@ public class GnssMeasurementsProvider extends } } @Override protected void onActive() { mSettingsHelper.addOnGnssMeasurementsFullTrackingEnabledChangedListener(this); } @Override protected void onInactive() { mSettingsHelper.removeOnGnssMeasurementsFullTrackingEnabledChangedListener(this); } @Override public void onSettingChanged() { // GNSS Measurements Full Tracking dev setting changed updateService(); } @Override protected Boolean mergeRequests(List<GnssRegistration> registrations) { if (mSettingsHelper.isGnssMeasurementsFullTrackingEnabled()) { Loading @@ -101,7 +119,7 @@ public class GnssMeasurementsProvider extends } for (GnssRegistration registration : registrations) { if (registration.getRequest().isFullTracking()) { if (Objects.requireNonNull(registration.getRequest()).isFullTracking()) { return true; } } Loading
services/core/java/com/android/server/location/SettingsHelper.java +59 −19 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ public class SettingsHelper { private final IntegerSecureSetting mLocationMode; private final LongGlobalSetting mBackgroundThrottleIntervalMs; private final BooleanGlobalSetting mGnssMeasurementFullTracking; private final StringListCachedSecureSetting mLocationPackageBlacklist; private final StringListCachedSecureSetting mLocationPackageWhitelist; private final StringSetCachedGlobalSetting mBackgroundThrottlePackageWhitelist; Loading @@ -110,6 +111,8 @@ public class SettingsHelper { mLocationMode = new IntegerSecureSetting(context, LOCATION_MODE, handler); mBackgroundThrottleIntervalMs = new LongGlobalSetting(context, LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS, handler); mGnssMeasurementFullTracking = new BooleanGlobalSetting(context, ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, handler); mLocationPackageBlacklist = new StringListCachedSecureSetting(context, LOCATION_PACKAGE_BLACKLIST, handler); mLocationPackageWhitelist = new StringListCachedSecureSetting(context, Loading Loading @@ -245,6 +248,30 @@ public class SettingsHelper { mBackgroundThrottlePackageWhitelist.removeListener(listener); } /** * Retrieve the gnss measurements full tracking enabled setting. */ public boolean isGnssMeasurementsFullTrackingEnabled() { return mGnssMeasurementFullTracking.getValue(false); } /** * Add a listener for changes to the background throttle package whitelist. Callbacks occur on * an unspecified thread. */ public void addOnGnssMeasurementsFullTrackingEnabledChangedListener( GlobalSettingChangedListener listener) { mGnssMeasurementFullTracking.addListener(listener); } /** * Remove a listener for changes to the background throttle package whitelist. */ public void removeOnGnssMeasurementsFullTrackingEnabledChangedListener( GlobalSettingChangedListener listener) { mGnssMeasurementFullTracking.removeListener(listener); } /** * Retrieve the ignore settings package whitelist. */ Loading Loading @@ -283,19 +310,6 @@ public class SettingsHelper { } } /** * Retrieve the gnss measurements full tracking enabled setting. */ public boolean isGnssMeasurementsFullTrackingEnabled() { long identity = Binder.clearCallingIdentity(); try { return Settings.Global.getInt(mContext.getContentResolver(), ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, 0) == 1; } finally { Binder.restoreCallingIdentity(identity); } } /** * Retrieve the accuracy for coarsening location, ie, the grid size used for snap-to-grid * coarsening. Loading Loading @@ -395,7 +409,7 @@ public class SettingsHelper { @GuardedBy("this") private boolean mRegistered; private ObservingSetting(Handler handler) { ObservingSetting(Handler handler) { super(handler); mListeners = new CopyOnWriteArrayList<>(); } Loading Loading @@ -439,13 +453,13 @@ public class SettingsHelper { private final Context mContext; private final String mSettingName; private IntegerSecureSetting(Context context, String settingName, Handler handler) { IntegerSecureSetting(Context context, String settingName, Handler handler) { super(handler); mContext = context; mSettingName = settingName; } private void register() { void register() { register(mContext, Settings.Secure.getUriFor(mSettingName)); } Loading @@ -470,7 +484,7 @@ public class SettingsHelper { @GuardedBy("this") private List<String> mCachedValue; private StringListCachedSecureSetting(Context context, String settingName, StringListCachedSecureSetting(Context context, String settingName, Handler handler) { super(handler); mContext = context; Loading Loading @@ -524,12 +538,38 @@ public class SettingsHelper { } } private static class BooleanGlobalSetting extends ObservingSetting { private final Context mContext; private final String mSettingName; BooleanGlobalSetting(Context context, String settingName, Handler handler) { super(handler); mContext = context; mSettingName = settingName; } public void register() { register(mContext, Settings.Global.getUriFor(mSettingName)); } public boolean getValue(boolean defaultValue) { long identity = Binder.clearCallingIdentity(); try { return Settings.Global.getInt(mContext.getContentResolver(), mSettingName, defaultValue ? 1 : 0) != 0; } finally { Binder.restoreCallingIdentity(identity); } } } private static class LongGlobalSetting extends ObservingSetting { private final Context mContext; private final String mSettingName; private LongGlobalSetting(Context context, String settingName, Handler handler) { LongGlobalSetting(Context context, String settingName, Handler handler) { super(handler); mContext = context; mSettingName = settingName; Loading Loading @@ -561,7 +601,7 @@ public class SettingsHelper { @GuardedBy("this") private ArraySet<String> mCachedValue; private StringSetCachedGlobalSetting(Context context, String settingName, StringSetCachedGlobalSetting(Context context, String settingName, Supplier<ArraySet<String>> baseValuesSupplier, Handler handler) { super(handler); mContext = context; Loading
services/core/java/com/android/server/location/gnss/GnssManagerService.java +2 −3 Original line number Diff line number Diff line Loading @@ -313,9 +313,8 @@ public class GnssManagerService { /** * Adds a GNSS measurements listener. */ public void addGnssMeasurementsListener(@Nullable GnssRequest request, IGnssMeasurementsListener listener, String packageName, @Nullable String featureId) { public void addGnssMeasurementsListener(GnssRequest request, IGnssMeasurementsListener listener, String packageName, @Nullable String featureId) { mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION, null); if (request.isFullTracking()) { mContext.enforceCallingOrSelfPermission(Manifest.permission.LOCATION_HARDWARE, null); Loading
services/tests/mockingservicestests/src/com/android/server/location/util/listeners/AbstractListenerManagerTest.java +29 −3 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(0); mListenerManager.notifyListeners(); Loading @@ -69,6 +70,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener); mListenerManager.removeListener(listener); assertThat(mListenerManager.mRegistered).isFalse(); assertThat(mListenerManager.mActive).isFalse(); mListenerManager.notifyListeners(); verify(listener, never()).run(); Loading @@ -83,6 +85,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener1); mListenerManager.addListener(1, listener2); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(1); mListenerManager.notifyListeners(); Loading @@ -92,6 +95,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener3); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(1); mListenerManager.notifyListeners(); Loading @@ -101,6 +105,7 @@ public class AbstractListenerManagerTest { mListenerManager.removeListener(listener2); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(0); mListenerManager.notifyListeners(); Loading @@ -111,6 +116,7 @@ public class AbstractListenerManagerTest { mListenerManager.removeListener(listener1); mListenerManager.removeListener(listener3); assertThat(mListenerManager.mRegistered).isFalse(); assertThat(mListenerManager.mActive).isFalse(); } @Test Loading @@ -133,12 +139,14 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(0, listener); mListenerManager.setActive(0, false); assertThat(mListenerManager.mRegistered).isFalse(); assertThat(mListenerManager.mActive).isFalse(); mListenerManager.notifyListeners(); verify(listener, never()).run(); mListenerManager.setActive(0, true); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(0); mListenerManager.notifyListeners(); Loading @@ -155,6 +163,7 @@ public class AbstractListenerManagerTest { mListenerManager.addListener(2, listener2); mListenerManager.addListener(1, listener3); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(2); mListenerManager.notifyListeners(); Loading @@ -164,6 +173,7 @@ public class AbstractListenerManagerTest { mListenerManager.setActive(2, false); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(1); mListenerManager.notifyListeners(); Loading @@ -173,6 +183,7 @@ public class AbstractListenerManagerTest { mListenerManager.setActive(2, true); assertThat(mListenerManager.mRegistered).isTrue(); assertThat(mListenerManager.mActive).isTrue(); assertThat(mListenerManager.mMergedRequest).isEqualTo(2); mListenerManager.notifyListeners(); Loading @@ -184,12 +195,13 @@ public class AbstractListenerManagerTest { mListenerManager.setActive(1, false); mListenerManager.setActive(2, false); assertThat(mListenerManager.mRegistered).isFalse(); assertThat(mListenerManager.mActive).isFalse(); } private static class TestRegistration extends AbstractListenerManager.Registration<Integer, Runnable> { private boolean mActive = true; boolean mActive = true; protected TestRegistration(Integer integer, Runnable runnable) { super(integer, DIRECT_EXECUTOR, runnable); Loading @@ -199,8 +211,12 @@ public class AbstractListenerManagerTest { private static class TestListenerManager extends AbstractListenerManager<Runnable, Integer, Runnable, TestRegistration, Integer> { private boolean mRegistered; private int mMergedRequest; boolean mActive; boolean mRegistered; int mMergedRequest; TestListenerManager() { } public void addListener(Integer request, Runnable listener) { addRegistration(listener, new TestRegistration(request, listener)); Loading Loading @@ -245,6 +261,16 @@ public class AbstractListenerManagerTest { return registration.mActive; } @Override protected void onActive() { mActive = true; } @Override protected void onInactive() { mActive = false; } @Override protected Integer mergeRequests(List<TestRegistration> testRegistrations) { int max = Integer.MIN_VALUE; Loading