Merge "Restore GpsStatus listeners" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
beff33a3bd
@@ -82,6 +82,8 @@ public class LocationManager {
|
|||||||
new ArrayMap<>();
|
new ArrayMap<>();
|
||||||
private final ArrayMap<OnNmeaMessageListener, GnssStatusListenerTransport> mGnssNmeaListeners =
|
private final ArrayMap<OnNmeaMessageListener, GnssStatusListenerTransport> mGnssNmeaListeners =
|
||||||
new ArrayMap<>();
|
new ArrayMap<>();
|
||||||
|
private final ArrayMap<GpsStatus.Listener, GnssStatusListenerTransport> mGpsStatusListeners =
|
||||||
|
new ArrayMap<>();
|
||||||
// volatile + GnssStatus final-fields pattern to avoid a partially published object
|
// volatile + GnssStatus final-fields pattern to avoid a partially published object
|
||||||
private volatile GnssStatus mGnssStatus;
|
private volatile GnssStatus mGnssStatus;
|
||||||
private int mTimeToFirstFix;
|
private int mTimeToFirstFix;
|
||||||
@@ -1703,6 +1705,33 @@ public class LocationManager {
|
|||||||
mNmeaBuffer = new ArrayList<>();
|
mNmeaBuffer = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GnssStatusListenerTransport(GpsStatus.Listener listener, Handler handler) {
|
||||||
|
mGnssHandler = new GnssHandler(handler);
|
||||||
|
mNmeaBuffer = null;
|
||||||
|
mGnssCallback = listener != null ? new GnssStatus.Callback() {
|
||||||
|
@Override
|
||||||
|
public void onStarted() {
|
||||||
|
listener.onGpsStatusChanged(GpsStatus.GPS_EVENT_STARTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStopped() {
|
||||||
|
listener.onGpsStatusChanged(GpsStatus.GPS_EVENT_STOPPED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFirstFix(int ttff) {
|
||||||
|
listener.onGpsStatusChanged(GpsStatus.GPS_EVENT_FIRST_FIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSatelliteStatusChanged(GnssStatus status) {
|
||||||
|
listener.onGpsStatusChanged(GpsStatus.GPS_EVENT_SATELLITE_STATUS);
|
||||||
|
}
|
||||||
|
} : null;
|
||||||
|
mGnssNmeaListener = null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onGnssStarted() {
|
public void onGnssStarted() {
|
||||||
if (mGnssCallback != null) {
|
if (mGnssCallback != null) {
|
||||||
@@ -1763,7 +1792,22 @@ public class LocationManager {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
@RequiresPermission(ACCESS_FINE_LOCATION)
|
@RequiresPermission(ACCESS_FINE_LOCATION)
|
||||||
public boolean addGpsStatusListener(GpsStatus.Listener listener) {
|
public boolean addGpsStatusListener(GpsStatus.Listener listener) {
|
||||||
return false;
|
boolean result;
|
||||||
|
|
||||||
|
if (mGpsStatusListeners.get(listener) != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
GnssStatusListenerTransport transport = new GnssStatusListenerTransport(listener, null);
|
||||||
|
result = mService.registerGnssStatusCallback(transport, mContext.getPackageName());
|
||||||
|
if (result) {
|
||||||
|
mGpsStatusListeners.put(listener, transport);
|
||||||
|
}
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1773,7 +1817,16 @@ public class LocationManager {
|
|||||||
* @deprecated use {@link #unregisterGnssStatusCallback(GnssStatus.Callback)} instead.
|
* @deprecated use {@link #unregisterGnssStatusCallback(GnssStatus.Callback)} instead.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void removeGpsStatusListener(GpsStatus.Listener listener) {}
|
public void removeGpsStatusListener(GpsStatus.Listener listener) {
|
||||||
|
try {
|
||||||
|
GnssStatusListenerTransport transport = mGpsStatusListeners.remove(listener);
|
||||||
|
if (transport != null) {
|
||||||
|
mService.unregisterGnssStatusCallback(transport);
|
||||||
|
}
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a GNSS status callback.
|
* Registers a GNSS status callback.
|
||||||
@@ -1803,8 +1856,8 @@ public class LocationManager {
|
|||||||
public boolean registerGnssStatusCallback(
|
public boolean registerGnssStatusCallback(
|
||||||
@NonNull GnssStatus.Callback callback, @Nullable Handler handler) {
|
@NonNull GnssStatus.Callback callback, @Nullable Handler handler) {
|
||||||
boolean result;
|
boolean result;
|
||||||
|
synchronized (mGnssStatusListeners) {
|
||||||
if (mGnssStatusListeners.get(callback) != null) {
|
if (mGnssStatusListeners.get(callback) != null) {
|
||||||
// listener is already registered
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@@ -1817,6 +1870,7 @@ public class LocationManager {
|
|||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
throw e.rethrowFromSystemServer();
|
throw e.rethrowFromSystemServer();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1827,6 +1881,7 @@ public class LocationManager {
|
|||||||
* @param callback GNSS status callback object to remove
|
* @param callback GNSS status callback object to remove
|
||||||
*/
|
*/
|
||||||
public void unregisterGnssStatusCallback(@NonNull GnssStatus.Callback callback) {
|
public void unregisterGnssStatusCallback(@NonNull GnssStatus.Callback callback) {
|
||||||
|
synchronized (mGnssStatusListeners) {
|
||||||
try {
|
try {
|
||||||
GnssStatusListenerTransport transport = mGnssStatusListeners.remove(callback);
|
GnssStatusListenerTransport transport = mGnssStatusListeners.remove(callback);
|
||||||
if (transport != null) {
|
if (transport != null) {
|
||||||
@@ -1836,6 +1891,7 @@ public class LocationManager {
|
|||||||
throw e.rethrowFromSystemServer();
|
throw e.rethrowFromSystemServer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an NMEA listener.
|
* Adds an NMEA listener.
|
||||||
@@ -2106,7 +2162,15 @@ public class LocationManager {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
@RequiresPermission(ACCESS_FINE_LOCATION)
|
@RequiresPermission(ACCESS_FINE_LOCATION)
|
||||||
public @Nullable GpsStatus getGpsStatus(@Nullable GpsStatus status) {
|
public @Nullable GpsStatus getGpsStatus(@Nullable GpsStatus status) {
|
||||||
return null;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user