From 00fe7e2d78cf2eb763aff9ff68ccf943775a3793 Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Thu, 28 Feb 2019 13:52:27 -0800 Subject: Remove deprecated GNSS APIs + add nullability Cleans up location APIs by removing old deprecated APIs (deprecated since API 24) and adding nullability annotations everywhere. Bug:126698813,126701422,126702274 Test: built Change-Id: I6caf7f9778100bb3eee53178c25ce1694fb2d395 --- location/java/android/location/GpsStatus.java | 3 + .../java/android/location/LocationManager.java | 376 +++++++-------------- .../java/android/location/LocationRequest.java | 40 ++- 3 files changed, 156 insertions(+), 263 deletions(-) (limited to 'location/java/android') diff --git a/location/java/android/location/GpsStatus.java b/location/java/android/location/GpsStatus.java index 609a15e1be7e..4e37654e7c65 100644 --- a/location/java/android/location/GpsStatus.java +++ b/location/java/android/location/GpsStatus.java @@ -30,6 +30,7 @@ import java.util.NoSuchElementException; *

This class is used in conjunction with the {@link Listener} interface. * * @deprecated use {@link GnssStatus} and {@link GnssStatus.Callback}. + * @removed */ @Deprecated public final class GpsStatus { @@ -112,6 +113,7 @@ public final class GpsStatus { /** * Used for receiving notifications when GPS status has changed. * @deprecated use {@link GnssStatus.Callback} instead. + * @removed */ @Deprecated public interface Listener { @@ -142,6 +144,7 @@ public final class GpsStatus { * You can implement this interface and call {@link LocationManager#addNmeaListener} * to receive NMEA data from the GPS engine. * @deprecated use {@link OnNmeaMessageListener} instead. + * @removed */ @Deprecated public interface NmeaListener { diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 6828c597fe9a..8af153283d70 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -44,12 +44,12 @@ import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; +import android.util.ArrayMap; import android.util.Log; import com.android.internal.location.ProviderProperties; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; /** @@ -78,14 +78,10 @@ public class LocationManager { private final GnssMeasurementCallbackTransport mGnssMeasurementCallbackTransport; private final GnssNavigationMessageCallbackTransport mGnssNavigationMessageCallbackTransport; private final BatchedLocationCallbackTransport mBatchedLocationCallbackTransport; - private final HashMap mGpsStatusListeners = - new HashMap<>(); - private final HashMap mGpsNmeaListeners = - new HashMap<>(); - private final HashMap mGnssStatusListeners = - new HashMap<>(); - private final HashMap mGnssNmeaListeners = - new HashMap<>(); + private final ArrayMap mGnssStatusListeners = + new ArrayMap<>(); + private final ArrayMap mGnssNmeaListeners = + new ArrayMap<>(); // volatile + GnssStatus final-fields pattern to avoid a partially published object private volatile GnssStatus mGnssStatus; private int mTimeToFirstFix; @@ -293,8 +289,7 @@ public class LocationManager { "com.android.settings.location.FOOTER_STRING"; // Map from LocationListeners to their associated ListenerTransport objects - private final HashMap mListeners = - new HashMap(); + private final ArrayMap mListeners = new ArrayMap<>(); private class ListenerTransport extends ILocationListener.Stub { private static final int TYPE_LOCATION_CHANGED = 1; @@ -405,7 +400,7 @@ public class LocationManager { * @hide */ @TestApi - public String[] getBackgroundThrottlingWhitelist() { + public @NonNull String[] getBackgroundThrottlingWhitelist() { try { return mService.getBackgroundThrottlingWhitelist(); } catch (RemoteException e) { @@ -417,7 +412,7 @@ public class LocationManager { * @hide */ @TestApi - public String[] getIgnoreSettingsWhitelist() { + public @NonNull String[] getIgnoreSettingsWhitelist() { try { return mService.getIgnoreSettingsWhitelist(); } catch (RemoteException e) { @@ -431,7 +426,7 @@ public class LocationManager { * right way to create an instance of this class is using the * factory Context.getSystemService. */ - public LocationManager(Context context, ILocationManager service) { + public LocationManager(@NonNull Context context, @NonNull ILocationManager service) { mService = service; mContext = context; mGnssMeasurementCallbackTransport = @@ -454,7 +449,7 @@ public class LocationManager { * * @return list of Strings containing names of the provider */ - public List getAllProviders() { + public @NonNull List getAllProviders() { try { return mService.getAllProviders(); } catch (RemoteException e) { @@ -469,7 +464,7 @@ public class LocationManager { * enabled are returned. * @return list of Strings containing names of the providers */ - public List getProviders(boolean enabledOnly) { + public @NonNull List getProviders(boolean enabledOnly) { try { return mService.getProviders(null, enabledOnly); } catch (RemoteException e) { @@ -488,7 +483,7 @@ public class LocationManager { * @throws SecurityException if the caller is not permitted to access the * given provider. */ - public LocationProvider getProvider(String name) { + public @Nullable LocationProvider getProvider(@NonNull String name) { checkProvider(name); try { ProviderProperties properties = mService.getProviderProperties(name); @@ -511,7 +506,7 @@ public class LocationManager { * enabled are returned. * @return list of Strings containing names of the providers */ - public List getProviders(Criteria criteria, boolean enabledOnly) { + public @NonNull List getProviders(@NonNull Criteria criteria, boolean enabledOnly) { checkCriteria(criteria); try { return mService.getProviders(criteria, enabledOnly); @@ -542,7 +537,7 @@ public class LocationManager { * @param enabledOnly if true then only a provider that is currently enabled is returned * @return name of the provider that best matches the requirements */ - public String getBestProvider(Criteria criteria, boolean enabledOnly) { + public @Nullable String getBestProvider(@NonNull Criteria criteria, boolean enabledOnly) { checkCriteria(criteria); try { return mService.getBestProvider(criteria, enabledOnly); @@ -572,8 +567,8 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestLocationUpdates(String provider, long minTime, float minDistance, - LocationListener listener) { + public void requestLocationUpdates(@NonNull String provider, long minTime, float minDistance, + @NonNull LocationListener listener) { checkProvider(provider); checkListener(listener); @@ -604,8 +599,8 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestLocationUpdates(String provider, long minTime, float minDistance, - LocationListener listener, Looper looper) { + public void requestLocationUpdates(@NonNull String provider, long minTime, float minDistance, + @NonNull LocationListener listener, @Nullable Looper looper) { checkProvider(provider); checkListener(listener); @@ -637,8 +632,8 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, - LocationListener listener, Looper looper) { + public void requestLocationUpdates(long minTime, float minDistance, @NonNull Criteria criteria, + @NonNull LocationListener listener, @Nullable Looper looper) { checkCriteria(criteria); checkListener(listener); @@ -665,8 +660,8 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestLocationUpdates(String provider, long minTime, float minDistance, - PendingIntent intent) { + public void requestLocationUpdates(@NonNull String provider, long minTime, float minDistance, + @NonNull PendingIntent intent) { checkProvider(provider); checkPendingIntent(intent); @@ -772,8 +767,8 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, - PendingIntent intent) { + public void requestLocationUpdates(long minTime, float minDistance, @NonNull Criteria criteria, + @NonNull PendingIntent intent) { checkCriteria(criteria); checkPendingIntent(intent); @@ -802,7 +797,8 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestSingleUpdate(String provider, LocationListener listener, Looper looper) { + public void requestSingleUpdate( + @NonNull String provider, @NonNull LocationListener listener, @Nullable Looper looper) { checkProvider(provider); checkListener(listener); @@ -832,7 +828,10 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestSingleUpdate(Criteria criteria, LocationListener listener, Looper looper) { + public void requestSingleUpdate( + @NonNull Criteria criteria, + @NonNull LocationListener listener, + @Nullable Looper looper) { checkCriteria(criteria); checkListener(listener); @@ -855,7 +854,7 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestSingleUpdate(String provider, PendingIntent intent) { + public void requestSingleUpdate(@NonNull String provider, @NonNull PendingIntent intent) { checkProvider(provider); checkPendingIntent(intent); @@ -879,7 +878,7 @@ public class LocationManager { * @throws SecurityException if no suitable permission is present */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestSingleUpdate(Criteria criteria, PendingIntent intent) { + public void requestSingleUpdate(@NonNull Criteria criteria, @NonNull PendingIntent intent) { checkCriteria(criteria); checkPendingIntent(intent); @@ -948,8 +947,10 @@ public class LocationManager { @SystemApi @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestLocationUpdates(LocationRequest request, LocationListener listener, - Looper looper) { + public void requestLocationUpdates( + @NonNull LocationRequest request, + @NonNull LocationListener listener, + @Nullable Looper looper) { checkListener(listener); requestLocationUpdates(request, listener, looper, null); } @@ -978,7 +979,8 @@ public class LocationManager { @SystemApi @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void requestLocationUpdates(LocationRequest request, PendingIntent intent) { + public void requestLocationUpdates( + @NonNull LocationRequest request, @NonNull PendingIntent intent) { checkPendingIntent(intent); requestLocationUpdates(request, null, null, intent); } @@ -1003,7 +1005,7 @@ public class LocationManager { * @hide */ @RequiresPermission(allOf = {LOCATION_HARDWARE, ACCESS_FINE_LOCATION}) - public boolean injectLocation(Location newLocation) { + public boolean injectLocation(@NonNull Location newLocation) { try { return mService.injectLocation(newLocation); } catch (RemoteException e) { @@ -1048,7 +1050,7 @@ public class LocationManager { * @param listener listener object that no longer needs location updates * @throws IllegalArgumentException if listener is null */ - public void removeUpdates(LocationListener listener) { + public void removeUpdates(@NonNull LocationListener listener) { checkListener(listener); String packageName = mContext.getPackageName(); @@ -1073,7 +1075,7 @@ public class LocationManager { * @param intent pending intent object that no longer needs location updates * @throws IllegalArgumentException if intent is null */ - public void removeUpdates(PendingIntent intent) { + public void removeUpdates(@NonNull PendingIntent intent) { checkPendingIntent(intent); String packageName = mContext.getPackageName(); @@ -1133,7 +1135,7 @@ public class LocationManager { */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void addProximityAlert(double latitude, double longitude, float radius, long expiration, - PendingIntent intent) { + @NonNull PendingIntent intent) { checkPendingIntent(intent); if (expiration < 0) expiration = Long.MAX_VALUE; @@ -1183,7 +1185,10 @@ public class LocationManager { * @hide */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public void addGeofence(LocationRequest request, Geofence fence, PendingIntent intent) { + public void addGeofence( + @NonNull LocationRequest request, + @NonNull Geofence fence, + @NonNull PendingIntent intent) { checkPendingIntent(intent); checkGeofence(fence); @@ -1210,7 +1215,7 @@ public class LocationManager { * @throws SecurityException if {@link android.Manifest.permission#ACCESS_FINE_LOCATION} * permission is not present */ - public void removeProximityAlert(PendingIntent intent) { + public void removeProximityAlert(@NonNull PendingIntent intent) { checkPendingIntent(intent); String packageName = mContext.getPackageName(); @@ -1237,7 +1242,7 @@ public class LocationManager { * * @hide */ - public void removeGeofence(Geofence fence, PendingIntent intent) { + public void removeGeofence(@NonNull Geofence fence, @NonNull PendingIntent intent) { checkPendingIntent(intent); checkGeofence(fence); String packageName = mContext.getPackageName(); @@ -1260,7 +1265,7 @@ public class LocationManager { * * @hide */ - public void removeAllGeofences(PendingIntent intent) { + public void removeAllGeofences(@NonNull PendingIntent intent) { checkPendingIntent(intent); String packageName = mContext.getPackageName(); @@ -1290,7 +1295,7 @@ public class LocationManager { * @hide */ @SystemApi - public boolean isLocationEnabledForUser(UserHandle userHandle) { + public boolean isLocationEnabledForUser(@NonNull UserHandle userHandle) { try { return mService.isLocationEnabledForUser(userHandle.getIdentifier()); } catch (RemoteException e) { @@ -1309,7 +1314,7 @@ public class LocationManager { @SystemApi @TestApi @RequiresPermission(WRITE_SECURE_SETTINGS) - public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) { + public void setLocationEnabledForUser(boolean enabled, @NonNull UserHandle userHandle) { Settings.Secure.putIntForUser( mContext.getContentResolver(), Settings.Secure.LOCATION_MODE, @@ -1332,7 +1337,7 @@ public class LocationManager { * * @throws IllegalArgumentException if provider is null */ - public boolean isProviderEnabled(String provider) { + public boolean isProviderEnabled(@NonNull String provider) { return isProviderEnabledForUser(provider, Process.myUserHandle()); } @@ -1353,7 +1358,8 @@ public class LocationManager { * @hide */ @SystemApi - public boolean isProviderEnabledForUser(String provider, UserHandle userHandle) { + public boolean isProviderEnabledForUser( + @NonNull String provider, @NonNull UserHandle userHandle) { checkProvider(provider); try { @@ -1382,7 +1388,7 @@ public class LocationManager { @SystemApi @RequiresPermission(WRITE_SECURE_SETTINGS) public boolean setProviderEnabledForUser( - String provider, boolean enabled, UserHandle userHandle) { + @NonNull String provider, boolean enabled, @NonNull UserHandle userHandle) { checkProvider(provider); return Settings.Secure.setLocationProviderEnabledForUser( @@ -1406,6 +1412,7 @@ public class LocationManager { * * @hide */ + @Nullable public Location getLastLocation() { String packageName = mContext.getPackageName(); @@ -1434,7 +1441,8 @@ public class LocationManager { * @throws IllegalArgumentException if provider is null or doesn't exist */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - public Location getLastKnownLocation(String provider) { + @Nullable + public Location getLastKnownLocation(@NonNull String provider) { checkProvider(provider); String packageName = mContext.getPackageName(); LocationRequest request = LocationRequest.createFromDeprecatedProvider( @@ -1447,10 +1455,6 @@ public class LocationManager { } } - // --- Mock provider support --- - // TODO: It would be fantastic to deprecate mock providers entirely, and replace - // with something closer to LocationProviderBase.java - /** * Creates a mock location provider and adds it to the set of active providers. * @@ -1461,7 +1465,8 @@ public class LocationManager { * allowed} for your app. * @throws IllegalArgumentException if a provider with the given name already exists */ - public void addTestProvider(String name, boolean requiresNetwork, boolean requiresSatellite, + public void addTestProvider( + @NonNull String name, boolean requiresNetwork, boolean requiresSatellite, boolean requiresCell, boolean hasMonetaryCost, boolean supportsAltitude, boolean supportsSpeed, boolean supportsBearing, int powerRequirement, int accuracy) { ProviderProperties properties = new ProviderProperties(requiresNetwork, @@ -1488,7 +1493,7 @@ public class LocationManager { * allowed} for your app. * @throws IllegalArgumentException if no provider with the given name exists */ - public void removeTestProvider(String provider) { + public void removeTestProvider(@NonNull String provider) { try { mService.removeTestProvider(provider, mContext.getOpPackageName()); } catch (RemoteException e) { @@ -1512,7 +1517,7 @@ public class LocationManager { * @throws IllegalArgumentException if no provider with the given name exists * @throws IllegalArgumentException if the location is incomplete */ - public void setTestProviderLocation(String provider, Location loc) { + public void setTestProviderLocation(@NonNull String provider, @NonNull Location loc) { if (!loc.isComplete()) { IllegalArgumentException e = new IllegalArgumentException( "Incomplete location object, missing timestamp or accuracy? " + loc); @@ -1546,7 +1551,7 @@ public class LocationManager { * @deprecated This function has always been a no-op, and may be removed in the future. */ @Deprecated - public void clearTestProviderLocation(String provider) {} + public void clearTestProviderLocation(@NonNull String provider) {} /** * Sets a mock enabled value for the given provider. This value will be used in place @@ -1560,7 +1565,7 @@ public class LocationManager { * allowed} for your app. * @throws IllegalArgumentException if no provider with the given name exists */ - public void setTestProviderEnabled(String provider, boolean enabled) { + public void setTestProviderEnabled(@NonNull String provider, boolean enabled) { try { mService.setTestProviderEnabled(provider, enabled, mContext.getOpPackageName()); } catch (RemoteException e) { @@ -1581,7 +1586,7 @@ public class LocationManager { * @deprecated Use {@link #setTestProviderEnabled(String, boolean)} instead. */ @Deprecated - public void clearTestProviderEnabled(String provider) { + public void clearTestProviderEnabled(@NonNull String provider) { setTestProviderEnabled(provider, false); } @@ -1601,7 +1606,8 @@ public class LocationManager { * @deprecated This method has no effect. */ @Deprecated - public void setTestProviderStatus(String provider, int status, Bundle extras, long updateTime) { + public void setTestProviderStatus( + @NonNull String provider, int status, @Nullable Bundle extras, long updateTime) { try { mService.setTestProviderStatus(provider, status, extras, updateTime, mContext.getOpPackageName()); @@ -1622,7 +1628,7 @@ public class LocationManager { * @deprecated This method has no effect. */ @Deprecated - public void clearTestProviderStatus(String provider) { + public void clearTestProviderStatus(@NonNull String provider) { setTestProviderStatus(provider, LocationProvider.AVAILABLE, null, 0L); } @@ -1648,13 +1654,11 @@ public class LocationManager { // This class is used to send Gnss status events to the client's specific thread. private class GnssStatusListenerTransport extends IGnssStatusListener.Stub { - private final GpsStatus.Listener mGpsListener; - private final GpsStatus.NmeaListener mGpsNmeaListener; private final GnssStatus.Callback mGnssCallback; private final OnNmeaMessageListener mGnssNmeaListener; private class GnssHandler extends Handler { - public GnssHandler(Handler handler) { + GnssHandler(Handler handler) { super(handler != null ? handler.getLooper() : Looper.myLooper()); } @@ -1663,24 +1667,22 @@ public class LocationManager { switch (msg.what) { case NMEA_RECEIVED: synchronized (mNmeaBuffer) { - int length = mNmeaBuffer.size(); - for (int i = 0; i < length; i++) { - Nmea nmea = mNmeaBuffer.get(i); + for (Nmea nmea : mNmeaBuffer) { mGnssNmeaListener.onNmeaMessage(nmea.mNmea, nmea.mTimestamp); } mNmeaBuffer.clear(); } break; - case GpsStatus.GPS_EVENT_STARTED: + case GNSS_EVENT_STARTED: mGnssCallback.onStarted(); break; - case GpsStatus.GPS_EVENT_STOPPED: + case GNSS_EVENT_STOPPED: mGnssCallback.onStopped(); break; - case GpsStatus.GPS_EVENT_FIRST_FIX: + case GNSS_EVENT_FIRST_FIX: mGnssCallback.onFirstFix(mTimeToFirstFix); break; - case GpsStatus.GPS_EVENT_SATELLITE_STATUS: + case GNSS_EVENT_SATELLITE_STATUS: mGnssCallback.onSatelliteStatusChanged(mGnssStatus); break; default: @@ -1691,8 +1693,11 @@ public class LocationManager { private final Handler mGnssHandler; - // This must not equal any of the GpsStatus event IDs - private static final int NMEA_RECEIVED = 1000; + private static final int NMEA_RECEIVED = 1; + private static final int GNSS_EVENT_STARTED = 2; + private static final int GNSS_EVENT_STOPPED = 3; + private static final int GNSS_EVENT_FIRST_FIX = 4; + private static final int GNSS_EVENT_SATELLITE_STATUS = 5; private class Nmea { long mTimestamp; @@ -1705,98 +1710,31 @@ public class LocationManager { } private final ArrayList mNmeaBuffer; - GnssStatusListenerTransport(GpsStatus.Listener listener) { - this(listener, null); - } - - GnssStatusListenerTransport(GpsStatus.Listener listener, Handler handler) { - mGpsListener = listener; - mGnssHandler = new GnssHandler(handler); - mGpsNmeaListener = null; - mNmeaBuffer = null; - mGnssCallback = mGpsListener != null ? new GnssStatus.Callback() { - @Override - public void onStarted() { - mGpsListener.onGpsStatusChanged(GpsStatus.GPS_EVENT_STARTED); - } - - @Override - public void onStopped() { - mGpsListener.onGpsStatusChanged(GpsStatus.GPS_EVENT_STOPPED); - } - - @Override - public void onFirstFix(int ttff) { - mGpsListener.onGpsStatusChanged(GpsStatus.GPS_EVENT_FIRST_FIX); - } - - @Override - public void onSatelliteStatusChanged(GnssStatus status) { - mGpsListener.onGpsStatusChanged(GpsStatus.GPS_EVENT_SATELLITE_STATUS); - } - } : null; - mGnssNmeaListener = null; - } - - GnssStatusListenerTransport(GpsStatus.NmeaListener listener) { - this(listener, null); - } - - GnssStatusListenerTransport(GpsStatus.NmeaListener listener, Handler handler) { - mGpsListener = null; - mGnssHandler = new GnssHandler(handler); - mGpsNmeaListener = listener; - mNmeaBuffer = new ArrayList(); - mGnssCallback = null; - mGnssNmeaListener = mGpsNmeaListener != null ? new OnNmeaMessageListener() { - @Override - public void onNmeaMessage(String nmea, long timestamp) { - mGpsNmeaListener.onNmeaReceived(timestamp, nmea); - } - } : null; - } - - GnssStatusListenerTransport(GnssStatus.Callback callback) { - this(callback, null); - } - GnssStatusListenerTransport(GnssStatus.Callback callback, Handler handler) { mGnssCallback = callback; mGnssHandler = new GnssHandler(handler); mGnssNmeaListener = null; mNmeaBuffer = null; - mGpsListener = null; - mGpsNmeaListener = null; - } - - GnssStatusListenerTransport(OnNmeaMessageListener listener) { - this(listener, null); } GnssStatusListenerTransport(OnNmeaMessageListener listener, Handler handler) { mGnssCallback = null; mGnssHandler = new GnssHandler(handler); mGnssNmeaListener = listener; - mGpsListener = null; - mGpsNmeaListener = null; - mNmeaBuffer = new ArrayList(); + mNmeaBuffer = new ArrayList<>(); } @Override public void onGnssStarted() { if (mGnssCallback != null) { - Message msg = Message.obtain(); - msg.what = GpsStatus.GPS_EVENT_STARTED; - mGnssHandler.sendMessage(msg); + mGnssHandler.obtainMessage(GNSS_EVENT_STARTED).sendToTarget(); } } @Override public void onGnssStopped() { if (mGnssCallback != null) { - Message msg = Message.obtain(); - msg.what = GpsStatus.GPS_EVENT_STOPPED; - mGnssHandler.sendMessage(msg); + mGnssHandler.obtainMessage(GNSS_EVENT_STOPPED).sendToTarget(); } } @@ -1804,9 +1742,7 @@ public class LocationManager { public void onFirstFix(int ttff) { if (mGnssCallback != null) { mTimeToFirstFix = ttff; - Message msg = Message.obtain(); - msg.what = GpsStatus.GPS_EVENT_FIRST_FIX; - mGnssHandler.sendMessage(msg); + mGnssHandler.obtainMessage(GNSS_EVENT_FIRST_FIX).sendToTarget(); } } @@ -1817,11 +1753,8 @@ public class LocationManager { mGnssStatus = new GnssStatus(svCount, prnWithFlags, cn0s, elevations, azimuths, carrierFreqs); - Message msg = Message.obtain(); - msg.what = GpsStatus.GPS_EVENT_SATELLITE_STATUS; - // remove any SV status messages already in the queue - mGnssHandler.removeMessages(GpsStatus.GPS_EVENT_SATELLITE_STATUS); - mGnssHandler.sendMessage(msg); + mGnssHandler.removeMessages(GNSS_EVENT_SATELLITE_STATUS); + mGnssHandler.obtainMessage(GNSS_EVENT_SATELLITE_STATUS).sendToTarget(); } } @@ -1831,11 +1764,9 @@ public class LocationManager { synchronized (mNmeaBuffer) { mNmeaBuffer.add(new Nmea(timestamp, nmea)); } - Message msg = Message.obtain(); - msg.what = NMEA_RECEIVED; - // remove any NMEA_RECEIVED messages already in the queue + mGnssHandler.removeMessages(NMEA_RECEIVED); - mGnssHandler.sendMessage(msg); + mGnssHandler.obtainMessage(NMEA_RECEIVED).sendToTarget(); } } } @@ -1849,27 +1780,12 @@ public class LocationManager { * * @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present * @deprecated use {@link #registerGnssStatusCallback(GnssStatus.Callback)} instead. + * @removed */ @Deprecated @RequiresPermission(ACCESS_FINE_LOCATION) public boolean addGpsStatusListener(GpsStatus.Listener listener) { - boolean result; - - if (mGpsStatusListeners.get(listener) != null) { - // listener is already registered - return true; - } - try { - GnssStatusListenerTransport transport = new GnssStatusListenerTransport(listener); - result = mService.registerGnssStatusCallback(transport, mContext.getPackageName()); - if (result) { - mGpsStatusListeners.put(listener, transport); - } - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - - return result; + return false; } /** @@ -1877,18 +1793,10 @@ public class LocationManager { * * @param listener GPS status listener object to remove * @deprecated use {@link #unregisterGnssStatusCallback(GnssStatus.Callback)} instead. + * @removed */ @Deprecated - public void removeGpsStatusListener(GpsStatus.Listener listener) { - try { - GnssStatusListenerTransport transport = mGpsStatusListeners.remove(listener); - if (transport != null) { - mService.unregisterGnssStatusCallback(transport); - } - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } + public void removeGpsStatusListener(GpsStatus.Listener listener) {} /** * Registers a GNSS status callback. @@ -1900,7 +1808,7 @@ public class LocationManager { * @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present */ @RequiresPermission(ACCESS_FINE_LOCATION) - public boolean registerGnssStatusCallback(GnssStatus.Callback callback) { + public boolean registerGnssStatusCallback(@NonNull GnssStatus.Callback callback) { return registerGnssStatusCallback(callback, null); } @@ -1915,7 +1823,8 @@ public class LocationManager { * @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present */ @RequiresPermission(ACCESS_FINE_LOCATION) - public boolean registerGnssStatusCallback(GnssStatus.Callback callback, Handler handler) { + public boolean registerGnssStatusCallback( + @NonNull GnssStatus.Callback callback, @Nullable Handler handler) { boolean result; if (mGnssStatusListeners.get(callback) != null) { // listener is already registered @@ -1940,7 +1849,7 @@ public class LocationManager { * * @param callback GNSS status callback object to remove */ - public void unregisterGnssStatusCallback(GnssStatus.Callback callback) { + public void unregisterGnssStatusCallback(@NonNull GnssStatus.Callback callback) { try { GnssStatusListenerTransport transport = mGnssStatusListeners.remove(callback); if (transport != null) { @@ -1960,27 +1869,12 @@ public class LocationManager { * * @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present * @deprecated use {@link #addNmeaListener(OnNmeaMessageListener)} instead. + * @removed */ @Deprecated @RequiresPermission(ACCESS_FINE_LOCATION) public boolean addNmeaListener(GpsStatus.NmeaListener listener) { - boolean result; - - if (mGpsNmeaListeners.get(listener) != null) { - // listener is already registered - return true; - } - try { - GnssStatusListenerTransport transport = new GnssStatusListenerTransport(listener); - result = mService.registerGnssStatusCallback(transport, mContext.getPackageName()); - if (result) { - mGpsNmeaListeners.put(listener, transport); - } - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - - return result; + return false; } /** @@ -1988,18 +1882,10 @@ public class LocationManager { * * @param listener a {@link GpsStatus.NmeaListener} object to remove * @deprecated use {@link #removeNmeaListener(OnNmeaMessageListener)} instead. + * @removed */ @Deprecated - public void removeNmeaListener(GpsStatus.NmeaListener listener) { - try { - GnssStatusListenerTransport transport = mGpsNmeaListeners.remove(listener); - if (transport != null) { - mService.unregisterGnssStatusCallback(transport); - } - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } + public void removeNmeaListener(GpsStatus.NmeaListener listener) {} /** * Adds an NMEA listener. @@ -2011,7 +1897,7 @@ public class LocationManager { * @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present */ @RequiresPermission(ACCESS_FINE_LOCATION) - public boolean addNmeaListener(OnNmeaMessageListener listener) { + public boolean addNmeaListener(@NonNull OnNmeaMessageListener listener) { return addNmeaListener(listener, null); } @@ -2026,10 +1912,11 @@ public class LocationManager { * @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present */ @RequiresPermission(ACCESS_FINE_LOCATION) - public boolean addNmeaListener(OnNmeaMessageListener listener, Handler handler) { + public boolean addNmeaListener( + @NonNull OnNmeaMessageListener listener, @Nullable Handler handler) { boolean result; - if (mGpsNmeaListeners.get(listener) != null) { + if (mGnssNmeaListeners.get(listener) != null) { // listener is already registered return true; } @@ -2052,7 +1939,7 @@ public class LocationManager { * * @param listener a {@link OnNmeaMessageListener} object to remove */ - public void removeNmeaListener(OnNmeaMessageListener listener) { + public void removeNmeaListener(@NonNull OnNmeaMessageListener listener) { try { GnssStatusListenerTransport transport = mGnssNmeaListeners.remove(listener); if (transport != null) { @@ -2068,6 +1955,7 @@ public class LocationManager { * Don't use it. Use {@link #registerGnssMeasurementsCallback} instead. * @hide * @deprecated Not supported anymore. + * @removed */ @Deprecated @SystemApi @@ -2083,7 +1971,8 @@ public class LocationManager { * @return {@code true} if the callback was added successfully, {@code false} otherwise. */ @RequiresPermission(ACCESS_FINE_LOCATION) - public boolean registerGnssMeasurementsCallback(GnssMeasurementsEvent.Callback callback) { + public boolean registerGnssMeasurementsCallback( + @NonNull GnssMeasurementsEvent.Callback callback) { return registerGnssMeasurementsCallback(callback, null); } @@ -2095,8 +1984,8 @@ public class LocationManager { * @return {@code true} if the callback was added successfully, {@code false} otherwise. */ @RequiresPermission(ACCESS_FINE_LOCATION) - public boolean registerGnssMeasurementsCallback(GnssMeasurementsEvent.Callback callback, - Handler handler) { + public boolean registerGnssMeasurementsCallback( + @NonNull GnssMeasurementsEvent.Callback callback, @Nullable Handler handler) { return mGnssMeasurementCallbackTransport.add(callback, handler); } @@ -2120,15 +2009,12 @@ public class LocationManager { } /** - * Returns an integer with flags representing the capabilities of the GNSS chipset. + * Returns the integer capability flags of the GNSS chipset as defined in {@code + * IGnssCallback.hal} * * @hide */ @SystemApi - /** - * Returns the integer capability flags of the GNSS chipset as defined in {@code - * IGnssCallback.hal} - */ public int getGnssCapabilities() { try { return mGnssMeasurementCallbackTransport.getGnssCapabilities(); @@ -2144,6 +2030,7 @@ public class LocationManager { * @hide * @deprecated use {@link #unregisterGnssMeasurementsCallback(GnssMeasurementsEvent.Callback)} * instead. + * @removed */ @Deprecated @SystemApi @@ -2155,7 +2042,8 @@ public class LocationManager { * * @param callback a {@link GnssMeasurementsEvent.Callback} object to remove. */ - public void unregisterGnssMeasurementsCallback(GnssMeasurementsEvent.Callback callback) { + public void unregisterGnssMeasurementsCallback( + @NonNull GnssMeasurementsEvent.Callback callback) { mGnssMeasurementCallbackTransport.remove(callback); } @@ -2164,6 +2052,7 @@ public class LocationManager { * Don't use it. Use {@link #registerGnssNavigationMessageCallback} instead. * @hide * @deprecated Not supported anymore. + * @removed */ @Deprecated @SystemApi @@ -2179,12 +2068,12 @@ public class LocationManager { * @deprecated use * {@link #unregisterGnssNavigationMessageCallback(GnssNavigationMessage.Callback)} * instead + * @removed */ @Deprecated @SystemApi @SuppressLint("Doclava125") - public void removeGpsNavigationMessageListener(GpsNavigationMessageEvent.Listener listener) { - } + public void removeGpsNavigationMessageListener(GpsNavigationMessageEvent.Listener listener) {} /** * Registers a GNSS Navigation Message callback. @@ -2193,7 +2082,7 @@ public class LocationManager { * @return {@code true} if the callback was added successfully, {@code false} otherwise. */ public boolean registerGnssNavigationMessageCallback( - GnssNavigationMessage.Callback callback) { + @NonNull GnssNavigationMessage.Callback callback) { return registerGnssNavigationMessageCallback(callback, null); } @@ -2206,7 +2095,7 @@ public class LocationManager { */ @RequiresPermission(ACCESS_FINE_LOCATION) public boolean registerGnssNavigationMessageCallback( - GnssNavigationMessage.Callback callback, Handler handler) { + @NonNull GnssNavigationMessage.Callback callback, @Nullable Handler handler) { return mGnssNavigationMessageCallbackTransport.add(callback, handler); } @@ -2216,7 +2105,7 @@ public class LocationManager { * @param callback a {@link GnssNavigationMessage.Callback} object to remove. */ public void unregisterGnssNavigationMessageCallback( - GnssNavigationMessage.Callback callback) { + @NonNull GnssNavigationMessage.Callback callback) { mGnssNavigationMessageCallbackTransport.remove(callback); } @@ -2230,19 +2119,12 @@ public class LocationManager { * * @param status object containing GPS status details, or null. * @return status object containing updated GPS status. + * @removed */ @Deprecated @RequiresPermission(ACCESS_FINE_LOCATION) - public GpsStatus getGpsStatus(GpsStatus status) { - if (status == null) { - status = new GpsStatus(); - } - // When mGnssStatus is null, that means that this method is called outside - // onGpsStatusChanged(). Return an empty status to maintain backwards compatibility. - if (mGnssStatus != null) { - status.setStatus(mGnssStatus, mTimeToFirstFix); - } - return status; + public @Nullable GpsStatus getGpsStatus(@Nullable GpsStatus status) { + return null; } /** @@ -2319,7 +2201,7 @@ public class LocationManager { @SystemApi @RequiresPermission(Manifest.permission.LOCATION_HARDWARE) public boolean registerGnssBatchedLocationCallback(long periodNanos, boolean wakeOnFifoFull, - BatchedLocationCallback callback, Handler handler) { + @NonNull BatchedLocationCallback callback, @Nullable Handler handler) { mBatchedLocationCallbackTransport.add(callback, handler); try { @@ -2357,7 +2239,8 @@ public class LocationManager { */ @SystemApi @RequiresPermission(Manifest.permission.LOCATION_HARDWARE) - public boolean unregisterGnssBatchedLocationCallback(BatchedLocationCallback callback) { + public boolean unregisterGnssBatchedLocationCallback( + @NonNull BatchedLocationCallback callback) { mBatchedLocationCallbackTransport.remove(callback); @@ -2379,7 +2262,8 @@ public class LocationManager { * * @return true if the command succeeds. */ - public boolean sendExtraCommand(String provider, String command, Bundle extras) { + public boolean sendExtraCommand( + @NonNull String provider, @NonNull String command, @Nullable Bundle extras) { try { return mService.sendExtraCommand(provider, command, extras); } catch (RemoteException e) { @@ -2448,7 +2332,7 @@ public class LocationManager { * @hide */ @SystemApi - public boolean isProviderPackage(String packageName) { + public boolean isProviderPackage(@NonNull String packageName) { try { return mService.isProviderPackage(packageName); } catch (RemoteException e) { @@ -2464,7 +2348,7 @@ public class LocationManager { */ @SystemApi @RequiresPermission(Manifest.permission.LOCATION_HARDWARE) - public void setLocationControllerExtraPackage(String packageName) { + public void setLocationControllerExtraPackage(@NonNull String packageName) { try { mService.setLocationControllerExtraPackage(packageName); } catch (RemoteException e) { diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java index 6fd063eb62f0..a05d8501bc1f 100644 --- a/location/java/android/location/LocationRequest.java +++ b/location/java/android/location/LocationRequest.java @@ -17,6 +17,8 @@ package android.location; import android.Manifest; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.TestApi; @@ -183,14 +185,16 @@ public final class LocationRequest implements Parcelable { * * @return a new location request */ + @NonNull public static LocationRequest create() { return new LocationRequest(); } /** @hide */ @SystemApi - public static LocationRequest createFromDeprecatedProvider(String provider, long minTime, - float minDistance, boolean singleShot) { + @NonNull + public static LocationRequest createFromDeprecatedProvider( + @NonNull String provider, long minTime, float minDistance, boolean singleShot) { if (minTime < 0) minTime = 0; if (minDistance < 0) minDistance = 0; @@ -215,8 +219,9 @@ public final class LocationRequest implements Parcelable { /** @hide */ @SystemApi - public static LocationRequest createFromDeprecatedCriteria(Criteria criteria, long minTime, - float minDistance, boolean singleShot) { + @NonNull + public static LocationRequest createFromDeprecatedCriteria( + @NonNull Criteria criteria, long minTime, float minDistance, boolean singleShot) { if (minTime < 0) minTime = 0; if (minDistance < 0) minDistance = 0; @@ -287,7 +292,7 @@ public final class LocationRequest implements Parcelable { * @return the same object, so that setters can be chained * @throws IllegalArgumentException if the quality constant is not valid */ - public LocationRequest setQuality(int quality) { + public @NonNull LocationRequest setQuality(int quality) { checkQuality(quality); mQuality = quality; return this; @@ -330,7 +335,7 @@ public final class LocationRequest implements Parcelable { * @return the same object, so that setters can be chained * @throws IllegalArgumentException if the interval is less than zero */ - public LocationRequest setInterval(long millis) { + public @NonNull LocationRequest setInterval(long millis) { checkInterval(millis); mInterval = millis; if (!mExplicitFastestInterval) { @@ -362,7 +367,7 @@ public final class LocationRequest implements Parcelable { * @hide */ @SystemApi - public LocationRequest setLowPowerMode(boolean enabled) { + public @NonNull LocationRequest setLowPowerMode(boolean enabled) { mLowPowerMode = enabled; return this; } @@ -386,7 +391,7 @@ public final class LocationRequest implements Parcelable { * @return the same object, so that setters can be chained */ @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS) - public LocationRequest setLocationSettingsIgnored(boolean locationSettingsIgnored) { + public @NonNull LocationRequest setLocationSettingsIgnored(boolean locationSettingsIgnored) { mLocationSettingsIgnored = locationSettingsIgnored; return this; } @@ -427,7 +432,7 @@ public final class LocationRequest implements Parcelable { * @return the same object, so that setters can be chained * @throws IllegalArgumentException if the interval is less than zero */ - public LocationRequest setFastestInterval(long millis) { + public @NonNull LocationRequest setFastestInterval(long millis) { checkInterval(millis); mExplicitFastestInterval = true; mFastestInterval = millis; @@ -463,7 +468,7 @@ public final class LocationRequest implements Parcelable { * @param millis duration of request in milliseconds * @return the same object, so that setters can be chained */ - public LocationRequest setExpireIn(long millis) { + public @NonNull LocationRequest setExpireIn(long millis) { long elapsedRealtime = SystemClock.elapsedRealtime(); // Check for > Long.MAX_VALUE overflow (elapsedRealtime > 0): @@ -491,7 +496,7 @@ public final class LocationRequest implements Parcelable { * @param millis expiration time of request, in milliseconds since boot including suspend * @return the same object, so that setters can be chained */ - public LocationRequest setExpireAt(long millis) { + public @NonNull LocationRequest setExpireAt(long millis) { mExpireAt = millis; if (mExpireAt < 0) mExpireAt = 0; return this; @@ -522,7 +527,7 @@ public final class LocationRequest implements Parcelable { * @return the same object, so that setters can be chained * @throws IllegalArgumentException if numUpdates is 0 or less */ - public LocationRequest setNumUpdates(int numUpdates) { + public @NonNull LocationRequest setNumUpdates(int numUpdates) { if (numUpdates <= 0) { throw new IllegalArgumentException( "invalid numUpdates: " + numUpdates); @@ -553,7 +558,8 @@ public final class LocationRequest implements Parcelable { } } - public LocationRequest setProvider(String provider) { + /** Sets the provider to use for this location request. */ + public @NonNull LocationRequest setProvider(@NonNull String provider) { checkProvider(provider); mProvider = provider; return this; @@ -561,13 +567,13 @@ public final class LocationRequest implements Parcelable { /** @hide */ @SystemApi - public String getProvider() { + public @NonNull String getProvider() { return mProvider; } /** @hide */ @SystemApi - public LocationRequest setSmallestDisplacement(float meters) { + public @NonNull LocationRequest setSmallestDisplacement(float meters) { checkDisplacement(meters); mSmallestDisplacement = meters; return this; @@ -590,13 +596,13 @@ public final class LocationRequest implements Parcelable { * @hide */ @SystemApi - public void setWorkSource(WorkSource workSource) { + public void setWorkSource(@Nullable WorkSource workSource) { mWorkSource = workSource; } /** @hide */ @SystemApi - public WorkSource getWorkSource() { + public @Nullable WorkSource getWorkSource() { return mWorkSource; } -- cgit v1.2.3-59-g8ed1b