private static ContentProviderClient acquireContentProviderClient(Context context, Uri uri) { if (VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { return context.getContentResolver().acquireUnstableContentProviderClient(uri); } return context.getContentResolver().acquireContentProviderClient(uri); }
private static ContentProviderClient acquireContentProviderClient(Context context, String name) { if (VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { return context.getContentResolver().acquireUnstableContentProviderClient(name); } return context.getContentResolver().acquireContentProviderClient(name); }
ContentResolver resolver = context.getContentResolver(); ContentProviderClient client = resolver.acquireContentProviderClient("myAuthority"); MyContentProvider provider = (MyContentProvider) client.getLocalContentProvider(); provider.resetDatabase(); client.release();
@Override public boolean onCreate() { ContentProviderClient contentProviderClient = ApplicationProvider.getApplicationContext() .getContentResolver() .acquireContentProviderClient("x-authority"); transcript.add(contentProviderClient == null ? "x-authority not registered yet" : "x-authority is registered"); return false; } }
} else if ( scheme.equals( ContentResolver.SCHEME_CONTENT ) ) { try { provider = context.getContentResolver().acquireContentProviderClient( uri ); } catch ( SecurityException e ) { return 0;
runInSeparateProcess(new TestService.Procedure() { @Override public void run(final Context context) { installCondomProcess(context, new CondomOptions()); final ContentResolver resolver = context.getContentResolver(); // Regular provider access final String android_id = Settings.Secure.getString(resolver, Settings.Secure.ANDROID_ID); assertNotNull("Regular access to ANDROID_ID", android_id); final ContentProviderClient client = resolver.acquireContentProviderClient(Settings.AUTHORITY); assertNotNull("Regular access to Settings provider", client); client.release(); withFakeSelfPackageName(new Runnable() { @Override public void run() { assertNotNull("Regular access to content provider", resolver.acquireContentProviderClient("com.oasisfeng.condom.test")); }}); }});
@Test public void acquireContentProviderClient_isStable() { ContentProviderClient client = contentResolver.acquireContentProviderClient(AUTHORITY); assertThat(shadowOf(client).isStable()).isTrue(); }
@Test public void contentProviderShouldBeCreatedBeforeBeingRegistered() throws Exception { XContentProvider xContentProvider = Robolectric.setupContentProvider(XContentProvider.class, "x-authority"); assertThat(xContentProvider.transcript).containsExactly("x-authority not registered yet"); ContentProviderClient contentProviderClient = contentResolver.acquireContentProviderClient("x-authority"); assertThat(contentProviderClient.getLocalContentProvider()).isSameAs(xContentProvider); }
@Test public void withoutManifest_shouldRegisterWithContentResolver() throws Exception { ProviderInfo providerInfo = new ProviderInfo(); providerInfo.authority = "some-authority"; controller.create(providerInfo); ContentProviderClient client = contentResolver.acquireContentProviderClient(providerInfo.authority); client.query(Uri.parse("something"), new String[]{"title"}, "*", new String[]{}, "created"); assertThat(controller.get().transcript).containsExactly("onCreate", "query for something"); }
@Test public void shouldRegisterWithContentResolver() throws Exception { controller.create().get(); ContentProviderClient client = contentResolver.acquireContentProviderClient( "org.robolectric.authority1"); client.query(Uri.parse("something"), new String[]{"title"}, "*", new String[]{}, "created"); assertThat(controller.get().transcript).containsExactly("onCreate", "query for something"); }
@Test public void testContentProviderOutboundJudge() { final TestContext context = new TestContext(); final CondomOptions options = new CondomOptions().setOutboundJudge(new OutboundJudge() { @Override public boolean shouldAllow(final OutboundType type, final @Nullable Intent intent, final String target_pkg) { final String settings_pkg = InstrumentationRegistry.getTargetContext().getPackageManager().resolveContentProvider(Settings.System.CONTENT_URI.getAuthority(), 0).packageName; return ! settings_pkg.equals(target_pkg); }}); final CondomContext condom = CondomContext.wrap(context, TAG, options), dry_condom = CondomContext.wrap(context, TAG, options.setDryRun(true)); for (final Context context2test : new Context[] {condom, condom.getApplicationContext()}) { assertNull(context2test.getPackageManager().resolveContentProvider(Settings.AUTHORITY, 0)); assertNull(context2test.getContentResolver().acquireContentProviderClient(Settings.System.CONTENT_URI)); } for (final Context context2test : new Context[] {dry_condom, dry_condom.getApplicationContext()}) { assertNotNull(context2test.getPackageManager().resolveContentProvider(Settings.AUTHORITY, 0)); assertNotNull(context2test.getContentResolver().acquireContentProviderClient(Settings.System.CONTENT_URI)); } }
@Test(expected = IllegalStateException.class) public void release_shouldFailWhenCalledTwice() { ContentProviderClient client = contentResolver.acquireContentProviderClient(AUTHORITY); client.release(); client.release(); fail("client.release() was called twice and did not throw"); }
@Test public void testContentProvider() { final TestContext context = new TestContext(); final CondomContext condom = CondomContext.wrap(context, TAG), dry_condom = CondomContext.wrap(context, TAG, new CondomOptions().setDryRun(true)); // Regular provider access final String android_id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); assertNotNull(android_id); for (final Context context2test : new Context[] {condom, condom.getApplicationContext(), dry_condom, dry_condom.getApplicationContext()}) { final String condom_android_id = Settings.Secure.getString(context2test.getContentResolver(), Settings.Secure.ANDROID_ID); assertEquals(android_id, condom_android_id); } context.mTestingStoppedProvider = true; for (final Context context2test : new Context[] {condom, condom.getApplicationContext()}) { // Prevent stopped packages, assertNull(context2test.getPackageManager().resolveContentProvider(TEST_AUTHORITY, 0)); assertNull(context2test.getContentResolver().acquireContentProviderClient(TEST_CONTENT_URI)); // Providers in system package should not be blocked. assertNotNull(context2test.getPackageManager().resolveContentProvider(Settings.AUTHORITY, 0)); assertNotNull(context2test.getContentResolver().acquireContentProviderClient(Settings.System.CONTENT_URI)); } for (final Context context2test : new Context[] {dry_condom, dry_condom.getApplicationContext()}) { assertNotNull(context2test.getPackageManager().resolveContentProvider(TEST_AUTHORITY, 0)); assertNotNull(context2test.getContentResolver().acquireContentProviderClient(TEST_CONTENT_URI)); } context.mTestingStoppedProvider = false; } private static final String TEST_AUTHORITY = "com.oasisfeng.condom.test";
@Test public void release_shouldRelease() { ContentProviderClient client = contentResolver.acquireContentProviderClient(AUTHORITY); ShadowContentProviderClient shadow = shadowOf(client); assertThat(shadow.isReleased()).isFalse(); client.release(); assertThat(shadow.isReleased()).isTrue(); }
@Override public IBinder acquireProviderClient(ProviderInfo info) { if (mTempLock != null) { mTempLock.block(); } if (!isBound()) { VClientImpl.get().bindApplication(info.packageName, info.processName); } IInterface provider = null; String[] authorities = info.authority.split(";"); String authority = authorities.length == 0 ? info.authority : authorities[0]; ContentResolver resolver = VirtualCore.get().getContext().getContentResolver(); ContentProviderClient client = null; try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { client = resolver.acquireUnstableContentProviderClient(authority); } else { client = resolver.acquireContentProviderClient(authority); } } catch (Throwable e) { VLog.e(TAG, "", e); } if (client != null) { provider = mirror.android.content.ContentProviderClient.mContentProvider.get(client); client.release(); } return provider != null ? provider.asBinder() : null; }
@Test @Config(minSdk = JELLY_BEAN_MR2) public void shouldDelegateToContentProvider() throws Exception { ContentProviderClient client = contentResolver.acquireContentProviderClient(AUTHORITY);
@Test public void testProvider() { final ContentResolver resolver = context().getContentResolver(); // Regular provider access final String android_id = Settings.System.getString(resolver, Settings.System.ANDROID_ID); assertNotNull(android_id); final ContentProviderClient client = resolver.acquireContentProviderClient(Settings.AUTHORITY); assertNotNull(client); client.release(); sCondomProcessPackageManager.mCondom.mOutboundJudge = mBlockAllJudge; assertNull(resolver.acquireContentProviderClient("downloads")); }
@Test public void testContentProviderOutboundJudge() { final TestContext context = new TestContext(); final CondomOptions options = new CondomOptions().setOutboundJudge(new OutboundJudge() { @Override public boolean shouldAllow(final OutboundType type, final @Nullable Intent intent, final String target_pkg) { final String settings_pkg = InstrumentationRegistry.getTargetContext().getPackageManager().resolveContentProvider(Settings.System.CONTENT_URI.getAuthority(), 0).packageName; return ! settings_pkg.equals(target_pkg); }}); final CondomContext condom = CondomContext.wrap(context, TAG, options), dry_condom = CondomContext.wrap(context, TAG, options.setDryRun(true)); assertNull(condom.getPackageManager().resolveContentProvider(Settings.AUTHORITY, 0)); assertNotNull(dry_condom.getPackageManager().resolveContentProvider(Settings.AUTHORITY, 0)); assertNull(condom.getContentResolver().acquireContentProviderClient(Settings.System.CONTENT_URI)); assertNotNull(dry_condom.getContentResolver().acquireContentProviderClient(Settings.System.CONTENT_URI)); }
ContentProviderClient client = resolver.acquireContentProviderClient(uri); if (client == null) { throw new IllegalArgumentException("Unknown URI " + uri);
@Test public void testContentProvider() { final TestContext context = new TestContext(); final CondomContext condom = CondomContext.wrap(context, TAG), dry_condom = CondomContext.wrap(context, TAG, new CondomOptions().setDryRun(true)); // Regular provider access final String android_id = Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID); assertNotNull(android_id); final String condom_android_id = Settings.System.getString(condom.getContentResolver(), Settings.System.ANDROID_ID); assertEquals(android_id, condom_android_id); final String dry_android_id = Settings.System.getString(dry_condom.getContentResolver(), Settings.System.ANDROID_ID); assertEquals(android_id, dry_android_id); context.mTestingStoppedProvider = true; // Prevent stopped packages, assertNull(condom.getPackageManager().resolveContentProvider(TEST_AUTHORITY, 0)); assertNotNull(dry_condom.getPackageManager().resolveContentProvider(TEST_AUTHORITY, 0)); assertNull(condom.getContentResolver().acquireContentProviderClient(TEST_CONTENT_URI)); assertNotNull(dry_condom.getContentResolver().acquireContentProviderClient(TEST_CONTENT_URI)); // Providers in system package should not be blocked. assertNotNull(condom.getPackageManager().resolveContentProvider(Settings.AUTHORITY, 0)); assertNotNull(dry_condom.getPackageManager().resolveContentProvider(Settings.AUTHORITY, 0)); assertNotNull(condom.getContentResolver().acquireContentProviderClient(Settings.System.CONTENT_URI)); assertNotNull(dry_condom.getContentResolver().acquireContentProviderClient(Settings.System.CONTENT_URI)); context.mTestingStoppedProvider = false; } private static final String TEST_AUTHORITY = "com.oasisfeng.condom.test";