diff --git a/androidshared/src/main/java/org/odk/collect/androidshared/ui/ToastUtils.kt b/androidshared/src/main/java/org/odk/collect/androidshared/ui/ToastUtils.kt index 15e6461391e..b58e7b5f894 100644 --- a/androidshared/src/main/java/org/odk/collect/androidshared/ui/ToastUtils.kt +++ b/androidshared/src/main/java/org/odk/collect/androidshared/ui/ToastUtils.kt @@ -2,7 +2,6 @@ package org.odk.collect.androidshared.ui import android.app.Activity import android.app.Application -import android.content.Context import android.os.Build import android.view.Gravity import android.view.ViewGroup @@ -21,30 +20,31 @@ object ToastUtils { private var recordedToasts = mutableListOf() private lateinit var lastToast: Toast + private lateinit var application: Application @JvmStatic - fun showShortToast(context: Context, message: String) { - showToast(context.applicationContext as Application, message) + fun showShortToast(message: String) { + showToast(application, message) } @JvmStatic - fun showShortToast(context: Context, messageResource: Int) { + fun showShortToast(messageResource: Int) { showToast( - context.applicationContext as Application, - context.getLocalizedString(messageResource) + application, + application.getLocalizedString(messageResource) ) } @JvmStatic - fun showLongToast(context: Context, message: String) { - showToast(context.applicationContext as Application, message, Toast.LENGTH_LONG) + fun showLongToast(message: String) { + showToast(application, message, Toast.LENGTH_LONG) } @JvmStatic - fun showLongToast(context: Context, messageResource: Int) { + fun showLongToast(messageResource: Int) { showToast( - context.applicationContext as Application, - context.getLocalizedString(messageResource), + application, + application.getLocalizedString(messageResource), Toast.LENGTH_LONG ) } @@ -63,13 +63,18 @@ object ToastUtils { return copy } + @JvmStatic + fun setApplication(application: Application) { + this.application = application + } + private fun showToast( - context: Application, + application: Application, message: String, duration: Int = Toast.LENGTH_SHORT ) { hideLastToast() - lastToast = Toast.makeText(context, message, duration) + lastToast = Toast.makeText(application, message, duration) lastToast.show() if (recordToasts) { diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/FormDownloadListActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/FormDownloadListActivity.java index 655f4e069ec..bf682068119 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/FormDownloadListActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/FormDownloadListActivity.java @@ -273,7 +273,7 @@ public void onItemClick(AdapterView parent, View view, int position, long id) */ private void downloadFormList() { if (!connectivityProvider.isDeviceOnline()) { - ToastUtils.showShortToast(this, org.odk.collect.strings.R.string.no_connection); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.no_connection); if (viewModel.isDownloadOnlyMode()) { setReturnResult(false, getString(org.odk.collect.strings.R.string.no_connection), viewModel.getFormResults()); @@ -408,7 +408,7 @@ private void startFormsDownload(@NonNull ArrayList filesToDow downloadFormsTask.execute(filesToDownload); } else { - ToastUtils.showShortToast(this, org.odk.collect.strings.R.string.noselect_error); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.noselect_error); } } diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/FormFillingActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/FormFillingActivity.java index 6393fe83560..a20b2420248 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/FormFillingActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/FormFillingActivity.java @@ -865,7 +865,7 @@ protected void onActivityResult(int requestCode, int resultCode, final Intent in if (intent == null && requestCode != RequestCodes.DRAW_IMAGE && requestCode != RequestCodes.ANNOTATE_IMAGE && requestCode != RequestCodes.SIGNATURE_CAPTURE && requestCode != RequestCodes.IMAGE_CAPTURE) { Timber.d("The intent has a null value for requestCode: %s", requestCode); - showLongToast(this, getString(org.odk.collect.strings.R.string.null_intent_value)); + showLongToast(getString(org.odk.collect.strings.R.string.null_intent_value)); return; } @@ -978,7 +978,7 @@ public void setWidgetData(Object data) { waitingForDataRegistry.cancelWaitingForData(); } catch (Exception e) { Timber.e(e); - ToastUtils.showLongToast(this, currentViewIfODKView.getContext().getString(org.odk.collect.strings.R.string.error_attaching_binary_file, + ToastUtils.showLongToast(currentViewIfODKView.getContext().getString(org.odk.collect.strings.R.string.error_attaching_binary_file, e.getMessage())); } set = true; @@ -1552,7 +1552,7 @@ public boolean saveForm(boolean exit, boolean complete, String updatedSaveName, // save current answer if (current) { if (!formEntryViewModel.updateAnswersForScreen(getAnswers(), complete)) { - showShortToast(this, org.odk.collect.strings.R.string.data_saved_error); + showShortToast(org.odk.collect.strings.R.string.data_saved_error); return false; } } @@ -1584,7 +1584,7 @@ private void handleSaveResult(FormSaveViewModel.SaveResult result) { if (result.getRequest().viewExiting()) { finishAndReturnInstance(); } else { - showShortToast(this, org.odk.collect.strings.R.string.data_saved_ok); + showShortToast(org.odk.collect.strings.R.string.data_saved_ok); } formSessionRepository.update(sessionId, formSaveViewModel.getInstance()); @@ -1604,7 +1604,7 @@ private void handleSaveResult(FormSaveViewModel.SaveResult result) { message = getString(org.odk.collect.strings.R.string.data_saved_error); } - showLongToast(this, message); + showLongToast(message); formSaveViewModel.resumeFormEntry(); break; @@ -1612,7 +1612,7 @@ private void handleSaveResult(FormSaveViewModel.SaveResult result) { DialogFragmentUtils.dismissDialog(SaveFormProgressDialogFragment.class, getSupportFragmentManager()); DialogFragmentUtils.dismissDialog(ChangesReasonPromptDialogFragment.class, getSupportFragmentManager()); - showLongToast(this, String.format(getString(org.odk.collect.strings.R.string.encryption_error_message), + showLongToast(String.format(getString(org.odk.collect.strings.R.string.encryption_error_message), result.getMessage())); finishAndReturnInstance(); formSaveViewModel.resumeFormEntry(); @@ -1954,7 +1954,7 @@ public void loadingComplete(FormLoaderTask task, FormDef formDef, String warning boolean hasUsedSavepoint = task.hasUsedSavepoint(); if (hasUsedSavepoint) { - runOnUiThread(() -> showLongToast(this, org.odk.collect.strings.R.string.savepoint_used)); + runOnUiThread(() -> showLongToast(org.odk.collect.strings.R.string.savepoint_used)); } if (formController.getInstanceFile() == null) { @@ -1992,7 +1992,7 @@ && new PlayServicesChecker().isGooglePlayServicesAvailable(this)) { formEntryViewModel.refresh(); if (warningMsg != null) { - showLongToast(this, warningMsg); + showLongToast(warningMsg); Timber.w(warningMsg); } } @@ -2050,7 +2050,7 @@ && new PlayServicesChecker().isGooglePlayServicesAvailable(this)) { } } else { Timber.e(new Error("FormController is null")); - showLongToast(this, org.odk.collect.strings.R.string.loading_form_failed); + showLongToast(org.odk.collect.strings.R.string.loading_form_failed); exit(); } } @@ -2129,14 +2129,14 @@ public void advance() { @Override public void onSavePointError(String errorMessage) { if (errorMessage != null && errorMessage.trim().length() > 0) { - showLongToast(this, getString(org.odk.collect.strings.R.string.save_point_error, errorMessage)); + showLongToast(getString(org.odk.collect.strings.R.string.save_point_error, errorMessage)); } } @Override public void onSaveFormIndexError(String errorMessage) { if (errorMessage != null && errorMessage.trim().length() > 0) { - showLongToast(this, getString(org.odk.collect.strings.R.string.save_point_error, errorMessage)); + showLongToast(getString(org.odk.collect.strings.R.string.save_point_error, errorMessage)); } } diff --git a/collect_app/src/main/java/org/odk/collect/android/application/initialization/ApplicationInitializer.kt b/collect_app/src/main/java/org/odk/collect/android/application/initialization/ApplicationInitializer.kt index 7452af606cf..5324a8016e3 100644 --- a/collect_app/src/main/java/org/odk/collect/android/application/initialization/ApplicationInitializer.kt +++ b/collect_app/src/main/java/org/odk/collect/android/application/initialization/ApplicationInitializer.kt @@ -10,6 +10,7 @@ import org.odk.collect.android.application.Collect import org.odk.collect.android.application.initialization.upgrade.UpgradeInitializer import org.odk.collect.android.entities.EntitiesRepositoryProvider import org.odk.collect.android.projects.ProjectsDataService +import org.odk.collect.androidshared.ui.ToastUtils import org.odk.collect.metadata.PropertyManager import org.odk.collect.projects.ProjectsRepository import org.odk.collect.settings.SettingsProvider @@ -49,6 +50,7 @@ class ApplicationInitializer( } private fun initializeFrameworks() { + ToastUtils.setApplication(context) initializeLogging() AppInitializer.getInstance(context).initializeComponent(JodaTimeInitializer::class.java) AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) diff --git a/collect_app/src/main/java/org/odk/collect/android/configure/qr/QRCodeMenuProvider.kt b/collect_app/src/main/java/org/odk/collect/android/configure/qr/QRCodeMenuProvider.kt index b7c9b2d7b79..218413caa17 100644 --- a/collect_app/src/main/java/org/odk/collect/android/configure/qr/QRCodeMenuProvider.kt +++ b/collect_app/src/main/java/org/odk/collect/android/configure/qr/QRCodeMenuProvider.kt @@ -62,7 +62,6 @@ class QRCodeMenuProvider internal constructor( photoPickerIntent.type = "image/*" intentLauncher.launchForResult(activity, photoPickerIntent, SELECT_PHOTO) { showShortToast( - activity, activity.getString( org.odk.collect.strings.R.string.activity_not_found, activity.getString(org.odk.collect.strings.R.string.choose_image) diff --git a/collect_app/src/main/java/org/odk/collect/android/configure/qr/QRCodeScannerFragment.kt b/collect_app/src/main/java/org/odk/collect/android/configure/qr/QRCodeScannerFragment.kt index 1bb9baf6557..1b038fef0da 100644 --- a/collect_app/src/main/java/org/odk/collect/android/configure/qr/QRCodeScannerFragment.kt +++ b/collect_app/src/main/java/org/odk/collect/android/configure/qr/QRCodeScannerFragment.kt @@ -56,7 +56,6 @@ class QRCodeScannerFragment : BarCodeScannerFragment() { } showLongToast( - requireContext(), getString(org.odk.collect.strings.R.string.successfully_imported_settings) ) ActivityUtils.startActivityAndCloseAllOthers( @@ -66,14 +65,12 @@ class QRCodeScannerFragment : BarCodeScannerFragment() { } SettingsImportingResult.INVALID_SETTINGS -> showLongToast( - requireContext(), getString( org.odk.collect.strings.R.string.invalid_qrcode ) ) SettingsImportingResult.GD_PROJECT -> showLongToast( - requireContext(), getString(org.odk.collect.strings.R.string.settings_with_gd_protocol) ) } diff --git a/collect_app/src/main/java/org/odk/collect/android/formentry/ODKView.java b/collect_app/src/main/java/org/odk/collect/android/formentry/ODKView.java index 4f21dec5e79..2f4d07ffb02 100644 --- a/collect_app/src/main/java/org/odk/collect/android/formentry/ODKView.java +++ b/collect_app/src/main/java/org/odk/collect/android/formentry/ODKView.java @@ -471,11 +471,11 @@ private void addIntentLaunchButton(Context context, FormEntryPrompt[] questionPr } catch (ExternalParamsException e) { Timber.e(e, "ExternalParamsException"); - ToastUtils.showShortToast(getContext(), e.getMessage()); + ToastUtils.showShortToast(e.getMessage()); } catch (ActivityNotFoundException e) { Timber.d(e, "ActivityNotFoundExcept"); - ToastUtils.showShortToast(getContext(), errorString); + ToastUtils.showShortToast(errorString); } }); } diff --git a/collect_app/src/main/java/org/odk/collect/android/formlists/blankformlist/BlankFormListMenuProvider.kt b/collect_app/src/main/java/org/odk/collect/android/formlists/blankformlist/BlankFormListMenuProvider.kt index 502ff038e32..9b43d331bfc 100644 --- a/collect_app/src/main/java/org/odk/collect/android/formlists/blankformlist/BlankFormListMenuProvider.kt +++ b/collect_app/src/main/java/org/odk/collect/android/formlists/blankformlist/BlankFormListMenuProvider.kt @@ -89,11 +89,11 @@ class BlankFormListMenuProvider( if (networkStateProvider?.isDeviceOnline == true) { viewModel.syncWithServer().observe(activity) { success: Boolean -> if (success) { - ToastUtils.showShortToast(activity, org.odk.collect.strings.R.string.form_update_succeeded) + ToastUtils.showShortToast(org.odk.collect.strings.R.string.form_update_succeeded) } } } else { - ToastUtils.showShortToast(activity, org.odk.collect.strings.R.string.no_connection) + ToastUtils.showShortToast(org.odk.collect.strings.R.string.no_connection) } true } diff --git a/collect_app/src/main/java/org/odk/collect/android/formmanagement/CollectFormEntryControllerFactory.kt b/collect_app/src/main/java/org/odk/collect/android/formmanagement/CollectFormEntryControllerFactory.kt index 3ece257f3a6..3106fda0c79 100644 --- a/collect_app/src/main/java/org/odk/collect/android/formmanagement/CollectFormEntryControllerFactory.kt +++ b/collect_app/src/main/java/org/odk/collect/android/formmanagement/CollectFormEntryControllerFactory.kt @@ -1,18 +1,28 @@ package org.odk.collect.android.formmanagement +import android.os.Handler +import android.os.Looper import org.javarosa.core.model.FormDef +import org.javarosa.core.model.condition.EvaluationContext +import org.javarosa.core.model.condition.FilterStrategy +import org.javarosa.core.model.instance.DataInstance +import org.javarosa.core.model.instance.TreeReference import org.javarosa.form.api.FormEntryController import org.javarosa.form.api.FormEntryModel +import org.javarosa.xpath.expr.XPathExpression import org.odk.collect.android.application.Collect import org.odk.collect.android.dynamicpreload.ExternalDataManagerImpl import org.odk.collect.android.dynamicpreload.handler.ExternalDataHandlerPull import org.odk.collect.android.tasks.FormLoaderTask.FormEntryControllerFactory +import org.odk.collect.androidshared.ui.ToastUtils import org.odk.collect.entities.javarosa.filter.LocalEntitiesFilterStrategy import org.odk.collect.entities.javarosa.filter.PullDataFunctionHandler import org.odk.collect.entities.javarosa.finalization.EntityFormFinalizationProcessor import org.odk.collect.entities.storage.EntitiesRepository +import org.odk.collect.settings.keys.ProjectKeys import org.odk.collect.shared.settings.Settings import java.io.File +import java.util.function.Supplier class CollectFormEntryControllerFactory( private val entitiesRepository: EntitiesRepository, @@ -26,9 +36,40 @@ class CollectFormEntryControllerFactory( return FormEntryController(FormEntryModel(formDef)).also { val externalDataHandlerPull = ExternalDataHandlerPull(externalDataManager) - it.addFunctionHandler(PullDataFunctionHandler(entitiesRepository, externalDataHandlerPull)) + it.addFunctionHandler( + PullDataFunctionHandler( + entitiesRepository, + externalDataHandlerPull + ) + ) it.addPostProcessor(EntityFormFinalizationProcessor()) + + if (settings.getBoolean(ProjectKeys.KEY_DEBUG_FILTERS)) { + it.addFilterStrategy(LoggingFilterStrategy()) + } + it.addFilterStrategy(LocalEntitiesFilterStrategy(entitiesRepository)) } } } + +private class LoggingFilterStrategy : FilterStrategy { + override fun filter( + sourceInstance: DataInstance<*>, + nodeSet: TreeReference, + predicate: XPathExpression, + children: MutableList, + evaluationContext: EvaluationContext, + next: Supplier> + ): MutableList { + val startTime = System.currentTimeMillis() + val result = next.get() + + val filterTime = System.currentTimeMillis() - startTime + Handler(Looper.getMainLooper()).post { + ToastUtils.showShortToast("Filter took ${filterTime / 1000.0}s") + } + + return result + } +} diff --git a/collect_app/src/main/java/org/odk/collect/android/fragments/BarCodeScannerFragment.java b/collect_app/src/main/java/org/odk/collect/android/fragments/BarCodeScannerFragment.java index dda1be456d5..05a3fdf3c4d 100644 --- a/collect_app/src/main/java/org/odk/collect/android/fragments/BarCodeScannerFragment.java +++ b/collect_app/src/main/java/org/odk/collect/android/fragments/BarCodeScannerFragment.java @@ -99,7 +99,7 @@ private void startScanning(Bundle savedInstanceState) { try { handleScanningResult(barcodeResult); } catch (IOException | DataFormatException | IllegalArgumentException e) { - ToastUtils.showShortToast(requireContext(), getString(org.odk.collect.strings.R.string.invalid_qrcode)); + ToastUtils.showShortToast(getString(org.odk.collect.strings.R.string.invalid_qrcode)); } }); } diff --git a/collect_app/src/main/java/org/odk/collect/android/instancemanagement/send/InstanceUploaderListActivity.java b/collect_app/src/main/java/org/odk/collect/android/instancemanagement/send/InstanceUploaderListActivity.java index 648c4950955..d994bbcebff 100644 --- a/collect_app/src/main/java/org/odk/collect/android/instancemanagement/send/InstanceUploaderListActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/instancemanagement/send/InstanceUploaderListActivity.java @@ -170,12 +170,12 @@ public void onCreate(Bundle savedInstanceState) { public void onUploadButtonsClicked() { if (!connectivityProvider.isDeviceOnline()) { - ToastUtils.showShortToast(this, org.odk.collect.strings.R.string.no_connection); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.no_connection); return; } if (autoSendOngoing) { - ToastUtils.showShortToast(this, org.odk.collect.strings.R.string.send_in_progress); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.send_in_progress); return; } @@ -187,7 +187,7 @@ public void onUploadButtonsClicked() { multiSelectViewModel.unselectAll(); } else { // no items selected - ToastUtils.showLongToast(this, org.odk.collect.strings.R.string.noselect_error); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.noselect_error); } } @@ -376,7 +376,7 @@ public void onItemClick(AdapterView parent, View view, int position, long row Cursor c = (Cursor) listView.getAdapter().getItem(position); boolean encryptedForm = !Boolean.parseBoolean(c.getString(c.getColumnIndex(DatabaseInstanceColumns.CAN_EDIT_WHEN_COMPLETE))); if (encryptedForm) { - ToastUtils.showLongToast(this, org.odk.collect.strings.R.string.encrypted_form); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.encrypted_form); } else { long instanceId = c.getLong(c.getColumnIndex(DatabaseInstanceColumns._ID)); Intent intent = FormFillingIntentFactory.editInstanceIntent(this, projectsDataService.requireCurrentProject().getUuid(), instanceId); diff --git a/collect_app/src/main/java/org/odk/collect/android/preferences/Defaults.kt b/collect_app/src/main/java/org/odk/collect/android/preferences/Defaults.kt index 8c396a0f6fe..714876a8392 100644 --- a/collect_app/src/main/java/org/odk/collect/android/preferences/Defaults.kt +++ b/collect_app/src/main/java/org/odk/collect/android/preferences/Defaults.kt @@ -50,6 +50,8 @@ object Defaults { hashMap[ProjectKeys.KEY_USGS_MAP_STYLE] = "topographic" hashMap[ProjectKeys.KEY_GOOGLE_MAP_STYLE] = GoogleMap.MAP_TYPE_NORMAL.toString() hashMap[ProjectKeys.KEY_MAPBOX_MAP_STYLE] = "mapbox://styles/mapbox/streets-v11" + // experimental_preferences.xml + hashMap[ProjectKeys.KEY_DEBUG_FILTERS] = false return hashMap } diff --git a/collect_app/src/main/java/org/odk/collect/android/preferences/dialogs/AdminPasswordDialogFragment.kt b/collect_app/src/main/java/org/odk/collect/android/preferences/dialogs/AdminPasswordDialogFragment.kt index 1ce3cb2efdd..ce3d2429af5 100644 --- a/collect_app/src/main/java/org/odk/collect/android/preferences/dialogs/AdminPasswordDialogFragment.kt +++ b/collect_app/src/main/java/org/odk/collect/android/preferences/dialogs/AdminPasswordDialogFragment.kt @@ -10,7 +10,6 @@ import android.widget.CompoundButton import androidx.fragment.app.DialogFragment import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.odk.collect.android.R import org.odk.collect.android.databinding.AdminPasswordDialogLayoutBinding import org.odk.collect.android.injection.DaggerUtils import org.odk.collect.android.preferences.ProjectPreferencesViewModel @@ -62,7 +61,6 @@ class AdminPasswordDialogFragment : DialogFragment() { projectPreferencesViewModel.setStateUnlocked() } else { ToastUtils.showShortToast( - requireContext(), org.odk.collect.strings.R.string.admin_password_incorrect ) } diff --git a/collect_app/src/main/java/org/odk/collect/android/preferences/dialogs/ChangeAdminPasswordDialog.kt b/collect_app/src/main/java/org/odk/collect/android/preferences/dialogs/ChangeAdminPasswordDialog.kt index 361122bcc87..54e164f2428 100644 --- a/collect_app/src/main/java/org/odk/collect/android/preferences/dialogs/ChangeAdminPasswordDialog.kt +++ b/collect_app/src/main/java/org/odk/collect/android/preferences/dialogs/ChangeAdminPasswordDialog.kt @@ -10,7 +10,6 @@ import android.widget.CompoundButton import androidx.fragment.app.DialogFragment import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.odk.collect.android.R import org.odk.collect.android.databinding.PasswordDialogLayoutBinding import org.odk.collect.android.injection.DaggerUtils import org.odk.collect.android.preferences.ProjectPreferencesViewModel @@ -66,13 +65,11 @@ class ChangeAdminPasswordDialog : DialogFragment() { if (password.isEmpty()) { projectPreferencesViewModel.setStateNotProtected() ToastUtils.showShortToast( - requireContext(), org.odk.collect.strings.R.string.admin_password_disabled ) } else { projectPreferencesViewModel.setStateUnlocked() ToastUtils.showShortToast( - requireContext(), org.odk.collect.strings.R.string.admin_password_changed ) } diff --git a/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ExperimentalPreferencesFragment.java b/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ExperimentalPreferencesFragment.java index f440c90cabc..ed38db3a938 100644 --- a/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ExperimentalPreferencesFragment.java +++ b/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ExperimentalPreferencesFragment.java @@ -36,7 +36,7 @@ public void onViewCreated(@NotNull View view, @Nullable Bundle savedInstanceStat super.onViewCreated(view, savedInstanceState); if (getPreferenceScreen().getPreferenceCount() == 0) { - ToastUtils.showLongToast(requireContext(), "No experimental settings at the moment!"); + ToastUtils.showLongToast("No experimental settings at the moment!"); getParentFragmentManager().popBackStack(); } } diff --git a/collect_app/src/main/java/org/odk/collect/android/preferences/screens/FormMetadataPreferencesFragment.java b/collect_app/src/main/java/org/odk/collect/android/preferences/screens/FormMetadataPreferencesFragment.java index f819003641d..3785259516e 100644 --- a/collect_app/src/main/java/org/odk/collect/android/preferences/screens/FormMetadataPreferencesFragment.java +++ b/collect_app/src/main/java/org/odk/collect/android/preferences/screens/FormMetadataPreferencesFragment.java @@ -59,7 +59,7 @@ private void setupPrefs() { emailPreference.setOnPreferenceChangeListener((preference, newValue) -> { String newValueString = newValue.toString(); if (!newValueString.isEmpty() && !Validator.isEmailAddressValid(newValueString)) { - ToastUtils.showLongToast(requireContext(), org.odk.collect.strings.R.string.invalid_email_address); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.invalid_email_address); return false; } diff --git a/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ProjectManagementPreferencesFragment.kt b/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ProjectManagementPreferencesFragment.kt index a1456e08a2a..a2291ce18ce 100644 --- a/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ProjectManagementPreferencesFragment.kt +++ b/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ProjectManagementPreferencesFragment.kt @@ -104,7 +104,6 @@ class ProjectManagementPreferencesFragment : MainMenuActivity::class.java ) ToastUtils.showLongToast( - requireContext(), getString( org.odk.collect.strings.R.string.switched_project, newCurrentProject.name diff --git a/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ServerPreferencesFragment.java b/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ServerPreferencesFragment.java index 33b7a4f0d63..af8b6b8e3cf 100644 --- a/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ServerPreferencesFragment.java +++ b/collect_app/src/main/java/org/odk/collect/android/preferences/screens/ServerPreferencesFragment.java @@ -89,7 +89,7 @@ private Preference.OnPreferenceChangeListener createChangeListener() { if (Validator.isUrlValid(url)) { preference.setSummary(newValue.toString()); } else { - ToastUtils.showShortToast(requireContext(), org.odk.collect.strings.R.string.url_error); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.url_error); return false; } break; @@ -99,7 +99,7 @@ private Preference.OnPreferenceChangeListener createChangeListener() { // do not allow leading and trailing whitespace if (!username.equals(username.trim())) { - ToastUtils.showShortToast(requireContext(), org.odk.collect.strings.R.string.username_error_whitespace); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.username_error_whitespace); return false; } @@ -111,7 +111,7 @@ private Preference.OnPreferenceChangeListener createChangeListener() { // do not allow leading and trailing whitespace if (!pw.equals(pw.trim())) { - ToastUtils.showShortToast(requireContext(), org.odk.collect.strings.R.string.password_error_whitespace); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.password_error_whitespace); return false; } diff --git a/collect_app/src/main/java/org/odk/collect/android/projects/ManualProjectCreatorDialog.kt b/collect_app/src/main/java/org/odk/collect/android/projects/ManualProjectCreatorDialog.kt index 1d0a695ea94..89053e359bd 100644 --- a/collect_app/src/main/java/org/odk/collect/android/projects/ManualProjectCreatorDialog.kt +++ b/collect_app/src/main/java/org/odk/collect/android/projects/ManualProjectCreatorDialog.kt @@ -104,7 +104,7 @@ class ManualProjectCreatorDialog : private fun handleAddingNewProject() { if (!Validator.isUrlValid(binding.urlInputText.text?.trim().toString())) { - ToastUtils.showShortToast(requireContext(), org.odk.collect.strings.R.string.url_error) + ToastUtils.showShortToast(org.odk.collect.strings.R.string.url_error) } else { val settingsJson = appConfigurationGenerator.getAppConfigurationAsJsonWithServerDetails( binding.urlInputText.text?.trim().toString(), @@ -132,7 +132,6 @@ class ManualProjectCreatorDialog : projectCreator.createNewProject(settingsJson) ActivityUtils.startActivityAndCloseAllOthers(activity, MainMenuActivity::class.java) ToastUtils.showLongToast( - requireContext(), getString(org.odk.collect.strings.R.string.switched_project, projectsDataService.requireCurrentProject().name) ) } @@ -141,7 +140,6 @@ class ManualProjectCreatorDialog : projectsDataService.setCurrentProject(uuid) ActivityUtils.startActivityAndCloseAllOthers(activity, MainMenuActivity::class.java) ToastUtils.showLongToast( - requireContext(), getString( org.odk.collect.strings.R.string.switched_project, projectsDataService.requireCurrentProject().name diff --git a/collect_app/src/main/java/org/odk/collect/android/projects/ProjectSettingsDialog.kt b/collect_app/src/main/java/org/odk/collect/android/projects/ProjectSettingsDialog.kt index 426ddc9b81f..42ae18d36eb 100644 --- a/collect_app/src/main/java/org/odk/collect/android/projects/ProjectSettingsDialog.kt +++ b/collect_app/src/main/java/org/odk/collect/android/projects/ProjectSettingsDialog.kt @@ -118,7 +118,6 @@ class ProjectSettingsDialog(private val viewModelFactory: ViewModelProvider.Fact MainMenuActivity::class.java ) ToastUtils.showLongToast( - requireContext(), getString(org.odk.collect.strings.R.string.switched_project, project.name) ) dismiss() diff --git a/collect_app/src/main/java/org/odk/collect/android/projects/QrCodeProjectCreatorDialog.kt b/collect_app/src/main/java/org/odk/collect/android/projects/QrCodeProjectCreatorDialog.kt index 835a6230233..af039ab3eb3 100644 --- a/collect_app/src/main/java/org/odk/collect/android/projects/QrCodeProjectCreatorDialog.kt +++ b/collect_app/src/main/java/org/odk/collect/android/projects/QrCodeProjectCreatorDialog.kt @@ -100,13 +100,11 @@ class QrCodeProjectCreatorDialog : qrCodeDecoder.decode(it) } catch (e: QRCodeDecoder.QRCodeInvalidException) { showShortToast( - requireContext(), org.odk.collect.strings.R.string.invalid_qrcode ) "" } catch (e: QRCodeDecoder.QRCodeNotFoundException) { showShortToast( - requireContext(), org.odk.collect.strings.R.string.qr_code_not_found ) "" @@ -188,7 +186,6 @@ class QrCodeProjectCreatorDialog : photoPickerIntent ) { showShortToast( - requireContext(), getString( org.odk.collect.strings.R.string.activity_not_found, getString(org.odk.collect.strings.R.string.choose_image) @@ -261,7 +258,6 @@ class QrCodeProjectCreatorDialog : CompressionUtils.decompress(barcodeResult.text) } catch (e: Exception) { showShortToast( - requireContext(), getString(org.odk.collect.strings.R.string.invalid_qrcode) ) "" @@ -295,7 +291,6 @@ class QrCodeProjectCreatorDialog : ActivityUtils.startActivityAndCloseAllOthers(activity, MainMenuActivity::class.java) ToastUtils.showLongToast( - requireContext(), getString( org.odk.collect.strings.R.string.switched_project, projectsDataService.requireCurrentProject().name @@ -304,14 +299,12 @@ class QrCodeProjectCreatorDialog : } SettingsImportingResult.INVALID_SETTINGS -> ToastUtils.showLongToast( - requireContext(), getString( org.odk.collect.strings.R.string.invalid_qrcode ) ) SettingsImportingResult.GD_PROJECT -> ToastUtils.showLongToast( - requireContext(), getString( org.odk.collect.strings.R.string.settings_with_gd_protocol ) @@ -323,7 +316,6 @@ class QrCodeProjectCreatorDialog : projectsDataService.setCurrentProject(uuid) ActivityUtils.startActivityAndCloseAllOthers(activity, MainMenuActivity::class.java) ToastUtils.showLongToast( - requireContext(), getString( org.odk.collect.strings.R.string.switched_project, projectsDataService.requireCurrentProject().name diff --git a/collect_app/src/main/java/org/odk/collect/android/utilities/MediaUtils.kt b/collect_app/src/main/java/org/odk/collect/android/utilities/MediaUtils.kt index cc45934bec1..bd8377ea335 100644 --- a/collect_app/src/main/java/org/odk/collect/android/utilities/MediaUtils.kt +++ b/collect_app/src/main/java/org/odk/collect/android/utilities/MediaUtils.kt @@ -17,7 +17,6 @@ import android.app.Activity import android.content.Context import android.content.Intent import org.odk.collect.android.BuildConfig -import org.odk.collect.android.R import org.odk.collect.androidshared.system.IntentLauncher import org.odk.collect.androidshared.ui.ToastUtils import timber.log.Timber @@ -44,7 +43,7 @@ class MediaUtils(private val intentLauncher: IntentLauncher, private val content if (!file.exists()) { val errorMsg: String = context.getString(org.odk.collect.strings.R.string.file_missing, file) Timber.d("File %s is missing", file) - ToastUtils.showLongToast(context, errorMsg) + ToastUtils.showLongToast(errorMsg) return } @@ -55,7 +54,7 @@ class MediaUtils(private val intentLauncher: IntentLauncher, private val content ) if (contentUri == null) { - ToastUtils.showLongToast(context, "Can't open file. If you are on a Huawei device, this is expected and will not be fixed.") + ToastUtils.showLongToast("Can't open file. If you are on a Huawei device, this is expected and will not be fixed.") return } @@ -70,7 +69,7 @@ class MediaUtils(private val intentLauncher: IntentLauncher, private val content org.odk.collect.strings.R.string.activity_not_found, context.getString(org.odk.collect.strings.R.string.open_file) ) - ToastUtils.showLongToast(context, message) + ToastUtils.showLongToast(message) Timber.w(message) } } diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/AnnotateWidget.java b/collect_app/src/main/java/org/odk/collect/android/widgets/AnnotateWidget.java index c2752e05db8..9f329d99fc4 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/AnnotateWidget.java +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/AnnotateWidget.java @@ -136,7 +136,7 @@ public void setData(Object newImageObj) { if (newImageObj instanceof File) { String mimeType = FileUtils.getMimeType((File) newImageObj); if ("image/gif".equals(mimeType)) { - ToastUtils.showLongToast(getContext(), org.odk.collect.strings.R.string.gif_not_supported); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.gif_not_supported); } else { super.setData(newImageObj); binding.annotateButton.setEnabled(binaryName != null); diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/BarcodeWidget.java b/collect_app/src/main/java/org/odk/collect/android/widgets/BarcodeWidget.java index 45ea10e9779..da0f793d85f 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/BarcodeWidget.java +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/BarcodeWidget.java @@ -147,7 +147,7 @@ private void setCameraIdIfNeeded(FormEntryPrompt prompt, IntentIntegrator intent if (cameraUtils.isFrontCameraAvailable(getContext())) { intent.addExtra(FRONT, true); } else { - ToastUtils.showLongToast(getContext(), org.odk.collect.strings.R.string.error_front_camera_unavailable); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.error_front_camera_unavailable); } } } diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/BearingWidget.java b/collect_app/src/main/java/org/odk/collect/android/widgets/BearingWidget.java index 54e188faa26..7f0404a6ea5 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/BearingWidget.java +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/BearingWidget.java @@ -121,7 +121,7 @@ private void onButtonClick() { waitingForDataRegistry.waitForData(getFormEntryPrompt().getIndex()); } else { - ToastUtils.showLongToast(getContext(), org.odk.collect.strings.R.string.bearing_lack_of_sensors); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.bearing_lack_of_sensors); binding.bearingButton.setEnabled(false); binding.widgetAnswerText.updateState(false); diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/ExAudioWidget.java b/collect_app/src/main/java/org/odk/collect/android/widgets/ExAudioWidget.java index 52b1645b3a0..b643f25eb8f 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/ExAudioWidget.java +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/ExAudioWidget.java @@ -102,7 +102,7 @@ public void setData(Object object) { } } else if (object != null) { if (object instanceof File) { - ToastUtils.showLongToast(getContext(), org.odk.collect.strings.R.string.invalid_file_type); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.invalid_file_type); mediaUtils.deleteMediaFile(((File) object).getAbsolutePath()); Timber.e(new Error("ExAudioWidget's setBinaryData must receive a audio file but received: " + FileUtils.getMimeType((File) object))); } else { diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/ExImageWidget.java b/collect_app/src/main/java/org/odk/collect/android/widgets/ExImageWidget.java index b5b76b78bdb..e07902010e2 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/ExImageWidget.java +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/ExImageWidget.java @@ -98,7 +98,7 @@ public void setData(Object object) { } } else if (object != null) { if (object instanceof File) { - ToastUtils.showLongToast(getContext(), org.odk.collect.strings.R.string.invalid_file_type); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.invalid_file_type); mediaUtils.deleteMediaFile(((File) object).getAbsolutePath()); Timber.e(new Error("ExImageWidget's setBinaryData must receive an image file but received: " + FileUtils.getMimeType((File) object))); } else { diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/ExVideoWidget.java b/collect_app/src/main/java/org/odk/collect/android/widgets/ExVideoWidget.java index b3ae7654556..da9f4036c9c 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/ExVideoWidget.java +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/ExVideoWidget.java @@ -93,7 +93,7 @@ public void setData(Object object) { } } else if (object != null) { if (object instanceof File) { - ToastUtils.showLongToast(getContext(), org.odk.collect.strings.R.string.invalid_file_type); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.invalid_file_type); mediaUtils.deleteMediaFile(((File) object).getAbsolutePath()); Timber.e(new Error("ExVideoWidget's setBinaryData must receive a video file but received: " + FileUtils.getMimeType((File) object))); } else { diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/UrlWidget.java b/collect_app/src/main/java/org/odk/collect/android/widgets/UrlWidget.java index d6e8579f928..c867f01924e 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/UrlWidget.java +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/UrlWidget.java @@ -51,7 +51,7 @@ protected View onCreateAnswerView(Context context, FormEntryPrompt prompt, int a @Override public void clearAnswer() { - ToastUtils.showShortToast(getContext(), "URL is readonly"); + ToastUtils.showShortToast("URL is readonly"); } @Override @@ -85,7 +85,7 @@ public void onButtonClick() { externalWebPageHelper.bindCustomTabsService(getContext(), null); externalWebPageHelper.openWebPageInCustomTab((Activity) getContext(), Uri.parse(getFormEntryPrompt().getAnswerText())); } else { - ToastUtils.showShortToast(getContext(), "No URL set"); + ToastUtils.showShortToast("No URL set"); } } } diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/utilities/FileRequester.kt b/collect_app/src/main/java/org/odk/collect/android/widgets/utilities/FileRequester.kt index 632b6213610..bc1fee184fc 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/utilities/FileRequester.kt +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/utilities/FileRequester.kt @@ -2,7 +2,6 @@ package org.odk.collect.android.widgets.utilities import android.app.Activity import org.javarosa.form.api.FormEntryPrompt -import org.odk.collect.android.R import org.odk.collect.android.javarosawrapper.FormController import org.odk.collect.android.utilities.ExternalAppIntentProvider import org.odk.collect.androidshared.system.IntentLauncher @@ -40,13 +39,13 @@ class FileRequesterImpl( intentWithoutDefaultCategory, requestCode ) { - showLongToast(activity, getErrorMessage(formEntryPrompt, activity)) + showLongToast(getErrorMessage(formEntryPrompt, activity)) } } } catch (e: Exception) { - showLongToast(activity, e.message!!) + showLongToast(e.message!!) } catch (e: Error) { - showLongToast(activity, e.message!!) + showLongToast(e.message!!) } } diff --git a/collect_app/src/main/java/org/odk/collect/android/widgets/utilities/RangeWidgetUtils.java b/collect_app/src/main/java/org/odk/collect/android/widgets/utilities/RangeWidgetUtils.java index 896ed83fcdc..0c879a4b842 100644 --- a/collect_app/src/main/java/org/odk/collect/android/widgets/utilities/RangeWidgetUtils.java +++ b/collect_app/src/main/java/org/odk/collect/android/widgets/utilities/RangeWidgetUtils.java @@ -221,7 +221,7 @@ static boolean isWidgetValid(Context context, RangeQuestion rangeQuestion) { boolean result = true; if (rangeStep.compareTo(BigDecimal.ZERO) == 0 || rangeEnd.subtract(rangeStart).remainder(rangeStep).compareTo(BigDecimal.ZERO) != 0) { - ToastUtils.showLongToast(context, org.odk.collect.strings.R.string.invalid_range_widget); + ToastUtils.showLongToast(org.odk.collect.strings.R.string.invalid_range_widget); result = false; } return result; diff --git a/collect_app/src/main/res/xml/dev_tools_preferences.xml b/collect_app/src/main/res/xml/dev_tools_preferences.xml index c700a4101ce..6592b08abb5 100644 --- a/collect_app/src/main/res/xml/dev_tools_preferences.xml +++ b/collect_app/src/main/res/xml/dev_tools_preferences.xml @@ -9,4 +9,10 @@ android:key="crash_app" app:persistent="false"/> + + diff --git a/geo/src/main/java/org/odk/collect/geo/GeoActivityUtils.kt b/geo/src/main/java/org/odk/collect/geo/GeoActivityUtils.kt index d6bafd8f3c8..1a21403efdb 100644 --- a/geo/src/main/java/org/odk/collect/geo/GeoActivityUtils.kt +++ b/geo/src/main/java/org/odk/collect/geo/GeoActivityUtils.kt @@ -15,7 +15,7 @@ internal object GeoActivityUtils { ) if (!permissionGranted) { - ToastUtils.showLongToast(activity, org.odk.collect.strings.R.string.not_granted_permission) + ToastUtils.showLongToast(org.odk.collect.strings.R.string.not_granted_permission) activity.finish() } } diff --git a/geo/src/main/java/org/odk/collect/geo/geopoint/GeoPointMapActivity.java b/geo/src/main/java/org/odk/collect/geo/geopoint/GeoPointMapActivity.java index 173f30db7aa..136ec2345fe 100644 --- a/geo/src/main/java/org/odk/collect/geo/geopoint/GeoPointMapActivity.java +++ b/geo/src/main/java/org/odk/collect/geo/geopoint/GeoPointMapActivity.java @@ -154,7 +154,7 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.geopoint_layout); } catch (NoClassDefFoundError e) { Timber.e(e, "Google maps not accessible due to: %s ", e.getMessage()); - ToastUtils.showShortToast(this, org.odk.collect.strings.R.string.google_play_services_error_occured); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.google_play_services_error_occured); finish(); return; } diff --git a/geo/src/main/java/org/odk/collect/geo/selection/SelectionMapFragment.kt b/geo/src/main/java/org/odk/collect/geo/selection/SelectionMapFragment.kt index ee547a765ec..f6c079455a3 100644 --- a/geo/src/main/java/org/odk/collect/geo/selection/SelectionMapFragment.kt +++ b/geo/src/main/java/org/odk/collect/geo/selection/SelectionMapFragment.kt @@ -117,7 +117,7 @@ class SelectionMapFragment( Manifest.permission.ACCESS_COARSE_LOCATION ) ) { - ToastUtils.showLongToast(requireContext(), org.odk.collect.strings.R.string.not_granted_permission) + ToastUtils.showLongToast(org.odk.collect.strings.R.string.not_granted_permission) requireActivity().finish() } diff --git a/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapConfigurator.java b/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapConfigurator.java index 882a0967295..6893db939e0 100644 --- a/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapConfigurator.java +++ b/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapConfigurator.java @@ -64,7 +64,7 @@ private static boolean isGoogleMapsSdkAvailable(Context context) { @Override public void showUnavailableMessage(Context context) { if (!isGoogleMapsSdkAvailable(context)) { - ToastUtils.showLongToast(context, context.getString( + ToastUtils.showLongToast(context.getString( org.odk.collect.strings.R.string.basemap_source_unavailable, context.getString(sourceLabelId))); } diff --git a/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapFragment.java b/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapFragment.java index 8b0ae5d196c..35a9de6df45 100644 --- a/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapFragment.java +++ b/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapFragment.java @@ -152,7 +152,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync((GoogleMap googleMap) -> { if (googleMap == null) { - ToastUtils.showShortToast(requireContext(), org.odk.collect.strings.R.string.google_play_services_error_occured); + ToastUtils.showShortToast(org.odk.collect.strings.R.string.google_play_services_error_occured); if (errorListener != null) { errorListener.onError(); } diff --git a/mapbox/src/main/java/org/odk/collect/mapbox/MapboxMapConfigurator.java b/mapbox/src/main/java/org/odk/collect/mapbox/MapboxMapConfigurator.java index aa757526ee0..1c02a1a33ad 100644 --- a/mapbox/src/main/java/org/odk/collect/mapbox/MapboxMapConfigurator.java +++ b/mapbox/src/main/java/org/odk/collect/mapbox/MapboxMapConfigurator.java @@ -51,8 +51,7 @@ public MapboxMapConfigurator() { } @Override public void showUnavailableMessage(Context context) { - ToastUtils.showLongToast(context, context.getString( - org.odk.collect.strings.R.string.basemap_source_unavailable, context.getString(sourceLabelId))); + ToastUtils.showLongToast(context.getString(org.odk.collect.strings.R.string.basemap_source_unavailable, context.getString(sourceLabelId))); } @Override public List createPrefs(Context context, Settings settings) { diff --git a/selfie-camera/src/main/java/org/odk/collect/selfiecamera/CaptureSelfieActivity.kt b/selfie-camera/src/main/java/org/odk/collect/selfiecamera/CaptureSelfieActivity.kt index eaabfb72108..da61d7b196e 100644 --- a/selfie-camera/src/main/java/org/odk/collect/selfiecamera/CaptureSelfieActivity.kt +++ b/selfie-camera/src/main/java/org/odk/collect/selfiecamera/CaptureSelfieActivity.kt @@ -58,7 +58,7 @@ class CaptureSelfieActivity : LocalizedActivity() { Camera.State.UNINITIALIZED -> {} Camera.State.INITIALIZED -> setupCamera(camera) Camera.State.FAILED_TO_INITIALIZE -> { - showLongToast(this, org.odk.collect.strings.R.string.camera_failed_to_initialize) + showLongToast(org.odk.collect.strings.R.string.camera_failed_to_initialize) } } } @@ -72,11 +72,11 @@ class CaptureSelfieActivity : LocalizedActivity() { camera.takePicture( imagePath, { ExternalAppUtils.returnSingleValue(this, imagePath) }, - { showLongToast(this, org.odk.collect.strings.R.string.camera_error) } + { showLongToast(org.odk.collect.strings.R.string.camera_error) } ) } - showLongToast(this, org.odk.collect.strings.R.string.take_picture_instruction) + showLongToast(org.odk.collect.strings.R.string.take_picture_instruction) } private fun permissionsGranted(): Boolean { diff --git a/selfie-camera/src/test/java/org/odk/collect/selfiecamera/CaptureSelfieActivityTest.kt b/selfie-camera/src/test/java/org/odk/collect/selfiecamera/CaptureSelfieActivityTest.kt index d8357374426..fcd478a6920 100644 --- a/selfie-camera/src/test/java/org/odk/collect/selfiecamera/CaptureSelfieActivityTest.kt +++ b/selfie-camera/src/test/java/org/odk/collect/selfiecamera/CaptureSelfieActivityTest.kt @@ -19,11 +19,11 @@ import org.junit.Test import org.junit.runner.RunWith import org.odk.collect.androidshared.livedata.MutableNonNullLiveData import org.odk.collect.androidshared.livedata.NonNullLiveData +import org.odk.collect.androidshared.ui.ToastUtils import org.odk.collect.androidtest.ActivityScenarioLauncherRule import org.odk.collect.externalapp.ExternalAppUtils import org.odk.collect.permissions.PermissionsChecker import org.odk.collect.selfiecamera.support.RobolectricApplication -import org.robolectric.shadows.ShadowToast @RunWith(AndroidJUnit4::class) class CaptureSelfieActivityTest { @@ -94,6 +94,7 @@ class CaptureSelfieActivityTest { @Test fun clickingPreview_whenThereIsAnErrorSavingImage_showsToast() { + ToastUtils.recordToasts = true camera.failToSave = true val intent = Intent(application, CaptureSelfieActivity::class.java).also { @@ -103,12 +104,13 @@ class CaptureSelfieActivityTest { launcher.launch(intent) onView(withId(R.id.preview)).perform(click()) - val latestToast = ShadowToast.getTextOfLatestToast() + val latestToast = ToastUtils.popRecordedToasts()[1] assertThat(latestToast, equalTo(application.getString(org.odk.collect.strings.R.string.camera_error))) } @Test fun whenCameraFailsToInitialize_showsToast() { + ToastUtils.recordToasts = true camera.failToInitialize = true val intent = Intent(application, CaptureSelfieActivity::class.java).also { @@ -116,7 +118,7 @@ class CaptureSelfieActivityTest { } launcher.launch(intent) - val latestToast = ShadowToast.getTextOfLatestToast() + val latestToast = ToastUtils.popRecordedToasts()[0] assertThat(latestToast, equalTo(application.getString(org.odk.collect.strings.R.string.camera_failed_to_initialize))) } } diff --git a/selfie-camera/src/test/java/org/odk/collect/selfiecamera/support/RobolectricApplication.kt b/selfie-camera/src/test/java/org/odk/collect/selfiecamera/support/RobolectricApplication.kt index 4429b0749ea..a6748a8f346 100644 --- a/selfie-camera/src/test/java/org/odk/collect/selfiecamera/support/RobolectricApplication.kt +++ b/selfie-camera/src/test/java/org/odk/collect/selfiecamera/support/RobolectricApplication.kt @@ -1,10 +1,16 @@ package org.odk.collect.selfiecamera.support import android.app.Application +import org.odk.collect.androidshared.ui.ToastUtils import org.odk.collect.selfiecamera.SelfieCameraDependencyComponent import org.odk.collect.selfiecamera.SelfieCameraDependencyComponentProvider class RobolectricApplication : Application(), SelfieCameraDependencyComponentProvider { override lateinit var selfieCameraDependencyComponent: SelfieCameraDependencyComponent + + override fun onCreate() { + super.onCreate() + ToastUtils.setApplication(this) + } } diff --git a/settings/src/main/java/org/odk/collect/settings/keys/ProjectKeys.kt b/settings/src/main/java/org/odk/collect/settings/keys/ProjectKeys.kt index 6d70994bc0b..322e8d583ca 100644 --- a/settings/src/main/java/org/odk/collect/settings/keys/ProjectKeys.kt +++ b/settings/src/main/java/org/odk/collect/settings/keys/ProjectKeys.kt @@ -50,6 +50,9 @@ object ProjectKeys { const val KEY_BACKGROUND_LOCATION = "background_location" const val KEY_BACKGROUND_RECORDING = "background_recording" + // experimental_preferences.xml + const val KEY_DEBUG_FILTERS = "experimental_debug_filters" + // values const val PROTOCOL_SERVER = "odk_default" const val PROTOCOL_GOOGLE_SHEETS = "google_sheets" diff --git a/strings/src/main/res/values/strings.xml b/strings/src/main/res/values/strings.xml index fa633972d32..1de757bc1d3 100644 --- a/strings/src/main/res/values/strings.xml +++ b/strings/src/main/res/values/strings.xml @@ -1227,6 +1227,10 @@ Force an uncaught exception causing the app to crash + + Debug filters + Show debug information for filter expression executions during form entry + About permissions You will be asked to allow ODK Collect access to the features below, select “allow” if you want to use them. Notifications