summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java36
1 files changed, 22 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java b/services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java
index 399e9413bded..61386cbbc378 100644
--- a/services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java
+++ b/services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java
@@ -30,7 +30,6 @@ import android.content.Intent;
import android.content.IntentFilter;
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;
@@ -140,20 +139,12 @@ public class NetworkTimeUpdateService extends Binder {
/** Initialize the receivers and initiate the first NTP request */
public void systemRunning() {
// Listen for scheduled refreshes.
- mContext.registerReceiver(
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- onPollNetworkTime("scheduled refresh");
- }
- },
- new IntentFilter(ACTION_POLL),
- /*broadcastPermission=*/ null,
- mHandler);
+ ScheduledRefreshBroadcastReceiver receiver = new ScheduledRefreshBroadcastReceiver();
+ mContext.registerReceiver(receiver, new IntentFilter(ACTION_POLL));
// Listen for network connectivity changes.
- NetworkTimeUpdateCallback networkTimeUpdateCallback = new NetworkTimeUpdateCallback();
- mCM.registerDefaultNetworkCallback(networkTimeUpdateCallback, mHandler);
+ NetworkConnectivityCallback networkConnectivityCallback = new NetworkConnectivityCallback();
+ mCM.registerDefaultNetworkCallback(networkConnectivityCallback, mHandler);
// Listen for user settings changes.
ContentResolver resolver = mContext.getContentResolver();
@@ -241,8 +232,25 @@ public class NetworkTimeUpdateService extends Binder {
}
}
+ private class ScheduledRefreshBroadcastReceiver extends BroadcastReceiver implements Runnable {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // The BroadcastReceiver has to complete quickly or an ANR will be triggered by the
+ // platform regardless of the receiver thread used. Instead of blocking the receiver
+ // thread, the long-running / blocking work is posted to mHandler to allow onReceive()
+ // to return immediately.
+ mHandler.post(this);
+ }
+
+ @Override
+ public void run() {
+ onPollNetworkTime("scheduled refresh");
+ }
+ }
+
// All callbacks will be invoked using mHandler because of how the callback is registered.
- private class NetworkTimeUpdateCallback extends NetworkCallback {
+ private class NetworkConnectivityCallback extends ConnectivityManager.NetworkCallback {
@Override
public void onAvailable(@NonNull Network network) {
Log.d(TAG, String.format("New default network %s; checking time.", network));