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

Commit 21f28e69 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "BroadcastInterceptingContext: use passed-in broadcast Handler." into mainline-prod

parents 7d5365b2 aa7de1bf
Loading
Loading
Loading
Loading
+30 −9
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -43,6 +42,8 @@ public class BroadcastInterceptingContext extends ContextWrapper {

    private final List<BroadcastInterceptor> mInterceptors = new ArrayList<>();

    private boolean mUseRegisteredHandlers;

    public abstract class FutureIntent extends FutureTask<Intent> {
        public FutureIntent() {
            super(
@@ -62,17 +63,24 @@ public class BroadcastInterceptingContext extends ContextWrapper {
    public class BroadcastInterceptor extends FutureIntent {
        private final BroadcastReceiver mReceiver;
        private final IntentFilter mFilter;
        private final Handler mHandler;

        public BroadcastInterceptor(BroadcastReceiver receiver, IntentFilter filter) {
        public BroadcastInterceptor(BroadcastReceiver receiver, IntentFilter filter,
                Handler handler) {
            mReceiver = receiver;
            mFilter = filter;
            mHandler = mUseRegisteredHandlers ? handler : null;
        }

        public boolean dispatchBroadcast(Intent intent) {
            if (mFilter.match(getContentResolver(), intent, false, TAG) > 0) {
                if (mReceiver != null) {
                    final Context context = BroadcastInterceptingContext.this;
                    if (mHandler == null) {
                        mReceiver.onReceive(context, intent);
                    } else {
                        mHandler.post(() -> mReceiver.onReceive(context, intent));
                    }
                    return false;
                } else {
                    set(intent);
@@ -117,25 +125,38 @@ public class BroadcastInterceptingContext extends ContextWrapper {
    }

    public FutureIntent nextBroadcastIntent(IntentFilter filter) {
        final BroadcastInterceptor interceptor = new BroadcastInterceptor(null, filter);
        final BroadcastInterceptor interceptor = new BroadcastInterceptor(null, filter, null);
        synchronized (mInterceptors) {
            mInterceptors.add(interceptor);
        }
        return interceptor;
    }

    @Override
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
    /**
     * Whether to send broadcasts to registered handlers. By default, receivers are called
     * synchronously by sendBroadcast. If this method is called with {@code true}, the receiver is
     * instead called by a runnable posted to the Handler specified when the receiver was
     * registered. This method applies only to future registrations, already-registered receivers
     * are unaffected.
     */
    public void setUseRegisteredHandlers(boolean use) {
        synchronized (mInterceptors) {
            mInterceptors.add(new BroadcastInterceptor(receiver, filter));
            mUseRegisteredHandlers = use;
        }
        return null;
    }

    @Override
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
        return registerReceiver(receiver, filter, null, null);
    }

    @Override
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
            String broadcastPermission, Handler scheduler) {
        return registerReceiver(receiver, filter);
        synchronized (mInterceptors) {
            mInterceptors.add(new BroadcastInterceptor(receiver, filter, scheduler));
        }
        return null;
    }

    @Override