private static void testOrderedBroadcast(final Context context, final Intent intent, final boolean expected_pass) { final BroadcastReceiver responder = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { setResultCode(Activity.RESULT_OK); }}; if (intent.getAction() != null) context.registerReceiver(responder, new IntentFilter(intent.getAction())); try { final SettableFuture<Integer> future = new SettableFuture<>(); context.sendOrderedBroadcast(intent, null, new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { future.set(getResultCode()); }}, null, Activity.RESULT_CANCELED, null, null); final int result = waitForCompletion(future); assertEquals(expected_pass ? Activity.RESULT_OK : Activity.RESULT_CANCELED, result); } finally { if (intent.getAction() != null) context.unregisterReceiver(responder); } }
private static void runInSeparateProcess(final TestService.Procedure procedure) { final Context context = context(); final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); assertNotNull(am); KILL: for (;;) { // Ensure the separate process is always cleanly started. am.killBackgroundProcesses(context().getPackageName()); for (final ActivityManager.RunningAppProcessInfo process : am.getRunningAppProcesses()) { if (process.uid != Process.myUid()) continue; if (process.pid == Process.myPid()) continue; try { Thread.sleep(20); } catch (final InterruptedException ignored) {} continue KILL; } break; } final SettableFuture<IBinder> holder = new SettableFuture<>(); final ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(final ComponentName name, final IBinder service) { holder.set(service); } @Override public void onServiceDisconnected(final ComponentName name) {} }; if (! context.bindService(new Intent(context, TestService.class), connection, Context.BIND_AUTO_CREATE)) throw new IllegalStateException("TestService is not properly setup"); final IBinder binder = waitForCompletion(holder); try { TestService.invokeService(binder, procedure); } finally { context.unbindService(connection); } }