Nothing in either source set drives SAF as a picker. The only SAF coverage is the publish side, in OutputPublisherPublishTest, against hand-written ContentProvider fakes -- so the launcher wiring in ConverterScreen, the MIME filter it passes, and the grant that comes back have never been executed by a test. Driving the real picker needs three things this repo did not have. UiAutomator, because DocumentsUI is another process. Compose's matchers stop at this process's composition and Espresso's stop at its view hierarchy; neither can see or tap a window belonging to another package. It FLOATS, at "2.+", which is the same argument the catalog already makes for work and lifecycle rather than a new one: androidx.test.uiautomator is inside floatedGroupPrefixes, so the componentSelection guard makes "+" mean "newest RELEASED", and that is load-bearing here -- this library publishes 2.4.0-alphas above its stable, so without the guard the float would be a pin to a prerelease. Resolved to 2.4.0 (released) on debugAndroidTestRuntimeClasspath, checked rather than assumed. It is deliberately NOT pinned alongside ktlint/detekt/JaCoCo/Robolectric: those are pinned because a new rule or a new runtime changes the verdict on files nobody touched. UiAutomator has no verdict -- it taps what a selector names, and a selector that stops matching is this repo's test to fix, in a diff that explains itself. The "2." rather than a bare "+" is the one thing held back: a major is where the selector API would be free to change under exactly that assumption. A DocumentsProvider, because DocumentsUI does not browse a filesystem -- it lists what providers offer it. Writing a file into Downloads would have worked and tested less: the fixture root declares Root.COLUMN_MIME_TYPES, and DocumentsUI filters the drawer by it, which is what gives the MIME filter a mutation with a shape rather than "one file among the hundreds in Downloads was not listed". Its contents are also exactly one file, where a shared directory accumulates whatever earlier runs left behind. And the first AndroidManifest.xml this source set has ever had, to declare it -- a ContentProvider is instantiated by the system and cannot be registered from test code. In androidTest rather than src/debug so it is installed by the instrumentation APK only, and never appears in a developer's own file picker. Two things worth knowing before editing either file. XML comments cannot contain "--", which the manifest's first draft failed the build on; and "*/" inside a KDoc closes the comment, which the provider's did. Both are silent in review and loud in the build. No test yet, and no new test tag: TestTags.Converter.CHOOSE_FILE and FILE_CARD_NAME already name both ends of the round trip. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
48 lines
2.6 KiB
XML
48 lines
2.6 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!--
|
|
The first manifest this source set has ever had, and it exists for one component.
|
|
|
|
SafPickerRoundTripTest drives the real system file picker. DocumentsUI only shows what a
|
|
DocumentsProvider offers it, so a test that picks a file needs a provider to pick from, and
|
|
that provider has to be declared: a ContentProvider is instantiated by the system from a
|
|
manifest entry and cannot be registered from test code.
|
|
|
|
It is declared HERE rather than in src/debug on purpose. src/debug would put a fake storage
|
|
root inside the shipped debug APK, where it would show up in every developer's own file
|
|
picker and in every other app's; this way it is installed only by the instrumentation APK,
|
|
alongside the test that needs it, and is gone the moment that APK is uninstalled.
|
|
|
|
The four attributes are not decoration. Each one is required for the picker to see it:
|
|
|
|
exported DocumentsUI is another app; an unexported provider is invisible to it.
|
|
permission MANAGE_DOCUMENTS is held by DocumentsUI and essentially nothing else,
|
|
so this is what stops any installed app from reading the fixture. The
|
|
provider is exported to the *picker*, not to the world.
|
|
grantUriPermissions How the app under test ends up able to read the URI it was handed. The
|
|
picker returns the document URI with FLAG_GRANT_READ_URI_PERMISSION,
|
|
and that flag does nothing unless the provider allows grants. Without
|
|
it the pick "succeeds" and every read of the result fails.
|
|
DOCUMENTS_PROVIDER The action DocumentsUI queries the package manager for. No filter, no
|
|
root in the drawer.
|
|
|
|
The authority carries the .test suffix because this component belongs to the instrumentation
|
|
package (org.libremediaconverter.test), not to the app. Authorities are global to the device:
|
|
reusing the app's would collide with the app on any device where both are installed.
|
|
-->
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
|
|
<application>
|
|
<provider
|
|
android:name="org.libremediaconverter.saf.FixtureDocumentsProvider"
|
|
android:authorities="org.libremediaconverter.test.fixtures"
|
|
android:exported="true"
|
|
android:grantUriPermissions="true"
|
|
android:permission="android.permission.MANAGE_DOCUMENTS">
|
|
<intent-filter>
|
|
<action android:name="android.content.action.DOCUMENTS_PROVIDER" />
|
|
</intent-filter>
|
|
</provider>
|
|
</application>
|
|
|
|
</manifest>
|