diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/FeatureOverviewActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/FeatureOverviewActivity.kt index 855d6ba20dd..1a008eaf7e3 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/FeatureOverviewActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/FeatureOverviewActivity.kt @@ -6,9 +6,11 @@ import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.content.res.Resources.NotFoundException import android.os.Bundle +import android.view.Menu import android.view.View import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.SearchView import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -35,6 +37,7 @@ import java.util.* class FeatureOverviewActivity : AppCompatActivity() { private lateinit var recyclerView: RecyclerView private var sectionAdapter: FeatureSectionAdapter? = null + private var featureAdapter: FeatureAdapter? = null private var features: List? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -50,7 +53,7 @@ class FeatureOverviewActivity : AppCompatActivity() { override fun onItemClicked(recyclerView: RecyclerView?, position: Int, view: View?) { if (sectionAdapter!!.isSectionHeaderPosition(position).not()) { val itemPosition = sectionAdapter!!.getConvertedPosition(position) - val feature = features!![itemPosition] + val feature = featureAdapter!!.getItem(itemPosition) startFeature(feature) } } @@ -86,6 +89,7 @@ class FeatureOverviewActivity : AppCompatActivity() { if (featuresList.isNullOrEmpty()) { return } + featureAdapter = FeatureAdapter(features!!) val sections: MutableList = ArrayList() var currentCat = "" for (i in features!!.indices) { @@ -95,12 +99,11 @@ class FeatureOverviewActivity : AppCompatActivity() { currentCat = category } } - sectionAdapter = FeatureSectionAdapter( this, R.layout.section_main_layout, R.id.section_text, - FeatureAdapter(features!!) + featureAdapter!! ) sectionAdapter!!.setSections(sections.toTypedArray()) recyclerView.adapter = sectionAdapter @@ -163,6 +166,56 @@ class FeatureOverviewActivity : AppCompatActivity() { } } + // Add SearchView to the app bar + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_feature_overview, menu) + val searchItem = menu.findItem(R.id.action_search) + val searchView = searchItem.actionView as SearchView + searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + return false // No action on submit + } + + override fun onQueryTextChange(newText: String?): Boolean { + filterFeatures(newText) + return true + } + }) + return true + } + + // Filter the features based on the search query + private fun filterFeatures(query: String?) { + val filteredFeatures = if (query.isNullOrEmpty()) { + features // Show full list if query is empty + } else { + features?.filter { it.getLabel().contains(query, ignoreCase = true) } + } + updateAdapter(filteredFeatures) + } + + // Update the adapter with filtered features + private fun updateAdapter(filteredFeatures: List?) { + if (filteredFeatures.isNullOrEmpty()) { + featureAdapter?.update(emptyList()) + sectionAdapter?.setSections(emptyArray()) + sectionAdapter?.notifyDataSetChanged() + return + } + val sections: MutableList = ArrayList() + var currentCat = "" + for (i in filteredFeatures.indices) { + val category = filteredFeatures[i].category + if (currentCat != category) { + sections.add(FeatureSectionAdapter.Section(i, category)) + currentCat = category + } + } + featureAdapter?.update(filteredFeatures) + sectionAdapter?.setSections(sections.toTypedArray()) + sectionAdapter?.notifyDataSetChanged() + } + companion object { private const val KEY_STATE_FEATURES = "featureList" } diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/adapter/FeatureAdapter.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/adapter/FeatureAdapter.kt index 9cca2b38637..542fa6cd8d1 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/adapter/FeatureAdapter.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/adapter/FeatureAdapter.kt @@ -12,12 +12,11 @@ import org.maplibre.android.testapp.utils.FontCache /** * Adapter used for FeatureOverviewActivity. * - * * Adapts a Feature to a visual representation to be shown in a RecyclerView. - * */ -class FeatureAdapter(private val features: List) : +class FeatureAdapter(private var features: List) : RecyclerView.Adapter() { + class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { var labelView: TextView var descriptionView: TextView @@ -32,8 +31,7 @@ class FeatureAdapter(private val features: List) : } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = - LayoutInflater.from(parent.context).inflate(R.layout.item_main_feature, parent, false) + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_main_feature, parent, false) return ViewHolder(view) } @@ -45,4 +43,13 @@ class FeatureAdapter(private val features: List) : override fun getItemCount(): Int { return features.size } + + fun update(newFeatures: List) { + features = newFeatures + notifyDataSetChanged() + } + + fun getItem(position: Int): Feature { + return features[position] + } } diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-anydpi/ic_search.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-anydpi/ic_search.xml new file mode 100644 index 00000000000..6796805c38b --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-anydpi/ic_search.xml @@ -0,0 +1,11 @@ + + + diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-hdpi/ic_search.png b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-hdpi/ic_search.png new file mode 100644 index 00000000000..d98549d7303 Binary files /dev/null and b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-hdpi/ic_search.png differ diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-mdpi/ic_search.png b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-mdpi/ic_search.png new file mode 100644 index 00000000000..6b772791caa Binary files /dev/null and b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-mdpi/ic_search.png differ diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xhdpi/ic_search.png b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xhdpi/ic_search.png new file mode 100644 index 00000000000..72ce491f3d0 Binary files /dev/null and b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xhdpi/ic_search.png differ diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xxhdpi/ic_search.png b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xxhdpi/ic_search.png new file mode 100644 index 00000000000..96d063da4e0 Binary files /dev/null and b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xxhdpi/ic_search.png differ diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/menu/menu_feature_overview.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/menu/menu_feature_overview.xml new file mode 100644 index 00000000000..6d798f3ce60 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/menu/menu_feature_overview.xml @@ -0,0 +1,10 @@ + + + + diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml index 885a1a2ed8c..af6620dd915 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml @@ -7,4 +7,5 @@ Benchmark World Tour Benchmark Writes out avg. fps and 1% fps after world tour with .flyTo() + Search