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
This commit is contained in:
Soonil Nagarkar
2019-02-28 13:52:27 -08:00
parent 0718be8cfa
commit 00fe7e2d78
8 changed files with 274 additions and 371 deletions

View File

@@ -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<GpsStatus.Listener, GnssStatusListenerTransport> mGpsStatusListeners =
new HashMap<>();
private final HashMap<GpsStatus.NmeaListener, GnssStatusListenerTransport> mGpsNmeaListeners =
new HashMap<>();
private final HashMap<GnssStatus.Callback, GnssStatusListenerTransport> mGnssStatusListeners =
new HashMap<>();
private final HashMap<OnNmeaMessageListener, GnssStatusListenerTransport> mGnssNmeaListeners =
new HashMap<>();
private final ArrayMap<GnssStatus.Callback, GnssStatusListenerTransport> mGnssStatusListeners =
new ArrayMap<>();
private final ArrayMap<OnNmeaMessageListener, GnssStatusListenerTransport> 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<LocationListener, ListenerTransport> mListeners =
new HashMap<LocationListener,ListenerTransport>();
private final ArrayMap<LocationListener, ListenerTransport> 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<String> getAllProviders() {
public @NonNull List<String> 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<String> getProviders(boolean enabledOnly) {
public @NonNull List<String> 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<String> getProviders(Criteria criteria, boolean enabledOnly) {
public @NonNull List<String> 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<Nmea> 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<Nmea>();
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<Nmea>();
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) {