Merge "BroadcastInterceptingContext: use passed-in broadcast Handler." into mainline-prod
This commit is contained in:
committed by
Android (Google) Code Review
commit
21f28e69e1
@@ -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;
|
||||
mReceiver.onReceive(context, intent);
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
mUseRegisteredHandlers = use;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
|
||||
synchronized (mInterceptors) {
|
||||
mInterceptors.add(new BroadcastInterceptor(receiver, filter));
|
||||
}
|
||||
return null;
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user