From 7f2cfed525e806efd7a9ba658b54583579f27fe5 Mon Sep 17 00:00:00 2001 From: Wyatt Riley Date: Tue, 27 Jun 2017 19:59:19 -0700 Subject: [PATCH] Ensure complete GnssStatus construction Using volatile reference & final member pattern. Bug: 37517406 Test: basic GNSS & GPS Status output works Change-Id: I5650149e0a3f63a52734c8f044d38f3956819921 --- location/java/android/location/GnssStatus.java | 13 ++++++------- location/java/android/location/LocationManager.java | 7 ++++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/location/java/android/location/GnssStatus.java b/location/java/android/location/GnssStatus.java index 912551f5e4a94..b2903c4689e0f 100644 --- a/location/java/android/location/GnssStatus.java +++ b/location/java/android/location/GnssStatus.java @@ -97,13 +97,12 @@ public final class GnssStatus { CONSTELLATION_QZSS, CONSTELLATION_BEIDOU, CONSTELLATION_GALILEO}) public @interface ConstellationType {} - /* These package private values are modified by the LocationManager class */ - /* package */ int[] mSvidWithFlags; - /* package */ float[] mCn0DbHz; - /* package */ float[] mElevations; - /* package */ float[] mAzimuths; - /* package */ int mSvCount; - /* package */ float[] mCarrierFrequencies; + final int[] mSvidWithFlags; + final float[] mCn0DbHz; + final float[] mElevations; + final float[] mAzimuths; + final int mSvCount; + final float[] mCarrierFrequencies; GnssStatus(int svCount, int[] svidWithFlags, float[] cn0s, float[] elevations, float[] azimuths, float[] carrierFrequencies) { diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 26ac2a23d8c5c..968f596e0cc5b 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -74,7 +74,8 @@ public class LocationManager { new HashMap<>(); private final HashMap mGnssNmeaListeners = new HashMap<>(); - private GnssStatus mGnssStatus; + // volatile + GnssStatus final-fields pattern to avoid a partially published object + private volatile GnssStatus mGnssStatus; private int mTimeToFirstFix; /** @@ -1563,7 +1564,7 @@ public class LocationManager { float[] cn0s, float[] elevations, float[] azimuths, float[] carrierFreqs) { if (mGnssCallback != null) { mGnssStatus = new GnssStatus(svCount, prnWithFlags, cn0s, elevations, azimuths, - carrierFreqs); + carrierFreqs); Message msg = Message.obtain(); msg.what = GpsStatus.GPS_EVENT_SATELLITE_STATUS; @@ -1949,7 +1950,7 @@ public class LocationManager { status = new GpsStatus(); } // When mGnssStatus is null, that means that this method is called outside - // onGpsStatusChanged(). Return an empty status to maintain backwards compatibility. + // onGpsStatusChanged(). Return an empty status to maintain backwards compatibility. if (mGnssStatus != null) { status.setStatus(mGnssStatus, mTimeToFirstFix); }