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

Commit dbfdb3f5 authored by Neil Fuller's avatar Neil Fuller
Browse files

Stop blocking broadcast receiver thread

Stop blocking broadcast receiver thread during network operations.

This reverts part of a behavior change from commit 6bb629bb.
That commit switched a BroadcastReceiver over to using a specific
handler (X) for some long-running work. That isn't the same behavior as
posting the work to handler X and returning immediately, and it can
cause an ANR if the work takes too long.

The behavior has been changed back to explicitly post work to the
handler and return.

Bug: 271951363
Test: build / boot / treehugger
Change-Id: I9aeaf200d19de97b5be909678aab8d5421cd11a4
parent c752ab59
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();
@@ -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.
    // 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));