From c834669d372d08e17fb2929801989b29abaa667e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 4 Mar 2025 16:28:21 +0100 Subject: [PATCH 1/3] Add activity search to Android test app --- .../activity/FeatureOverviewActivity.kt | 59 +++++++++++++++++- .../android/testapp/adapter/FeatureAdapter.kt | 17 +++-- .../main/res/drawable-anydpi/ic_search.xml | 11 ++++ .../src/main/res/drawable-hdpi/ic_search.png | Bin 0 -> 515 bytes .../src/main/res/drawable-mdpi/ic_search.png | Bin 0 -> 350 bytes .../src/main/res/drawable-xhdpi/ic_search.png | Bin 0 -> 638 bytes .../main/res/drawable-xxhdpi/ic_search.png | Bin 0 -> 1110 bytes .../main/res/menu/menu_feature_overview.xml | 0 8 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-anydpi/ic_search.xml create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-hdpi/ic_search.png create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-mdpi/ic_search.png create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xhdpi/ic_search.png create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xxhdpi/ic_search.png create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/menu/menu_feature_overview.xml 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 0000000000000000000000000000000000000000..d98549d7303fb6021e62837d7dff64139b756190 GIT binary patch literal 515 zcmV+e0{s1nP)A=|$1|7L~jx)I5Skv4mh71+qMst zpeg4UAzxYCkLOR$=LVbEQi5(dzYN-8&gDi6Dr$M9g766+s{zNHUxIF>g0Sv8YQP!i z7lA!^8uw$Y3Fix;-%t)c&S!yTevNyv{AZjmgj|$blpK0olLY!Mbsy(TL8tDV^Nff= z{KP#t6svJ326pf3w~d4i={E0T&jfmzqPh=NQyp?^%SFk;vO>hD=Mj%t8o4^)z#C7T z6!I@pdPv|4k68(FQOZGy3BG8;34cxEjIKf7ozAZW5lX@zxTbN$8Cup{e`RVxoT25r z;hM$~XK4AJxTbN$8FK2HYZ^zKiNri}Ze{!nXIfgCFWmKN>}bg!83>luvbtN^tR5g83=<-6R{idgCQl8%w+yd zs??uPNs?qzmgT-EiW7}@8qZ{hIF5&Mtv6Ygtr4`&@;u+jJHiQ2#4=llS2I9jycmMzZ07*qoM6N<$g8Filo&W#< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..72ce491f3d0ec9d550442bb5b4c0934b44163ca6 GIT binary patch literal 638 zcmV-^0)hRBP) z9JI+l=Q49LlT1w&6ciNXl2WO(*lxEwtyb$&e}8(W-`}!sqtWP;%jE@*n>dw9Wlagb zMw9-_qE1bB*N&(Sf<3SduH>(&8-^0Tq8~ljThw_+$-Z&s zsYwb8P*FG3ctru0VuB8Bn?Y#o9R2C?40Ya6fDV#>rY0>~!HcL*{XV3|8!eo$al1`g zlyDW3@<5F@qJhkKe^gMw2k(0$ivoQ5?ITp6P=5Q+@_vU16!jUjh2*@8VC&SRMTb`f zD{xPZH|%{L1&sX;lj$~UA0wD8+e%lcONwTHp8lxuj%NJ@tME=uQtUMZzV4{;j(tgS z*6e_zZWwGGvs$gTNnH>W{EWd}A#>CcYa7nI8+$@+P!#Z%Nw`GLw*~dK+r-Vf8}lW} zG{*$Tb|EH{)_Ata_82E9O5lh|B{kPJ)4Z;g+GU)e*q4-&xnUxM%yygT1Izoai2Z1c zteCNbNC`g3J|YR*|M!CqDc##+0j`K_S7ID2Sr*_d+h<}NtZiZnm{>cF#2+iML+!uC z+9sxe+^s}xJ6Unm{#&eVVhYIJ?$oyu^?E%&t6*5$^pe+^a=`n!z}hBvGha|pP>@f4 Y0goZJ46}a}O8@`>07*qoM6N<$g5b?A`Tzg` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..96d063da4e0a41775e991d7b9cc7d8db6284866d GIT binary patch literal 1110 zcmV-c1gZOpP)Juk-M3({6BzWOCS*V@OixcA&_4GCNX$4YW+7(KI~Mx+P%f7bsgKNp0o~F; zCL#2DU43PZ5me4M9axe=|3B1eCMcCk69|4q2b6|*64bxzuyXn)CtRuKp_X<4inxSu zD0ojhZ5yLCv>DY-oCE{<9y5UdG&?(c0j49`whP5Zqj6FDP{HpfZRi|W!XIehGKgo| zW+$MkUTdGGaQv>eafVv0c0>a<0^daPE@_+Hfa<%U{hM-juY~GY(qIjB)P65;haKZ% zOT5I@-Z}{CmCTLl0t$Xf%T^55wZb4WrqI)9~FCmv|k-uoP}DiW-+w1l!*Pb$#2Bgy3TZmuu`J zUmkPzC87zE^hASCLgs|8$4oiBszvaNutDdgLBz+bX8(HJRN%^Up+UgC*_oin8_`}u zySKQUPHUee=<|sTSHMhEk_lF+Dh4(OEwQ?Irj2B5U{GIqJAuDvv~3K0%i6O-*(Wrv z4Rb@M(;4emNx}A0#?&9dI15*;ej7?0U(dwqmL>!2=7;hy&sjLv^t;@+M}z5@w#^fq zla@6xT1mN{xC`4~-1e*_u727mSFl1@DVi8fQtm6M-+dtxv{J~*x7H~!IzT1yUmJ42 zx^?|8fN&$3>nhqJE=fU_Zfetpw Date: Tue, 4 Mar 2025 16:30:37 +0100 Subject: [PATCH 2/3] Commit file --- .../src/main/res/menu/menu_feature_overview.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 index e69de29bb2d..6d798f3ce60 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/menu/menu_feature_overview.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/menu/menu_feature_overview.xml @@ -0,0 +1,10 @@ + + + + From c1b9a41827de9bc6a939225cb5a592be077dd3a0 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 4 Mar 2025 16:31:03 +0100 Subject: [PATCH 3/3] Update strings.xml --- .../MapLibreAndroidTestApp/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) 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