From 45d1b261e6faf9e73ba954d42d514ef6250020b9 Mon Sep 17 00:00:00 2001 From: zhoulei Date: Wed, 10 May 2017 18:09:50 +0800 Subject: [PATCH] update time while network is connected NTP update time from network while the network is not OK, so it should not be excuted the network is disconnected to be for low power consumption Test: as follows - built - flashed - booted Change-Id: I17f2a9463551e254284ee8a9f894a95e983eee19 Signed-off-by: zhoulei --- .../android/server/NetworkTimeUpdateService.java | 53 +++++++++++----------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/services/core/java/com/android/server/NetworkTimeUpdateService.java b/services/core/java/com/android/server/NetworkTimeUpdateService.java index b64c65dd5827..9f7437ec2a3a 100644 --- a/services/core/java/com/android/server/NetworkTimeUpdateService.java +++ b/services/core/java/com/android/server/NetworkTimeUpdateService.java @@ -26,6 +26,8 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.database.ContentObserver; import android.net.ConnectivityManager; +import android.net.ConnectivityManager.NetworkCallback; +import android.net.Network; import android.os.Binder; import android.os.Handler; import android.os.HandlerThread; @@ -73,6 +75,7 @@ public class NetworkTimeUpdateService extends Binder { private long mNitzTimeSetTime = NOT_SET; // TODO: Have a way to look up the timezone we are in private long mNitzZoneSetTime = NOT_SET; + private Network mDefaultNetwork = null; private Context mContext; private TrustedTime mTime; @@ -82,6 +85,8 @@ public class NetworkTimeUpdateService extends Binder { private AlarmManager mAlarmManager; private PendingIntent mPendingPollIntent; private SettingsObserver mSettingsObserver; + private ConnectivityManager mCM; + private NetworkTimeUpdateCallback mNetworkTimeUpdateCallback; // The last time that we successfully fetched the NTP time. private long mLastNtpFetchTime = NOT_SET; private final PowerManager.WakeLock mWakeLock; @@ -103,6 +108,7 @@ public class NetworkTimeUpdateService extends Binder { mContext = context; mTime = NtpTrustedTime.getInstance(context); mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); + mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); Intent pollIntent = new Intent(ACTION_POLL, null); mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0); @@ -123,13 +129,12 @@ public class NetworkTimeUpdateService extends Binder { public void systemRunning() { registerForTelephonyIntents(); registerForAlarms(); - registerForConnectivityIntents(); HandlerThread thread = new HandlerThread(TAG); thread.start(); mHandler = new MyHandler(thread.getLooper()); - // Check the network time on the new thread - mHandler.obtainMessage(EVENT_POLL_NETWORK_TIME).sendToTarget(); + mNetworkTimeUpdateCallback = new NetworkTimeUpdateCallback(); + mCM.registerDefaultNetworkCallback(mNetworkTimeUpdateCallback, mHandler); mSettingsObserver = new SettingsObserver(mHandler, EVENT_AUTO_TIME_CHANGED); mSettingsObserver.observe(mContext); @@ -152,15 +157,10 @@ public class NetworkTimeUpdateService extends Binder { }, new IntentFilter(ACTION_POLL)); } - private void registerForConnectivityIntents() { - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); - mContext.registerReceiver(mConnectivityReceiver, intentFilter); - } - private void onPollNetworkTime(int event) { - // If Automatic time is not set, don't bother. - if (!isAutomaticTimeRequested()) return; + // If Automatic time is not set, don't bother. Similarly, if we don't + // have any default network, don't bother. + if (!isAutomaticTimeRequested() || mDefaultNetwork == null) return; mWakeLock.acquire(); try { onPollNetworkTimeUnderWakeLock(event); @@ -262,22 +262,6 @@ public class NetworkTimeUpdateService extends Binder { } }; - /** Receiver for ConnectivityManager events */ - private BroadcastReceiver mConnectivityReceiver = new BroadcastReceiver() { - - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { - if (DBG) Log.d(TAG, "Received CONNECTIVITY_ACTION "); - // Don't bother checking if we have connectivity, NtpTrustedTime does that for us. - Message message = mHandler.obtainMessage(EVENT_NETWORK_CHANGED); - // Send with a short delay to make sure the network is ready for use - mHandler.sendMessageDelayed(message, NETWORK_CHANGE_EVENT_DELAY_MS); - } - } - }; - /** Handler to do the network accesses on */ private class MyHandler extends Handler { @@ -297,6 +281,21 @@ public class NetworkTimeUpdateService extends Binder { } } + private class NetworkTimeUpdateCallback extends NetworkCallback { + @Override + public void onAvailable(Network network) { + Log.d(TAG, String.format("New default network %s; checking time.", network)); + mDefaultNetwork = network; + // Running on mHandler so invoke directly. + onPollNetworkTime(EVENT_NETWORK_CHANGED); + } + + @Override + public void onLost(Network network) { + if (network.equals(mDefaultNetwork)) mDefaultNetwork = null; + } + } + /** Observer to watch for changes to the AUTO_TIME setting */ private static class SettingsObserver extends ContentObserver { -- 2.11.0