From 3dced7ace6818bf3f7165bb3773b238affbe6013 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Fri, 18 Oct 2024 20:15:23 +0200 Subject: [PATCH] include hidden apps when selecting an app --- .../de/jrpie/android/launcher/Functions.kt | 1 - .../launcher/actions/LauncherAction.kt | 20 +++++++++++++-- .../jrpie/android/launcher/apps/AppFilter.kt | 25 +++++++++++++------ .../android/launcher/ui/list/ListActivity.kt | 15 ++++++----- .../ui/list/apps/AppsRecyclerAdapter.kt | 8 +++--- .../launcher/ui/list/apps/ListFragmentApps.kt | 23 ++++++++++++----- .../SettingsFragmentActionsRecycler.kt | 2 ++ 7 files changed, 68 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index 0db033d..f2d151d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -5,7 +5,6 @@ import android.app.Service import android.app.role.RoleManager import android.content.Context import android.content.Intent -import android.content.pm.ApplicationInfo import android.content.pm.LauncherApps import android.content.pm.PackageManager import android.graphics.ColorMatrix diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt index a3acbb7..6442f47 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt @@ -10,6 +10,7 @@ import android.os.SystemClock import android.view.KeyEvent import android.widget.Toast import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.apps.AppInfo.Companion.INVALID_USER import de.jrpie.android.launcher.ui.list.ListActivity import de.jrpie.android.launcher.ui.settings.SettingsActivity @@ -183,8 +184,23 @@ private fun openSettings(context: Context) { fun openAppsList(context: Context, favorite: Boolean = false, hidden: Boolean = false) { val intent = Intent(context, ListActivity::class.java) intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString()) - intent.putExtra("favorite", favorite) - intent.putExtra("hidden", hidden) + intent.putExtra( + "favoritesVisibility", + if (favorite) { + AppFilter.Companion.AppSetVisibility.EXCLUSIVE + } else { + AppFilter.Companion.AppSetVisibility.VISIBLE + } + ) + intent.putExtra( + "hiddenVisibility", + if (hidden) { + AppFilter.Companion.AppSetVisibility.EXCLUSIVE + } else { + AppFilter.Companion.AppSetVisibility.HIDDEN + } + ) + context.startActivity(intent) } diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/AppFilter.kt b/app/src/main/java/de/jrpie/android/launcher/apps/AppFilter.kt index a0c0490..a2420f7 100644 --- a/app/src/main/java/de/jrpie/android/launcher/apps/AppFilter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/apps/AppFilter.kt @@ -6,19 +6,19 @@ import kotlin.text.Regex.Companion.escapeReplacement class AppFilter( var search: String, - var showOnlyFavorites: Boolean = false, - var showOnlyHidden: Boolean = false + var favoritesVisibility: AppSetVisibility = AppSetVisibility.VISIBLE, + var hiddenVisibility: AppSetVisibility = AppSetVisibility.HIDDEN, ) { operator fun invoke(apps: List): List { var apps = apps val hidden = LauncherPreferences.apps().hidden() ?: setOf() - apps = apps.filter { info -> !showOnlyHidden.xor(hidden.contains(info.app)) } - - if (showOnlyFavorites) { - val favorites = LauncherPreferences.apps().favorites() ?: setOf() - apps = apps.filter { info -> favorites.contains(info.app) } + val favorites = LauncherPreferences.apps().favorites() ?: setOf() + apps = apps.filter { info -> + favoritesVisibility.predicate(favorites, info) + && hiddenVisibility.predicate(hidden, info) } + // normalize text for search var allowedSpecialCharacters = search .lowercase(Locale.ROOT) @@ -52,4 +52,15 @@ class AppFilter( return r; } } + + companion object { + enum class AppSetVisibility( + val predicate: (set: Set, DetailedAppInfo) -> Boolean + ) { + VISIBLE({ _, _ -> true }), + HIDDEN({ set, appInfo -> !set.contains(appInfo.app) }), + EXCLUSIVE({ set, appInfo -> set.contains(appInfo.app) }), + ; + } + } } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt index 1074fb4..5a01237 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt @@ -18,6 +18,7 @@ import com.google.android.material.tabs.TabLayout import de.jrpie.android.launcher.R import de.jrpie.android.launcher.REQUEST_UNINSTALL import de.jrpie.android.launcher.actions.LauncherAction +import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.databinding.ListBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.UIObject @@ -27,8 +28,8 @@ import de.jrpie.android.launcher.ui.list.other.ListFragmentOther // TODO: Better solution for this intercommunication functionality (used in list-fragments) var intention = ListActivity.ListActivityIntention.VIEW -var showFavorites = false -var showHidden = false +var favoritesVisibility: AppFilter.Companion.AppSetVisibility = AppFilter.Companion.AppSetVisibility.VISIBLE +var hiddenVisibility: AppFilter.Companion.AppSetVisibility = AppFilter.Companion.AppSetVisibility.HIDDEN var forGesture: String? = null /** @@ -57,8 +58,10 @@ class ListActivity : AppCompatActivity(), UIObject { ?.let { ListActivityIntention.valueOf(it) } ?: ListActivityIntention.VIEW - showFavorites = bundle.getBoolean("favorite") ?: false - showHidden = bundle.getBoolean("hidden") ?: false + favoritesVisibility = bundle.getSerializable("favoritesVisibility") + as? AppFilter.Companion.AppSetVisibility ?: favoritesVisibility + hiddenVisibility = bundle.getSerializable("hiddenVisibility") + as? AppFilter.Companion.AppSetVisibility ?: favoritesVisibility if (intention != ListActivityIntention.VIEW) forGesture = bundle.getString("forGesture") @@ -126,9 +129,9 @@ class ListActivity : AppCompatActivity(), UIObject { fun updateTitle() { var titleResource = intention.titleResource if (intention == ListActivityIntention.VIEW) { - titleResource = if (showHidden) { + titleResource = if (hiddenVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { R.string.list_title_hidden - } else if (showFavorites) { + } else if (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { R.string.list_title_favorite } else { R.string.list_title_view diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt index 618236a..2a42ed7 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt @@ -258,13 +258,13 @@ class AppsRecyclerAdapter( } - fun setShowOnlyFavorites(show: Boolean) { - appFilter.showOnlyFavorites = show + fun setFavoritesVisibility(v: AppFilter.Companion.AppSetVisibility) { + appFilter.favoritesVisibility = v; updateAppsList() } - fun setShowHiddenApps(show: Boolean) { - appFilter.showOnlyHidden = show + fun setHiddenAppsVisibility(v: AppFilter.Companion.AppSetVisibility) { + appFilter.hiddenVisibility = v; updateAppsList() } } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt index 441e88a..c5b840d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt @@ -13,10 +13,10 @@ import de.jrpie.android.launcher.openSoftKeyboard import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.UIObject import de.jrpie.android.launcher.ui.list.ListActivity +import de.jrpie.android.launcher.ui.list.favoritesVisibility import de.jrpie.android.launcher.ui.list.forGesture +import de.jrpie.android.launcher.ui.list.hiddenVisibility import de.jrpie.android.launcher.ui.list.intention -import de.jrpie.android.launcher.ui.list.showFavorites -import de.jrpie.android.launcher.ui.list.showHidden /** @@ -47,7 +47,8 @@ class ListFragmentApps : Fragment(), UIObject { LauncherPreferences.getSharedPreferences() .registerOnSharedPreferenceChangeListener(sharedPreferencesListener) - binding.listAppsCheckBoxFavorites.isChecked = showFavorites + binding.listAppsCheckBoxFavorites.isChecked = + (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) } override fun onStop() { @@ -64,7 +65,11 @@ class ListFragmentApps : Fragment(), UIObject { appsRViewAdapter = AppsRecyclerAdapter( requireActivity(), binding.root, intention, forGesture, - appFilter = AppFilter("", showOnlyFavorites = showFavorites, showOnlyHidden = showHidden) + appFilter = AppFilter( + "", + favoritesVisibility = favoritesVisibility, + hiddenVisibility = hiddenVisibility + ) ) // set up the list / recycler @@ -72,6 +77,7 @@ class ListFragmentApps : Fragment(), UIObject { // improve performance (since content changes don't change the layout size) setHasFixedSize(true) layoutManager = LinearLayoutManager(context) + // TODO: option to change this to GridLayoutManager(context, numCols) adapter = appsRViewAdapter } @@ -91,8 +97,13 @@ class ListFragmentApps : Fragment(), UIObject { }) binding.listAppsCheckBoxFavorites.setOnClickListener { - showFavorites = binding.listAppsCheckBoxFavorites.isChecked - appsRViewAdapter.setShowOnlyFavorites(showFavorites) + favoritesVisibility = + if (binding.listAppsCheckBoxFavorites.isChecked) { + AppFilter.Companion.AppSetVisibility.EXCLUSIVE + } else { + AppFilter.Companion.AppSetVisibility.VISIBLE + } + appsRViewAdapter.setFavoritesVisibility(favoritesVisibility) (activity as? ListActivity)?.updateTitle() } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt index 9d9685f..f80a558 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/actions/SettingsFragmentActionsRecycler.kt @@ -17,6 +17,7 @@ import de.jrpie.android.launcher.R import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.actions.Action import de.jrpie.android.launcher.actions.Gesture +import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.databinding.SettingsActionsRecyclerBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.transformGrayscale @@ -155,6 +156,7 @@ class ActionsRecyclerAdapter(val activity: Activity) : private fun chooseApp(gesture: Gesture) { val intent = Intent(activity, ListActivity::class.java) intent.putExtra("intention", ListActivity.ListActivityIntention.PICK.toString()) + intent.putExtra("hiddenVisibility", AppFilter.Companion.AppSetVisibility.VISIBLE) intent.putExtra("forGesture", gesture.id) // for which action we choose the app activity.startActivityForResult( intent,