diff --git a/frameworks/base/core/java/android/util/NtpTrustedTime.java b/frameworks/base/core/java/android/util/NtpTrustedTime.java
index ed2d3c6..7047645 100644
--- a/frameworks/base/core/java/android/util/NtpTrustedTime.java
+++ b/frameworks/base/core/java/android/util/NtpTrustedTime.java
@@ -39,7 +39,7 @@ public class NtpTrustedTime implements TrustedTime {
private static NtpTrustedTime sSingleton;
private static Context sContext;
- private final String mServer;
+ private String mServer;
private final long mTimeout;
private ConnectivityManager mCM;
@@ -48,6 +48,13 @@ public class NtpTrustedTime implements TrustedTime {
private long mCachedNtpTime;
private long mCachedNtpElapsedRealtime;
private long mCachedNtpCertainty;
+
+ String[] backupNtpServers = new String[]{
+ "tw.pool.ntp.org",
+ "time.nist.gov",
+ "time-a.nist.gov"
+ };
+ int index = -1;
private NtpTrustedTime(String server, long timeout) {
if (LOGD) Log.d(TAG, "creating NtpTrustedTime using " + server);
@@ -101,15 +108,28 @@ public class NtpTrustedTime implements TrustedTime {
if (LOGD) Log.d(TAG, "forceRefresh() from cache miss");
final SntpClient client = new SntpClient();
- if (client.requestTime(mServer, (int) mTimeout)) {
- mHasCache = true;
- mCachedNtpTime = client.getNtpTime();
- mCachedNtpElapsedRealtime = client.getNtpTimeReference();
- mCachedNtpCertainty = client.getRoundTripTime() / 2;
- return true;
- } else {
- return false;
- }
+ boolean result = false;
+ while(!(result = client.requestTime(mServer, (int)mTimeout)) && index < (backupNtpServers.length-1)){
+ index++;
+ mServer = backupNtpServers[index];
+ }
+ index = -1;
+ Resources res = sContext.getResources();
+ String defaultServer = res.getString(
+ com.android.internal.R.string.config_ntpServer);
+ String secureServer = Settings.Global.getString(
+ sContext.getContentResolver(), Settings.Global.NTP_SERVER);
+
+ mServer = secureServer != null ? secureServer : defaultServer;
+
+ if(result){
+ mHasCache = true;
+ mCachedNtpTime = client.getNtpTime();
+ mCachedNtpElapsedRealtime = client.getNtpTimeReference();
+ mCachedNtpCertainty = client.getRoundTripTime() / 2;
+ }
+
+ return result;
}
@Override
diff --git a/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
new file mode 100644
index 0000000..ee8306f
--- /dev/null
+++ b/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!--use windows ntp server for default-->
+ <string name="def_ntp_server" translatable="false">
+ time.windows.com
+ </string>
+</resources>
diff --git a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/frameworks/base/packages/SettingsProvider/src/com/android/provide
index 11e8e54..b529c2e 100644
--- a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2575,6 +2575,9 @@ class DatabaseHelper extends SQLiteOpenHelper {
loadBooleanSetting(stmt, Settings.Global.THEATER_MODE_ON,
R.bool.def_theater_mode_on);
+ loadStringSetting(stmt, Settings.Global.NTP_SERVER,
+ R.string.def_ntp_server);
+
loadStringSetting(stmt, Settings.Global.AIRPLANE_MODE_RADIOS,
R.string.def_airplane_mode_radios);