gitextract_2lkczetw/ ├── .circleci/ │ ├── config.yml │ ├── generate-app-test-list.sh │ ├── gradle-large.properties │ ├── gradle.properties │ └── test_modules.txt ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── ISSUE_TEMPLATE/ │ │ └── config.yml │ ├── ISSUE_TEMPLATE.md │ ├── PULL_REQUEST_TEMPLATE.md │ └── TESTING_RESULT_TEMPLATES.md ├── .gitignore ├── .hgtags ├── LICENSE.md ├── README.md ├── SECURITY.md ├── analytics/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── analytics/ │ ├── Analytics.kt │ ├── BlockableFirebaseAnalytics.kt │ └── NoopAnalytics.kt ├── androidshared/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── androidshared/ │ │ └── bitmap/ │ │ ├── ImageCompressorTest.kt │ │ └── ImageFileUtilsTest.kt │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── androidshared/ │ │ │ ├── async/ │ │ │ │ └── TrackableWorker.kt │ │ │ ├── bitmap/ │ │ │ │ ├── ImageCompressor.kt │ │ │ │ └── ImageFileUtils.kt │ │ │ ├── data/ │ │ │ │ ├── AppState.kt │ │ │ │ ├── Consumable.kt │ │ │ │ └── Data.kt │ │ │ ├── livedata/ │ │ │ │ ├── LiveDataExt.kt │ │ │ │ ├── LiveDataUtils.java │ │ │ │ └── NonNullLiveData.kt │ │ │ ├── system/ │ │ │ │ ├── BroadcastReceiverRegister.kt │ │ │ │ ├── CameraUtils.java │ │ │ │ ├── ContextExt.kt │ │ │ │ ├── ExternalFilesUtils.kt │ │ │ │ ├── IntentLauncher.kt │ │ │ │ ├── OpenGLVersionChecker.kt │ │ │ │ ├── PlayServicesChecker.java │ │ │ │ ├── ProcessRestoreDetector.kt │ │ │ │ └── UriExt.kt │ │ │ ├── ui/ │ │ │ │ ├── AlertStore.kt │ │ │ │ ├── Animations.kt │ │ │ │ ├── ColorPickerDialog.kt │ │ │ │ ├── ComposeThemeProvider.kt │ │ │ │ ├── DialogFragmentUtils.kt │ │ │ │ ├── DialogUtils.kt │ │ │ │ ├── DisplayString.kt │ │ │ │ ├── EdgeToEdge.kt │ │ │ │ ├── FragmentFactoryBuilder.kt │ │ │ │ ├── GroupClickListener.kt │ │ │ │ ├── ListFragmentStateAdapter.kt │ │ │ │ ├── MenuExt.kt │ │ │ │ ├── ObviousProgressBar.kt │ │ │ │ ├── OneSignTextWatcher.kt │ │ │ │ ├── PrefUtils.kt │ │ │ │ ├── ReturnToAppActivity.kt │ │ │ │ ├── SnackbarUtils.kt │ │ │ │ ├── ToastUtils.kt │ │ │ │ ├── compose/ │ │ │ │ │ └── Margins.kt │ │ │ │ └── multiclicksafe/ │ │ │ │ ├── DoubleClickSafeMaterialButton.kt │ │ │ │ ├── MultiClickGuard.kt │ │ │ │ ├── MultiClickSafeMaterialButton.kt │ │ │ │ ├── MultiClickSafeTextInputEditText.kt │ │ │ │ └── MultiClickSaveOnClickListener.kt │ │ │ └── utils/ │ │ │ ├── AppBarUtils.kt │ │ │ ├── ColorUtils.kt │ │ │ ├── CompressionUtils.kt │ │ │ ├── FileExt.kt │ │ │ ├── InMemUniqueIdGenerator.kt │ │ │ ├── PathUtils.kt │ │ │ ├── PreferenceFragmentCompatUtils.kt │ │ │ ├── ScreenUtils.java │ │ │ ├── SettingsUniqueIdGenerator.kt │ │ │ ├── UniqueIdGenerator.kt │ │ │ └── Validator.kt │ │ └── res/ │ │ ├── color/ │ │ │ ├── color_error_button_icon.xml │ │ │ ├── color_on_primary_low_emphasis.xml │ │ │ ├── color_on_surface_high_emphasis.xml │ │ │ ├── color_on_surface_low_emphasis.xml │ │ │ ├── color_on_surface_medium_emphasis.xml │ │ │ └── color_primary_low_emphasis.xml │ │ ├── drawable/ │ │ │ ├── color_circle.xml │ │ │ ├── ic_close_24.xml │ │ │ ├── list_item_divider.xml │ │ │ ├── radio_button_inset.xml │ │ │ └── shadow_up.xml │ │ ├── layout/ │ │ │ ├── app_bar_layout.xml │ │ │ └── color_picker_dialog_layout.xml │ │ └── values/ │ │ ├── attrs.xml │ │ ├── color_picker_dialog_colors.xml │ │ ├── dimens.xml │ │ └── styles.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── androidshared/ │ │ ├── async/ │ │ │ └── TrackableWorkerTest.kt │ │ ├── livedata/ │ │ │ └── LiveDataUtilsTest.kt │ │ ├── system/ │ │ │ └── UriExtTest.kt │ │ ├── ui/ │ │ │ ├── ColorPickerDialogTest.kt │ │ │ ├── OneSignTextWatcherTest.kt │ │ │ └── ReturnToAppActivityTest.kt │ │ └── utils/ │ │ ├── ColorUtilsTest.kt │ │ ├── CompressionUtilsTest.kt │ │ ├── DialogFragmentUtilsTest.java │ │ ├── InMemUniqueIdGeneratorTest.kt │ │ ├── IntentLauncherImplTest.kt │ │ ├── PathUtilsTest.kt │ │ ├── SettingsUniqueIdGeneratorTest.kt │ │ ├── UniqueIdGeneratorTest.kt │ │ └── ValidatorTest.kt │ └── resources/ │ └── robolectric.properties ├── androidtest/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── androidtest/ │ ├── ActivityScenarioExtensions.kt │ ├── ActivityScenarioLauncherRule.kt │ ├── DrawableMatcher.kt │ ├── FakeLifecycleOwner.kt │ ├── FragmentScenarioExtensions.kt │ ├── LiveDataTestUtils.kt │ ├── MainDispatcherRule.kt │ ├── NodeInteractionExtensions.kt │ └── RecordedIntentsRule.kt ├── async/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── async/ │ │ ├── Cancellable.kt │ │ ├── OngoingWorkListener.kt │ │ ├── Scheduler.kt │ │ ├── SchedulerAsyncTaskMimic.kt │ │ ├── SchedulerBuilder.kt │ │ ├── ScopeCancellable.kt │ │ ├── TaskRunner.kt │ │ ├── TaskSpec.kt │ │ ├── TaskSpecRunner.kt │ │ ├── TaskSpecScheduler.kt │ │ ├── coroutines/ │ │ │ └── CoroutineTaskRunner.kt │ │ ├── network/ │ │ │ ├── ConnectivityProvider.kt │ │ │ └── NetworkStateProvider.kt │ │ ├── services/ │ │ │ └── ForegroundServiceTaskSpecRunner.kt │ │ └── workmanager/ │ │ ├── TaskSpecWorker.kt │ │ └── WorkManagerTaskSpecScheduler.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── async/ │ ├── TaskSpecTest.kt │ └── workmanager/ │ └── TaskSpecWorkerTest.kt ├── audio-clips/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── audioclips/ │ │ ├── AudioClipViewModel.kt │ │ ├── AudioPlayer.kt │ │ ├── AudioPlayerFactory.kt │ │ ├── Clip.kt │ │ ├── PlaybackFailedException.kt │ │ └── ThreadSafeMediaPlayerWrapper.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── audioclips/ │ └── AudioClipViewModelTest.kt ├── audio-recorder/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── audiorecorder/ │ │ ├── DaggerSetup.kt │ │ ├── mediarecorder/ │ │ │ └── MediaRecorderRecordingResource.kt │ │ ├── recorder/ │ │ │ ├── Recorder.kt │ │ │ ├── RecordingResource.kt │ │ │ └── RecordingResourceRecorder.kt │ │ ├── recording/ │ │ │ ├── AudioRecorder.kt │ │ │ ├── AudioRecorderFactory.kt │ │ │ ├── AudioRecorderService.kt │ │ │ └── internal/ │ │ │ ├── ForegroundServiceAudioRecorder.kt │ │ │ ├── RecordingForegroundServiceNotification.kt │ │ │ └── RecordingRepository.kt │ │ └── testsupport/ │ │ └── StubAudioRecorder.kt │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── audiorecorder/ │ │ ├── mediarecorder/ │ │ │ └── AMRRecordingResourceTest.kt │ │ ├── recorder/ │ │ │ └── RecordingResourceRecorderTest.kt │ │ ├── recording/ │ │ │ ├── AudioRecorderTest.kt │ │ │ └── internal/ │ │ │ ├── AudioRecorderServiceTest.kt │ │ │ ├── ForegroundServiceAudioRecorderTest.kt │ │ │ └── RecordingForegroundServiceNotificationTest.kt │ │ ├── support/ │ │ │ └── FakeRecorder.kt │ │ └── testsupport/ │ │ ├── RobolectricApplication.kt │ │ └── StubAudioRecorderTest.kt │ └── resources/ │ └── robolectric.properties ├── benchmark.sh ├── build.gradle ├── check-size.sh ├── codecov.yml ├── collect_app/ │ ├── build.gradle │ ├── google-services.json │ ├── libs/ │ │ └── bikram-sambat-1.8.0.jar │ ├── proguard-rules.txt │ └── src/ │ ├── androidTest/ │ │ ├── assets/ │ │ │ └── instances/ │ │ │ ├── One Question_2021-06-22_15-55-50.xml │ │ │ └── one-question-google_2023-08-08_14-51-00.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── android/ │ │ ├── benchmark/ │ │ │ ├── EntitiesBenchmarkTest.kt │ │ │ ├── FormsUpdateBenchmarkTest.kt │ │ │ ├── SearchBenchmarkTest.kt │ │ │ └── support/ │ │ │ └── Benchmarker.kt │ │ ├── feature/ │ │ │ ├── entitymanagement/ │ │ │ │ └── ViewEntitiesTest.kt │ │ │ ├── external/ │ │ │ │ ├── AndroidShortcutsTest.kt │ │ │ │ ├── FormDownloadActionTest.kt │ │ │ │ ├── FormEditActionTest.kt │ │ │ │ ├── FormPickActionTest.kt │ │ │ │ ├── InstanceEditActionTest.kt │ │ │ │ ├── InstancePickActionTest.kt │ │ │ │ └── InstanceUploadActionTest.kt │ │ │ ├── formentry/ │ │ │ │ ├── AddRepeatTest.kt │ │ │ │ ├── AudioAutoplayTest.kt │ │ │ │ ├── AudioRecordingTest.java │ │ │ │ ├── BackgroundAudioRecordingTest.java │ │ │ │ ├── CascadingSelectTest.kt │ │ │ │ ├── CatchFormDesignExceptionsTest.kt │ │ │ │ ├── ContextMenuTest.java │ │ │ │ ├── DeletingRepeatGroupsTest.java │ │ │ │ ├── EncryptedFormTest.kt │ │ │ │ ├── ExternalAudioRecordingTest.java │ │ │ │ ├── ExternalSecondaryInstanceTest.java │ │ │ │ ├── ExternalSelectsTest.kt │ │ │ │ ├── FieldListUpdateTest.kt │ │ │ │ ├── FillBlankFormWithRepeatGroupTest.kt │ │ │ │ ├── FormEndTest.kt │ │ │ │ ├── FormHierarchyTest.java │ │ │ │ ├── FormLanguageTest.java │ │ │ │ ├── FormMediaTest.kt │ │ │ │ ├── FormMetadataTest.kt │ │ │ │ ├── FormNavigationTest.kt │ │ │ │ ├── FormSaveTest.kt │ │ │ │ ├── FormStylingTest.kt │ │ │ │ ├── GuidanceTest.kt │ │ │ │ ├── ImageLoadingTest.kt │ │ │ │ ├── IntentGroupTest.kt │ │ │ │ ├── InvalidFormTest.kt │ │ │ │ ├── LikertTest.java │ │ │ │ ├── NestedIntentGroupTest.kt │ │ │ │ ├── QuickSaveTest.java │ │ │ │ ├── QuittingFormTest.java │ │ │ │ ├── RankingWidgetWithCSVTest.java │ │ │ │ ├── RequiredAndConstraintQuestionTest.kt │ │ │ │ ├── SaveIncompleteTest.kt │ │ │ │ ├── SavePointTest.kt │ │ │ │ ├── SearchAppearancesTest.kt │ │ │ │ ├── audit/ │ │ │ │ │ ├── AuditTest.kt │ │ │ │ │ ├── IdentifyUserTest.kt │ │ │ │ │ └── TrackChangesReasonTest.kt │ │ │ │ ├── backgroundlocation/ │ │ │ │ │ ├── LocationTrackingAuditTest.java │ │ │ │ │ └── SetGeopointActionTest.java │ │ │ │ ├── dynamicpreload/ │ │ │ │ │ ├── DynamicPreLoadedDataPullTest.kt │ │ │ │ │ └── DynamicPreLoadedDataSelects.java │ │ │ │ └── entities/ │ │ │ │ ├── EntityFormApprovalTest.kt │ │ │ │ ├── EntityFormCreateUpdateTest.kt │ │ │ │ ├── EntityFormEditTest.kt │ │ │ │ ├── EntityFormLockingTest.kt │ │ │ │ ├── EntityFormSpecVersionTest.kt │ │ │ │ └── EntityListSyncTest.kt │ │ │ ├── formmanagement/ │ │ │ │ ├── BulkFinalizationTest.kt │ │ │ │ ├── DeleteBlankFormTest.java │ │ │ │ ├── FormUpdateTest.kt │ │ │ │ ├── FormsAdbTest.java │ │ │ │ ├── GetBlankFormsTest.java │ │ │ │ ├── HideOldVersionsTest.java │ │ │ │ ├── ManualUpdatesTest.java │ │ │ │ ├── MatchExactlyTest.kt │ │ │ │ └── PreviouslyDownloadedOnlyTest.kt │ │ │ ├── instancemanagement/ │ │ │ │ ├── AutoSendTest.kt │ │ │ │ ├── DeleteSavedFormTest.kt │ │ │ │ ├── EditSavedFormTest.kt │ │ │ │ ├── InstancesAdbTest.kt │ │ │ │ ├── PartialSubmissionTest.kt │ │ │ │ └── SendFinalizedFormTest.kt │ │ │ ├── maps/ │ │ │ │ └── FormMapTest.kt │ │ │ ├── projects/ │ │ │ │ ├── AddNewProjectTest.kt │ │ │ │ ├── DeleteProjectTest.kt │ │ │ │ ├── GoogleDriveDeprecationTest.kt │ │ │ │ ├── LaunchScreenTest.kt │ │ │ │ ├── MobileDeviceManagementTest.kt │ │ │ │ ├── ProjectsAdbTest.kt │ │ │ │ ├── SwitchProjectTest.kt │ │ │ │ └── UpdateProjectTest.kt │ │ │ ├── settings/ │ │ │ │ ├── ConfigureWithQRCodeTest.java │ │ │ │ ├── FormEntrySettingsTest.kt │ │ │ │ ├── FormManagementSettingsTest.kt │ │ │ │ ├── FormMetadataSettingsTest.kt │ │ │ │ ├── MovingBackwardsTest.kt │ │ │ │ ├── ResetProjectTest.kt │ │ │ │ ├── ServerSettingsTest.java │ │ │ │ └── SettingLanguageTest.kt │ │ │ └── smoke/ │ │ │ ├── AllWidgetsFormTest.kt │ │ │ ├── BadServerTest.java │ │ │ └── GetAndSubmitFormTest.java │ │ ├── instrumented/ │ │ │ ├── forms/ │ │ │ │ └── FormUtilsTest.java │ │ │ ├── tasks/ │ │ │ │ └── FormLoaderTaskTest.java │ │ │ └── utilities/ │ │ │ ├── CustomSQLiteQueryExecutionTest.java │ │ │ └── DateTimeUtilsTest.java │ │ └── support/ │ │ ├── ActivityHelpers.java │ │ ├── CollectHelpers.kt │ │ ├── ContentProviderUtils.kt │ │ ├── CountingTaskExecutorIdlingResource.java │ │ ├── DummyActivityLauncher.kt │ │ ├── FakeClickableMapFragment.kt │ │ ├── FakeLocationClient.java │ │ ├── FakeNetworkStateProvider.kt │ │ ├── StorageUtils.kt │ │ ├── StubOpenRosaServer.kt │ │ ├── SubmissionParser.kt │ │ ├── TestDependencies.kt │ │ ├── TranslatedStringBuilder.kt │ │ ├── actions/ │ │ │ └── RotateAction.java │ │ ├── async/ │ │ │ ├── AsyncWorkTracker.kt │ │ │ ├── AsyncWorkTrackerIdlingResource.kt │ │ │ ├── TrackingCoroutineAndWorkManagerScheduler.kt │ │ │ └── TrackingCoroutineDispatcher.kt │ │ ├── matchers/ │ │ │ ├── CustomMatchers.kt │ │ │ └── ToastMatcher.java │ │ ├── pages/ │ │ │ ├── AboutPage.java │ │ │ ├── AccessControlPage.kt │ │ │ ├── AddNewRepeatDialog.kt │ │ │ ├── AppClosedPage.kt │ │ │ ├── AsyncPage.kt │ │ │ ├── BlankFormSearchPage.java │ │ │ ├── BulkFinalizationConfirmationDialogPage.kt │ │ │ ├── CancelRecordingDialog.java │ │ │ ├── ChangesReasonPromptPage.java │ │ │ ├── DeleteSavedFormPage.java │ │ │ ├── DeleteSelectedDialog.java │ │ │ ├── EditSavedFormPage.java │ │ │ ├── EntitiesPage.kt │ │ │ ├── EntityListPage.kt │ │ │ ├── ErrorDialog.kt │ │ │ ├── ErrorPage.kt │ │ │ ├── ExperimentalPage.java │ │ │ ├── FillBlankFormPage.java │ │ │ ├── FirstLaunchPage.kt │ │ │ ├── FormEndPage.java │ │ │ ├── FormEntryPage.java │ │ │ ├── FormHierarchyPage.kt │ │ │ ├── FormManagementPage.java │ │ │ ├── FormMapPage.java │ │ │ ├── FormMetadataPage.java │ │ │ ├── FormsDownloadResultPage.kt │ │ │ ├── GetBlankFormPage.java │ │ │ ├── IdentifyUserPromptPage.java │ │ │ ├── ListPreferenceDialog.java │ │ │ ├── MainMenuPage.java │ │ │ ├── MainMenuSettingsPage.kt │ │ │ ├── ManualProjectCreatorDialogPage.kt │ │ │ ├── MapsSettingsPage.java │ │ │ ├── NotificationDrawer.kt │ │ │ ├── OkDialog.java │ │ │ ├── OpenSourceLicensesPage.java │ │ │ ├── Page.kt │ │ │ ├── PreferencePage.java │ │ │ ├── ProjectDisplayPage.kt │ │ │ ├── ProjectManagementPage.kt │ │ │ ├── ProjectSettingsDialogPage.kt │ │ │ ├── ProjectSettingsPage.java │ │ │ ├── QRCodePage.java │ │ │ ├── QrCodeProjectCreatorDialogPage.kt │ │ │ ├── ResetApplicationDialog.java │ │ │ ├── SaveOrDiscardFormDialog.kt │ │ │ ├── SaveOrIgnoreDrawingDialog.kt │ │ │ ├── SavepointRecoveryDialogPage.kt │ │ │ ├── SelectMinimalDialogPage.kt │ │ │ ├── SendFinalizedFormPage.kt │ │ │ ├── ServerAuthDialog.java │ │ │ ├── ServerSettingsPage.java │ │ │ ├── ShortcutsPage.java │ │ │ ├── UserAndDeviceIdentitySettingsPage.java │ │ │ ├── UserInterfacePage.java │ │ │ ├── ViewFormPage.kt │ │ │ └── ViewSentFormPage.java │ │ └── rules/ │ │ ├── BlankFormTestRule.kt │ │ ├── CollectTestRule.kt │ │ ├── FormEntryActivityTestRule.kt │ │ ├── IdlingResourceRule.kt │ │ ├── NotificationDrawerRule.kt │ │ ├── PageComposeRule.kt │ │ ├── PrepDeviceForTestsRule.kt │ │ ├── RecentAppsRule.kt │ │ ├── ResetRotationRule.kt │ │ ├── ResetStateRule.kt │ │ ├── RetryOnDeviceErrorRule.kt │ │ ├── RunnableRule.kt │ │ └── TestRuleChain.kt │ ├── debug/ │ │ ├── AndroidManifest.xml │ │ └── google-services.json │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── assets/ │ │ │ └── svg_map_helper.js │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ ├── android/ │ │ │ │ ├── activities/ │ │ │ │ │ ├── AboutActivity.kt │ │ │ │ │ ├── ActivityUtils.java │ │ │ │ │ ├── AppListActivity.java │ │ │ │ │ ├── BearingActivity.java │ │ │ │ │ ├── CrashHandlerActivity.kt │ │ │ │ │ ├── DeleteFormsActivity.kt │ │ │ │ │ ├── FirstLaunchActivity.kt │ │ │ │ │ ├── FormDownloadListActivity.java │ │ │ │ │ ├── FormEntryViewModelFactory.kt │ │ │ │ │ ├── FormFillingActivity.java │ │ │ │ │ ├── FormListActivity.java │ │ │ │ │ ├── FormMapActivity.kt │ │ │ │ │ ├── InstanceChooserList.java │ │ │ │ │ ├── ScannerWithFlashlightActivity.kt │ │ │ │ │ └── viewmodels/ │ │ │ │ │ └── FormDownloadListViewModel.java │ │ │ │ ├── adapters/ │ │ │ │ │ ├── AboutListAdapter.kt │ │ │ │ │ ├── AbstractSelectListAdapter.java │ │ │ │ │ ├── FormDownloadListAdapter.java │ │ │ │ │ ├── InstanceListCursorAdapter.java │ │ │ │ │ ├── InstanceUploaderAdapter.java │ │ │ │ │ ├── RankingListAdapter.java │ │ │ │ │ ├── SelectMultipleListAdapter.java │ │ │ │ │ └── SelectOneListAdapter.java │ │ │ │ ├── analytics/ │ │ │ │ │ ├── AnalyticsEvents.kt │ │ │ │ │ └── AnalyticsUtils.kt │ │ │ │ ├── application/ │ │ │ │ │ ├── Collect.java │ │ │ │ │ ├── CollectSettingsChangeHandler.kt │ │ │ │ │ ├── ComposeTheme.kt │ │ │ │ │ ├── FeatureFlags.kt │ │ │ │ │ ├── MapboxClassInstanceCreator.kt │ │ │ │ │ └── initialization/ │ │ │ │ │ ├── AnalyticsInitializer.kt │ │ │ │ │ ├── ApplicationInitializer.kt │ │ │ │ │ ├── CachedFormsCleaner.kt │ │ │ │ │ ├── CrashReportingTree.kt │ │ │ │ │ ├── ExistingProjectMigrator.kt │ │ │ │ │ ├── ExistingSettingsMigrator.kt │ │ │ │ │ ├── GoogleDriveProjectsDeleter.kt │ │ │ │ │ ├── JavaRosaInitializer.kt │ │ │ │ │ ├── MapsInitializer.kt │ │ │ │ │ ├── SavepointsImporter.kt │ │ │ │ │ ├── ScheduledWorkUpgrade.kt │ │ │ │ │ ├── UserPropertiesInitializer.kt │ │ │ │ │ └── upgrade/ │ │ │ │ │ ├── BeforeProjectsInstallDetector.kt │ │ │ │ │ └── UpgradeInitializer.kt │ │ │ │ ├── audio/ │ │ │ │ │ ├── AMRAppender.java │ │ │ │ │ ├── AudioButton.java │ │ │ │ │ ├── AudioControllerView.java │ │ │ │ │ ├── AudioFileAppender.java │ │ │ │ │ ├── AudioRecordingControllerFragment.java │ │ │ │ │ ├── AudioRecordingErrorDialogFragment.java │ │ │ │ │ ├── BackgroundAudioHelpDialogFragment.java │ │ │ │ │ ├── M4AAppender.java │ │ │ │ │ ├── VolumeBar.java │ │ │ │ │ └── Waveform.java │ │ │ │ ├── backgroundwork/ │ │ │ │ │ ├── AutoUpdateTaskSpec.kt │ │ │ │ │ ├── BackgroundWorkUtils.java │ │ │ │ │ ├── FormUpdateAndInstanceSubmitScheduler.java │ │ │ │ │ ├── FormUpdateScheduler.java │ │ │ │ │ ├── InstanceSubmitScheduler.java │ │ │ │ │ ├── SendFormsTaskSpec.kt │ │ │ │ │ ├── SyncFormsTaskSpec.kt │ │ │ │ │ └── TaskData.kt │ │ │ │ ├── configure/ │ │ │ │ │ └── qr/ │ │ │ │ │ ├── AppConfigurationGenerator.kt │ │ │ │ │ ├── CachingQRCodeGenerator.kt │ │ │ │ │ ├── QRCodeActivityResultDelegate.kt │ │ │ │ │ ├── QRCodeMenuProvider.kt │ │ │ │ │ ├── QRCodeScannerFragment.kt │ │ │ │ │ ├── QRCodeTabsActivity.kt │ │ │ │ │ ├── QRCodeViewModel.kt │ │ │ │ │ ├── SettingsBarcodeScannerViewFactory.kt │ │ │ │ │ └── ShowQRCodeFragment.kt │ │ │ │ ├── dao/ │ │ │ │ │ ├── CursorLoaderFactory.java │ │ │ │ │ └── helpers/ │ │ │ │ │ └── InstancesDaoHelper.java │ │ │ │ ├── database/ │ │ │ │ │ ├── DatabaseConstants.java │ │ │ │ │ ├── DatabaseObjectMapper.kt │ │ │ │ │ ├── entities/ │ │ │ │ │ │ └── DatabaseEntitiesRepository.kt │ │ │ │ │ ├── forms/ │ │ │ │ │ │ ├── DatabaseFormColumns.kt │ │ │ │ │ │ ├── DatabaseFormsRepository.java │ │ │ │ │ │ └── FormDatabaseMigrator.java │ │ │ │ │ ├── instances/ │ │ │ │ │ │ ├── DatabaseInstanceColumns.kt │ │ │ │ │ │ ├── DatabaseInstancesRepository.java │ │ │ │ │ │ └── InstanceDatabaseMigrator.java │ │ │ │ │ ├── itemsets/ │ │ │ │ │ │ └── DatabaseFastExternalItemsetsRepository.kt │ │ │ │ │ └── savepoints/ │ │ │ │ │ ├── DatabaseSavepointsColumns.kt │ │ │ │ │ ├── DatabaseSavepointsRepository.kt │ │ │ │ │ └── SavepointsDatabaseMigrator.kt │ │ │ │ ├── dynamicpreload/ │ │ │ │ │ ├── DynamicPreloadXFormParserFactory.kt │ │ │ │ │ ├── ExternalAnswerResolver.java │ │ │ │ │ ├── ExternalAppsUtils.java │ │ │ │ │ ├── ExternalDataHandler.java │ │ │ │ │ ├── ExternalDataManager.java │ │ │ │ │ ├── ExternalDataManagerImpl.java │ │ │ │ │ ├── ExternalDataReader.java │ │ │ │ │ ├── ExternalDataReaderImpl.java │ │ │ │ │ ├── ExternalDataUseCases.kt │ │ │ │ │ ├── ExternalDataUtil.java │ │ │ │ │ ├── ExternalSQLiteOpenHelper.java │ │ │ │ │ ├── ExternalSelectChoice.java │ │ │ │ │ └── handler/ │ │ │ │ │ ├── ExternalDataHandlerBase.java │ │ │ │ │ ├── ExternalDataHandlerPull.java │ │ │ │ │ ├── ExternalDataHandlerSearch.java │ │ │ │ │ └── ExternalDataSearchType.java │ │ │ │ ├── entities/ │ │ │ │ │ └── EntitiesRepositoryProvider.kt │ │ │ │ ├── exception/ │ │ │ │ │ ├── EncryptionException.java │ │ │ │ │ ├── ExternalDataException.java │ │ │ │ │ ├── ExternalParamsException.java │ │ │ │ │ └── JavaRosaException.java │ │ │ │ ├── external/ │ │ │ │ │ ├── AndroidShortcutsActivity.kt │ │ │ │ │ ├── FormUriActivity.kt │ │ │ │ │ ├── FormsContract.java │ │ │ │ │ ├── FormsProvider.java │ │ │ │ │ ├── InstanceProvider.java │ │ │ │ │ └── InstancesContract.java │ │ │ │ ├── fastexternalitemset/ │ │ │ │ │ ├── ItemsetDao.java │ │ │ │ │ ├── ItemsetDbAdapter.java │ │ │ │ │ └── XPathParseTool.java │ │ │ │ ├── formentry/ │ │ │ │ │ ├── BackgroundAudioPermissionDialogFragment.java │ │ │ │ │ ├── BackgroundAudioViewModel.java │ │ │ │ │ ├── CurrentFormIndex.kt │ │ │ │ │ ├── FormAnimation.kt │ │ │ │ │ ├── FormDefCache.kt │ │ │ │ │ ├── FormEnd.kt │ │ │ │ │ ├── FormEndView.kt │ │ │ │ │ ├── FormEndViewModel.kt │ │ │ │ │ ├── FormEntryMenuProvider.kt │ │ │ │ │ ├── FormEntryUseCases.kt │ │ │ │ │ ├── FormEntryViewModel.java │ │ │ │ │ ├── FormError.kt │ │ │ │ │ ├── FormIndexAnimationHandler.kt │ │ │ │ │ ├── FormLoadingDialogFragment.java │ │ │ │ │ ├── FormOpeningMode.kt │ │ │ │ │ ├── FormSessionRepository.kt │ │ │ │ │ ├── ODKView.java │ │ │ │ │ ├── PrinterWidgetViewModel.kt │ │ │ │ │ ├── QuitFormDialog.kt │ │ │ │ │ ├── RecordingHandler.java │ │ │ │ │ ├── RecordingWarningDialogFragment.java │ │ │ │ │ ├── RefreshFormListDialogFragment.java │ │ │ │ │ ├── SwipeHandler.kt │ │ │ │ │ ├── audit/ │ │ │ │ │ │ ├── AsyncTaskAuditEventWriter.java │ │ │ │ │ │ ├── AuditConfig.java │ │ │ │ │ │ ├── AuditEvent.java │ │ │ │ │ │ ├── AuditEventCSVLine.java │ │ │ │ │ │ ├── AuditEventLogger.java │ │ │ │ │ │ ├── AuditEventSaveTask.java │ │ │ │ │ │ ├── AuditUtils.kt │ │ │ │ │ │ ├── ChangesReasonPromptDialogFragment.java │ │ │ │ │ │ ├── IdentifyUserPromptDialogFragment.java │ │ │ │ │ │ └── IdentityPromptViewModel.java │ │ │ │ │ ├── backgroundlocation/ │ │ │ │ │ │ ├── BackgroundLocationHelper.java │ │ │ │ │ │ ├── BackgroundLocationManager.java │ │ │ │ │ │ └── BackgroundLocationViewModel.java │ │ │ │ │ ├── media/ │ │ │ │ │ │ ├── FormMediaUtils.java │ │ │ │ │ │ └── PromptAutoplayer.java │ │ │ │ │ ├── questions/ │ │ │ │ │ │ ├── AnswersProvider.java │ │ │ │ │ │ ├── AudioVideoImageTextLabel.java │ │ │ │ │ │ ├── NoButtonsItem.java │ │ │ │ │ │ ├── QuestionDetails.java │ │ │ │ │ │ └── SelectChoiceUtils.kt │ │ │ │ │ ├── repeats/ │ │ │ │ │ │ ├── AddRepeatDialog.kt │ │ │ │ │ │ └── DeleteRepeatDialogFragment.java │ │ │ │ │ └── saving/ │ │ │ │ │ ├── DiskFormSaver.java │ │ │ │ │ ├── FormSaveViewModel.java │ │ │ │ │ ├── FormSaver.java │ │ │ │ │ ├── SaveAnswerFileErrorDialogFragment.java │ │ │ │ │ ├── SaveAnswerFileProgressDialogFragment.java │ │ │ │ │ └── SaveFormProgressDialogFragment.java │ │ │ │ ├── formhierarchy/ │ │ │ │ │ ├── FormHierarchyFragment.java │ │ │ │ │ ├── FormHierarchyFragmentHostActivity.kt │ │ │ │ │ ├── FormHierarchyViewModel.kt │ │ │ │ │ ├── HierarchyItem.kt │ │ │ │ │ ├── HierarchyListAdapter.kt │ │ │ │ │ ├── HierarchyListItemView.kt │ │ │ │ │ └── QuestionAnswerProcessor.kt │ │ │ │ ├── formlists/ │ │ │ │ │ ├── blankformlist/ │ │ │ │ │ │ ├── BlankFormListActivity.kt │ │ │ │ │ │ ├── BlankFormListAdapter.kt │ │ │ │ │ │ ├── BlankFormListItem.kt │ │ │ │ │ │ ├── BlankFormListItemView.kt │ │ │ │ │ │ ├── BlankFormListMenuProvider.kt │ │ │ │ │ │ ├── BlankFormListViewModel.kt │ │ │ │ │ │ └── DeleteBlankFormFragment.kt │ │ │ │ │ ├── savedformlist/ │ │ │ │ │ │ ├── DeleteSavedFormFragment.kt │ │ │ │ │ │ ├── SavedFormListItemView.kt │ │ │ │ │ │ ├── SavedFormListListMenuProvider.kt │ │ │ │ │ │ ├── SavedFormListViewModel.kt │ │ │ │ │ │ └── SelectableSavedFormListItemViewHolder.kt │ │ │ │ │ └── sorting/ │ │ │ │ │ ├── FormListSortingAdapter.kt │ │ │ │ │ ├── FormListSortingBottomSheetDialog.kt │ │ │ │ │ └── FormListSortingOption.kt │ │ │ │ ├── formmanagement/ │ │ │ │ │ ├── CollectFormEntryControllerFactory.kt │ │ │ │ │ ├── FormFillingIntentFactory.kt │ │ │ │ │ ├── FormSourceExceptionMapper.kt │ │ │ │ │ ├── FormsDataService.kt │ │ │ │ │ ├── LocalFormUseCases.kt │ │ │ │ │ ├── OpenRosaClientProvider.kt │ │ │ │ │ ├── ServerFormDetails.kt │ │ │ │ │ ├── ServerFormUseCases.kt │ │ │ │ │ ├── download/ │ │ │ │ │ │ ├── FormDownloadException.kt │ │ │ │ │ │ ├── FormDownloadExceptionMapper.kt │ │ │ │ │ │ ├── FormDownloader.kt │ │ │ │ │ │ └── ServerFormDownloader.java │ │ │ │ │ ├── drafts/ │ │ │ │ │ │ ├── BulkFinalizationViewModel.kt │ │ │ │ │ │ └── DraftsMenuProvider.kt │ │ │ │ │ ├── finalization/ │ │ │ │ │ │ └── EditedFormFinalizationProcessor.kt │ │ │ │ │ ├── formmap/ │ │ │ │ │ │ └── FormMapViewModel.kt │ │ │ │ │ ├── matchexactly/ │ │ │ │ │ │ └── ServerFormsSynchronizer.java │ │ │ │ │ └── metadata/ │ │ │ │ │ ├── FormMetadata.kt │ │ │ │ │ └── FormMetadataParser.kt │ │ │ │ ├── fragments/ │ │ │ │ │ ├── BarCodeScannerFragment.kt │ │ │ │ │ ├── BarcodeWidgetScannerFragment.kt │ │ │ │ │ ├── MediaLoadingFragment.java │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ ├── FormsDownloadResultDialog.kt │ │ │ │ │ │ ├── LocationProvidersDisabledDialog.java │ │ │ │ │ │ ├── MovingBackwardsDialog.java │ │ │ │ │ │ ├── RangePickerDialogFragment.kt │ │ │ │ │ │ ├── RankingWidgetDialog.java │ │ │ │ │ │ ├── ResetSettingsResultDialog.java │ │ │ │ │ │ ├── SelectMinimalDialog.java │ │ │ │ │ │ ├── SelectMultiMinimalDialog.java │ │ │ │ │ │ ├── SelectOneMinimalDialog.java │ │ │ │ │ │ └── SimpleDialog.java │ │ │ │ │ └── viewmodels/ │ │ │ │ │ ├── RankingViewModel.java │ │ │ │ │ └── SelectMinimalViewModel.java │ │ │ │ ├── geo/ │ │ │ │ │ ├── MapConfiguratorProvider.java │ │ │ │ │ └── MapFragmentFactoryImpl.kt │ │ │ │ ├── injection/ │ │ │ │ │ ├── DaggerUtils.kt │ │ │ │ │ └── config/ │ │ │ │ │ ├── AppDependencyComponent.kt │ │ │ │ │ ├── AppDependencyModule.java │ │ │ │ │ ├── CollectDrawDependencyModule.kt │ │ │ │ │ ├── CollectEntitiesDependencyModule.kt │ │ │ │ │ ├── CollectGeoDependencyModule.kt │ │ │ │ │ ├── CollectGoogleMapsDependencyModule.kt │ │ │ │ │ ├── CollectOsmDroidDependencyModule.kt │ │ │ │ │ ├── CollectProjectsDependencyModule.kt │ │ │ │ │ ├── CollectSelfieCameraDependencyModule.kt │ │ │ │ │ └── ProjectDependencyModuleFactory.kt │ │ │ │ ├── instancemanagement/ │ │ │ │ │ ├── FinalizeAllSnackbarPresenter.kt │ │ │ │ │ ├── InstanceDeleter.kt │ │ │ │ │ ├── InstanceDiskSynchronizer.java │ │ │ │ │ ├── InstanceExt.kt │ │ │ │ │ ├── InstanceListItemView.kt │ │ │ │ │ ├── InstanceSubmitter.kt │ │ │ │ │ ├── InstancesDataService.kt │ │ │ │ │ ├── LocalInstancesUseCases.kt │ │ │ │ │ ├── autosend/ │ │ │ │ │ │ ├── AutoSendSettingsProvider.kt │ │ │ │ │ │ ├── FormExt.kt │ │ │ │ │ │ └── InstanceAutoSendFetcher.kt │ │ │ │ │ └── send/ │ │ │ │ │ ├── InstanceUploaderActivity.java │ │ │ │ │ ├── InstanceUploaderListActivity.java │ │ │ │ │ ├── ReadyToSendBanner.kt │ │ │ │ │ └── ReadyToSendViewModel.kt │ │ │ │ ├── itemsets/ │ │ │ │ │ └── FastExternalItemsetsRepository.kt │ │ │ │ ├── javarosawrapper/ │ │ │ │ │ ├── FormController.kt │ │ │ │ │ ├── FormControllerExt.kt │ │ │ │ │ ├── FormDesignException.kt │ │ │ │ │ ├── FormIndexUtils.java │ │ │ │ │ ├── InstanceMetadata.java │ │ │ │ │ ├── JavaRosaFormController.java │ │ │ │ │ └── ValidationResult.kt │ │ │ │ ├── listeners/ │ │ │ │ │ ├── AdvanceToNextListener.java │ │ │ │ │ ├── DeleteInstancesListener.java │ │ │ │ │ ├── DownloadFormsTaskListener.java │ │ │ │ │ ├── FormListDownloaderListener.java │ │ │ │ │ ├── FormLoaderListener.java │ │ │ │ │ ├── InstanceUploaderListener.java │ │ │ │ │ ├── Result.java │ │ │ │ │ ├── SelectItemClickListener.java │ │ │ │ │ ├── ThousandsSeparatorTextWatcher.java │ │ │ │ │ └── WidgetValueChangedListener.java │ │ │ │ ├── location/ │ │ │ │ │ └── client/ │ │ │ │ │ └── MaxAccuracyWithinTimeoutLocationClientWrapper.java │ │ │ │ ├── logic/ │ │ │ │ │ ├── FileReference.java │ │ │ │ │ ├── FileReferenceFactory.java │ │ │ │ │ ├── ImmutableDisplayableQuestion.java │ │ │ │ │ └── actions/ │ │ │ │ │ └── setgeopoint/ │ │ │ │ │ ├── CollectSetGeopointAction.java │ │ │ │ │ └── CollectSetGeopointActionHandler.java │ │ │ │ ├── mainmenu/ │ │ │ │ │ ├── CurrentProjectViewModel.kt │ │ │ │ │ ├── MainMenuActivity.kt │ │ │ │ │ ├── MainMenuButton.kt │ │ │ │ │ ├── MainMenuFragment.kt │ │ │ │ │ ├── MainMenuViewModel.kt │ │ │ │ │ ├── MainMenuViewModelFactory.kt │ │ │ │ │ ├── PermissionsDialogFragment.kt │ │ │ │ │ ├── RequestPermissionsViewModel.kt │ │ │ │ │ └── StartNewFormButton.kt │ │ │ │ ├── notifications/ │ │ │ │ │ ├── NotificationManagerNotifier.kt │ │ │ │ │ ├── NotificationUtils.kt │ │ │ │ │ ├── Notifier.kt │ │ │ │ │ └── builders/ │ │ │ │ │ ├── FormUpdatesAvailableNotificationBuilder.kt │ │ │ │ │ ├── FormUpdatesDownloadedNotificationBuilder.kt │ │ │ │ │ ├── FormsSubmissionNotificationBuilder.kt │ │ │ │ │ ├── FormsSyncFailedNotificationBuilder.kt │ │ │ │ │ └── FormsSyncStoppedNotificationBuilder.kt │ │ │ │ ├── preferences/ │ │ │ │ │ ├── Defaults.kt │ │ │ │ │ ├── PreferenceVisibilityHandler.kt │ │ │ │ │ ├── ProjectPreferencesViewModel.kt │ │ │ │ │ ├── ServerPreferencesAdder.java │ │ │ │ │ ├── SettingsExt.kt │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ ├── AdminPasswordDialogFragment.kt │ │ │ │ │ │ ├── ChangeAdminPasswordDialog.kt │ │ │ │ │ │ ├── DeleteProjectDialog.kt │ │ │ │ │ │ ├── ResetDialogPreference.java │ │ │ │ │ │ ├── ResetDialogPreferenceFragmentCompat.java │ │ │ │ │ │ ├── ResetProgressDialog.kt │ │ │ │ │ │ └── ServerAuthDialogFragment.java │ │ │ │ │ ├── filters/ │ │ │ │ │ │ └── ControlCharacterFilter.java │ │ │ │ │ ├── screens/ │ │ │ │ │ │ ├── AccessControlPreferencesFragment.kt │ │ │ │ │ │ ├── BaseAdminPreferencesFragment.java │ │ │ │ │ │ ├── BasePreferencesFragment.kt │ │ │ │ │ │ ├── BaseProjectPreferencesFragment.java │ │ │ │ │ │ ├── DevToolsPreferencesFragment.kt │ │ │ │ │ │ ├── ExperimentalPreferencesFragment.java │ │ │ │ │ │ ├── FormEntryAccessPreferencesFragment.kt │ │ │ │ │ │ ├── FormManagementPreferencesFragment.java │ │ │ │ │ │ ├── FormMetadataPreferencesFragment.java │ │ │ │ │ │ ├── IdentityPreferencesFragment.kt │ │ │ │ │ │ ├── MainMenuAccessPreferencesFragment.kt │ │ │ │ │ │ ├── MapsPreferencesFragment.kt │ │ │ │ │ │ ├── ProjectDisplayPreferencesFragment.kt │ │ │ │ │ │ ├── ProjectManagementPreferencesFragment.kt │ │ │ │ │ │ ├── ProjectPreferencesActivity.kt │ │ │ │ │ │ ├── ProjectPreferencesFragment.kt │ │ │ │ │ │ ├── ServerPreferencesFragment.java │ │ │ │ │ │ ├── UserInterfacePreferencesFragment.java │ │ │ │ │ │ └── UserSettingsAccessPreferencesFragment.java │ │ │ │ │ ├── source/ │ │ │ │ │ │ ├── SettingsStore.kt │ │ │ │ │ │ ├── SharedPreferencesSettings.kt │ │ │ │ │ │ └── SharedPreferencesSettingsProvider.kt │ │ │ │ │ └── utilities/ │ │ │ │ │ └── PreferencesUtils.java │ │ │ │ ├── projects/ │ │ │ │ │ ├── DuplicateProjectConfirmationDialog.kt │ │ │ │ │ ├── FileDebugLogger.kt │ │ │ │ │ ├── ManualProjectCreatorDialog.kt │ │ │ │ │ ├── ProjectCreatorImpl.kt │ │ │ │ │ ├── ProjectDeleter.kt │ │ │ │ │ ├── ProjectDependencyModule.kt │ │ │ │ │ ├── ProjectIconView.kt │ │ │ │ │ ├── ProjectListItemView.kt │ │ │ │ │ ├── ProjectResetter.kt │ │ │ │ │ ├── ProjectSettingsDialog.kt │ │ │ │ │ ├── ProjectsDataService.kt │ │ │ │ │ ├── QrCodeProjectCreatorDialog.kt │ │ │ │ │ └── SettingsConnectionMatcherImpl.kt │ │ │ │ ├── savepoints/ │ │ │ │ │ ├── SavepointTask.kt │ │ │ │ │ └── SavepointUseCases.kt │ │ │ │ ├── state/ │ │ │ │ │ └── DataKeys.kt │ │ │ │ ├── storage/ │ │ │ │ │ ├── StoragePathProvider.kt │ │ │ │ │ ├── StoragePaths.kt │ │ │ │ │ └── StorageSubdirectory.java │ │ │ │ ├── tasks/ │ │ │ │ │ ├── DownloadFormListTask.java │ │ │ │ │ ├── DownloadFormsTask.java │ │ │ │ │ ├── FormLoaderTask.java │ │ │ │ │ ├── InstanceUploaderTask.java │ │ │ │ │ ├── MediaLoadingTask.java │ │ │ │ │ ├── ProgressNotifier.java │ │ │ │ │ ├── SaveFormIndexTask.java │ │ │ │ │ ├── SaveFormToDisk.java │ │ │ │ │ └── SaveToDiskResult.java │ │ │ │ ├── upload/ │ │ │ │ │ ├── FormUploadException.kt │ │ │ │ │ ├── InstanceServerUploader.java │ │ │ │ │ └── InstanceUploader.java │ │ │ │ ├── utilities/ │ │ │ │ │ ├── ActionRegister.kt │ │ │ │ │ ├── AdminPasswordProvider.java │ │ │ │ │ ├── AndroidUserAgent.java │ │ │ │ │ ├── AnimationUtils.java │ │ │ │ │ ├── Appearances.kt │ │ │ │ │ ├── ApplicationConstants.java │ │ │ │ │ ├── ArrayUtils.java │ │ │ │ │ ├── AuthDialogUtility.java │ │ │ │ │ ├── CSVUtils.java │ │ │ │ │ ├── ChangeLockProvider.kt │ │ │ │ │ ├── CollectStrictMode.kt │ │ │ │ │ ├── ContentUriHelper.kt │ │ │ │ │ ├── ContentUriProvider.java │ │ │ │ │ ├── ControllableLifecyleOwner.kt │ │ │ │ │ ├── DialogUtils.java │ │ │ │ │ ├── EncryptionUtils.java │ │ │ │ │ ├── ExternalAppIntentProvider.java │ │ │ │ │ ├── ExternalizableFormDefCache.java │ │ │ │ │ ├── FileProvider.java │ │ │ │ │ ├── FileUtils.java │ │ │ │ │ ├── FormEntryPromptUtils.java │ │ │ │ │ ├── FormNameUtils.java │ │ │ │ │ ├── FormUtils.java │ │ │ │ │ ├── FormsDownloadResultInterpreter.kt │ │ │ │ │ ├── FormsRepositoryProvider.kt │ │ │ │ │ ├── FormsUploadResultInterpreter.kt │ │ │ │ │ ├── HtmlUtils.java │ │ │ │ │ ├── ImageCompressionController.kt │ │ │ │ │ ├── InstanceAutoDeleteChecker.kt │ │ │ │ │ ├── InstanceUploaderUtils.java │ │ │ │ │ ├── InstancesRepositoryProvider.kt │ │ │ │ │ ├── LocaleHelper.kt │ │ │ │ │ ├── MediaUtils.kt │ │ │ │ │ ├── MyanmarDateUtils.java │ │ │ │ │ ├── QuestionMediaManager.java │ │ │ │ │ ├── RankingItemTouchHelperCallback.java │ │ │ │ │ ├── ReplaceCallback.java │ │ │ │ │ ├── ResponseMessageParser.java │ │ │ │ │ ├── SavepointsRepositoryProvider.kt │ │ │ │ │ ├── SelectOneWidgetUtils.java │ │ │ │ │ ├── SoftKeyboardController.kt │ │ │ │ │ ├── ThemeUtils.java │ │ │ │ │ ├── UnderlyingValuesConcat.java │ │ │ │ │ ├── ViewUtils.kt │ │ │ │ │ ├── WebCredentialsUtils.java │ │ │ │ │ └── ZipUtils.java │ │ │ │ ├── version/ │ │ │ │ │ ├── VersionDescriptionProvider.java │ │ │ │ │ └── VersionInformation.java │ │ │ │ ├── views/ │ │ │ │ │ ├── ChoicesRecyclerView.java │ │ │ │ │ ├── CustomNumberPicker.kt │ │ │ │ │ ├── CustomWebView.java │ │ │ │ │ ├── DayNightProgressDialog.java │ │ │ │ │ ├── DecoratedBarcodeView.kt │ │ │ │ │ ├── SlidingTabLayout.java │ │ │ │ │ ├── SlidingTabStrip.java │ │ │ │ │ ├── TrackingTouchSlider.kt │ │ │ │ │ ├── TransparentProgressScreen.kt │ │ │ │ │ ├── TwoItemMultipleChoiceView.java │ │ │ │ │ └── WidgetAnswerText.kt │ │ │ │ └── widgets/ │ │ │ │ ├── AnnotateWidget.java │ │ │ │ ├── AudioWidget.java │ │ │ │ ├── BaseImageWidget.java │ │ │ │ ├── BearingWidget.java │ │ │ │ ├── CounterWidget.kt │ │ │ │ ├── DecimalWidget.java │ │ │ │ ├── DrawWidget.java │ │ │ │ ├── ExAudioWidget.java │ │ │ │ ├── ExDecimalWidget.java │ │ │ │ ├── ExImageWidget.java │ │ │ │ ├── ExIntegerWidget.java │ │ │ │ ├── ExStringWidget.java │ │ │ │ ├── GeoPointMapWidget.java │ │ │ │ ├── GeoPointWidget.java │ │ │ │ ├── GeoShapeWidget.java │ │ │ │ ├── GeoTraceWidget.java │ │ │ │ ├── ImageWidget.java │ │ │ │ ├── IntegerWidget.java │ │ │ │ ├── MediaWidgetAnswerViewModel.kt │ │ │ │ ├── OSMWidget.java │ │ │ │ ├── PrinterWidget.kt │ │ │ │ ├── QuestionWidget.java │ │ │ │ ├── RatingWidget.java │ │ │ │ ├── SignatureWidget.java │ │ │ │ ├── StringNumberWidget.java │ │ │ │ ├── StringWidget.java │ │ │ │ ├── TextWidgetAnswer.kt │ │ │ │ ├── TimedGridWidget.kt │ │ │ │ ├── TriggerWidget.java │ │ │ │ ├── UrlWidget.java │ │ │ │ ├── WidgetAnswer.kt │ │ │ │ ├── WidgetAnswerView.kt │ │ │ │ ├── WidgetFactory.java │ │ │ │ ├── WidgetIconButton.kt │ │ │ │ ├── arbitraryfile/ │ │ │ │ │ ├── ArbitraryFileWidget.kt │ │ │ │ │ ├── ArbitraryFileWidgetContent.kt │ │ │ │ │ ├── ArbitraryFileWidgetDelegate.kt │ │ │ │ │ ├── ExArbitraryFileWidget.kt │ │ │ │ │ └── ExArbitraryFileWidgetContent.kt │ │ │ │ ├── barcode/ │ │ │ │ │ ├── BarcodeWidget.kt │ │ │ │ │ └── BarcodeWidgetContent.kt │ │ │ │ ├── datetime/ │ │ │ │ │ ├── DatePickerDetails.java │ │ │ │ │ ├── DateTimeUtils.java │ │ │ │ │ ├── DateTimeWidget.java │ │ │ │ │ ├── DateWidget.java │ │ │ │ │ ├── TimeWidget.java │ │ │ │ │ └── pickers/ │ │ │ │ │ ├── BikramSambatDatePickerDialog.java │ │ │ │ │ ├── BuddhistDatePickerDialog.kt │ │ │ │ │ ├── CopticDatePickerDialog.java │ │ │ │ │ ├── CustomDatePickerDialog.java │ │ │ │ │ ├── CustomTimePickerDialog.java │ │ │ │ │ ├── EthiopianDatePickerDialog.java │ │ │ │ │ ├── FixedDatePickerDialog.java │ │ │ │ │ ├── IslamicDatePickerDialog.java │ │ │ │ │ ├── MyanmarDatePickerDialog.java │ │ │ │ │ └── PersianDatePickerDialog.java │ │ │ │ ├── interfaces/ │ │ │ │ │ ├── FileWidget.java │ │ │ │ │ ├── GeoDataRequester.kt │ │ │ │ │ ├── MultiChoiceWidget.java │ │ │ │ │ ├── Printer.kt │ │ │ │ │ ├── SelectChoiceLoader.kt │ │ │ │ │ ├── Widget.java │ │ │ │ │ └── WidgetDataReceiver.kt │ │ │ │ ├── items/ │ │ │ │ │ ├── BaseSelectListWidget.java │ │ │ │ │ ├── ItemsWidgetUtils.kt │ │ │ │ │ ├── LabelWidget.java │ │ │ │ │ ├── LikertWidget.java │ │ │ │ │ ├── ListMultiWidget.java │ │ │ │ │ ├── ListWidget.java │ │ │ │ │ ├── RankingWidget.java │ │ │ │ │ ├── SelectImageMapWidget.java │ │ │ │ │ ├── SelectMinimalWidget.java │ │ │ │ │ ├── SelectMultiImageMapWidget.java │ │ │ │ │ ├── SelectMultiMinimalWidget.java │ │ │ │ │ ├── SelectMultiWidget.java │ │ │ │ │ ├── SelectOneFromMapDialogFragment.kt │ │ │ │ │ ├── SelectOneFromMapWidget.kt │ │ │ │ │ ├── SelectOneImageMapWidget.java │ │ │ │ │ ├── SelectOneMinimalWidget.java │ │ │ │ │ └── SelectOneWidget.java │ │ │ │ ├── range/ │ │ │ │ │ ├── RangeDecimalWidget.java │ │ │ │ │ ├── RangeIntegerWidget.java │ │ │ │ │ ├── RangePickerWidget.java │ │ │ │ │ └── RangePickerWidgetUtils.kt │ │ │ │ ├── utilities/ │ │ │ │ │ ├── ActivityGeoDataRequester.kt │ │ │ │ │ ├── AdditionalAttributes.kt │ │ │ │ │ ├── AudioFileRequester.java │ │ │ │ │ ├── AudioRecorderRecordingStatusHandler.java │ │ │ │ │ ├── BindAttributes.kt │ │ │ │ │ ├── DateTimeWidgetUtils.java │ │ │ │ │ ├── ExternalAppRecordingRequester.kt │ │ │ │ │ ├── FileRequester.kt │ │ │ │ │ ├── FormControllerWaitingForDataRegistry.java │ │ │ │ │ ├── GeoPolyDialogFragment.kt │ │ │ │ │ ├── GeoWidgetUtils.kt │ │ │ │ │ ├── GetContentAudioFileRequester.kt │ │ │ │ │ ├── ImageCaptureIntentCreator.kt │ │ │ │ │ ├── InternalRecordingRequester.java │ │ │ │ │ ├── QuestionFontSizeUtils.kt │ │ │ │ │ ├── RangeWidgetUtils.java │ │ │ │ │ ├── RecordingRequester.java │ │ │ │ │ ├── RecordingRequesterProvider.java │ │ │ │ │ ├── RecordingStatusHandler.java │ │ │ │ │ ├── SearchQueryViewModel.java │ │ │ │ │ ├── StringRequester.kt │ │ │ │ │ ├── StringWidgetUtils.java │ │ │ │ │ ├── ViewModelAudioPlayer.kt │ │ │ │ │ ├── WaitingForDataRegistry.java │ │ │ │ │ └── WidgetAnswerDialogFragment.kt │ │ │ │ ├── video/ │ │ │ │ │ ├── ExVideoWidget.kt │ │ │ │ │ ├── ExVideoWidgetContent.kt │ │ │ │ │ ├── VideoWidget.kt │ │ │ │ │ ├── VideoWidgetAnswer.kt │ │ │ │ │ └── VideoWidgetContent.kt │ │ │ │ ├── viewmodels/ │ │ │ │ │ ├── DateTimeViewModel.java │ │ │ │ │ └── QuestionViewModel.kt │ │ │ │ └── warnings/ │ │ │ │ └── SpacesInUnderlyingValuesWarning.java │ │ │ └── utilities/ │ │ │ ├── Result.java │ │ │ └── UserAgentProvider.java │ │ └── res/ │ │ ├── anim/ │ │ │ ├── fade_in.xml │ │ │ ├── fade_out.xml │ │ │ ├── push_left_in.xml │ │ │ ├── push_left_out.xml │ │ │ ├── push_right_in.xml │ │ │ └── push_right_out.xml │ │ ├── drawable/ │ │ │ ├── counter_minus_button_background.xml │ │ │ ├── counter_plus_button_background.xml │ │ │ ├── counter_value_background.xml │ │ │ ├── ic_access_time.xml │ │ │ ├── ic_add_circle_24.xml │ │ │ ├── ic_arrow_back.xml │ │ │ ├── ic_arrow_drop_down.xml │ │ │ ├── ic_arrow_up.xml │ │ │ ├── ic_baseline_delete_72.xml │ │ │ ├── ic_baseline_delete_outline_24.xml │ │ │ ├── ic_baseline_download_72.xml │ │ │ ├── ic_baseline_edit_72.xml │ │ │ ├── ic_baseline_error_24.xml │ │ │ ├── ic_baseline_help_outline_24.xml │ │ │ ├── ic_baseline_inbox_72.xml │ │ │ ├── ic_baseline_note_72.xml │ │ │ ├── ic_baseline_notifications_24.xml │ │ │ ├── ic_baseline_qr_code_scanner_24.xml │ │ │ ├── ic_baseline_refresh_24.xml │ │ │ ├── ic_baseline_refresh_error_24.xml │ │ │ ├── ic_baseline_search_24.xml │ │ │ ├── ic_baseline_send_72.xml │ │ │ ├── ic_baseline_sort_24.xml │ │ │ ├── ic_cancel.xml │ │ │ ├── ic_chat_bubble_24dp.xml │ │ │ ├── ic_check_circle_24.xml │ │ │ ├── ic_download_24.xml │ │ │ ├── ic_edit_24.xml │ │ │ ├── ic_folder_open.xml │ │ │ ├── ic_form_state_blank.xml │ │ │ ├── ic_form_state_finalized.xml │ │ │ ├── ic_form_state_saved.xml │ │ │ ├── ic_form_state_submission_failed.xml │ │ │ ├── ic_form_state_submitted.xml │ │ │ ├── ic_information_outline.xml │ │ │ ├── ic_map.xml │ │ │ ├── ic_menu_share.xml │ │ │ ├── ic_navigate_back.xml │ │ │ ├── ic_navigate_forward.xml │ │ │ ├── ic_ondemand_video_black_24dp.xml │ │ │ ├── ic_outline_assignment_accent_24.xml │ │ │ ├── ic_outline_cloud_accent_24.xml │ │ │ ├── ic_outline_color_lens_accent_24.xml │ │ │ ├── ic_outline_delete_accent_24.xml │ │ │ ├── ic_outline_edit_24.xml │ │ │ ├── ic_outline_face_accent_24.xml │ │ │ ├── ic_outline_forum_24.xml │ │ │ ├── ic_outline_info_small.xml │ │ │ ├── ic_outline_lock_24.xml │ │ │ ├── ic_outline_lock_accent_24.xml │ │ │ ├── ic_outline_lock_open_24.xml │ │ │ ├── ic_outline_map_accent_24.xml │ │ │ ├── ic_outline_menu_accent_24.xml │ │ │ ├── ic_outline_phonelink_setup_accent_24.xml │ │ │ ├── ic_outline_qr_code_scanner_accent_24.xml │ │ │ ├── ic_outline_rate_review_24.xml │ │ │ ├── ic_outline_refresh_accent_24.xml │ │ │ ├── ic_outline_settings_accent_24.xml │ │ │ ├── ic_outline_settings_applications_accent_24.xml │ │ │ ├── ic_outline_share_24.xml │ │ │ ├── ic_outline_stars_24.xml │ │ │ ├── ic_outline_vpn_key_accent_24.xml │ │ │ ├── ic_outline_warning_accent_24.xml │ │ │ ├── ic_outline_website_24.xml │ │ │ ├── ic_pause_24dp.xml │ │ │ ├── ic_person_24dp.xml │ │ │ ├── ic_play_arrow_24dp.xml │ │ │ ├── ic_repeat.xml │ │ │ ├── ic_room_form_state_complete_24dp.xml │ │ │ ├── ic_room_form_state_complete_48dp.xml │ │ │ ├── ic_room_form_state_incomplete_24dp.xml │ │ │ ├── ic_room_form_state_incomplete_48dp.xml │ │ │ ├── ic_room_form_state_submission_failed_24dp.xml │ │ │ ├── ic_room_form_state_submission_failed_48dp.xml │ │ │ ├── ic_room_form_state_submitted_24dp.xml │ │ │ ├── ic_room_form_state_submitted_48dp.xml │ │ │ ├── ic_save_menu_24.xml │ │ │ ├── ic_send_24.xml │ │ │ ├── ic_sort.xml │ │ │ ├── ic_sort_by_alpha.xml │ │ │ ├── ic_sort_by_last_saved.xml │ │ │ ├── ic_splash_screen_icon.xml │ │ │ ├── ic_stop_black_24dp.xml │ │ │ ├── ic_visibility.xml │ │ │ ├── ic_volume_up_black_24dp.xml │ │ │ ├── inset_divider_64dp.xml │ │ │ ├── main_menu_button_background.xml │ │ │ ├── odk_logo.xml │ │ │ ├── pill_filled.xml │ │ │ ├── pill_unfilled.xml │ │ │ ├── project_icon_background.xml │ │ │ ├── question_with_error_border.xml │ │ │ ├── select_item_border.xml │ │ │ └── start_new_form_button_background.xml │ │ ├── drawable-ldrtl/ │ │ │ ├── counter_minus_button_background.xml │ │ │ └── counter_plus_button_background.xml │ │ ├── layout/ │ │ │ ├── about_item_layout.xml │ │ │ ├── about_layout.xml │ │ │ ├── activity_blank_form_list.xml │ │ │ ├── activity_custom_scanner.xml │ │ │ ├── activity_preferences_layout.xml │ │ │ ├── add_repeat_dialog_layout.xml │ │ │ ├── admin_password_dialog_layout.xml │ │ │ ├── annotate_widget.xml │ │ │ ├── audio_controller_layout.xml │ │ │ ├── audio_player_layout.xml │ │ │ ├── audio_recording_controller_fragment.xml │ │ │ ├── audio_video_image_text_label.xml │ │ │ ├── audio_widget_answer.xml │ │ │ ├── background_audio_help_fragment_layout.xml │ │ │ ├── bearing_widget_answer.xml │ │ │ ├── blank_form_list_item.xml │ │ │ ├── bottom_sheet.xml │ │ │ ├── captioned_item.xml │ │ │ ├── captioned_list_dialog.xml │ │ │ ├── changes_reason_dialog.xml │ │ │ ├── checkbox.xml │ │ │ ├── circular_progress_indicator.xml │ │ │ ├── counter_widget.xml │ │ │ ├── current_project_menu_icon.xml │ │ │ ├── custom_date_picker_dialog.xml │ │ │ ├── date_time_widget_answer.xml │ │ │ ├── date_widget_answer.xml │ │ │ ├── delete_form_layout.xml │ │ │ ├── delete_project_dialog_layout.xml │ │ │ ├── draw_widget.xml │ │ │ ├── ex_audio_widget_answer.xml │ │ │ ├── ex_image_widget_answer.xml │ │ │ ├── ex_string_question_type.xml │ │ │ ├── first_launch_layout.xml │ │ │ ├── form_chooser_list.xml │ │ │ ├── form_chooser_list_item.xml │ │ │ ├── form_chooser_list_item_icon.xml │ │ │ ├── form_chooser_list_item_map_button.xml │ │ │ ├── form_chooser_list_item_multiple_choice.xml │ │ │ ├── form_chooser_list_item_text.xml │ │ │ ├── form_download_list.xml │ │ │ ├── form_entry.xml │ │ │ ├── form_entry_end.xml │ │ │ ├── form_hierarchy_layout.xml │ │ │ ├── form_map_activity.xml │ │ │ ├── fragment_scan.xml │ │ │ ├── geopoint_question.xml │ │ │ ├── geoshape_question.xml │ │ │ ├── geotrace_question.xml │ │ │ ├── google_drive_deprecation_banner.xml │ │ │ ├── help_layout.xml │ │ │ ├── hierarchy_group_item.xml │ │ │ ├── hierarchy_host_layout.xml │ │ │ ├── hierarchy_question_item.xml │ │ │ ├── hierarchy_repeatable_group_instance_item.xml │ │ │ ├── hierarchy_repeatable_group_item.xml │ │ │ ├── identify_user_dialog.xml │ │ │ ├── image_widget.xml │ │ │ ├── instance_uploader_list.xml │ │ │ ├── label_widget.xml │ │ │ ├── launch_intent_button_layout.xml │ │ │ ├── main_menu.xml │ │ │ ├── main_menu_activity.xml │ │ │ ├── main_menu_button.xml │ │ │ ├── manual_project_creator_dialog_layout.xml │ │ │ ├── map_button.xml │ │ │ ├── no_buttons_item_layout.xml │ │ │ ├── number_picker_dialog.xml │ │ │ ├── odk_view.xml │ │ │ ├── osm_widget_answer.xml │ │ │ ├── password_dialog_layout.xml │ │ │ ├── permissions_dialog_layout.xml │ │ │ ├── printer_widget.xml │ │ │ ├── progress_bar_view.xml │ │ │ ├── project_icon_view.xml │ │ │ ├── project_list_item.xml │ │ │ ├── project_settings_dialog_layout.xml │ │ │ ├── qr_code_project_creator_dialog_layout.xml │ │ │ ├── question_error_layout.xml │ │ │ ├── question_widget.xml │ │ │ ├── quit_form_dialog_layout.xml │ │ │ ├── range_picker_widget_answer.xml │ │ │ ├── range_widget_horizontal.xml │ │ │ ├── range_widget_vertical.xml │ │ │ ├── ranking_item.xml │ │ │ ├── ranking_widget.xml │ │ │ ├── rating_widget_answer.xml │ │ │ ├── ready_to_send_banner.xml │ │ │ ├── reset_dialog_layout.xml │ │ │ ├── select_image_map_widget_answer.xml │ │ │ ├── select_list_widget_answer.xml │ │ │ ├── select_minimal_dialog_layout.xml │ │ │ ├── select_minimal_widget_answer.xml │ │ │ ├── select_multi_item.xml │ │ │ ├── select_one_from_map_widget_answer.xml │ │ │ ├── select_one_item.xml │ │ │ ├── server_auth_dialog.xml │ │ │ ├── show_qrcode_fragment.xml │ │ │ ├── signature_widget.xml │ │ │ ├── sort_item_layout.xml │ │ │ ├── start_new_from_button.xml │ │ │ ├── tabs_layout.xml │ │ │ ├── time_widget_answer.xml │ │ │ ├── transparent_progress_screen.xml │ │ │ ├── trigger_widget_answer.xml │ │ │ ├── url_widget_answer.xml │ │ │ ├── waveform_layout.xml │ │ │ ├── widget_answer_dialog_layout.xml │ │ │ └── widget_answer_text.xml │ │ ├── menu/ │ │ │ ├── blank_form_list_menu.xml │ │ │ ├── changes_reason_dialog.xml │ │ │ ├── drafts.xml │ │ │ ├── form_hierarchy_menu.xml │ │ │ ├── form_menu.xml │ │ │ ├── instance_uploader_menu.xml │ │ │ ├── main_menu.xml │ │ │ ├── project_preferences_menu.xml │ │ │ ├── qr_code_scan_menu.xml │ │ │ ├── saved_form_list_menu.xml │ │ │ └── select_minimal_dialog_menu.xml │ │ ├── navigation/ │ │ │ └── form_entry.xml │ │ ├── raw/ │ │ │ ├── isrgrootx1.pem │ │ │ └── keep.xml │ │ ├── values/ │ │ │ ├── arrays.xml │ │ │ ├── attrs.xml │ │ │ ├── buttons.xml │ │ │ ├── colors.xml │ │ │ ├── date_time_pickers.xml │ │ │ ├── dimens.xml │ │ │ ├── form_entry_activity_theme.xml │ │ │ ├── form_state_colors.xml │ │ │ ├── leak_canary_config.xml │ │ │ ├── material_colors.xml │ │ │ ├── screen_names.xml │ │ │ ├── settings_theme.xml │ │ │ ├── shape.xml │ │ │ ├── styles.xml │ │ │ ├── theme.xml │ │ │ └── typography.xml │ │ ├── values-night/ │ │ │ └── material_colors.xml │ │ └── xml/ │ │ ├── access_control_preferences.xml │ │ ├── dev_tools_preferences.xml │ │ ├── experimental_preferences.xml │ │ ├── form_entry_access_preferences.xml │ │ ├── form_management_preferences.xml │ │ ├── form_metadata_preferences.xml │ │ ├── identity_preferences.xml │ │ ├── main_menu_access_preferences.xml │ │ ├── maps_preferences.xml │ │ ├── network_security_config.xml │ │ ├── odk_server_preferences.xml │ │ ├── project_display_preferences.xml │ │ ├── project_management_preferences.xml │ │ ├── project_preferences.xml │ │ ├── provider_paths.xml │ │ ├── server_preferences.xml │ │ ├── user_interface_preferences.xml │ │ └── user_settings_access_preferences.xml │ ├── release/ │ │ └── google-services.json │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ ├── android/ │ │ │ ├── TestSettingsProvider.kt │ │ │ ├── activities/ │ │ │ │ ├── CrashHandlerActivityTest.kt │ │ │ │ ├── FirstLaunchActivityTest.kt │ │ │ │ ├── FormFillingActivityTest.kt │ │ │ │ └── FormHierarchyFragmentHostActivityTest.kt │ │ │ ├── application/ │ │ │ │ ├── CollectSettingsChangeHandlerTest.kt │ │ │ │ ├── RobolectricApplication.java │ │ │ │ └── initialization/ │ │ │ │ ├── AnalyticsInitializerTest.kt │ │ │ │ ├── CachedFormsCleanerTest.kt │ │ │ │ ├── ExistingSettingsMigratorTest.kt │ │ │ │ ├── GoogleDriveProjectsDeleterTest.kt │ │ │ │ ├── SavepointsImporterTest.kt │ │ │ │ ├── ScheduledWorkUpgradeTest.kt │ │ │ │ └── upgrade/ │ │ │ │ └── BeforeProjectsInstallDetectorTest.kt │ │ │ ├── audio/ │ │ │ │ ├── AudioButtonTest.java │ │ │ │ ├── AudioControllerViewTest.java │ │ │ │ ├── AudioRecordingControllerFragmentTest.java │ │ │ │ ├── AudioRecordingFormErrorDialogFragmentTest.java │ │ │ │ └── BackgroundAudioHelpDialogFragmentTest.java │ │ │ ├── backgroundwork/ │ │ │ │ ├── AutoUpdateTaskSpecTest.kt │ │ │ │ ├── FormUpdateAndInstanceSubmitSchedulerTest.kt │ │ │ │ ├── SendFormsTaskSpecTest.kt │ │ │ │ └── SyncFormsTaskSpecTest.kt │ │ │ ├── configure/ │ │ │ │ └── qr/ │ │ │ │ ├── QRCodeActivityResultDelegateTest.kt │ │ │ │ ├── QRCodeMenuProviderTest.kt │ │ │ │ ├── QRCodeScannerFragmentTest.kt │ │ │ │ └── QRCodeViewModelTest.kt │ │ │ ├── database/ │ │ │ │ ├── DatabaseFormsRepositoryTest.java │ │ │ │ ├── DatabaseInstancesRepositoryTest.kt │ │ │ │ ├── DatabaseSavepointsRepositoryTest.kt │ │ │ │ ├── FormDatabaseMigratorTest.java │ │ │ │ ├── InstanceDatabaseMigratorTest.kt │ │ │ │ └── entities/ │ │ │ │ └── EntitiesDatabaseMigratorTest.kt │ │ │ ├── dependencies/ │ │ │ │ ├── BikramSambatTest.java │ │ │ │ └── PersianCalendarTest.java │ │ │ ├── dynamicpreload/ │ │ │ │ ├── DynamicPreloadExtraTest.kt │ │ │ │ ├── DynamicPreloadParseProcessorTest.kt │ │ │ │ ├── ExternalDataReaderTest.java │ │ │ │ ├── ExternalDataUseCasesTest.kt │ │ │ │ └── ExternalDataUtilTest.java │ │ │ ├── entities/ │ │ │ │ ├── DatabaseEntitiesRepositoryTest.kt │ │ │ │ ├── EntitiesRepositoryTest.kt │ │ │ │ ├── InMemEntitiesRepositoryTest.kt │ │ │ │ └── support/ │ │ │ │ └── EntitySameAsMatcher.kt │ │ │ ├── external/ │ │ │ │ ├── FormUriActivityTest.kt │ │ │ │ ├── FormsProviderTest.java │ │ │ │ └── InstanceProviderTest.java │ │ │ ├── fakes/ │ │ │ │ └── FakePermissionsProvider.kt │ │ │ ├── formentry/ │ │ │ │ ├── AppStateFormSessionRepositoryTest.kt │ │ │ │ ├── AudioVideoImageTextLabelTest.java │ │ │ │ ├── AudioVideoImageTextLabelVisibilityTest.kt │ │ │ │ ├── BackgroundAudioPermissionDialogFragmentTest.java │ │ │ │ ├── BackgroundAudioViewModelTest.java │ │ │ │ ├── FormEndTest.kt │ │ │ │ ├── FormEndViewModelTest.kt │ │ │ │ ├── FormEntryMenuProviderTest.kt │ │ │ │ ├── FormEntryUseCasesTest.kt │ │ │ │ ├── FormEntryViewModelTest.java │ │ │ │ ├── FormLoadingDialogFragmentTest.java │ │ │ │ ├── FormSessionRepositoryTest.kt │ │ │ │ ├── InMemoryFormSessionRepositoryTest.kt │ │ │ │ ├── PrinterWidgetViewModelTest.kt │ │ │ │ ├── QuitFormDialogTest.kt │ │ │ │ ├── RecordingHandlerTest.java │ │ │ │ ├── RefreshFormListDialogFragmentTest.java │ │ │ │ ├── SaveFormProgressDialogFragmentTest.java │ │ │ │ ├── audit/ │ │ │ │ │ ├── AsyncTaskAuditEventWriterTest.java │ │ │ │ │ ├── AuditConfigTest.java │ │ │ │ │ ├── AuditEventCSVLineTest.java │ │ │ │ │ ├── AuditEventLoggerTest.java │ │ │ │ │ ├── AuditEventTest.java │ │ │ │ │ ├── FormSaveViewModelTest.java │ │ │ │ │ └── IdentityPromptViewModelTest.java │ │ │ │ ├── backgroundlocation/ │ │ │ │ │ └── BackgroundLocationManagerTest.java │ │ │ │ ├── repeats/ │ │ │ │ │ └── DeleteRepeatDialogFragmentTest.java │ │ │ │ └── support/ │ │ │ │ └── InMemFormSessionRepository.kt │ │ │ ├── formhierarchy/ │ │ │ │ ├── HierarchyListItemViewTest.kt │ │ │ │ └── QuestionAnswerProcessorTest.kt │ │ │ ├── formlists/ │ │ │ │ ├── DeleteBlankFormFragmentTest.kt │ │ │ │ ├── blankformlist/ │ │ │ │ │ ├── BlankFormListItemTest.kt │ │ │ │ │ ├── BlankFormListItemViewTest.kt │ │ │ │ │ ├── BlankFormListMenuProviderTest.kt │ │ │ │ │ └── BlankFormListViewModelTest.kt │ │ │ │ └── savedformlist/ │ │ │ │ ├── DeleteSavedFormFragmentTest.kt │ │ │ │ ├── SavedFormListListMenuProviderTest.kt │ │ │ │ └── SavedFormListViewModelTest.kt │ │ │ ├── formmanagement/ │ │ │ │ ├── DownloadMediaFilesServerFormUseCasesTest.kt │ │ │ │ ├── DownloadUpdatesServerFormUseCasesTest.kt │ │ │ │ ├── FetchFormDetailsServerFormUseCasesTest.kt │ │ │ │ ├── FilterFormsToAddTest.kt │ │ │ │ ├── FormFillingIntentFactoryTest.kt │ │ │ │ ├── FormSourceExceptionMapperTest.kt │ │ │ │ ├── FormsDataServiceTest.kt │ │ │ │ ├── LocalFormUseCasesTest.java │ │ │ │ ├── ServerFormsSynchronizerTest.java │ │ │ │ ├── ShouldAddFormFileTest.java │ │ │ │ ├── download/ │ │ │ │ │ ├── FormDownloadExceptionMapperTest.kt │ │ │ │ │ └── ServerFormDownloaderTest.java │ │ │ │ ├── drafts/ │ │ │ │ │ └── DraftsMenuProviderTest.kt │ │ │ │ ├── formmap/ │ │ │ │ │ └── FormMapViewModelTest.kt │ │ │ │ └── metadata/ │ │ │ │ └── FormMetadataParserTest.kt │ │ │ ├── fragments/ │ │ │ │ ├── dialogs/ │ │ │ │ │ ├── FormsDownloadResultDialogTest.kt │ │ │ │ │ ├── RangePickerDialogFragmentTest.kt │ │ │ │ │ ├── SelectMinimalDialogTest.java │ │ │ │ │ ├── SelectMultiMinimalDialogTest.java │ │ │ │ │ └── SelectOneMinimalDialogTest.java │ │ │ │ └── support/ │ │ │ │ └── DialogFragmentHelpers.java │ │ │ ├── geo/ │ │ │ │ └── MapFragmentFactoryImplTest.kt │ │ │ ├── instancemanagement/ │ │ │ │ ├── InstanceDeleterTest.kt │ │ │ │ ├── InstanceExtKtTest.kt │ │ │ │ ├── InstanceListItemViewTest.kt │ │ │ │ ├── InstancesDataServiceTest.kt │ │ │ │ ├── LocalInstancesUseCasesTest.kt │ │ │ │ ├── autosend/ │ │ │ │ │ ├── AutoSendSettingsProviderTest.kt │ │ │ │ │ ├── FormExtTest.kt │ │ │ │ │ └── InstanceAutoSendFetcherTest.kt │ │ │ │ └── send/ │ │ │ │ ├── ReadyToSendBannerTest.kt │ │ │ │ └── ReadyToSendViewModelTest.kt │ │ │ ├── javarosawrapper/ │ │ │ │ ├── FakeFormController.java │ │ │ │ └── FormControllerTest.java │ │ │ ├── location/ │ │ │ │ └── client/ │ │ │ │ ├── FakeLocationClient.java │ │ │ │ └── MaxAccuracyWithinTimeoutLocationClientWrapperTest.java │ │ │ ├── mainmenu/ │ │ │ │ ├── CurrentProjectViewModelTest.kt │ │ │ │ ├── MainMenuActivityTest.kt │ │ │ │ ├── MainMenuButtonTest.kt │ │ │ │ ├── MainMenuViewModelTest.kt │ │ │ │ ├── PermissionsDialogFragmentTest.kt │ │ │ │ └── RequestPermissionsViewModelTest.kt │ │ │ ├── notifications/ │ │ │ │ └── NotificationManagerNotifierTest.kt │ │ │ ├── preferences/ │ │ │ │ ├── AppConfigurationGeneratorTest.kt │ │ │ │ ├── ProjectPreferencesViewModelTest.kt │ │ │ │ ├── ServerPreferencesAdderTest.java │ │ │ │ ├── dialogs/ │ │ │ │ │ ├── AdminPasswordDialogFragmentTest.kt │ │ │ │ │ ├── ChangeAdminPasswordDialogTest.kt │ │ │ │ │ ├── DeleteProjectDialogTest.kt │ │ │ │ │ ├── ResetProgressDialogTest.kt │ │ │ │ │ └── ServerAuthDialogFragmentTest.java │ │ │ │ ├── screens/ │ │ │ │ │ ├── FormEntryAccessPreferencesFragmentTest.kt │ │ │ │ │ ├── FormManagementPreferencesFragmentTest.kt │ │ │ │ │ ├── FormMetadataPreferencesFragmentTest.kt │ │ │ │ │ ├── IdentityPreferencesFragmentTest.kt │ │ │ │ │ ├── MainMenuAccessPreferencesTest.kt │ │ │ │ │ ├── MapsPreferencesFragmentTest.kt │ │ │ │ │ ├── ProjectDisplayPreferencesFragmentTest.kt │ │ │ │ │ ├── ProjectPreferencesFragmentTest.kt │ │ │ │ │ └── UserInterfacePreferencesFragmentTest.kt │ │ │ │ └── source/ │ │ │ │ ├── SettingsStoreTest.kt │ │ │ │ ├── SharedPreferencesSettingsProviderTest.kt │ │ │ │ └── SharedPreferencesSettingsTest.kt │ │ │ ├── projects/ │ │ │ │ ├── ExistingProjectMigratorTest.kt │ │ │ │ ├── ManualProjectCreatorDialogTest.kt │ │ │ │ ├── ProjectCreatorImplTest.kt │ │ │ │ ├── ProjectDeleterTest.kt │ │ │ │ ├── ProjectIconViewTest.kt │ │ │ │ ├── ProjectListItemViewTest.kt │ │ │ │ ├── ProjectResetterTest.kt │ │ │ │ ├── ProjectSettingsDialogTest.kt │ │ │ │ ├── ProjectsDataServiceTest.kt │ │ │ │ ├── QrCodeProjectCreatorDialogTest.kt │ │ │ │ └── SettingsConnectionMatcherImplTest.kt │ │ │ ├── savepoints/ │ │ │ │ └── SavepointUseCasesTest.kt │ │ │ ├── storage/ │ │ │ │ └── StoragePathProviderTest.kt │ │ │ ├── support/ │ │ │ │ ├── CollectHelpers.java │ │ │ │ ├── Matchers.kt │ │ │ │ ├── MockFormEntryPromptBuilder.java │ │ │ │ ├── SwipableParentActivity.kt │ │ │ │ └── WidgetTestActivity.kt │ │ │ ├── tasks/ │ │ │ │ └── SaveFormIndexTaskTest.java │ │ │ ├── utilities/ │ │ │ │ ├── AdminPasswordProviderTest.java │ │ │ │ ├── AppearancesTest.kt │ │ │ │ ├── ArrayUtilsTest.java │ │ │ │ ├── CSVUtilsTest.java │ │ │ │ ├── ChangeLockProviderTest.kt │ │ │ │ ├── ExternalAppIntentProviderTest.kt │ │ │ │ ├── ExternalAppUtilsTest.java │ │ │ │ ├── FileUtilsTest.java │ │ │ │ ├── FormNameUtilsTest.java │ │ │ │ ├── FormsDownloadResultInterpreterTest.kt │ │ │ │ ├── FormsRepositoryProviderTest.kt │ │ │ │ ├── FormsUploadResultInterpreterTest.kt │ │ │ │ ├── HtmlUtilsTest.kt │ │ │ │ ├── ImageCompressionControllerTest.kt │ │ │ │ ├── InstanceAutoDeleteCheckerTest.kt │ │ │ │ ├── InstanceUploaderUtilsTest.java │ │ │ │ ├── InstancesRepositoryProviderTest.kt │ │ │ │ ├── MediaUtilsTest.kt │ │ │ │ ├── MyanmarDateUtilsTest.java │ │ │ │ ├── QuestionFontSizeUtilsTest.java │ │ │ │ ├── StubFormController.kt │ │ │ │ └── WebCredentialsUtilsTest.java │ │ │ ├── version/ │ │ │ │ └── VersionInformationTest.java │ │ │ ├── views/ │ │ │ │ ├── ChoicesRecyclerViewTest.java │ │ │ │ ├── TrackingTouchSliderTest.java │ │ │ │ └── helpers/ │ │ │ │ └── PromptAutoplayerTest.java │ │ │ └── widgets/ │ │ │ ├── AnnotateWidgetTest.java │ │ │ ├── ArbitraryFileWidgetTest.kt │ │ │ ├── AudioWidgetTest.java │ │ │ ├── BarcodeWidgetTest.kt │ │ │ ├── BearingWidgetTest.java │ │ │ ├── CounterWidgetTest.kt │ │ │ ├── DecimalWidgetTest.java │ │ │ ├── DrawWidgetTest.java │ │ │ ├── ExArbitraryFileWidgetTest.kt │ │ │ ├── ExAudioWidgetTest.java │ │ │ ├── ExDecimalWidgetTest.java │ │ │ ├── ExImageWidgetTest.java │ │ │ ├── ExIntegerWidgetTest.java │ │ │ ├── ExStringWidgetTest.kt │ │ │ ├── ExVideoWidgetTest.kt │ │ │ ├── GeoPointMapWidgetTest.java │ │ │ ├── GeoPointWidgetTest.java │ │ │ ├── GeoShapeWidgetTest.java │ │ │ ├── GeoTraceWidgetTest.java │ │ │ ├── ImageWidgetTest.java │ │ │ ├── IntegerWidgetTest.java │ │ │ ├── OSMWidgetTest.java │ │ │ ├── PrinterWidgetTest.kt │ │ │ ├── QuestionWidgetTest.java │ │ │ ├── RatingWidgetTest.java │ │ │ ├── SignatureWidgetTest.java │ │ │ ├── StringNumberWidgetTest.java │ │ │ ├── StringWidgetTest.kt │ │ │ ├── TriggerWidgetTest.java │ │ │ ├── UrlWidgetTest.java │ │ │ ├── VideoWidgetTest.kt │ │ │ ├── WidgetFactoryTest.kt │ │ │ ├── base/ │ │ │ │ ├── BinaryWidgetTest.java │ │ │ │ ├── FileWidgetTest.java │ │ │ │ ├── GeneralExStringWidgetTest.java │ │ │ │ ├── GeneralSelectMultiWidgetTest.java │ │ │ │ ├── GeneralSelectOneWidgetTest.java │ │ │ │ ├── GeneralStringWidgetTest.java │ │ │ │ ├── QuestionWidgetTest.java │ │ │ │ ├── SelectWidgetTest.java │ │ │ │ └── WidgetTest.java │ │ │ ├── datetime/ │ │ │ │ ├── DateTimeUtilsTest.java │ │ │ │ ├── DateTimeWidgetTest.java │ │ │ │ ├── DateTimeWidgetUtilsTest.java │ │ │ │ ├── DateWidgetTest.java │ │ │ │ ├── DaylightSavingTest.java │ │ │ │ ├── TimeWidgetTest.java │ │ │ │ └── pickers/ │ │ │ │ ├── BikramSambatDatePickerDialogTest.java │ │ │ │ ├── BuddhistDatePickerDialogTest.kt │ │ │ │ ├── CopticDatePickerDialogTest.java │ │ │ │ ├── EthiopianDatePickerDialogTest.java │ │ │ │ ├── IslamicDatePickerDialogTest.java │ │ │ │ ├── MyanmarDatePickerDialogTest.java │ │ │ │ └── PersianDatePickerDialogTest.java │ │ │ ├── items/ │ │ │ │ ├── LikertWidgetTest.java │ │ │ │ ├── ListMultiWidgetTest.java │ │ │ │ ├── ListWidgetTest.java │ │ │ │ ├── RankingWidgetTest.java │ │ │ │ ├── SelectChoicesMapDataTest.kt │ │ │ │ ├── SelectImageMapWidgetTest.java │ │ │ │ ├── SelectMultiImageMapWidgetTest.java │ │ │ │ ├── SelectMultiMinimalWidgetTest.java │ │ │ │ ├── SelectMultiWidgetTest.java │ │ │ │ ├── SelectOneFromMapDialogFragmentTest.kt │ │ │ │ ├── SelectOneFromMapWidgetTest.kt │ │ │ │ ├── SelectOneImageMapWidgetTest.java │ │ │ │ ├── SelectOneMinimalWidgetTest.java │ │ │ │ └── SelectOneWidgetTest.java │ │ │ ├── range/ │ │ │ │ ├── RangeDecimalWidgetTest.java │ │ │ │ ├── RangeIntegerWidgetTest.java │ │ │ │ ├── RangePickerWidgetTest.kt │ │ │ │ └── RangePickerWidgetUtilsTest.kt │ │ │ ├── support/ │ │ │ │ ├── FakeQuestionMediaManager.java │ │ │ │ ├── FakeWaitingForDataRegistry.java │ │ │ │ ├── FormElementFixtures.kt │ │ │ │ ├── FormEntryPromptSelectChoiceLoader.kt │ │ │ │ ├── GeoWidgetHelpers.java │ │ │ │ ├── NoOpMapFragment.kt │ │ │ │ ├── QuestionWidgetHelpers.java │ │ │ │ └── SynchronousImageLoader.kt │ │ │ ├── utilities/ │ │ │ │ ├── ActivityGeoDataRequesterTest.java │ │ │ │ ├── AudioRecorderRecordingStatusHandlerTest.java │ │ │ │ ├── ExternalAppRecordingRequesterTest.kt │ │ │ │ ├── FileRequesterImplTest.kt │ │ │ │ ├── GeoPolyDialogFragmentTest.kt │ │ │ │ ├── GeoWidgetUtilsTest.kt │ │ │ │ ├── GetContentAudioFileRequesterTest.kt │ │ │ │ ├── InternalRecordingRequesterTest.java │ │ │ │ ├── RangeWidgetUtilsTest.java │ │ │ │ ├── RecordingRequesterProviderTest.java │ │ │ │ ├── StringRequesterImplTest.kt │ │ │ │ └── StringWidgetUtilsTest.java │ │ │ ├── viewmodels/ │ │ │ │ ├── DateTimeViewModelTest.java │ │ │ │ └── QuestionViewModelTest.kt │ │ │ └── warnings/ │ │ │ ├── SpacesInUnderlyingValuesTest.java │ │ │ └── SpacesInUnderlyingValuesWarningTest.java │ │ └── geo/ │ │ └── javarosa/ │ │ └── IntersectsFunctionHandlerTest.kt │ └── resources/ │ ├── forms/ │ │ └── simple-search-external-csv.xml │ ├── media/ │ │ └── simple-search-external-csv-fruits.csv │ └── robolectric.properties ├── config/ │ ├── checkstyle.xml │ ├── lint.xml │ ├── pmd-ruleset.xml │ └── quality.gradle ├── crash-handler/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── crashhandler/ │ │ │ ├── CrashHandler.kt │ │ │ ├── CrashView.kt │ │ │ └── MockCrashView.kt │ │ └── res/ │ │ └── layout/ │ │ └── crash_layout.xml │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── crashhandler/ │ └── CrashHandlerTest.kt ├── create-release.sh ├── db/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── db/ │ │ └── sqlite/ │ │ ├── AltDatabasePathContext.kt │ │ ├── CursorExt.kt │ │ ├── CustomSQLiteQueryBuilder.java │ │ ├── CustomSQLiteQueryExecutor.java │ │ ├── DatabaseConnection.kt │ │ ├── DatabaseMigrator.java │ │ ├── MigrationListDatabaseMigrator.kt │ │ ├── RowNumbers.kt │ │ ├── SQLiteColumns.kt │ │ ├── SQLiteDatabaseExt.kt │ │ ├── SQLiteUtils.java │ │ ├── SqlQuery.kt │ │ └── SynchronizedDatabaseConnection.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── db/ │ └── sqlite/ │ ├── CustomSQLiteQueryBuilderTest.java │ ├── DatabaseConnectionTest.kt │ ├── RowNumbersTest.kt │ ├── SQLiteUtilsTest.java │ ├── SqlQueryTest.kt │ ├── SqliteDatabaseExtTest.kt │ └── support/ │ └── NoopMigrator.kt ├── debug.keystore ├── docs/ │ ├── ANALYTICS-QUESTIONS.md │ ├── CODE-GUIDELINES.md │ ├── CONTRIBUTING.md │ ├── STATE.md │ ├── TEST-GUIDELINES.md │ ├── WIDGETS.md │ └── WINDOWS-DEV-SETUP.md ├── download-robolectric-deps.sh ├── draw/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── draw/ │ │ │ ├── DaggerSetup.kt │ │ │ ├── DrawActivity.java │ │ │ ├── DrawView.kt │ │ │ ├── DrawViewModel.kt │ │ │ ├── PenColorPickerDialog.kt │ │ │ ├── PenColorPickerViewModel.kt │ │ │ ├── QuitDrawingDialog.kt │ │ │ └── RobolectricApplication.kt │ │ └── res/ │ │ └── layout/ │ │ ├── draw_layout.xml │ │ └── quit_drawing_dialog_layout.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── draw/ │ │ ├── DrawActivityTest.kt │ │ ├── PenColorPickerDialogTest.kt │ │ └── PenColorPickerViewModelTest.kt │ └── resources/ │ └── robolectric.properties ├── entities/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── entities/ │ │ │ ├── DaggerSetup.kt │ │ │ ├── LocalEntityUseCases.kt │ │ │ ├── browser/ │ │ │ │ ├── EntitiesFragment.kt │ │ │ │ ├── EntitiesViewModel.kt │ │ │ │ ├── EntityBrowserActivity.kt │ │ │ │ ├── EntityItem.kt │ │ │ │ └── EntityListsFragment.kt │ │ │ ├── javarosa/ │ │ │ │ ├── filter/ │ │ │ │ │ ├── LocalEntitiesFilterStrategy.kt │ │ │ │ │ └── PullDataFunctionHandler.kt │ │ │ │ ├── finalization/ │ │ │ │ │ ├── EntitiesExtra.kt │ │ │ │ │ ├── EntityFormFinalizationProcessor.kt │ │ │ │ │ ├── FormEntity.kt │ │ │ │ │ └── InvalidEntity.kt │ │ │ │ ├── intance/ │ │ │ │ │ ├── LocalEntitiesExternalInstanceParserFactory.kt │ │ │ │ │ ├── LocalEntitiesInstanceAdapter.kt │ │ │ │ │ └── LocalEntitiesInstanceProvider.kt │ │ │ │ ├── parse/ │ │ │ │ │ ├── EntityFormExtra.kt │ │ │ │ │ ├── EntityFormParseProcessor.kt │ │ │ │ │ ├── EntitySchema.kt │ │ │ │ │ ├── EntityXFormParserFactory.kt │ │ │ │ │ ├── SaveTo.kt │ │ │ │ │ ├── StringExt.kt │ │ │ │ │ └── XPathExpressionExt.kt │ │ │ │ └── spec/ │ │ │ │ ├── EntityAction.kt │ │ │ │ ├── EntityFormParser.kt │ │ │ │ ├── FormEntityElement.kt │ │ │ │ └── UnrecognizedEntityVersionException.kt │ │ │ ├── server/ │ │ │ │ └── EntitySource.kt │ │ │ └── storage/ │ │ │ ├── EntitiesRepository.kt │ │ │ ├── Entity.kt │ │ │ ├── EntityList.kt │ │ │ ├── InMemEntitiesRepository.kt │ │ │ └── QueryException.kt │ │ └── res/ │ │ ├── layout/ │ │ │ ├── entities_layout.xml │ │ │ ├── entity_list_item_layout.xml │ │ │ └── list_layout.xml │ │ └── navigation/ │ │ └── entities_nav.xml │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── entities/ │ ├── LocalEntityUseCasesTest.kt │ ├── browser/ │ │ └── EntityItemTest.kt │ └── javarosa/ │ ├── EntitiesTest.kt │ ├── EntityFormFinalizationProcessorTest.kt │ ├── EntityFormParseProcessorTest.kt │ ├── EntityFormParserTest.kt │ ├── LocalEntitiesInstanceProviderTest.kt │ ├── filter/ │ │ ├── LocalEntitiesFilterStrategyTest.kt │ │ └── PullDataFunctionHandlerTest.kt │ ├── parse/ │ │ ├── StringExtTest.kt │ │ └── XPathExpressionExtTest.kt │ └── support/ │ └── EntityXFormsElement.kt ├── errors/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── errors/ │ │ │ ├── ErrorActivity.kt │ │ │ ├── ErrorAdapter.kt │ │ │ └── ErrorItem.kt │ │ └── res/ │ │ └── layout/ │ │ ├── activity_error.xml │ │ └── error_item.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── errors/ │ │ └── ErrorActivityTest.kt │ └── resources/ │ └── robolectric.properties ├── external-app/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── externalapp/ │ │ └── ExternalAppUtils.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── externalapp/ │ └── ExternalAppUtilsTest.kt ├── forms/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── forms/ │ │ ├── Form.java │ │ ├── FormListItem.kt │ │ ├── FormSource.java │ │ ├── FormSourceException.kt │ │ ├── FormsRepository.java │ │ ├── ManifestFile.kt │ │ ├── MediaFile.kt │ │ ├── instances/ │ │ │ ├── Instance.java │ │ │ └── InstancesRepository.java │ │ └── savepoints/ │ │ ├── Savepoint.kt │ │ └── SavepointsRepository.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── forms/ │ └── instances/ │ └── InstanceTest.kt ├── forms-test/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── formstest/ │ │ ├── FormFixtures.kt │ │ ├── FormUtils.kt │ │ ├── FormsRepositoryTest.java │ │ ├── InMemFormsRepository.java │ │ ├── InMemInstancesRepository.java │ │ ├── InMemSavepointsRepository.kt │ │ ├── InstanceFixtures.kt │ │ ├── InstanceUtils.kt │ │ ├── InstancesRepositoryTest.kt │ │ └── SavepointsRepositoryTest.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── formstest/ │ ├── InMemFormsRepositoryTest.java │ ├── InMemInstancesRepositoryTest.kt │ └── InMemSavepointsRepositoryTest.kt ├── fragments-test/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── fragmentstest/ │ └── FragmentScenarioLauncherRule.kt ├── geo/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── geo/ │ │ │ ├── Constants.kt │ │ │ ├── DaggerSetup.kt │ │ │ ├── GeoActivityUtils.kt │ │ │ ├── GeoUtils.kt │ │ │ ├── analytics/ │ │ │ │ └── AnalyticsEvents.kt │ │ │ ├── geopoint/ │ │ │ │ ├── AccuracyProgressView.kt │ │ │ │ ├── AccuracyStatusView.kt │ │ │ │ ├── GeoPointActivity.kt │ │ │ │ ├── GeoPointDialogFragment.kt │ │ │ │ ├── GeoPointMapActivity.java │ │ │ │ ├── GeoPointViewModel.kt │ │ │ │ └── LocationAccuracy.kt │ │ │ ├── geopoly/ │ │ │ │ ├── GeoPolyFragment.kt │ │ │ │ ├── GeoPolySettingsDialogFragment.java │ │ │ │ ├── GeoPolyUtils.kt │ │ │ │ ├── GeoPolyViewModel.kt │ │ │ │ └── InfoDialog.kt │ │ │ ├── javarosa/ │ │ │ │ └── IntersectsFunctionHandler.kt │ │ │ └── selection/ │ │ │ ├── MappableSelectItem.kt │ │ │ ├── SelectionMapFragment.kt │ │ │ └── SelectionSummarySheet.kt │ │ └── res/ │ │ ├── color/ │ │ │ └── fab_surface_background_color_less_transparent_disabled.xml │ │ ├── drawable/ │ │ │ ├── ic_add_location.xml │ │ │ ├── ic_backspace.xml │ │ │ ├── ic_crop_frame.xml │ │ │ ├── ic_distance.xml │ │ │ ├── ic_info.xml │ │ │ ├── ic_layers.xml │ │ │ ├── ic_my_location.xml │ │ │ ├── ic_note_add.xml │ │ │ ├── ic_pause_36.xml │ │ │ └── property_divider.xml │ │ ├── layout/ │ │ │ ├── accuracy_progress_layout.xml │ │ │ ├── accuracy_status_layout.xml │ │ │ ├── geopoint_dialog.xml │ │ │ ├── geopoint_layout.xml │ │ │ ├── geopoly_dialog.xml │ │ │ ├── geopoly_layout.xml │ │ │ ├── property.xml │ │ │ ├── selection_map_layout.xml │ │ │ ├── selection_summary_sheet_layout.xml │ │ │ └── simple_spinner_dropdown_item.xml │ │ ├── layout-land/ │ │ │ ├── geopoint_layout.xml │ │ │ └── geopoly_layout.xml │ │ └── values/ │ │ ├── attrs.xml │ │ ├── fab_surface.xml │ │ └── force_light_surface_overlay.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── geo/ │ │ ├── GeoUtilsTest.kt │ │ ├── geopoint/ │ │ │ ├── AccuracyProgressViewTest.kt │ │ │ ├── AccuracyStatusViewTest.kt │ │ │ ├── GeoPointActivityTest.kt │ │ │ ├── GeoPointDialogFragmentTest.kt │ │ │ ├── GeoPointMapActivityTest.java │ │ │ └── LocationTrackerGeoPointViewModelTest.kt │ │ ├── geopoly/ │ │ │ ├── GeoPolyFragmentTest.kt │ │ │ ├── GeoPolySettingsDialogFragmentTest.java │ │ │ ├── GeoPolyUtilsTest.kt │ │ │ ├── GeoPolyViewModelTest.kt │ │ │ └── InfoContentTest.kt │ │ ├── selection/ │ │ │ ├── SelectionMapFragmentTest.kt │ │ │ └── SelectionSummarySheetTest.kt │ │ └── support/ │ │ ├── AccuracyStatusViewMatcher.kt │ │ ├── FakeLocationTracker.kt │ │ ├── FakeMapFragment.kt │ │ ├── Fixtures.kt │ │ └── RobolectricApplication.kt │ └── resources/ │ └── robolectric.properties ├── google-maps/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── googlemaps/ │ │ ├── BitmapDescriptorCache.kt │ │ ├── DaggerSetup.kt │ │ ├── GoogleMapConfigurator.java │ │ ├── GoogleMapFragment.java │ │ ├── GoogleMapsMapBoxOfflineTileProvider.java │ │ ├── MapPointExt.kt │ │ ├── circles/ │ │ │ └── CircleFeature.kt │ │ └── scaleview/ │ │ ├── Drawer.java │ │ ├── MapScaleModel.java │ │ ├── MapScaleView.java │ │ ├── Scale.java │ │ ├── Scales.java │ │ └── ViewConfig.java │ └── res/ │ ├── layout/ │ │ └── map_layout.xml │ └── values/ │ └── attrs.xml ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── icons/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── res/ │ └── drawable/ │ ├── ic_add_white_24.xml │ ├── ic_baseline_add_24.xml │ ├── ic_baseline_barcode_scanner_white_24.xml │ ├── ic_baseline_calendar_today_white_24.xml │ ├── ic_baseline_check_24.xml │ ├── ic_baseline_collapse_24.xml │ ├── ic_baseline_done_all_24.xml │ ├── ic_baseline_draw_white_24.xml │ ├── ic_baseline_expand_24.xml │ ├── ic_baseline_explore_white_24.xml │ ├── ic_baseline_format_list_bulleted_white_24.xml │ ├── ic_baseline_format_list_numbered_white_24.xml │ ├── ic_baseline_language_24.xml │ ├── ic_baseline_layers_24.xml │ ├── ic_baseline_library_music_white_24.xml │ ├── ic_baseline_list_24.xml │ ├── ic_baseline_location_off_24.xml │ ├── ic_baseline_location_on_24.xml │ ├── ic_baseline_location_on_white_24.xml │ ├── ic_baseline_markup_white_24.xml │ ├── ic_baseline_mic_24.xml │ ├── ic_baseline_mic_off_24.xml │ ├── ic_baseline_mic_white_24.xml │ ├── ic_baseline_my_location_white_24.xml │ ├── ic_baseline_open_in_new_white_24.xml │ ├── ic_baseline_photo_camera_white_24.xml │ ├── ic_baseline_photo_library_white_24.xml │ ├── ic_baseline_print_white_24.xml │ ├── ic_baseline_qr_code_2_add_24.xml │ ├── ic_baseline_remove_24.xml │ ├── ic_baseline_rule_24.xml │ ├── ic_baseline_settings_24.xml │ ├── ic_baseline_signature_white_24.xml │ ├── ic_baseline_time_filled_white_24.xml │ ├── ic_baseline_visibility_24.xml │ ├── ic_baseline_warning_24.xml │ ├── ic_baseline_wifi_off_24.xml │ ├── ic_clear_white.xml │ ├── ic_close.xml │ ├── ic_color_lens_white.xml │ ├── ic_delete.xml │ ├── ic_delete_24.xml │ ├── ic_edit.xml │ ├── ic_map_marker_big.xml │ ├── ic_map_marker_small.xml │ ├── ic_map_marker_with_hole_big.xml │ ├── ic_map_marker_with_hole_small.xml │ ├── ic_map_point.xml │ ├── ic_notification_small.xml │ ├── ic_outline_info_24.xml │ ├── ic_outline_polygon_white_24.xml │ ├── ic_outline_polyline_white_24.xml │ ├── ic_save.xml │ └── ic_save_white.xml ├── image-loader/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── imageloader/ │ ├── GlideImageLoader.kt │ └── svg/ │ ├── SvgDecoder.kt │ ├── SvgDrawableTranscoder.kt │ ├── SvgModule.kt │ └── SvgSoftwareLayerSetter.kt ├── lists/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── lists/ │ │ │ ├── EmptyListView.kt │ │ │ ├── RecyclerViewUtils.kt │ │ │ └── selects/ │ │ │ ├── MultiSelectAdapter.kt │ │ │ ├── MultiSelectControlsFragment.kt │ │ │ ├── MultiSelectListFragment.kt │ │ │ ├── MultiSelectViewModel.kt │ │ │ ├── SelectItem.kt │ │ │ └── SingleSelectViewModel.kt │ │ └── res/ │ │ ├── layout/ │ │ │ ├── empty_list_view.xml │ │ │ ├── multi_select_controls_layout.xml │ │ │ └── multi_select_list.xml │ │ └── values/ │ │ └── attrs.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── lists/ │ │ ├── EmptyListViewTest.kt │ │ ├── RobolectricApplication.kt │ │ └── selects/ │ │ ├── MultiSelectAdapterTest.kt │ │ ├── MultiSelectControlsFragmentTest.kt │ │ ├── MultiSelectListFragmentTest.kt │ │ ├── MultiSelectViewModelTest.kt │ │ ├── SingleSelectViewModelTest.kt │ │ └── support/ │ │ └── TextAndCheckboxViewHolder.kt │ └── resources/ │ └── robolectric.properties ├── location/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── location/ │ │ ├── AndroidLocationClient.java │ │ ├── BaseLocationClient.kt │ │ ├── DaggerSetup.kt │ │ ├── GoogleFusedLocationClient.kt │ │ ├── Location.kt │ │ ├── LocationClient.java │ │ ├── LocationClientProvider.kt │ │ ├── LocationUtils.kt │ │ ├── satellites/ │ │ │ ├── GpsStatusSatelliteInfoClient.kt │ │ │ └── SatelliteInfoClient.kt │ │ └── tracker/ │ │ ├── ForegroundServiceLocationTracker.kt │ │ └── LocationTracker.kt │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── location/ │ │ ├── AndroidLocationClientTest.java │ │ ├── GoogleFusedLocationClientTest.kt │ │ ├── LocationClientProviderTest.kt │ │ ├── LocationUtilsTest.kt │ │ ├── RobolectricApplication.kt │ │ ├── TestClientListener.java │ │ ├── TestLocationListener.java │ │ └── tracker/ │ │ ├── ForegroundServiceLocationTrackerTest.kt │ │ ├── LocationTrackerServiceTest.kt │ │ └── LocationTrackerTest.kt │ └── resources/ │ └── robolectric.properties ├── mapbox/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── mapbox/ │ │ ├── DynamicPolyLineFeature.kt │ │ ├── DynamicPolygonFeature.kt │ │ ├── LineFeature.kt │ │ ├── MapBoxInitializationFragment.kt │ │ ├── MapFeature.kt │ │ ├── MapUtils.kt │ │ ├── MapboxMapConfigurator.java │ │ ├── MapboxMapFragment.kt │ │ ├── MarkerFeature.kt │ │ ├── StaticPolyLineFeature.kt │ │ ├── StaticPolygonFeature.kt │ │ └── TileHttpServer.java │ └── res/ │ └── layout/ │ └── mapbox_fragment_layout.xml ├── maps/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── maps/ │ │ │ ├── AnalyticsEvents.kt │ │ │ ├── MapConfigurator.kt │ │ │ ├── MapConsts.kt │ │ │ ├── MapFragment.kt │ │ │ ├── MapFragmentFactory.kt │ │ │ ├── MapPoint.kt │ │ │ ├── MapViewModel.kt │ │ │ ├── MapViewModelMapFragment.kt │ │ │ ├── ZoomObserver.kt │ │ │ ├── circles/ │ │ │ │ ├── CircleDescription.kt │ │ │ │ └── CurrentLocationDelegate.kt │ │ │ ├── layers/ │ │ │ │ ├── DirectoryReferenceLayerRepository.kt │ │ │ │ ├── MapFragmentReferenceLayerUtils.kt │ │ │ │ ├── MbtilesFile.java │ │ │ │ ├── OfflineMapLayersImporterAdapter.kt │ │ │ │ ├── OfflineMapLayersImporterDialogFragment.kt │ │ │ │ ├── OfflineMapLayersPickerAdapter.kt │ │ │ │ ├── OfflineMapLayersPickerBottomSheetDialogFragment.kt │ │ │ │ ├── OfflineMapLayersViewModel.kt │ │ │ │ ├── ReferenceLayerRepository.kt │ │ │ │ └── TileSource.java │ │ │ ├── markers/ │ │ │ │ ├── MarkerDescription.kt │ │ │ │ ├── MarkerIconCreator.kt │ │ │ │ └── MarkerIconDescription.kt │ │ │ └── traces/ │ │ │ ├── LineDescription.kt │ │ │ ├── PolygonDescription.kt │ │ │ └── TraceDescription.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_crosshairs.xml │ │ └── layout/ │ │ ├── offline_map_layers_importer.xml │ │ ├── offline_map_layers_importer_item.xml │ │ ├── offline_map_layers_picker.xml │ │ └── offline_map_layers_picker_item.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── maps/ │ │ ├── LineDescriptionTest.kt │ │ ├── MarkerIconDescriptionTest.kt │ │ ├── PolygonDescriptionTest.kt │ │ ├── RobolectricApplication.kt │ │ ├── TraceDescriptionTest.kt │ │ └── layers/ │ │ ├── DirectoryReferenceLayerRepositoryTest.kt │ │ ├── InMemReferenceLayerRepository.kt │ │ ├── MapFragmentReferenceLayerUtilsTest.kt │ │ ├── OfflineMapLayersImporterDialogFragmentTest.kt │ │ └── OfflineMapLayersPickerBottomSheetDialogFragmentTest.kt │ └── resources/ │ └── robolectric.properties ├── material/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── material/ │ │ │ ├── BottomSheetBehavior.kt │ │ │ ├── ErrorsPill.kt │ │ │ ├── MaterialFullScreenDialogFragment.kt │ │ │ ├── MaterialPill.kt │ │ │ ├── MaterialProgressDialogFragment.java │ │ │ └── Pill.kt │ │ └── res/ │ │ ├── layout/ │ │ │ ├── pill.xml │ │ │ └── progress_dialog.xml │ │ └── values/ │ │ ├── attrs.xml │ │ ├── material_3_button_icon_end_style.xml │ │ └── material_full_screen_dialog_theme.xml │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── material/ │ ├── ErrorsPillTest.kt │ └── MaterialProgressDialogFragmentTest.java ├── metadata/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── metadata/ │ │ ├── InstallIDProvider.kt │ │ └── PropertyManager.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── metadata/ │ ├── PropertyManagerTest.kt │ └── SettingsInstallIDProviderTest.kt ├── mobile-device-management/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── mobiledevicemanagement/ │ │ │ ├── MDMConfigHandler.kt │ │ │ └── MDMConfigObserver.kt │ │ └── res/ │ │ └── xml/ │ │ └── managed_configuration.xml │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── mobiledevicemanagement/ │ ├── MDMConfigHandlerTest.kt │ └── MDMConfigObserverTest.kt ├── nbistubs/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── AndroidManifest.xml ├── open-rosa/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── openrosa/ │ │ ├── forms/ │ │ │ ├── DocumentFetchResult.java │ │ │ ├── EntityIntegrity.kt │ │ │ ├── OpenRosaClient.kt │ │ │ └── OpenRosaXmlFetcher.java │ │ ├── http/ │ │ │ ├── CaseInsensitiveEmptyHeaders.java │ │ │ ├── CaseInsensitiveHeaders.java │ │ │ ├── CollectThenSystemContentTypeMapper.java │ │ │ ├── HttpCredentials.java │ │ │ ├── HttpCredentialsInterface.java │ │ │ ├── HttpGetResult.java │ │ │ ├── HttpHeadResult.java │ │ │ ├── HttpPostResult.java │ │ │ ├── OpenRosaConstants.kt │ │ │ ├── OpenRosaHttpInterface.java │ │ │ └── okhttp/ │ │ │ ├── OkHttpCaseInsensitiveHeaders.java │ │ │ ├── OkHttpConnection.java │ │ │ ├── OkHttpOpenRosaServerClientProvider.java │ │ │ ├── OpenRosaServerClient.java │ │ │ └── OpenRosaServerClientProvider.java │ │ └── parse/ │ │ ├── Kxml2OpenRosaResponseParser.kt │ │ └── OpenRosaResponseParser.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── openrosa/ │ ├── forms/ │ │ ├── OpenRosaClientTest.kt │ │ └── OpenRosaXmlFetcherTest.java │ ├── http/ │ │ ├── CaseInsensitiveEmptyHeadersTest.java │ │ ├── CollectThenSystemContentTypeMapperTest.java │ │ ├── OpenRosaGetRequestTest.java │ │ ├── OpenRosaHeadRequestTest.java │ │ ├── OpenRosaPostRequestTest.java │ │ └── okhttp/ │ │ ├── OkHttpCaseInsensitiveHeadersTest.java │ │ ├── OkHttpConnectionGetRequestTest.java │ │ ├── OkHttpConnectionHeadRequestTest.java │ │ ├── OkHttpConnectionPostRequestTest.java │ │ ├── OkHttpOpenRosaServerClientProviderTest.java │ │ └── OpenRosaServerClientProviderTest.java │ ├── parse/ │ │ └── Kxml2OpenRosaResponseParserTest.kt │ └── support/ │ ├── MockWebServerHelper.java │ ├── MockWebServerRule.kt │ └── StubWebCredentialsProvider.java ├── osmdroid/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── osmdroid/ │ │ ├── DaggerSetup.kt │ │ ├── OsmDroidInitializer.kt │ │ ├── OsmDroidMapConfigurator.java │ │ ├── OsmDroidMapFragment.java │ │ ├── OsmMBTileModuleProvider.java │ │ ├── OsmMBTileProvider.java │ │ ├── OsmMBTileSource.java │ │ └── WebMapService.java │ └── res/ │ └── layout/ │ └── osm_map_layout.xml ├── permissions/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── permissions/ │ │ │ ├── LocationAccessibilityChecker.kt │ │ │ ├── PermissionListener.kt │ │ │ ├── PermissionsChecker.kt │ │ │ ├── PermissionsDialogCreator.kt │ │ │ ├── PermissionsProvider.kt │ │ │ └── RequestPermissionsAPI.kt │ │ └── res/ │ │ └── drawable/ │ │ ├── ic_photo_camera.xml │ │ ├── ic_room_24dp.xml │ │ └── ic_storage.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── permissions/ │ │ ├── PermissionsDialogCreatorTest.kt │ │ └── PermissionsProviderTest.kt │ └── resources/ │ └── robolectric.properties ├── printer/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── printer/ │ └── HtmlPrinter.kt ├── projects/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── projects/ │ │ ├── DaggerSetup.kt │ │ ├── InMemProjectsRepository.kt │ │ ├── Project.kt │ │ ├── ProjectConfigurationResult.kt │ │ ├── ProjectCreator.kt │ │ ├── ProjectDependencyFactory.kt │ │ ├── ProjectsRepository.kt │ │ ├── SettingsConnectionMatcher.kt │ │ └── SharedPreferencesProjectsRepository.kt │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── projects/ │ │ ├── InMemProjectsRepositoryTest.kt │ │ ├── ProjectsRepositoryTest.kt │ │ ├── SharedPreferencesProjectsRepositoryTest.kt │ │ └── support/ │ │ └── RobolectricApplication.kt │ └── resources/ │ └── robolectric.properties ├── qr-code/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── qrcode/ │ │ │ ├── BarcodeFilter.kt │ │ │ ├── BarcodeScannerViewContainer.kt │ │ │ ├── DetectedState.kt │ │ │ ├── FlashlightToggle.kt │ │ │ ├── ScannerControls.kt │ │ │ ├── ScannerOverlay.kt │ │ │ ├── mlkit/ │ │ │ │ ├── MlKitBarcodeScannerViewFactory.kt │ │ │ │ └── PlayServicesFallbackBarcodeScannerViewFactory.kt │ │ │ └── zxing/ │ │ │ ├── QRCodeCreator.kt │ │ │ ├── QRCodeDecoder.kt │ │ │ └── ZxingBarcodeScannerViewFactory.kt │ │ └── res/ │ │ └── layout/ │ │ ├── mlkit_barcode_scanner_layout.xml │ │ └── zxing_barcode_scanner_layout.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── qrcode/ │ │ ├── BarcodeFilterTest.kt │ │ └── QRCodeEncodeDecodeTest.kt │ └── resources/ │ └── robolectric.properties ├── secrets.gradle ├── selfie-camera/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── selfiecamera/ │ │ │ ├── Camera.kt │ │ │ ├── CameraXCamera.kt │ │ │ ├── CaptureSelfieActivity.kt │ │ │ └── DaggerSetup.kt │ │ └── res/ │ │ └── layout/ │ │ └── activity_capture_selfie.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── selfiecamera/ │ │ ├── CaptureSelfieActivityTest.kt │ │ └── support/ │ │ └── RobolectricApplication.kt │ └── resources/ │ └── robolectric.properties ├── service-test/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── servicetest/ │ ├── NotificationDetails.kt │ └── ServiceScenario.kt ├── settings/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ ├── consumer-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── settings/ │ │ │ ├── InMemSettingsProvider.kt │ │ │ ├── ODKAppSettingsImporter.kt │ │ │ ├── ODKAppSettingsMigrator.java │ │ │ ├── SettingsProvider.kt │ │ │ ├── enums/ │ │ │ │ ├── AutoSend.kt │ │ │ │ ├── FormUpdateMode.java │ │ │ │ ├── GuidanceHintMode.kt │ │ │ │ ├── StringIdEnum.kt │ │ │ │ └── StringIdEnumUtils.kt │ │ │ ├── importing/ │ │ │ │ ├── ProjectDetailsCreatorImpl.kt │ │ │ │ └── SettingsImporter.kt │ │ │ ├── keys/ │ │ │ │ ├── AppConfigurationKeys.kt │ │ │ │ ├── MetaKeys.kt │ │ │ │ ├── ProjectKeys.kt │ │ │ │ └── ProtectedProjectKeys.kt │ │ │ ├── migration/ │ │ │ │ ├── KeyCombiner.java │ │ │ │ ├── KeyExtractor.java │ │ │ │ ├── KeyMover.java │ │ │ │ ├── KeyRenamer.java │ │ │ │ ├── KeyTranslator.java │ │ │ │ ├── KeyUpdater.java │ │ │ │ ├── KeyValuePair.java │ │ │ │ ├── Migration.java │ │ │ │ ├── MigrationUtils.java │ │ │ │ └── ValueTranslator.java │ │ │ └── validation/ │ │ │ └── JsonSchemaSettingsValidator.kt │ │ ├── res/ │ │ │ └── values/ │ │ │ └── strings.xml │ │ └── resources/ │ │ └── client-settings.schema.json │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── settings/ │ ├── ODKAppSettingsImporterTest.kt │ ├── ODKAppSettingsMigratorTest.java │ ├── importing/ │ │ ├── ProjectDetailsCreatorImplTest.kt │ │ └── SettingsImporterTest.kt │ ├── migration/ │ │ ├── KeyCombinerTest.java │ │ ├── KeyExtractorTest.java │ │ ├── KeyMoverTest.java │ │ ├── KeyRemoverTest.java │ │ ├── KeyRenamerTest.java │ │ ├── KeyTranslatorTest.java │ │ └── ValueTranslatorTest.java │ ├── support/ │ │ └── SettingsUtils.kt │ └── validation/ │ ├── JsonSchemaSettingsValidatorTest.kt │ └── OriginalJsonSchemaSettingsValidatorTest.kt ├── settings.gradle ├── shadows/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── shadows/ │ │ └── ShadowAndroidXAlertDialog.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── shadows/ │ └── ShadowAndroidXAlertDialogTest.kt ├── shared/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── shared/ │ │ ├── DebugLogger.kt │ │ ├── PathUtils.kt │ │ ├── Query.kt │ │ ├── TempFiles.kt │ │ ├── TimeInMs.kt │ │ ├── collections/ │ │ │ └── CollectionExtensions.kt │ │ ├── files/ │ │ │ └── FileExt.kt │ │ ├── geometry/ │ │ │ └── Geometry.kt │ │ ├── injection/ │ │ │ └── ObjectProvider.kt │ │ ├── locks/ │ │ │ ├── BooleanChangeLock.kt │ │ │ ├── ChangeLock.kt │ │ │ └── ThreadSafeBooleanChangeLock.kt │ │ ├── result/ │ │ │ └── Result.kt │ │ ├── settings/ │ │ │ ├── InMemSettings.kt │ │ │ └── Settings.kt │ │ └── strings/ │ │ ├── Md5.kt │ │ ├── RandomString.java │ │ ├── StringUtils.kt │ │ └── UUIDGenerator.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── shared/ │ ├── Md5Test.kt │ ├── PathUtilsTest.kt │ ├── QuickCheck.kt │ ├── collections/ │ │ └── CollectionExtensionsTest.kt │ ├── files/ │ │ └── FileExtTest.kt │ ├── geometry/ │ │ ├── GeometryTest.kt │ │ └── support/ │ │ ├── GeometryTestUtils.kt │ │ └── GeometryTestUtilsTest.kt │ ├── locks/ │ │ ├── BooleanChangeLockTest.kt │ │ ├── ChangeLockTest.kt │ │ └── ThreadSafeBooleanChangeLockTest.kt │ └── strings/ │ └── StringUtilsTest.kt ├── strings/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── odk/ │ │ │ └── collect/ │ │ │ └── strings/ │ │ │ ├── format/ │ │ │ │ └── LengthFormatter.kt │ │ │ └── localization/ │ │ │ ├── LocalizedActivity.kt │ │ │ └── LocalizedApplication.kt │ │ └── res/ │ │ ├── values/ │ │ │ ├── strings.xml │ │ │ └── untranslated.xml │ │ ├── values-af/ │ │ │ └── strings.xml │ │ ├── values-am/ │ │ │ └── strings.xml │ │ ├── values-ar/ │ │ │ └── strings.xml │ │ ├── values-bg/ │ │ │ └── strings.xml │ │ ├── values-bn/ │ │ │ └── strings.xml │ │ ├── values-ca/ │ │ │ └── strings.xml │ │ ├── values-cs/ │ │ │ └── strings.xml │ │ ├── values-da/ │ │ │ └── strings.xml │ │ ├── values-de/ │ │ │ └── strings.xml │ │ ├── values-es/ │ │ │ └── strings.xml │ │ ├── values-es-rSV/ │ │ │ └── strings.xml │ │ ├── values-et/ │ │ │ └── strings.xml │ │ ├── values-fa/ │ │ │ └── strings.xml │ │ ├── values-fa-rAF/ │ │ │ └── strings.xml │ │ ├── values-fi/ │ │ │ └── strings.xml │ │ ├── values-fr/ │ │ │ └── strings.xml │ │ ├── values-hi/ │ │ │ └── strings.xml │ │ ├── values-ht/ │ │ │ └── strings.xml │ │ ├── values-in/ │ │ │ └── strings.xml │ │ ├── values-it/ │ │ │ └── strings.xml │ │ ├── values-ja/ │ │ │ └── strings.xml │ │ ├── values-ka/ │ │ │ └── strings.xml │ │ ├── values-km/ │ │ │ └── strings.xml │ │ ├── values-ln/ │ │ │ └── strings.xml │ │ ├── values-lo-rLA/ │ │ │ └── strings.xml │ │ ├── values-lt/ │ │ │ └── strings.xml │ │ ├── values-mg/ │ │ │ └── strings.xml │ │ ├── values-ml/ │ │ │ └── strings.xml │ │ ├── values-mr/ │ │ │ └── strings.xml │ │ ├── values-ms/ │ │ │ └── strings.xml │ │ ├── values-my/ │ │ │ └── strings.xml │ │ ├── values-ne-rNP/ │ │ │ └── strings.xml │ │ ├── values-nl/ │ │ │ └── strings.xml │ │ ├── values-no/ │ │ │ └── strings.xml │ │ ├── values-pl/ │ │ │ └── strings.xml │ │ ├── values-ps/ │ │ │ └── strings.xml │ │ ├── values-pt/ │ │ │ └── strings.xml │ │ ├── values-ro/ │ │ │ └── strings.xml │ │ ├── values-ru/ │ │ │ └── strings.xml │ │ ├── values-rw/ │ │ │ └── strings.xml │ │ ├── values-si/ │ │ │ └── strings.xml │ │ ├── values-sl/ │ │ │ └── strings.xml │ │ ├── values-so/ │ │ │ └── strings.xml │ │ ├── values-sq/ │ │ │ └── strings.xml │ │ ├── values-sr/ │ │ │ └── strings.xml │ │ ├── values-sv-rSE/ │ │ │ └── strings.xml │ │ ├── values-sw/ │ │ │ └── strings.xml │ │ ├── values-sw-rKE/ │ │ │ └── strings.xml │ │ ├── values-te/ │ │ │ └── strings.xml │ │ ├── values-th-rTH/ │ │ │ └── strings.xml │ │ ├── values-ti/ │ │ │ └── strings.xml │ │ ├── values-tl/ │ │ │ └── strings.xml │ │ ├── values-tl-rPH/ │ │ │ └── strings.xml │ │ ├── values-tr/ │ │ │ └── strings.xml │ │ ├── values-uk/ │ │ │ └── strings.xml │ │ ├── values-ur/ │ │ │ └── strings.xml │ │ ├── values-ur-rPK/ │ │ │ └── strings.xml │ │ ├── values-vi/ │ │ │ └── strings.xml │ │ ├── values-zh/ │ │ │ └── strings.xml │ │ ├── values-zh-rTW/ │ │ │ └── strings.xml │ │ └── values-zu/ │ │ └── strings.xml │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── strings/ │ │ └── format/ │ │ ├── DateFormatsTest.kt │ │ └── LengthFormatterTest.kt │ └── resources/ │ └── robolectric.properties ├── test-forms/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── resources/ │ ├── forms/ │ │ ├── Empty First Repeat.xml │ │ ├── RepeatGroupAndGroup.xml │ │ ├── RepeatTitles_1648.xml │ │ ├── TestRepeat.xml │ │ ├── all-widgets.xml │ │ ├── audio-question.xml │ │ ├── basic.xml │ │ ├── different-search-appearances.xml │ │ ├── dynamic_and_static_choices.xml │ │ ├── dynamic_required_question.xml │ │ ├── emptyGroupFieldList.xml │ │ ├── encrypted-no-instanceID.xml │ │ ├── encrypted.xml │ │ ├── entity-update-pulldata.xml │ │ ├── external-audio-question.xml │ │ ├── external-csv-search-broken.xml │ │ ├── external-csv-search.xml │ │ ├── external_csv_form.xml │ │ ├── external_data_questions.xml │ │ ├── external_select.xml │ │ ├── external_select_10.xml │ │ ├── external_select_csv.xml │ │ ├── field-list-repeat.xml │ │ ├── fieldlist-updates.xml │ │ ├── fixed-count-repeat.xml │ │ ├── form1.xml │ │ ├── form2.xml │ │ ├── form3.xml │ │ ├── form4.xml │ │ ├── form5.xml │ │ ├── form6.xml │ │ ├── form7.xml │ │ ├── form8.xml │ │ ├── form9.xml │ │ ├── formHierarchy1.xml │ │ ├── formHierarchy2.xml │ │ ├── formHierarchy3.xml │ │ ├── form_design_error.xml │ │ ├── form_styling.xml │ │ ├── form_with_images.xml │ │ ├── g6Error.xml │ │ ├── hints_textq.xml │ │ ├── identify-user-audit-false.xml │ │ ├── identify-user-audit.xml │ │ ├── intent-group.xml │ │ ├── internal-audio-question.xml │ │ ├── invalid-form.xml │ │ ├── likert_test.xml │ │ ├── location-audit.xml │ │ ├── manyQ.xml │ │ ├── metadata.xml │ │ ├── nested-intent-group.xml │ │ ├── numberInCSV.xml │ │ ├── one-question-audit.xml │ │ ├── one-question-autoplay.xml │ │ ├── one-question-autosend-disabled.xml │ │ ├── one-question-autosend.xml │ │ ├── one-question-background-audio-audit.xml │ │ ├── one-question-background-audio-multiple.xml │ │ ├── one-question-background-audio.xml │ │ ├── one-question-editable.xml │ │ ├── one-question-encrypted-unicode.xml │ │ ├── one-question-entity-create-and-update.xml │ │ ├── one-question-entity-follow-up.xml │ │ ├── one-question-entity-registration-broken.xml │ │ ├── one-question-entity-registration-editable.xml │ │ ├── one-question-entity-registration-id.xml │ │ ├── one-question-entity-registration-v2020.1.xml │ │ ├── one-question-entity-registration-v2023.1.xml │ │ ├── one-question-entity-registration.xml │ │ ├── one-question-entity-update-and-create.xml │ │ ├── one-question-entity-update-editable.xml │ │ ├── one-question-entity-update.xml │ │ ├── one-question-last-saved-updated.xml │ │ ├── one-question-last-saved.xml │ │ ├── one-question-partial.xml │ │ ├── one-question-repeat.xml │ │ ├── one-question-translation.xml │ │ ├── one-question-updated.xml │ │ ├── one-question-uuid-instance-name.xml │ │ ├── one-question-with-constraint.xml │ │ ├── one-question.xml │ │ ├── pull_data.xml │ │ ├── random.xml │ │ ├── randomTest_broken.xml │ │ ├── ranking_widget.xml │ │ ├── repeat_group_form.xml │ │ ├── repeat_group_new.xml │ │ ├── repeat_group_wrapped_with_a_regular_group.xml │ │ ├── repeat_groups.xml │ │ ├── repeat_in_field_list.xml │ │ ├── repeat_without_label.xml │ │ ├── requiredQuestionInFieldList.xml │ │ ├── required_question_with_audio.xml │ │ ├── required_question_with_custom_error_message.xml │ │ ├── search_and_select.xml │ │ ├── selectOneExternal.xml │ │ ├── select_one_external.xml │ │ ├── setgeopoint-action.xml │ │ ├── simple-search-external-csv.xml │ │ ├── single-geopoint.xml │ │ ├── start-geopoint.xml │ │ ├── string_widgets_in_field_list.xml │ │ ├── track-changes-reason-on-edit.xml │ │ ├── two-question-audit-track-changes.xml │ │ ├── two-question-audit.xml │ │ ├── two-question-external.xml │ │ ├── two-question-required.xml │ │ ├── two-question-save-incomplete-required.xml │ │ ├── two-question-save-incomplete.xml │ │ ├── two-question-updated.xml │ │ ├── two-question.xml │ │ ├── two-questions-in-group.xml │ │ └── validate.xml │ └── media/ │ ├── external-csv-search-produce.csv │ ├── external_csv_cities.csv │ ├── external_csv_countries.csv │ ├── external_csv_neighbourhoods.csv │ ├── external_data.csv │ ├── external_data.xml │ ├── external_data_10.xml │ ├── external_data_broken.csv │ ├── fruits.csv │ ├── itemSets.csv │ ├── people.csv │ ├── selectOneExternal-media/ │ │ └── itemsets.csv │ ├── simple-search-external-csv-fruits.csv │ ├── test.m4a │ └── updated-people.csv ├── test-shared/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── testshared/ │ ├── ActivityControllerRule.kt │ ├── ActivityExt.kt │ ├── AssertIntentsHelper.kt │ ├── AssertionFramework.kt │ ├── ComposeAssertions.kt │ ├── ComposeInteractions.kt │ ├── DummyActivity.kt │ ├── ErrorIntentLauncher.kt │ ├── EspressoAssertions.kt │ ├── EspressoInteractions.kt │ ├── FakeAudioPlayer.kt │ ├── FakeBarcodeScannerView.kt │ ├── FakeBroadcastReceiverRegister.kt │ ├── FakeScheduler.kt │ ├── FragmentResultRecorder.kt │ ├── LocationTestUtils.kt │ ├── MockFragmentFactory.kt │ ├── MockWebPageService.kt │ ├── RecyclerViewMatcher.kt │ ├── RobolectricHelpers.kt │ ├── SliderExt.kt │ ├── TimeZoneSetter.kt │ ├── ViewActions.kt │ ├── ViewMatchers.kt │ └── WaitFor.kt ├── timedgrid/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── timedgrid/ │ │ ├── AssessmentType.kt │ │ ├── CommonTimedGridRenderer.kt │ │ ├── FinishType.kt │ │ ├── NavigationAwareWidget.kt │ │ ├── PausableCountDownTimer.kt │ │ ├── TimedGridRenderer.kt │ │ ├── TimedGridState.kt │ │ ├── TimedGridSummary.kt │ │ ├── TimedGridSummaryAnswerCreator.kt │ │ ├── TimedGridViewModel.kt │ │ ├── TimedGridWidgetConfiguration.kt │ │ ├── TimedGridWidgetDelegate.kt │ │ └── TimedGridWidgetLayout.kt │ └── res/ │ ├── color/ │ │ └── timed_grid_button_tint_selector.xml │ ├── drawable/ │ │ └── row_number_background.xml │ ├── layout/ │ │ ├── timed_grid.xml │ │ ├── timed_grid_item_button.xml │ │ └── timed_grid_item_row.xml │ └── values/ │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── upgrade/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── org/ │ │ └── odk/ │ │ └── collect/ │ │ └── upgrade/ │ │ ├── AppUpgrader.kt │ │ ├── LaunchState.kt │ │ └── Upgrade.kt │ └── test/ │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── upgrade/ │ ├── AppUpgraderTest.kt │ └── VersionCodeLaunchStateTest.kt └── web-page/ ├── .gitignore ├── build.gradle.kts └── src/ ├── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── org/ │ └── odk/ │ └── collect/ │ └── webpage/ │ ├── CustomTabsWebPageService.kt │ └── WebPageService.kt └── test/ └── java/ └── org/ └── odk/ └── collect/ └── webpage/ └── CustomTabsWebPageServiceTest.java