packages/apps/Settings / res/xml/date_time_prefs.xml
<PreferenceCategory
android:key="ntp_server_preference_category"
android:layout="@layout/preference_category_no_label">
<com.android.settings.datetime.DhcpNtpServerSwitchPreference
android:key="dhcp_ntp_server"
android:title="Use DHCP NTP server" />
<com.android.settings.datetime.NTPServerPreference
android:key="ntp_server"
android:title="NTP Server"
android:summary=""/>
</PreferenceCategory>
packages/apps/Settings / src/com/android/settings/datetime/DateTimeSettings.java
controllers.add(new NTPServerPreferenceController(context));
packages/apps/Settings / src/com/android/settings/datetime/DhcpNtpServerSwitchPreference.java
package com.android.settings.datetime;
import android.content.Context;
import android.provider.Settings;
import androidx.core.content.res.TypedArrayUtils;
import androidx.preference.SwitchPreference;
import android.util.AttributeSet;
import android.view.View;
public class DhcpNtpServerSwitchPreference extends SwitchPreference {
private Context mContext;
public DhcpNtpServerSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mContext = context;
mChecked = Settings.Global.getInt(context.getContentResolver(), "dhcp_ntp_server", 0) != 0;
}
public DhcpNtpServerSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public DhcpNtpServerSwitchPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context,
androidx.preference.R.attr.switchPreferenceStyle,
android.R.attr.switchPreferenceStyle));
}
public DhcpNtpServerSwitchPreference(Context context) {
this(context, null);
}
@Override
public void setChecked(boolean enabled) {
super.setChecked(enabled);
Settings.Global.putInt(mContext.getContentResolver(), "dhcp_ntp_server", (enabled ? 1 : 0));
}
}
packages/apps/Settings / src/com/android/settings/datetime/NTPServerPreference.java
package com.android.settings.datetime;
import android.content.Context;
import android.os.SystemProperties;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import android.content.res.Resources;
import android.util.Log;
import android.util.NtpTrustedTime;
import android.widget.EditText;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import com.android.settings.R;
import android.provider.Settings;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.os.Handler;
import android.util.AttributeSet;
import androidx.core.content.res.TypedArrayUtils;
import static java.security.AccessController.getContext;
public class NTPServerPreference extends Preference {
private final String TAG = "NTPServerPreference";
private Context mContext;
private String mNTPServer;
private NtpTrustedTime mNtp;
private ContentObserver mDhcpNtpServerObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
setEnabled(!isDhcpNtpServerEnabled());
}
};
public NTPServerPreference(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mContext = context;
setEnabled(!isDhcpNtpServerEnabled());
setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
showNTPServerSettingsDialog();
return true;
}
});
}
public NTPServerPreference(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public NTPServerPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context,
androidx.preference.R.attr.preferenceStyle,
android.R.attr.preferenceStyle));
}
public NTPServerPreference(Context context) {
this(context, null);
}
@Override
public void onAttached() {
super.onAttached();
setNTPServerSummary();
getContext().getContentResolver().registerContentObserver(Settings.Global.getUriFor("dhcp_ntp_server"), true, mDhcpNtpServerObserver);
}
@Override
public void onDetached() {
super.onDetached();
getContext().getContentResolver().unregisterContentObserver(mDhcpNtpServerObserver);
}
private void showNTPServerSettingsDialog() {
mNTPServer = Settings.Global.getString(mContext.getContentResolver(), Settings.Global.NTP_SERVER);
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.input_dialog_ntpserver, null);
EditText dialogET = layout.findViewById(R.id.input_dialog_ntp_ed);
dialogET.setText(getSummary());
new AlertDialog.Builder(mContext)
.setView(layout)
.setTitle(R.string.ntp_server_address)
.setNegativeButton(R.string.dlg_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
}
}).setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
mNtp = NtpTrustedTime.getInstance(mContext);
mNTPServer = dialogET.getText().toString();
//TODO:设置config
Settings.Global.putString(mContext.getContentResolver(), "sys.device.ntpserver", mNTPServer);
mNtp.forceSync();
// getSummary();
setNTPServerSummary();
//pm add for saveNTPServer
Settings.Global.putString(mContext.getContentResolver(), Settings.Global.NTP_SERVER, mNTPServer);
//notify reboot
/*new AlertDialog.Builder(mContext)
.setTitle(com.android.internal.R.string.notification_channel_alerts)
.setMessage("Please reboot to apply the new setting.")
.setNegativeButton(com.android.internal.R.string.cancel,new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int i){
}
})
.setPositiveButton(com.android.internal.R.string.factorytest_reboot,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int i){
//TODO:reboot
Intent intent = new Intent(Intent.ACTION_REBOOT);
intent.putExtra("nowait", 1);
intent.putExtra("interval", 1);
intent.putExtra("window", 0);
mContext.sendBroadcast(intent);
}
}).create().show();*/
}
}).create().show();
}
private void setNTPServerSummary() {
String ntpServer = Settings.Global.getString(mContext.getContentResolver(), Settings.Global.NTP_SERVER);
Log.i("test00"," ntpServer = " + ntpServer);
if (ntpServer == null || ntpServer.isEmpty()) {
Log.i("test00"," --------1-------- ");
this.setSummary(mContext.getResources().getString(com.android.internal.R.string.config_ntpServer));
} else {
Log.i("test00"," --------1-------- ");
this.setSummary(ntpServer);
}
}
private boolean isDhcpNtpServerEnabled() {
return Settings.Global.getInt(mContext.getContentResolver(), "dhcp_ntp_server", 0) != 0;
}
public CharSequence getSummary() {
final Resources res = mContext.getResources();
String ntp_server = Settings.Global.getString(mContext.getContentResolver(), "sys.device.ntpserver");
if (ntp_server == null){
Log.i("test00"," ntp_server = null " );
ntp_server = res.getString(com.android.internal.R.string.config_ntpServer);
}
Log.i("test00"," ntp_server = " + ntp_server);
return ntp_server;
}
}
默认服务器:frameworks/base / core/res/res/values/config.xml
<string translatable="false" name="config_ntpServer">2.android.pool.ntp.org</string>
frameworks/base / core/java/android/util/NtpTrustedTime.java
private NtpConnectionInfo getNtpConnectionInfo() {
final ContentResolver resolver = mContext.getContentResolver();
final Resources res = mContext.getResources();
String defaultServer;
if (Settings.Global.getString(mContext.getContentResolver(), "sys.device.ntpserver") == null) {
defaultServer = res.getString(com.android.internal.R.string.config_ntpServer);
}else {
defaultServer = Settings.Global.getString(mContext.getContentResolver(), "sys.device.ntpserver");
}
final int defaultTimeoutMillis = res.getInteger(
com.android.internal.R.integer.config_ntpTimeout);
packages/apps/Settings / res/layout/input_dialog_ntpserver.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/input_dialog_ntp_ed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:singleLine="true"
android:inputType="textUri"/>
</LinearLayout>
frameworks/base/core/java/android/util/NtpTrustedTime.java
@GuardedBy("this")
private NtpConnectionInfo getNtpConnectionInfo() {
final ContentResolver resolver = mContext.getContentResolver();
final Resources res = mContext.getResources();
final String hostname;
if (mHostnameForTests != null) {
hostname = mHostnameForTests;
} else {
String serverGlobalSetting =
Settings.Global.getString(resolver, Settings.Global.NTP_SERVER);
if (serverGlobalSetting != null) {
hostname = serverGlobalSetting;
} else {
hostname = res.getString(com.android.internal.R.string.config_ntpServer);
}
}