include hidden apps when selecting an app

This commit is contained in:
Josia Pietsch 2024-10-18 20:15:23 +02:00
parent 335aef1d7c
commit 3dced7ace6
Signed by: jrpie
GPG key ID: E70B571D66986A2D
7 changed files with 68 additions and 26 deletions

View file

@ -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

View file

@ -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)
}

View file

@ -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<DetailedAppInfo>): List<DetailedAppInfo> {
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<AppInfo>, DetailedAppInfo) -> Boolean
) {
VISIBLE({ _, _ -> true }),
HIDDEN({ set, appInfo -> !set.contains(appInfo.app) }),
EXCLUSIVE({ set, appInfo -> set.contains(appInfo.app) }),
;
}
}
}

View file

@ -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

View file

@ -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()
}
}

View file

@ -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()
}

View file

@ -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,