Merge "BroadcastInterceptingContext: use passed-in broadcast Handler."
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user