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.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Future;
|
|
||||||
import java.util.concurrent.FutureTask;
|
import java.util.concurrent.FutureTask;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
@@ -43,6 +42,8 @@ public class BroadcastInterceptingContext extends ContextWrapper {
|
|||||||
|
|
||||||
private final List<BroadcastInterceptor> mInterceptors = new ArrayList<>();
|
private final List<BroadcastInterceptor> mInterceptors = new ArrayList<>();
|
||||||
|
|
||||||
|
private boolean mUseRegisteredHandlers;
|
||||||
|
|
||||||
public abstract class FutureIntent extends FutureTask<Intent> {
|
public abstract class FutureIntent extends FutureTask<Intent> {
|
||||||
public FutureIntent() {
|
public FutureIntent() {
|
||||||
super(
|
super(
|
||||||
@@ -62,17 +63,24 @@ public class BroadcastInterceptingContext extends ContextWrapper {
|
|||||||
public class BroadcastInterceptor extends FutureIntent {
|
public class BroadcastInterceptor extends FutureIntent {
|
||||||
private final BroadcastReceiver mReceiver;
|
private final BroadcastReceiver mReceiver;
|
||||||
private final IntentFilter mFilter;
|
private final IntentFilter mFilter;
|
||||||
|
private final Handler mHandler;
|
||||||
|
|
||||||
public BroadcastInterceptor(BroadcastReceiver receiver, IntentFilter filter) {
|
public BroadcastInterceptor(BroadcastReceiver receiver, IntentFilter filter,
|
||||||
|
Handler handler) {
|
||||||
mReceiver = receiver;
|
mReceiver = receiver;
|
||||||
mFilter = filter;
|
mFilter = filter;
|
||||||
|
mHandler = mUseRegisteredHandlers ? handler : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean dispatchBroadcast(Intent intent) {
|
public boolean dispatchBroadcast(Intent intent) {
|
||||||
if (mFilter.match(getContentResolver(), intent, false, TAG) > 0) {
|
if (mFilter.match(getContentResolver(), intent, false, TAG) > 0) {
|
||||||
if (mReceiver != null) {
|
if (mReceiver != null) {
|
||||||
final Context context = BroadcastInterceptingContext.this;
|
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;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
set(intent);
|
set(intent);
|
||||||
@@ -117,25 +125,38 @@ public class BroadcastInterceptingContext extends ContextWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public FutureIntent nextBroadcastIntent(IntentFilter filter) {
|
public FutureIntent nextBroadcastIntent(IntentFilter filter) {
|
||||||
final BroadcastInterceptor interceptor = new BroadcastInterceptor(null, filter);
|
final BroadcastInterceptor interceptor = new BroadcastInterceptor(null, filter, null);
|
||||||
synchronized (mInterceptors) {
|
synchronized (mInterceptors) {
|
||||||
mInterceptors.add(interceptor);
|
mInterceptors.add(interceptor);
|
||||||
}
|
}
|
||||||
return 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
|
@Override
|
||||||
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
|
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
|
||||||
synchronized (mInterceptors) {
|
return registerReceiver(receiver, filter, null, null);
|
||||||
mInterceptors.add(new BroadcastInterceptor(receiver, filter));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
|
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
|
||||||
String broadcastPermission, Handler scheduler) {
|
String broadcastPermission, Handler scheduler) {
|
||||||
return registerReceiver(receiver, filter);
|
synchronized (mInterceptors) {
|
||||||
|
mInterceptors.add(new BroadcastInterceptor(receiver, filter, scheduler));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user