Create a working SearchView for the appslist

- Add a `filter` method to `AppsRecyclerView`
- Add a `SearchView` to layout
This commit is contained in:
Finn M Glas 2020-06-21 15:27:27 +02:00
parent 56fb5a063d
commit 2b96b3140d
No known key found for this signature in database
GPG key ID: 902A30146014DFBF
3 changed files with 69 additions and 12 deletions

View file

@ -13,8 +13,10 @@ import android.widget.PopupMenu
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.finnmglas.launcher.*
import com.finnmglas.launcher.libraries.*
import com.finnmglas.launcher.libraries.FontAwesome
import com.finnmglas.launcher.list.intendedChoosePause
import java.util.*
import kotlin.collections.ArrayList
/**
* A [RecyclerView] (efficient scrollable list) containing all apps on the users device.
@ -30,6 +32,7 @@ class AppsRecyclerAdapter(val activity: Activity,
RecyclerView.Adapter<AppsRecyclerAdapter.ViewHolder>() {
private val appsList: MutableList<AppInfo>
private val appsListDisplayed: MutableList<AppInfo>
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
@ -40,7 +43,7 @@ class AppsRecyclerAdapter(val activity: Activity,
override fun onClick(v: View) {
val pos = adapterPosition
val context: Context = v.context
val appPackageName = appsList[pos].packageName.toString()
val appPackageName = appsListDisplayed[pos].packageName.toString()
when (intention){
"view" -> {
@ -62,10 +65,10 @@ class AppsRecyclerAdapter(val activity: Activity,
}
override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
val appLabel = appsList[i].label.toString()
val appPackageName = appsList[i].packageName.toString()
val appIcon = appsList[i].icon
val isSystemApp = appsList[i].isSystemApp
val appLabel = appsListDisplayed[i].label.toString()
val appPackageName = appsListDisplayed[i].packageName.toString()
val appIcon = appsListDisplayed[i].icon
val isSystemApp = appsListDisplayed[i].isSystemApp
viewHolder.textView.text = appLabel
viewHolder.img.setImageDrawable(appIcon)
@ -127,7 +130,7 @@ class AppsRecyclerAdapter(val activity: Activity,
return true
}
override fun getItemCount(): Int { return appsList.size }
override fun getItemCount(): Int { return appsListDisplayed.size }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
@ -136,8 +139,11 @@ class AppsRecyclerAdapter(val activity: Activity,
}
init {
val pm: PackageManager = activity.packageManager
appsList = ArrayList()
appsListDisplayed = ArrayList()
val pm: PackageManager = activity.packageManager
val i = Intent(Intent.ACTION_MAIN, null)
i.addCategory(Intent.CATEGORY_LAUNCHER)
val allApps = pm.queryIntentActivities(i, 0)
@ -149,5 +155,23 @@ class AppsRecyclerAdapter(val activity: Activity,
appsList.add(app)
}
appsList.sortBy { it.label.toString() }
appsListDisplayed.addAll(appsList)
}
/**
* The function [filter] is used to search elements within this [RecyclerView].
*/
fun filter(text: String) {
appsListDisplayed.clear()
if (text.isEmpty()) {
appsListDisplayed.addAll(appsList)
} else {
for (item in appsList) {
if (item.label.toString().toLowerCase(Locale.ROOT).contains(text.toLowerCase(Locale.ROOT))) {
appsListDisplayed.add(item)
}
}
}
notifyDataSetChanged()
}
}

View file

@ -1,17 +1,19 @@
package com.finnmglas.launcher.list.apps
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.SearchView
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.finnmglas.launcher.R
import com.finnmglas.launcher.UIObject
import com.finnmglas.launcher.list.intention
import com.finnmglas.launcher.list.forApp
import com.finnmglas.launcher.dominantColor
import com.finnmglas.launcher.getSavedTheme
import com.finnmglas.launcher.list.forApp
import com.finnmglas.launcher.list.intention
import kotlinx.android.synthetic.main.list_apps.*
@ -36,17 +38,38 @@ class ListFragmentApps : Fragment(), UIObject {
override fun applyTheme() {
list_apps_container.setBackgroundColor(dominantColor)
val id: Int = list_apps_searchview.context.resources
.getIdentifier("android:id/search_src_text", null, null)
list_apps_searchview.findViewById<TextView>(id).setTextColor(Color.WHITE)
}
override fun setOnClicks() { }
override fun adjustLayout() {
val appsRViewAdapter = AppsRecyclerAdapter(activity!!, intention, forApp)
// set up the list / recycler
list_apps_rview.apply {
// improve performance (since content changes don't change the layout size)
setHasFixedSize(true)
layoutManager = LinearLayoutManager(context)
adapter = AppsRecyclerAdapter(activity!!, intention, forApp)
adapter = appsRViewAdapter
}
list_apps_searchview.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
appsRViewAdapter.filter(query);
return false
}
override fun onQueryTextChange(newText: String): Boolean {
appsRViewAdapter.filter(newText);
return false
}
})
}
}

View file

@ -2,6 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_apps_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -12,6 +13,7 @@
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:scrollbars="vertical"
@ -20,4 +22,12 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<SearchView
android:id="@+id/list_apps_searchview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>