Merge "BroadcastInterceptingContext: use passed-in broadcast Handler."

This commit is contained in:
Lorenzo Colitti
2021-02-15 10:42:18 +00:00
committed by Gerrit Code Review
3 changed files with 34 additions and 15 deletions

View File

@@ -4987,9 +4987,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
// TODO: make BroadcastInterceptingContext use the Handler passed in to registerReceiver ensureRunningOnConnectivityServiceThread();
// and put this back.
// ensureRunningOnConnectivityServiceThread();
final String action = intent.getAction(); final String action = intent.getAction();
final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);

View File

@@ -1300,10 +1300,8 @@ public class ConnectivityServiceTest {
} }
private void processBroadcastForVpn(Intent intent) { private void processBroadcastForVpn(Intent intent) {
// The BroadcastReceiver for this broadcast checks it is being run on the handler thread. mServiceContext.sendBroadcast(intent);
final Handler handler = new Handler(mVMSHandlerThread.getLooper()); HandlerUtils.waitForIdle(mVMSHandlerThread, TIMEOUT_MS);
handler.post(() -> mServiceContext.sendBroadcast(intent));
HandlerUtils.waitForIdle(handler, TIMEOUT_MS);
waitForIdle(); waitForIdle();
} }
@@ -1430,6 +1428,7 @@ public class ConnectivityServiceTest {
FakeSettingsProvider.clearSettingsProvider(); FakeSettingsProvider.clearSettingsProvider();
mServiceContext = new MockContext(InstrumentationRegistry.getContext(), mServiceContext = new MockContext(InstrumentationRegistry.getContext(),
new FakeSettingsProvider()); new FakeSettingsProvider());
mServiceContext.setUseRegisteredHandlers(true);
LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class); LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class);
LocalServices.addService( LocalServices.addService(
NetworkPolicyManagerInternal.class, mock(NetworkPolicyManagerInternal.class)); NetworkPolicyManagerInternal.class, mock(NetworkPolicyManagerInternal.class));

View File

@@ -42,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(
@@ -61,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);
@@ -116,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