Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2ea28e4c authored by Neil Fuller's avatar Neil Fuller Committed by Android (Google) Code Review
Browse files

Merge "Stop blocking broadcast receiver thread" into udc-dev

parents d746b23e dbfdb3f5
Loading
Loading
Loading
Loading
+22 −14
Original line number Original line Diff line number Diff line
@@ -30,7 +30,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
import android.net.Network;
import android.os.Binder;
import android.os.Binder;
import android.os.Handler;
import android.os.Handler;
@@ -140,20 +139,12 @@ public class NetworkTimeUpdateService extends Binder {
    /** Initialize the receivers and initiate the first NTP request */
    /** Initialize the receivers and initiate the first NTP request */
    public void systemRunning() {
    public void systemRunning() {
        // Listen for scheduled refreshes.
        // Listen for scheduled refreshes.
        mContext.registerReceiver(
        ScheduledRefreshBroadcastReceiver receiver = new ScheduledRefreshBroadcastReceiver();
                new BroadcastReceiver() {
        mContext.registerReceiver(receiver, new IntentFilter(ACTION_POLL));
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        onPollNetworkTime("scheduled refresh");
                    }
                },
                new IntentFilter(ACTION_POLL),
                /*broadcastPermission=*/ null,
                mHandler);


        // Listen for network connectivity changes.
        // Listen for network connectivity changes.
        NetworkTimeUpdateCallback networkTimeUpdateCallback = new NetworkTimeUpdateCallback();
        NetworkConnectivityCallback networkConnectivityCallback = new NetworkConnectivityCallback();
        mCM.registerDefaultNetworkCallback(networkTimeUpdateCallback, mHandler);
        mCM.registerDefaultNetworkCallback(networkConnectivityCallback, mHandler);


        // Listen for user settings changes.
        // Listen for user settings changes.
        ContentResolver resolver = mContext.getContentResolver();
        ContentResolver resolver = mContext.getContentResolver();
@@ -223,8 +214,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.
    // 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
        @Override
        public void onAvailable(@NonNull Network network) {
        public void onAvailable(@NonNull Network network) {
            Log.d(TAG, String.format("New default network %s; checking time.", network));
            Log.d(TAG, String.format("New default network %s; checking time.", network));