Loading services/core/java/com/android/server/location/GpsLocationProvider.java +43 −6 Original line number Original line Diff line number Diff line Loading @@ -22,10 +22,8 @@ import com.android.internal.location.GpsNetInitiatedHandler; import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderRequest; import com.android.internal.location.ProviderRequest; import com.android.internal.R; import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; import android.app.AlarmManager; import android.app.AlarmManager; import android.app.AppOpsManager; import android.app.AppOpsManager; Loading Loading @@ -72,7 +70,6 @@ import android.provider.Settings; import android.provider.Telephony.Carriers; import android.provider.Telephony.Carriers; import android.provider.Telephony.Sms.Intents; import android.provider.Telephony.Sms.Intents; import android.telephony.SmsMessage; import android.telephony.SmsMessage; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; Loading @@ -91,7 +88,6 @@ import java.io.StringReader; import java.net.InetAddress; import java.net.InetAddress; import java.net.UnknownHostException; import java.net.UnknownHostException; import java.util.Date; import java.util.Date; import java.util.List; import java.util.Map.Entry; import java.util.Map.Entry; import java.util.Properties; import java.util.Properties; Loading Loading @@ -283,8 +279,16 @@ public class GpsLocationProvider implements LocationProviderInterface { // current setting 24 hours // current setting 24 hours private static final long NTP_INTERVAL = 24*60*60*1000; private static final long NTP_INTERVAL = 24*60*60*1000; // how long to wait if we have a network error in NTP or XTRA downloading // how long to wait if we have a network error in NTP or XTRA downloading // the initial value of the exponential backoff // current setting - 5 minutes // current setting - 5 minutes private static final long RETRY_INTERVAL = 5*60*1000; private static final long RETRY_INTERVAL = 5*60*1000; // how long to wait if we have a network error in NTP or XTRA downloading // the max value of the exponential backoff // current setting - 4 hours private static final long MAX_RETRY_INTERVAL = 4*60*60*1000; private BackOff mNtpBackOff = new BackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL); private BackOff mXtraBackOff = new BackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL); // true if we are enabled, protected by this // true if we are enabled, protected by this private boolean mEnabled; private boolean mEnabled; Loading Loading @@ -877,9 +881,10 @@ public class GpsLocationProvider implements LocationProviderInterface { native_inject_time(time, timeReference, (int) certainty); native_inject_time(time, timeReference, (int) certainty); delay = NTP_INTERVAL; delay = NTP_INTERVAL; mNtpBackOff.reset(); } else { } else { if (DEBUG) Log.d(TAG, "requestTime failed"); if (DEBUG) Log.d(TAG, "requestTime failed"); delay = RETRY_INTERVAL; delay = mNtpBackOff.nextBackoffMillis(); } } sendMessage(INJECT_NTP_TIME_FINISHED, 0, null); sendMessage(INJECT_NTP_TIME_FINISHED, 0, null); Loading Loading @@ -920,6 +925,7 @@ public class GpsLocationProvider implements LocationProviderInterface { Log.d(TAG, "calling native_inject_xtra_data"); Log.d(TAG, "calling native_inject_xtra_data"); } } native_inject_xtra_data(data, data.length); native_inject_xtra_data(data, data.length); mXtraBackOff.reset(); } } sendMessage(DOWNLOAD_XTRA_DATA_FINISHED, 0, null); sendMessage(DOWNLOAD_XTRA_DATA_FINISHED, 0, null); Loading @@ -927,7 +933,8 @@ public class GpsLocationProvider implements LocationProviderInterface { if (data == null) { if (data == null) { // try again later // try again later // since this is delayed and not urgent we do not hold a wake lock here // since this is delayed and not urgent we do not hold a wake lock here mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA, RETRY_INTERVAL); mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA, mXtraBackOff.nextBackoffMillis()); } } // release wake lock held by task // release wake lock held by task Loading Loading @@ -2147,6 +2154,36 @@ public class GpsLocationProvider implements LocationProviderInterface { pw.append(s); pw.append(s); } } /** * A simple implementation of exponential backoff. */ private static final class BackOff { private static final int MULTIPLIER = 2; private final long mInitIntervalMillis; private final long mMaxIntervalMillis; private long mCurrentIntervalMillis; public BackOff(long initIntervalMillis, long maxIntervalMillis) { mInitIntervalMillis = initIntervalMillis; mMaxIntervalMillis = maxIntervalMillis; mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER; } public long nextBackoffMillis() { if (mCurrentIntervalMillis > mMaxIntervalMillis) { return mMaxIntervalMillis; } mCurrentIntervalMillis *= MULTIPLIER; return mCurrentIntervalMillis; } public void reset() { mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER; } } // for GPS SV statistics // for GPS SV statistics private static final int MAX_SVS = 32; private static final int MAX_SVS = 32; private static final int EPHEMERIS_MASK = 0; private static final int EPHEMERIS_MASK = 0; Loading Loading
services/core/java/com/android/server/location/GpsLocationProvider.java +43 −6 Original line number Original line Diff line number Diff line Loading @@ -22,10 +22,8 @@ import com.android.internal.location.GpsNetInitiatedHandler; import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderRequest; import com.android.internal.location.ProviderRequest; import com.android.internal.R; import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; import android.app.AlarmManager; import android.app.AlarmManager; import android.app.AppOpsManager; import android.app.AppOpsManager; Loading Loading @@ -72,7 +70,6 @@ import android.provider.Settings; import android.provider.Telephony.Carriers; import android.provider.Telephony.Carriers; import android.provider.Telephony.Sms.Intents; import android.provider.Telephony.Sms.Intents; import android.telephony.SmsMessage; import android.telephony.SmsMessage; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; Loading @@ -91,7 +88,6 @@ import java.io.StringReader; import java.net.InetAddress; import java.net.InetAddress; import java.net.UnknownHostException; import java.net.UnknownHostException; import java.util.Date; import java.util.Date; import java.util.List; import java.util.Map.Entry; import java.util.Map.Entry; import java.util.Properties; import java.util.Properties; Loading Loading @@ -283,8 +279,16 @@ public class GpsLocationProvider implements LocationProviderInterface { // current setting 24 hours // current setting 24 hours private static final long NTP_INTERVAL = 24*60*60*1000; private static final long NTP_INTERVAL = 24*60*60*1000; // how long to wait if we have a network error in NTP or XTRA downloading // how long to wait if we have a network error in NTP or XTRA downloading // the initial value of the exponential backoff // current setting - 5 minutes // current setting - 5 minutes private static final long RETRY_INTERVAL = 5*60*1000; private static final long RETRY_INTERVAL = 5*60*1000; // how long to wait if we have a network error in NTP or XTRA downloading // the max value of the exponential backoff // current setting - 4 hours private static final long MAX_RETRY_INTERVAL = 4*60*60*1000; private BackOff mNtpBackOff = new BackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL); private BackOff mXtraBackOff = new BackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL); // true if we are enabled, protected by this // true if we are enabled, protected by this private boolean mEnabled; private boolean mEnabled; Loading Loading @@ -877,9 +881,10 @@ public class GpsLocationProvider implements LocationProviderInterface { native_inject_time(time, timeReference, (int) certainty); native_inject_time(time, timeReference, (int) certainty); delay = NTP_INTERVAL; delay = NTP_INTERVAL; mNtpBackOff.reset(); } else { } else { if (DEBUG) Log.d(TAG, "requestTime failed"); if (DEBUG) Log.d(TAG, "requestTime failed"); delay = RETRY_INTERVAL; delay = mNtpBackOff.nextBackoffMillis(); } } sendMessage(INJECT_NTP_TIME_FINISHED, 0, null); sendMessage(INJECT_NTP_TIME_FINISHED, 0, null); Loading Loading @@ -920,6 +925,7 @@ public class GpsLocationProvider implements LocationProviderInterface { Log.d(TAG, "calling native_inject_xtra_data"); Log.d(TAG, "calling native_inject_xtra_data"); } } native_inject_xtra_data(data, data.length); native_inject_xtra_data(data, data.length); mXtraBackOff.reset(); } } sendMessage(DOWNLOAD_XTRA_DATA_FINISHED, 0, null); sendMessage(DOWNLOAD_XTRA_DATA_FINISHED, 0, null); Loading @@ -927,7 +933,8 @@ public class GpsLocationProvider implements LocationProviderInterface { if (data == null) { if (data == null) { // try again later // try again later // since this is delayed and not urgent we do not hold a wake lock here // since this is delayed and not urgent we do not hold a wake lock here mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA, RETRY_INTERVAL); mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA, mXtraBackOff.nextBackoffMillis()); } } // release wake lock held by task // release wake lock held by task Loading Loading @@ -2147,6 +2154,36 @@ public class GpsLocationProvider implements LocationProviderInterface { pw.append(s); pw.append(s); } } /** * A simple implementation of exponential backoff. */ private static final class BackOff { private static final int MULTIPLIER = 2; private final long mInitIntervalMillis; private final long mMaxIntervalMillis; private long mCurrentIntervalMillis; public BackOff(long initIntervalMillis, long maxIntervalMillis) { mInitIntervalMillis = initIntervalMillis; mMaxIntervalMillis = maxIntervalMillis; mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER; } public long nextBackoffMillis() { if (mCurrentIntervalMillis > mMaxIntervalMillis) { return mMaxIntervalMillis; } mCurrentIntervalMillis *= MULTIPLIER; return mCurrentIntervalMillis; } public void reset() { mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER; } } // for GPS SV statistics // for GPS SV statistics private static final int MAX_SVS = 32; private static final int MAX_SVS = 32; private static final int EPHEMERIS_MASK = 0; private static final int EPHEMERIS_MASK = 0; Loading