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 93b9ced0a..9a6643976 100644 --- a/app/src/main/java/com/fieldbook/tracker/activities/FieldEditorActivity.java +++ b/app/src/main/java/com/fieldbook/tracker/activities/FieldEditorActivity.java @@ -17,6 +17,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.provider.OpenableColumns; import android.text.Html; import android.text.Spanned; @@ -38,6 +39,7 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.Toolbar; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.documentfile.provider.DocumentFile; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.DividerItemDecoration; @@ -70,6 +72,7 @@ import com.fieldbook.tracker.utilities.SnackbarUtils; import com.fieldbook.tracker.utilities.TapTargetUtil; import com.fieldbook.tracker.utilities.Utils; +import com.fieldbook.tracker.views.SearchBar; import com.getkeepsafe.taptargetview.TapTarget; import com.getkeepsafe.taptargetview.TapTargetSequence; import com.google.android.material.floatingactionbutton.FloatingActionButton; @@ -102,6 +105,7 @@ public class FieldEditorActivity extends ThemedActivity private static final int REQUEST_FILE_EXPLORER_CODE = 1; private static final int REQUEST_CLOUD_FILE_CODE = 5; private static final int REQUEST_BRAPI_IMPORT_ACTIVITY = 10; + private ArrayList fieldList; public FieldAdapter mAdapter; public EditText trait; @@ -116,6 +120,7 @@ public class FieldEditorActivity extends ThemedActivity private ActionMode actionMode; private TextView customTitleView; public ExportUtil exportUtil; + private SearchBar searchBar; @Inject DataHelper database; @@ -182,6 +187,8 @@ public void onFieldSelected(int fieldId) { FloatingActionButton fab = findViewById(R.id.newField); fab.setOnClickListener(v -> handleImportAction()); + searchBar = findViewById(R.id.act_fields_sb); + queryAndLoadFields(); } @@ -1062,6 +1069,9 @@ public void queryAndLoadFields() { fieldList = database.getAllFieldObjects(); // Fetch data from the database mAdapter.submitList(new ArrayList<>(fieldList), () -> recyclerView.scrollToPosition(0)); mAdapter.notifyDataSetChanged(); + + new Handler(Looper.getMainLooper()).postDelayed(this::setupSearchBar, 100); + } catch (Exception e) { Log.e(TAG, "Error updating fields list", e); } @@ -1085,4 +1095,34 @@ public FieldSwitcher getFieldSwitcher() { return fieldSwitcher; } + private void setupSearchBar() { + + if (recyclerView.canScrollVertically(1) || recyclerView.canScrollVertically(-1)) { + + searchBar.setVisibility(View.VISIBLE); + + searchBar.editText.addTextChangedListener(new android.text.TextWatcher() { + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // Do nothing + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + mAdapter.setTextFilter(s.toString()); + } + + @Override + public void afterTextChanged(android.text.Editable s) { + // Do nothing + } + }); + + } else { + + searchBar.setVisibility(View.GONE); + + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/fieldbook/tracker/adapters/FieldAdapter.java b/app/src/main/java/com/fieldbook/tracker/adapters/FieldAdapter.java index 5b1ff69d4..b0a1eb0af 100644 --- a/app/src/main/java/com/fieldbook/tracker/adapters/FieldAdapter.java +++ b/app/src/main/java/com/fieldbook/tracker/adapters/FieldAdapter.java @@ -9,6 +9,7 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; @@ -39,6 +40,8 @@ public class FieldAdapter extends ListAdapter fullFieldList = new ArrayList<>(); public interface OnFieldSelectedListener { void onFieldSelected(int itemId); @@ -219,4 +222,24 @@ public void onBindViewHolder(ViewHolder holder, int position) { holder.sourceIcon.setBackground(null); } } + + @Override + public void submitList(@Nullable List list, @Nullable Runnable commitCallback) { + super.submitList(list, commitCallback); + fullFieldList.clear(); + if (list != null) { + fullFieldList.addAll(list); + } + } + + public void setTextFilter(String filter) { + this.filterText = filter; + List filterFields = new ArrayList<>(fullFieldList); + for (FieldObject field : fullFieldList) { + if (!filter.isEmpty() && !field.getExp_name().toLowerCase().contains(filter.toLowerCase())) { + filterFields.remove(field); + } + } + submitList(filterFields); + } } \ No newline at end of file diff --git a/app/src/main/java/com/fieldbook/tracker/views/SearchBar.kt b/app/src/main/java/com/fieldbook/tracker/views/SearchBar.kt index ae917974a..408f3c252 100644 --- a/app/src/main/java/com/fieldbook/tracker/views/SearchBar.kt +++ b/app/src/main/java/com/fieldbook/tracker/views/SearchBar.kt @@ -3,19 +3,15 @@ package com.fieldbook.tracker.views import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup import android.widget.AutoCompleteTextView -import android.widget.EditText import android.widget.FrameLayout -import android.widget.ImageButton -import android.widget.TextView -import androidx.core.widget.addTextChangedListener +import android.widget.ImageView import com.fieldbook.tracker.R -class SearchBar: FrameLayout { +class SearchBar : FrameLayout { lateinit var editText: AutoCompleteTextView + lateinit var clearButton: ImageView constructor(context: Context) : super(context) { init() @@ -25,7 +21,11 @@ class SearchBar: FrameLayout { init() } - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) { init() } @@ -35,6 +35,10 @@ class SearchBar: FrameLayout { val view = LayoutInflater.from(context).inflate(R.layout.view_search_bar, this, true) editText = view.findViewById(R.id.search) + clearButton = view.findViewById(R.id.clear) + clearButton.setOnClickListener { + editText.text.clear() + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fields.xml b/app/src/main/res/layout/activity_fields.xml index 40c1cc0f0..d4c825f87 100644 --- a/app/src/main/res/layout/activity_fields.xml +++ b/app/src/main/res/layout/activity_fields.xml @@ -1,7 +1,9 @@ @@ -21,6 +23,14 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + android:padding="5dp" + tools:listitem="@layout/list_item_field_recycler" + tools:itemCount="3"/> diff --git a/app/src/main/res/layout/list_item_field_recycler.xml b/app/src/main/res/layout/list_item_field_recycler.xml index c1d462864..68d2a99dd 100644 --- a/app/src/main/res/layout/list_item_field_recycler.xml +++ b/app/src/main/res/layout/list_item_field_recycler.xml @@ -13,7 +13,8 @@ android:layout_width="44dp" android:layout_height="44dp" android:gravity="center" - android:padding="8dp"/> + android:padding="8dp" + tools:src="@drawable/ic_file_csv"/> + android:singleLine="true" + tools:text="200"/> diff --git a/app/src/main/res/layout/view_search_bar.xml b/app/src/main/res/layout/view_search_bar.xml index a52eb0c17..2f9851b52 100644 --- a/app/src/main/res/layout/view_search_bar.xml +++ b/app/src/main/res/layout/view_search_bar.xml @@ -47,7 +47,6 @@ android:background="?selectableItemBackgroundBorderless" android:contentDescription="@string/searchpreference_clear" android:padding="4dp" - android:visibility="gone" app:srcCompat="@drawable/searchpreference_ic_clear" app:tint="?android:attr/textColorPrimary" />