Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V6.1 #1169

Open
wants to merge 42 commits into
base: main
Choose a base branch
from
Open

V6.1 #1169

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
e5263a4
init commit for removing primary/secondary requirement on import
chaneylc Jan 7, 2025
763c60d
Remove date trait text preview out of cvET
kamathprasad9 Jan 9, 2025
4e7984e
updated field file import to work without primary/secondary
chaneylc Jan 9, 2025
295a398
minor refactoring of range object class names to match with primary/s…
chaneylc Jan 10, 2025
8de0a5e
enhanced default primary/secondary logic to prioritize row/col and bl…
chaneylc Jan 10, 2025
c3830f0
Overwrite NA with date on save
kamathprasad9 Jan 17, 2025
9abce72
Set edited observations to black and italic
kamathprasad9 Jan 18, 2025
aac0762
Merge branch 'refs/heads/bugs_v6.0.6' into remove_primary_secondary_c…
chaneylc Jan 24, 2025
c3aefbe
removed primary/secondary choice from new brapi import
chaneylc Jan 24, 2025
a3c5279
minor ui fix for overlapping progress bar in brapi study list
chaneylc Jan 24, 2025
225a3ac
Merge branch 'refs/heads/bugs_v6.0.6' into remove_primary_secondary_c…
chaneylc Jan 24, 2025
d6e09c8
Change date trait preview text style
kamathprasad9 Jan 28, 2025
53be01f
Update date layout
kamathprasad9 Jan 28, 2025
c0f7a7c
init commit for crop image feature
chaneylc Jan 31, 2025
8b061df
Fix audio trait button states for NA
kamathprasad9 Feb 4, 2025
bb61b7a
Increase date preview text size
kamathprasad9 Feb 4, 2025
1d986a5
Update Audio trait with metadata view
kamathprasad9 Feb 6, 2025
c79e391
added crop region preview for camerax
chaneylc Feb 6, 2025
c025313
Fix audio trait NA delete layout bug
kamathprasad9 Feb 11, 2025
efeb6a6
Fix date edit styling for repeated measure
kamathprasad9 Feb 12, 2025
eca1736
kept prim/sec choices formatting consistent in collect
chaneylc Feb 13, 2025
59ae245
quickgoto now accessible through clicking primary/secondary ids
chaneylc Feb 14, 2025
494f91a
added logic for automatic primary/secondary selection
chaneylc Feb 14, 2025
166ee19
removed automatic "rep" choice for secondary name
chaneylc Feb 14, 2025
9a42a5b
minor ui changes and refactoring
chaneylc Feb 17, 2025
52442ef
Merge branch 'main' into remove_primary_secondary_choice
chaneylc Feb 17, 2025
23eb041
Merge branch 'refs/heads/main' into remove_primary_secondary_choice
chaneylc Feb 17, 2025
98dc729
minor ui changes and refactoring
chaneylc Feb 18, 2025
4a7e7bf
minor ui changes for trait status bar
chaneylc Feb 18, 2025
f5b9823
Fix percent trait to italic when seeking
kamathprasad9 Feb 19, 2025
276df0b
Merge branch 'main' into trait-modifications
kamathprasad9 Feb 19, 2025
f1fca91
Merge branch 'refs/heads/ffmpeg_fix' into remove_primary_secondary_ch…
chaneylc Feb 20, 2025
81fb43d
update layout
trife Feb 20, 2025
228912e
various bug fixes
chaneylc Feb 20, 2025
cf4a954
fixed trait sorting
chaneylc Feb 20, 2025
d180020
Merge branch 'refs/heads/crop_image_feature' into v6.0.7
chaneylc Feb 20, 2025
4da4973
Merge branch 'refs/heads/trait-modifications' into v6.1
chaneylc Feb 20, 2025
c9a1177
Merge branch 'refs/heads/remove_primary_secondary_choice' into v6.1
chaneylc Feb 20, 2025
903e93d
updated version to 6.1.0
chaneylc Feb 20, 2025
2aa37fa
fixed quickgoto cursor select for secondary id
chaneylc Feb 20, 2025
7d9ecb6
added button to swap quick goto input type
chaneylc Feb 20, 2025
94c7502
Merge branch 'main' into v6.1
trife Feb 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,10 @@ dependencies {
implementation "androidx.exifinterface:exifinterface:1.3.6"

//camerax
def camerax_version = "1.3.3"
def camerax_version = "1.4.1"

implementation "androidx.camera:camera-effects:$camerax_version"

implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
implementation "androidx.camera:camera-view:$camerax_version"
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,10 @@
android:scheme="fieldbook" />
</intent-filter>
</activity>
<activity android:name=".activities.CropImageActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name=".activities.brapi.BrapiExportActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.fieldbook.tracker.activities

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Size
import android.widget.ImageButton
import android.widget.TextView
Expand Down Expand Up @@ -31,16 +33,21 @@ class CameraActivity : ThemedActivity() {

private var supportedResolutions: List<Size> = listOf()

private var traitId: String? = null

companion object {

val TAG = CameraActivity::class.simpleName
const val EXTRA_TITLE = "title"

const val EXTRA_TRAIT_ID = "trait_id"
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

//get trait id from extras
traitId = intent.getStringExtra(EXTRA_TRAIT_ID)

setContentView(R.layout.activity_camera)

previewView = findViewById(R.id.act_camera_pv)
Expand Down Expand Up @@ -117,7 +124,9 @@ class CameraActivity : ThemedActivity() {
val resolution = getSupportedResolutionByPreferences()

cameraXFacade.bindPreview(
previewView, resolution
previewView, resolution,
traitId,
Handler(Looper.getMainLooper())
) { camera, executor, capture ->

setupCaptureUi(camera, executor, capture)
Expand All @@ -141,8 +150,10 @@ class CameraActivity : ThemedActivity() {
object : ImageCapture.OnImageSavedCallback {
override fun onError(error: ImageCaptureException) {}
override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
setResult(RESULT_OK)
finish()
runOnUiThread {
setResult(RESULT_OK)
finish()
}
}
})
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import com.fieldbook.tracker.dialogs.GeoNavCollectDialog;
import com.fieldbook.tracker.dialogs.ObservationMetadataFragment;
import com.fieldbook.tracker.dialogs.SearchDialog;
import com.fieldbook.tracker.fragments.CropImageFragment;
import com.fieldbook.tracker.interfaces.FieldSwitcher;
import com.fieldbook.tracker.location.GPSTracker;
import com.fieldbook.tracker.objects.FieldObject;
Expand Down Expand Up @@ -117,6 +118,7 @@
import org.phenoapps.utils.TextToSpeechHelper;
import org.threeten.bp.OffsetDateTime;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
Expand Down Expand Up @@ -153,6 +155,7 @@ public class CollectActivity extends ThemedActivity
SensorHelper.RelativeRotationListener {

public static final int REQUEST_FILE_EXPLORER_CODE = 1;
public static final int REQUEST_CROP_IMAGE_CODE = 101;
public static final int BARCODE_COLLECT_CODE = 99;
public static final int BARCODE_SEARCH_CODE = 98;

Expand Down Expand Up @@ -483,7 +486,7 @@ public String getStudyId() {
}

public String getObservationUnit() {
return getCRange().plot_id;
return getCRange().uniqueId;
}

public String getPerson() {
Expand Down Expand Up @@ -842,11 +845,11 @@ public void initWidgets(final boolean rangeSuppress) {

traitBox.initTraitDetails();

String currentSortOrder = preferences.getString(GeneralKeys.TRAITS_LIST_SORT_ORDER, "position");
// trait is unique, format is not
String[] traits = database.getVisibleTrait();
String[] traits = database.getVisibleTrait(currentSortOrder);
if (traits != null) {
traitBox.initTraitType(traits, rangeSuppress);

}
}

Expand Down Expand Up @@ -881,7 +884,7 @@ public boolean moveToSearch(
RangeObject ro = rangeBox.getCRange();

//issue #634 fix for now to check the search query by plot_id which should be the unique id
if (Objects.equals(ro.plot_id, searchUnique)) {
if (Objects.equals(ro.uniqueId, searchUnique)) {
moveToResultCore(j);
return true;
}
Expand All @@ -893,7 +896,7 @@ public boolean moveToSearch(
for (int j = 1; j <= plotIndices.length; j++) {
rangeBox.setRangeByIndex(j - 1);

if (rangeBox.getCRange().range.equals(range) & rangeBox.getCRange().plot.equals(plot)) {
if (rangeBox.getCRange().primaryId.equals(range) & rangeBox.getCRange().secondaryId.equals(plot)) {
moveToResultCore(j);
return true;
}
Expand All @@ -905,7 +908,7 @@ public boolean moveToSearch(
for (int j = 1; j <= plotIndices.length; j++) {
rangeBox.setRangeByIndex(j - 1);

if (rangeBox.getCRange().plot.equals(data)) {
if (rangeBox.getCRange().secondaryId.equals(data)) {
moveToResultCore(j);
return true;
}
Expand All @@ -917,7 +920,7 @@ public boolean moveToSearch(
for (int j = 1; j <= plotIndices.length; j++) {
rangeBox.setRangeByIndex(j - 1);

if (rangeBox.getCRange().range.equals(data)) {
if (rangeBox.getCRange().primaryId.equals(data)) {
moveToResultCore(j);
return true;
}
Expand All @@ -930,7 +933,7 @@ public boolean moveToSearch(
for (int j = 1; j <= rangeSize; j++) {
rangeBox.setRangeByIndex(j - 1);

if (rangeBox.getCRange().plot_id.equals(data)) {
if (rangeBox.getCRange().uniqueId.equals(data)) {

if (trait == -1) {
moveToResultCore(j);
Expand Down Expand Up @@ -1186,8 +1189,9 @@ public void navigateToTrait(String trait) {

if (trait != null) {

String currentSortOrder = preferences.getString(GeneralKeys.TRAITS_LIST_SORT_ORDER, "position");
//get all traits, filter the preference trait and check it's visibility
String[] traits = database.getVisibleTrait();
String[] traits = database.getVisibleTrait(currentSortOrder);

try {

Expand Down Expand Up @@ -1453,7 +1457,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
collectDataTapTargetView(R.id.traitLeft, getString(R.string.tutorial_main_traits_title), getString(R.string.tutorial_main_traits_description), 60),
collectDataTapTargetView(R.id.traitTypeTv, getString(R.string.tutorial_main_traitlist_title), getString(R.string.tutorial_main_traitlist_description), 80),
collectDataTapTargetView(R.id.rangeLeft, getString(R.string.tutorial_main_entries_title), getString(R.string.tutorial_main_entries_description), 60),
collectDataTapTargetView(R.id.valuesPlotRangeHolder, getString(R.string.tutorial_main_navinfo_title), getString(R.string.tutorial_main_navinfo_description), 60),
collectDataTapTargetView(R.id.namesHolderLayout, getString(R.string.tutorial_main_navinfo_title), getString(R.string.tutorial_main_navinfo_description), 60),
collectDataTapTargetView(R.id.traitHolder, getString(R.string.tutorial_main_datacollect_title), getString(R.string.tutorial_main_datacollect_description), 200),
collectDataTapTargetView(R.id.missingValue, getString(R.string.tutorial_main_na_title), getString(R.string.tutorial_main_na_description), 60),
collectDataTapTargetView(R.id.deleteValue, getString(R.string.tutorial_main_delete_title), getString(R.string.tutorial_main_delete_description), 60)
Expand Down Expand Up @@ -2115,6 +2119,13 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {

} else triggerTts(fail);
break;
case REQUEST_CROP_IMAGE_CODE:
if (resultCode == RESULT_OK) {
File f = new File(getContext().getCacheDir(), AbstractCameraTrait.TEMPORARY_IMAGE_NAME);
Uri uri = Uri.fromFile(f);
startCropActivity(getCurrentTrait().getId(), uri);
}
break;
}
}

Expand Down Expand Up @@ -2281,7 +2292,8 @@ public boolean existsTrait(final int plotId) {
*/
@Override
public int existsAllTraits(final int traitIndex, final int plotId) {
final ArrayList<TraitObject> traits = database.getVisibleTraitObjects();
String sortOrder = preferences.getString(GeneralKeys.TRAITS_LIST_SORT_ORDER, "position");
final ArrayList<TraitObject> traits = database.getVisibleTraitObjects(sortOrder);
for (int i = 0; i < traits.size(); i++) {
if (i != traitIndex
&& !database.getTraitExists(plotId, traits.get(i).getId())) return i;
Expand All @@ -2292,7 +2304,8 @@ public int existsAllTraits(final int traitIndex, final int plotId) {
@NonNull
@Override
public List<Integer> getNonExistingTraits(final int plotId) {
final ArrayList<TraitObject> traits = database.getVisibleTraitObjects();
String sortOrder = preferences.getString(GeneralKeys.TRAITS_LIST_SORT_ORDER, "position");
final ArrayList<TraitObject> traits = database.getVisibleTraitObjects(sortOrder);
final ArrayList<Integer> indices = new ArrayList<>();
for (int i = 0; i < traits.size(); i++) {
if (!database.getTraitExists(plotId, traits.get(i).getId()))
Expand Down Expand Up @@ -2882,4 +2895,50 @@ private void sendCrashReport(Exception e) {

}
}

/**
* a function that starts the crop activity and sends it required intent data
*/
public void startCropActivity(String traitId, Uri uri) {
try {
Intent intent = new Intent(this, CropImageActivity.class);
intent.putExtra(CropImageFragment.EXTRA_TRAIT_ID, Integer.parseInt(traitId));
intent.putExtra(CropImageFragment.EXTRA_IMAGE_URI, uri.toString());
cameraXFacade.unbind();
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}

public void requestAndCropImage() {
try {
Intent intent = new Intent(this, CameraActivity.class);
intent.putExtra(CropImageFragment.EXTRA_TRAIT_ID, Integer.parseInt(getCurrentTrait().getId()));
cameraXFacade.unbind();
startActivityForResult(intent, REQUEST_CROP_IMAGE_CODE);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* shows an alert dialog that asks user to define a crop region
*/
public void showCropDialog(String traitId, Uri uri) {
try {
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppAlertDialog);
builder.setTitle(R.string.dialog_crop_title);
builder.setMessage(R.string.dialog_crop_message);
builder.setPositiveButton(android.R.string.ok, (dialog, which) -> {
startCropActivity(traitId, uri);
});
builder.setNegativeButton(android.R.string.no, (dialog, which) -> {
dialog.dismiss();
});
builder.create().show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,8 @@ private void loadScreen() {
*/
private int checkTraitsExist() {

String[] traits = database.getVisibleTrait();
String currentSortOrder = preferences.getString(GeneralKeys.TRAITS_LIST_SORT_ORDER, "position");
String[] traits = database.getVisibleTrait(currentSortOrder);

if (!preferences.getBoolean(GeneralKeys.IMPORT_FIELD_FINISHED, false)
|| preferences.getInt(GeneralKeys.SELECTED_FIELD_ID, -1) == -1) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.fieldbook.tracker.activities

import android.os.Bundle
import androidx.core.os.bundleOf
import androidx.fragment.app.add
import androidx.fragment.app.commit
import com.fieldbook.tracker.R
import com.fieldbook.tracker.fragments.CropImageFragment
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class CropImageActivity: ThemedActivity() {

companion object {
const val TAG = "CropImageActivity"
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_crop_image)
if (savedInstanceState == null) {

val bundle = bundleOf(
CropImageFragment.EXTRA_TRAIT_ID to intent.getIntExtra(CropImageFragment.EXTRA_TRAIT_ID, -1),
CropImageFragment.EXTRA_IMAGE_URI to intent.getStringExtra(CropImageFragment.EXTRA_IMAGE_URI),
)

supportFragmentManager.commit {
setReorderingAllowed(true)
add<CropImageFragment>(R.id.fragment_container_view, args = bundle)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,11 @@ class FieldDetailFragment : Fragment(), FieldSyncController {
}

fun checkTraitsExist(): Int {
val traits = database.getVisibleTrait()

val currentSortOrder: String =
preferences.getString(GeneralKeys.TRAITS_LIST_SORT_ORDER, "position") ?: ""

val traits = database.getVisibleTrait(currentSortOrder)

return when {
traits.isEmpty() -> {
Expand Down
Loading