diff --git a/.gitignore b/.gitignore index 57f8fa09f..60d4e3a74 100644 --- a/.gitignore +++ b/.gitignore @@ -24,9 +24,6 @@ gradlew.bat # Local configuration file (sdk path, etc) local.properties -# Proguard folder generated by Eclipse -proguard/ - # Log Files *.log diff --git a/app/build.gradle b/app/build.gradle index e54e232a4..dd1ff3685 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,10 +21,6 @@ private Integer makeVersionCode() { } private String makeVersionName() { - if (ext.buildNumber) { - return "${ext.majorVersion}.${ext.minorVersion}.${ext.patchVersion}.${ext.buildNumber}" - } - return "${ext.majorVersion}.${ext.minorVersion}.${ext.patchVersion}" } @@ -72,17 +68,16 @@ android { buildTypes { release { - shrinkResources true - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' - // signingConfig signingConfigs.playStoreConfig //Add your own signing config + minifyEnabled false + debuggable false + //signingConfig signingConfigs.playStoreConfig //Add your own signing config } debug { clean debuggable true manifestPlaceholders = [crashlyticsCollectionEnabled: "false"] - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } @@ -146,7 +141,7 @@ dependencies { implementation 'com.google.zxing:core:3.3.3' - implementation('com.github.phenoapps:phenolib:v0.9.48') + implementation('com.github.phenoapps:phenolib:v0.9.49') implementation 'com.google.android.exoplayer:exoplayer:2.17.0' implementation 'com.arthenica:ffmpeg-kit-min:5.1.LTS' diff --git a/app/proguard-rules.txt b/app/proguard-rules.txt new file mode 100644 index 000000000..4160b1e89 --- /dev/null +++ b/app/proguard-rules.txt @@ -0,0 +1,2 @@ +-keep public class com.fieldbook.tracker.** + diff --git a/app/src/main/assets/database/sample.db b/app/src/main/assets/database/sample.db index dca11b324..553cf7a5e 100644 Binary files a/app/src/main/assets/database/sample.db and b/app/src/main/assets/database/sample.db differ diff --git a/app/src/main/assets/field_import/training_sample.csv b/app/src/main/assets/field_import/training_sample.csv index af936a87d..b554f3d32 100644 --- a/app/src/main/assets/field_import/training_sample.csv +++ b/app/src/main/assets/field_import/training_sample.csv @@ -1,4 +1,4 @@ -plot_id,row,column,plot,replicate,germplasm_name,pedigree +plot_id,row,column,plot,replicate,germplasm,pedigree 23TRN010_0101,1,1,0101,1,Barrie,"BW429, CPSR1//CNR17/3/NI98133/SALWIN" 23TRN010_0102,1,2,0102,1,Oahe,Ransom/SD96240-3-1 23TRN010_0103,1,3,0103,1,Jet,MS Chancellor/SD004072 diff --git a/app/src/main/java/com/fieldbook/tracker/activities/AboutActivity.java b/app/src/main/java/com/fieldbook/tracker/activities/AboutActivity.java index 465a9e04d..ff2c4f5ea 100644 --- a/app/src/main/java/com/fieldbook/tracker/activities/AboutActivity.java +++ b/app/src/main/java/com/fieldbook/tracker/activities/AboutActivity.java @@ -24,9 +24,6 @@ import com.fieldbook.tracker.BuildConfig; import com.fieldbook.tracker.R; import com.fieldbook.tracker.preferences.GeneralKeys; -import com.michaelflisar.changelog.ChangelogBuilder; -import com.michaelflisar.changelog.classes.ImportanceChangelogSorter; -import com.michaelflisar.changelog.internal.ChangelogDialogFragment; import com.mikepenz.aboutlibraries.LibsBuilder; import java.io.BufferedReader; @@ -81,16 +78,11 @@ public MaterialAboutList getMaterialAboutList(@NonNull Context c) { appCardBuilder.addItem(updateCheckItem); - appCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(getString(R.string.changelog_title)) - .icon(R.drawable.ic_about_changelog) - .setOnClickAction(new MaterialAboutItemOnClickAction() { - @Override - public void onClick() { - showChangelog(false, false); - } - }) - .build()); + appCardBuilder.addItem(ConvenienceBuilder.createWebsiteActionItem(c, + getResources().getDrawable(R.drawable.book_open_variant), + getString(R.string.about_manual_title), + false, + Uri.parse("https://docs.fieldbook.phenoapps.org/en/latest/field-book.html"))); appCardBuilder.addItem(ConvenienceBuilder.createRateActionItem(c, getResources().getDrawable(R.drawable.ic_about_rate), @@ -98,12 +90,6 @@ public void onClick() { null )); - appCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.about_help_translate_title) - .icon(R.drawable.ic_about_help_translate) - .setOnClickAction(ConvenienceBuilder.createWebsiteOnClickAction(c, Uri.parse("https://osij6hx.oneskyapp.com/collaboration/project?id=28259"))) - .build()); - MaterialAboutCard.Builder authorCardBuilder = new MaterialAboutCard.Builder(); authorCardBuilder.title(getString(R.string.about_project_lead_title)); @@ -120,32 +106,22 @@ public void onClick() { getString(R.string.about_developer_trife_email), "Field Book Question")); - authorCardBuilder.addItem(ConvenienceBuilder.createWebsiteActionItem(c, - getResources().getDrawable(R.drawable.ic_about_website), - "PhenoApps.org", - false, - Uri.parse("http://phenoapps.org/"))); - MaterialAboutCard.Builder contributorsCardBuilder = new MaterialAboutCard.Builder(); - contributorsCardBuilder.title(getString(R.string.about_contributors_title)); + contributorsCardBuilder.title(getString(R.string.about_support_title)); + contributorsCardBuilder.addItem(ConvenienceBuilder.createWebsiteActionItem(c, getResources().getDrawable(R.drawable.ic_about_contributors), - getString(R.string.about_contributors_developers_title), + getString(R.string.about_contributors_title), false, - Uri.parse("https://github.com/PhenoApps/Field-Book/graphs/contributors"))); + Uri.parse("https://github.com/PhenoApps/Field-Book#-contributors"))); - contributorsCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(getString(R.string.about_translators_title)) - .subText(getString(R.string.about_translators_text)) - .icon(R.drawable.ic_about_translators) - .build()); + contributorsCardBuilder.addItem(ConvenienceBuilder.createWebsiteActionItem(c, + getResources().getDrawable(R.drawable.ic_about_funding), + getString(R.string.about_contributors_funding_title), + false, + Uri.parse("https://github.com/PhenoApps/Field-Book#-funding"))); - contributorsCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(getString(R.string.about_contributors_funding_title)) - .subText(getString(R.string.about_contributors_funding_text)) - .icon(R.drawable.ic_about_funding) - .build()); MaterialAboutCard.Builder technicalCardBuilder = new MaterialAboutCard.Builder(); technicalCardBuilder.title(getString(R.string.about_technical_title)); @@ -171,7 +147,7 @@ public void onClick() { final int libStyleId = styleId; technicalCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.libraries_title) + .text(R.string.about_libraries_title) .icon(R.drawable.ic_about_libraries) .setOnClickAction(new MaterialAboutItemOnClickAction() { @Override @@ -179,7 +155,7 @@ public void onClick() { new LibsBuilder() .withActivityTheme(libStyleId) .withAutoDetect(true) - .withActivityTitle(getString(R.string.libraries_title)) + .withActivityTitle(getString(R.string.about_libraries_title)) .withLicenseShown(true) .withVersionShown(true) .start(getApplicationContext()); @@ -190,23 +166,18 @@ public void onClick() { MaterialAboutCard.Builder otherAppsCardBuilder = new MaterialAboutCard.Builder(); otherAppsCardBuilder.title(getString(R.string.about_title_other_apps)); + otherAppsCardBuilder.addItem(ConvenienceBuilder.createWebsiteActionItem(c, + getResources().getDrawable(R.drawable.ic_about_website), + "PhenoApps.org", + false, + Uri.parse("http://phenoapps.org/"))); + otherAppsCardBuilder.addItem(new MaterialAboutActionItem.Builder() .text("Coordinate") .icon(R.drawable.other_ic_coordinate) .setOnClickAction(openAppOrStore("org.wheatgenetics.coordinate", c)) .build()); - otherAppsCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text("Inventory") - .icon(R.drawable.other_ic_inventory) - .setOnClickAction(openAppOrStore("org.wheatgenetics.inventory", c)) - .build()); - - otherAppsCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text("Verify") - .icon(R.drawable.other_ic_verify) - .build()); - otherAppsCardBuilder.addItem(new MaterialAboutActionItem.Builder() .text("Intercross") .icon(R.drawable.other_ic_intercross) @@ -335,18 +306,6 @@ private boolean isNewerVersion(String currentVersion, String latestVersion) { return false; } - private void showChangelog(Boolean managedShow, Boolean rateButton) { - ChangelogDialogFragment builder = new ChangelogBuilder() - .withUseBulletList(true) // true if you want to show bullets before each changelog row, false otherwise - .withManagedShowOnStart(managedShow) // library will take care to show activity/dialog only if the changelog has new infos and will only show this new infos - .withRateButton(rateButton) // enable this to show a "rate app" button in the dialog => clicking it will open the play store; the parent activity or target fragment can also implement IChangelogRateHandler to handle the button click - .withSummary(false, true) // enable this to show a summary and a "show more" button, the second paramter describes if releases without summary items should be shown expanded or not - .withTitle(getString(R.string.changelog_title)) // provide a custom title if desired, default one is "Changelog " - .withOkButtonLabel(getString(android.R.string.ok)) // provide a custom ok button text if desired, default one is "OK" - .withSorter(new ImportanceChangelogSorter()) - .buildAndShowDialog(this, false); // second parameter defines, if the dialog has a dark or light theme - } - @Override protected CharSequence getActivityTitle() { return getString(R.string.mal_title_about); diff --git a/app/src/main/java/com/fieldbook/tracker/activities/CollectActivity.java b/app/src/main/java/com/fieldbook/tracker/activities/CollectActivity.java index 4e4620ba6..359523e08 100644 --- a/app/src/main/java/com/fieldbook/tracker/activities/CollectActivity.java +++ b/app/src/main/java/com/fieldbook/tracker/activities/CollectActivity.java @@ -563,7 +563,7 @@ private void initToolbars() { barcodeInput.setOnClickListener(v -> { triggerTts(barcodeTts); new IntentIntegrator(CollectActivity.this) - .setPrompt(getString(R.string.main_barcode_text)) + .setPrompt(getString(R.string.barcode_scanner_text)) .setBeepEnabled(false) .setRequestCode(BARCODE_COLLECT_CODE) .initiateScan(); @@ -1511,7 +1511,7 @@ public void onClick(DialogInterface dialog, int which) { @Override public void onClick(DialogInterface dialogInterface, int i) { new IntentIntegrator(CollectActivity.this) - .setPrompt(getString(R.string.main_barcode_text)) + .setPrompt(getString(R.string.barcode_scanner_text)) .setBeepEnabled(false) .setRequestCode(BARCODE_SEARCH_CODE) .initiateScan(); diff --git a/app/src/main/java/com/fieldbook/tracker/activities/ConfigActivity.java b/app/src/main/java/com/fieldbook/tracker/activities/ConfigActivity.java index 1595fb340..9e0b58ed8 100644 --- a/app/src/main/java/com/fieldbook/tracker/activities/ConfigActivity.java +++ b/app/src/main/java/com/fieldbook/tracker/activities/ConfigActivity.java @@ -335,7 +335,7 @@ private void loadScreen() { barcodeSearchFab = findViewById(R.id.act_config_search_fab); barcodeSearchFab.setOnClickListener(v -> { new IntentIntegrator(this) - .setPrompt(getString(R.string.main_barcode_text)) + .setPrompt(getString(R.string.barcode_scanner_text)) .setBeepEnabled(false) .setRequestCode(REQUEST_BARCODE) .initiateScan(); @@ -853,12 +853,14 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten @AfterPermissionGranted(PERMISSIONS_REQUEST_EXPORT_DATA) private void exportPermission() { String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; - if (EasyPermissions.hasPermissions(this, perms)) { - showSaveDialog(); - } else { - EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_export), - PERMISSIONS_REQUEST_EXPORT_DATA, perms); - } + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { + if (EasyPermissions.hasPermissions(this, perms)) { + showSaveDialog(); + } else { + EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_export), + PERMISSIONS_REQUEST_EXPORT_DATA, perms); + } + } else showSaveDialog(); } @AfterPermissionGranted(PERMISSIONS_REQUEST_TRAIT_DATA) diff --git a/app/src/main/java/com/fieldbook/tracker/activities/FieldEditorActivity.java b/app/src/main/java/com/fieldbook/tracker/activities/FieldEditorActivity.java index 8fff3c1b7..bdf439c5f 100644 --- a/app/src/main/java/com/fieldbook/tracker/activities/FieldEditorActivity.java +++ b/app/src/main/java/com/fieldbook/tracker/activities/FieldEditorActivity.java @@ -11,6 +11,7 @@ import android.location.Location; import android.media.MediaScannerConnection; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.provider.OpenableColumns; @@ -270,15 +271,16 @@ public void loadCloud() { @AfterPermissionGranted(PERMISSIONS_REQUEST_STORAGE) public void loadLocalPermission() { - String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; - if (EasyPermissions.hasPermissions(this, perms)) { - loadLocal(); - } else { - // Do not have permissions, request them now - EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_import), - PERMISSIONS_REQUEST_STORAGE, perms); - } - + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { + String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; + if (EasyPermissions.hasPermissions(this, perms)) { + loadLocal(); + } else { + // Do not have permissions, request them now + EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_import), + PERMISSIONS_REQUEST_STORAGE, perms); + } + } else loadLocal(); } @Override diff --git a/app/src/main/java/com/fieldbook/tracker/activities/TraitEditorActivity.java b/app/src/main/java/com/fieldbook/tracker/activities/TraitEditorActivity.java index 0a9c73fd5..e2380761f 100644 --- a/app/src/main/java/com/fieldbook/tracker/activities/TraitEditorActivity.java +++ b/app/src/main/java/com/fieldbook/tracker/activities/TraitEditorActivity.java @@ -14,6 +14,7 @@ import android.content.SharedPreferences.Editor; import android.graphics.Rect; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.util.Log; @@ -489,31 +490,40 @@ public void onClick(DialogInterface dialog, int which) { @AfterPermissionGranted(PERMISSIONS_REQUEST_STORAGE_IMPORT) public void loadTraitFilePermission() { - String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; - if (EasyPermissions.hasPermissions(this, perms)) { - if (ep.getBoolean(GeneralKeys.TRAITS_EXPORTED, false)) { - showFileDialog(); + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { + String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; + if (EasyPermissions.hasPermissions(this, perms)) { + if (ep.getBoolean(GeneralKeys.TRAITS_EXPORTED, false)) { + showFileDialog(); + } else { + checkTraitExportDialog(); + } } else { - checkTraitExportDialog(); + // Do not have permissions, request them now + EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_import), + PERMISSIONS_REQUEST_STORAGE_IMPORT, perms); } + } else if (ep.getBoolean(GeneralKeys.TRAITS_EXPORTED, false)) { + showFileDialog(); } else { - // Do not have permissions, request them now - EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_import), - PERMISSIONS_REQUEST_STORAGE_IMPORT, perms); + checkTraitExportDialog(); } - } @AfterPermissionGranted(PERMISSIONS_REQUEST_STORAGE_EXPORT) public void exportTraitFilePermission() { - String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; - if (EasyPermissions.hasPermissions(this, perms)) { - showExportDialog(); - } else { - // Do not have permissions, request them now - EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_export), - PERMISSIONS_REQUEST_STORAGE_EXPORT, perms); - } + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { + String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; + if (EasyPermissions.hasPermissions(this, perms)) { + showExportDialog(); + } else { + // Do not have permissions, request them now + EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_export), + PERMISSIONS_REQUEST_STORAGE_EXPORT, perms); + } + } else showExportDialog(); } private void showImportDialog() { diff --git a/app/src/main/java/com/fieldbook/tracker/preferences/BrapiPreferencesFragment.java b/app/src/main/java/com/fieldbook/tracker/preferences/BrapiPreferencesFragment.java index 8a4ed0300..115b55810 100644 --- a/app/src/main/java/com/fieldbook/tracker/preferences/BrapiPreferencesFragment.java +++ b/app/src/main/java/com/fieldbook/tracker/preferences/BrapiPreferencesFragment.java @@ -141,7 +141,7 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { brapiServerBarcode.setOnPreferenceClickListener(preference -> { new IntentIntegrator(getActivity()) - .setPrompt(getString(R.string.main_barcode_text)) + .setPrompt(getString(R.string.barcode_scanner_text)) .setBeepEnabled(true) .setRequestCode(IntentIntegrator.REQUEST_CODE) .initiateScan(); @@ -263,14 +263,14 @@ public void onDisplayPreferenceDialog(Preference preference) { //change request code for brapi url vs oidc url if (preference.getKey().equals(brapiURLPreference.getKey())) { new IntentIntegrator(getActivity()) - .setPrompt(getString(R.string.main_barcode_text)) + .setPrompt(getString(R.string.barcode_scanner_text)) .setBeepEnabled(false) .setRequestCode(REQUEST_BARCODE_SCAN_BASE_URL) .initiateScan(); } else { prefMgr.getSharedPreferences().edit().putBoolean(GeneralKeys.BRAPI_EXPLICIT_OIDC_URL, true).apply(); new IntentIntegrator(getActivity()) - .setPrompt(getString(R.string.main_barcode_text)) + .setPrompt(getString(R.string.barcode_scanner_text)) .setBeepEnabled(false) .setRequestCode(REQUEST_BARCODE_SCAN_OIDC_URL) .initiateScan(); diff --git a/app/src/main/java/com/fieldbook/tracker/preferences/DatabasePreferencesFragment.java b/app/src/main/java/com/fieldbook/tracker/preferences/DatabasePreferencesFragment.java index 6bc5d989e..eb26f5407 100644 --- a/app/src/main/java/com/fieldbook/tracker/preferences/DatabasePreferencesFragment.java +++ b/app/src/main/java/com/fieldbook/tracker/preferences/DatabasePreferencesFragment.java @@ -10,6 +10,7 @@ import android.content.SharedPreferences; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.text.Html; @@ -467,27 +468,33 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { @AfterPermissionGranted(PERMISSIONS_REQUEST_DATABASE_EXPORT) public void exportDatabaseFilePermission() { - String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; - if (EasyPermissions.hasPermissions(getContext(), perms)) { - showDatabaseExportDialog(); - } else { - // Do not have permissions, request them now - EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_export), - PERMISSIONS_REQUEST_DATABASE_EXPORT, perms); - } - } - @AfterPermissionGranted(PERMISSIONS_REQUEST_DATABASE_IMPORT) - public void importDatabaseFilePermission() { - String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; - if (getContext() != null) { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { + String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; if (EasyPermissions.hasPermissions(getContext(), perms)) { - showDatabaseImportDialog(); + showDatabaseExportDialog(); } else { // Do not have permissions, request them now - EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_import), - PERMISSIONS_REQUEST_DATABASE_IMPORT, perms); + EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_export), + PERMISSIONS_REQUEST_DATABASE_EXPORT, perms); } - } + } else showDatabaseExportDialog(); + } + + @AfterPermissionGranted(PERMISSIONS_REQUEST_DATABASE_IMPORT) + public void importDatabaseFilePermission() { + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { + String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE}; + if (getContext() != null) { + if (EasyPermissions.hasPermissions(getContext(), perms)) { + showDatabaseImportDialog(); + } else { + // Do not have permissions, request them now + EasyPermissions.requestPermissions(this, getString(R.string.permission_rationale_storage_import), + PERMISSIONS_REQUEST_DATABASE_IMPORT, perms); + } + } + } else showDatabaseImportDialog(); } } \ No newline at end of file diff --git a/app/src/main/java/com/fieldbook/tracker/preferences/LanguagePreferenceFragment.kt b/app/src/main/java/com/fieldbook/tracker/preferences/LanguagePreferenceFragment.kt index effbb1f98..852aa2871 100644 --- a/app/src/main/java/com/fieldbook/tracker/preferences/LanguagePreferenceFragment.kt +++ b/app/src/main/java/com/fieldbook/tracker/preferences/LanguagePreferenceFragment.kt @@ -21,9 +21,9 @@ class LanguagePreferenceFragment : PreferenceFragmentCompat(), Preference.OnPref getString(R.string.preferences_appearance_language) for (key in setOf("com.fieldbook.tracker.preference.language.default", - "am", "ar", "bn", "de", "en", "es", - "fr", "hi", "it", "ja", "om-ET", "pt-BR", - "ru", "zh-CN")) { + "am-ET", "ar-SA", "bn-BD", "de-DE", "en-US", "es-MX", + "fr-FR", "hi-IN", "it-IT", "ja-JP", "om-ET", "pt-BR", + "ru-RU", "sv-SE", "vi-VN", "zh-CN")) { findPreference(key)?.onPreferenceClickListener = this } } diff --git a/app/src/main/java/com/fieldbook/tracker/storage/StorageDefinerFragment.kt b/app/src/main/java/com/fieldbook/tracker/storage/StorageDefinerFragment.kt index 5938f54d9..1981bb147 100644 --- a/app/src/main/java/com/fieldbook/tracker/storage/StorageDefinerFragment.kt +++ b/app/src/main/java/com/fieldbook/tracker/storage/StorageDefinerFragment.kt @@ -26,6 +26,7 @@ class StorageDefinerFragment: PhenoLibStorageDefinerFragment() { AssetSample("field_import", "field_sample2.csv") to R.string.dir_field_import, AssetSample("field_import", "field_sample3.csv") to R.string.dir_field_import, AssetSample("field_import", "rtk_sample.csv") to R.string.dir_field_import, + AssetSample("field_import", "training_sample.csv") to R.string.dir_field_import, AssetSample("trait", "trait_sample.trt") to R.string.dir_trait, AssetSample("trait", "severity.txt") to R.string.dir_trait, AssetSample("database", "sample.db") to R.string.dir_database, diff --git a/app/src/main/java/com/fieldbook/tracker/traits/DateTraitLayout.java b/app/src/main/java/com/fieldbook/tracker/traits/DateTraitLayout.java index 8440f6112..10abd5c7d 100644 --- a/app/src/main/java/com/fieldbook/tracker/traits/DateTraitLayout.java +++ b/app/src/main/java/com/fieldbook/tracker/traits/DateTraitLayout.java @@ -240,6 +240,7 @@ private void loadSelectedDate() { ObservationModel model = getCurrentObservation(); date = model.getValue(); log(); + //afterLoadExists((CollectActivity) getContext(), date); } catch (Exception e) { e.printStackTrace(); } @@ -272,15 +273,19 @@ public void refreshLayout(Boolean onNew) { if (!block() || isFirstLoad) { isFirstLoad = false; super.refreshLayout(onNew); - loadSelectedDate(); + if (!onNew) { + ObservationModel model = getCurrentObservation(); + if (model != null) { + date = getCurrentObservation().getValue(); + } + refreshDateText(date); + } } else { Utils.makeToast(getContext(), getContext().getString(R.string.view_repeated_values_add_button_fail)); } } - @Override - public void afterLoadExists(CollectActivity act, @Nullable String value) { - super.afterLoadExists(act, value); + private void refreshDateText(String value) { //first check if observation values is observed for this plot and the value is not NA if (value != null && !value.equals("NA")) { @@ -333,6 +338,13 @@ public void afterLoadExists(CollectActivity act, @Nullable String value) { forceDataSavedColor(); } + } + + @Override + public void afterLoadExists(CollectActivity act, @Nullable String value) { + super.afterLoadExists(act, value); + + refreshDateText(value); isBlocked = false; } diff --git a/app/src/main/java/com/fieldbook/tracker/traits/UsbCameraTraitLayout.kt b/app/src/main/java/com/fieldbook/tracker/traits/UsbCameraTraitLayout.kt index 931cd4f20..30ff725db 100644 --- a/app/src/main/java/com/fieldbook/tracker/traits/UsbCameraTraitLayout.kt +++ b/app/src/main/java/com/fieldbook/tracker/traits/UsbCameraTraitLayout.kt @@ -62,6 +62,9 @@ class UsbCameraTraitLayout : BaseTraitLayout, ImageAdapter.ImageItemHandler { private var recyclerView: RecyclerView? = null private var previewGroup: Group? = null private var constraintLayout: ConstraintLayout? = null + //zoom buttons + private var zoomInButton: ImageButton? = null + private var zoomOutButton: ImageButton? = null constructor(context: Context?) : super(context) constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) @@ -88,6 +91,8 @@ class UsbCameraTraitLayout : BaseTraitLayout, ImageAdapter.ImageItemHandler { captureBtn = act.findViewById(R.id.usb_camera_fragment_capture_btn) recyclerView = act.findViewById(R.id.usb_camera_fragment_rv) previewGroup = act.findViewById(R.id.usb_camera_fragment_preview_group) + zoomInButton = act.findViewById(R.id.usb_camera_fragment_plus_btn) + zoomOutButton = act.findViewById(R.id.usb_camera_fragment_minus_btn) activity = act @@ -116,6 +121,54 @@ class UsbCameraTraitLayout : BaseTraitLayout, ImageAdapter.ImageItemHandler { } } + textureView?.setOnClickListener { + + mUsbCameraHelper?.setFocus() + + } + + zoomOutButton?.setOnClickListener { + + try { + + val current = mUsbCameraHelper?.getZoom() ?: 1 + + if (current < Int.MAX_VALUE) { + + mUsbCameraHelper?.setZoom(current) + + } + + } catch (e: Exception) { + + e.printStackTrace() + + Log.d(TAG, "Something went wrong with zooming USB Camera.") + + } + } + + zoomInButton?.setOnClickListener { + + try { + + val current = mUsbCameraHelper?.getZoom() ?: 1 + + if (current > 1) { + + mUsbCameraHelper?.setZoom(current - 1) + + } + + } catch (e: Exception) { + + e.printStackTrace() + + Log.d(TAG, "Something went wrong with zooming USB Camera.") + + } + } + registerReconnectListener() connectBtn?.requestFocus() diff --git a/app/src/main/java/com/fieldbook/tracker/views/RangeBoxView.kt b/app/src/main/java/com/fieldbook/tracker/views/RangeBoxView.kt index 54c4b98c0..c0c591e2f 100644 --- a/app/src/main/java/com/fieldbook/tracker/views/RangeBoxView.kt +++ b/app/src/main/java/com/fieldbook/tracker/views/RangeBoxView.kt @@ -649,10 +649,6 @@ class RangeBoxView : ConstraintLayout { //if we wrap around the entire range then observations are completed //notify the user and just go to the first range id. if (!firstLoop && prevPos == localPrev) { - Toast.makeText( - context, - R.string.activity_collect_all_obs_made, Toast.LENGTH_SHORT - ).show() return 1 } firstLoop = false diff --git a/app/src/main/java/com/fieldbook/tracker/views/RepeatedValuesView.kt b/app/src/main/java/com/fieldbook/tracker/views/RepeatedValuesView.kt index a63d0e258..764bad7d0 100644 --- a/app/src/main/java/com/fieldbook/tracker/views/RepeatedValuesView.kt +++ b/app/src/main/java/com/fieldbook/tracker/views/RepeatedValuesView.kt @@ -98,7 +98,11 @@ class RepeatedValuesView(context: Context, attributeSet: AttributeSet) : updateButtonVisibility() - act.traitLayoutRefresh() + Handler(Looper.getMainLooper()).postDelayed({ + + act.traitLayoutRefresh() + + }, 100) } } @@ -116,7 +120,11 @@ class RepeatedValuesView(context: Context, attributeSet: AttributeSet) : updateButtonVisibility() - act.traitLayoutRefresh() + Handler(Looper.getMainLooper()).postDelayed({ + + act.traitLayoutRefresh() + + }, 100) } } diff --git a/app/src/main/res/drawable/book_open_variant.xml b/app/src/main/res/drawable/book_open_variant.xml new file mode 100644 index 000000000..63aecf745 --- /dev/null +++ b/app/src/main/res/drawable/book_open_variant.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_pref_general_root_directory.xml b/app/src/main/res/drawable/ic_pref_general_root_directory.xml index 04be68ee7..a324140a0 100644 --- a/app/src/main/res/drawable/ic_pref_general_root_directory.xml +++ b/app/src/main/res/drawable/ic_pref_general_root_directory.xml @@ -1,3 +1,4 @@ + + android:pathData="M18,8H16V4H18M15,8H13V4H15M12,8H10V4H12M18,2H10L4,8V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V4A2,2 0 0,0 18,2Z" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_sv.png b/app/src/main/res/drawable/ic_sv.png new file mode 100644 index 000000000..350b363f4 Binary files /dev/null and b/app/src/main/res/drawable/ic_sv.png differ diff --git a/app/src/main/res/drawable/ic_vi.png b/app/src/main/res/drawable/ic_vi.png new file mode 100644 index 000000000..1748e86d8 Binary files /dev/null and b/app/src/main/res/drawable/ic_vi.png differ diff --git a/app/src/main/res/drawable/minus.xml b/app/src/main/res/drawable/minus.xml new file mode 100644 index 000000000..7c245638d --- /dev/null +++ b/app/src/main/res/drawable/minus.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/dialog_info.xml b/app/src/main/res/layout/dialog_info.xml index f5c44616a..438a1a15b 100644 --- a/app/src/main/res/layout/dialog_info.xml +++ b/app/src/main/res/layout/dialog_info.xml @@ -24,7 +24,7 @@ android:gravity="center" android:paddingHorizontal="20dp" android:paddingVertical="10dp" - android:text="@string/brapi_dialog_info_example_text"/> + android:text=""/>