diff --git a/app/src/main/java/com/finnmglas/launcher/list/apps/AppsRecyclerAdapter.kt b/app/src/main/java/com/finnmglas/launcher/list/apps/AppsRecyclerAdapter.kt index e05e140..b3cc908 100644 --- a/app/src/main/java/com/finnmglas/launcher/list/apps/AppsRecyclerAdapter.kt +++ b/app/src/main/java/com/finnmglas/launcher/list/apps/AppsRecyclerAdapter.kt @@ -8,13 +8,16 @@ import android.net.Uri import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager import android.widget.ImageView 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 +33,7 @@ class AppsRecyclerAdapter(val activity: Activity, RecyclerView.Adapter() { private val appsList: MutableList + private val appsListDisplayed: MutableList inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { @@ -40,7 +44,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 +66,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 +131,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 +140,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 +156,33 @@ 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) + } + } + } + + // Launch apps automatically if only one result is found + // TODO: Add option to disable this + if (appsListDisplayed.size == 1 && intention == "view") { + launch(appsListDisplayed[0].packageName.toString(), activity) + + val inputMethodManager = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.hideSoftInputFromWindow(View(activity).windowToken, 0) + } + + notifyDataSetChanged() } } diff --git a/app/src/main/java/com/finnmglas/launcher/list/apps/ListFragmentApps.kt b/app/src/main/java/com/finnmglas/launcher/list/apps/ListFragmentApps.kt index 5504371..2247723 100644 --- a/app/src/main/java/com/finnmglas/launcher/list/apps/ListFragmentApps.kt +++ b/app/src/main/java/com/finnmglas/launcher/list/apps/ListFragmentApps.kt @@ -8,10 +8,9 @@ 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 +35,37 @@ class ListFragmentApps : Fragment(), UIObject { override fun applyTheme() { list_apps_container.setBackgroundColor(dominantColor) + list_apps_searchview.setBackgroundColor(dominantColor) + list_apps_searchbar.setBackgroundColor(dominantColor) } 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 : + androidx.appcompat.widget.SearchView.OnQueryTextListener { + + override fun onQueryTextSubmit(query: String): Boolean { + appsRViewAdapter.filter(query); + return false + } + + override fun onQueryTextChange(newText: String): Boolean { + appsRViewAdapter.filter(newText); + return false + } + + }) } } \ No newline at end of file diff --git a/app/src/main/res/layout/list_apps.xml b/app/src/main/res/layout/list_apps.xml index 0c711a4..94f3fa3 100644 --- a/app/src/main/res/layout/list_apps.xml +++ b/app/src/main/res/layout/list_apps.xml @@ -2,10 +2,32 @@ + + + + + + app:layout_constraintTop_toBottomOf="@id/list_apps_searchbar" /> \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 695101d..6c2b558 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -6,9 +6,13 @@ @color/finnmglasTheme_background_color @color/finnmglasTheme_background_color - @color/finnmglasTheme_accent_color + #888 @color/finnmglasTheme_text_color + @color/finnmglasTheme_text_color + @color/finnmglasTheme_text_color + #555 + @style/Widget.AppCompat.Button.Colored @color/finnmglasTheme_accent_color