mirror of
https://github.com/jrpie/Launcher.git
synced 2025-02-23 14:31:30 +01:00
include hidden apps when selecting an app
This commit is contained in:
parent
335aef1d7c
commit
3dced7ace6
7 changed files with 68 additions and 26 deletions
|
@ -5,7 +5,6 @@ import android.app.Service
|
||||||
import android.app.role.RoleManager
|
import android.app.role.RoleManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.ApplicationInfo
|
|
||||||
import android.content.pm.LauncherApps
|
import android.content.pm.LauncherApps
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.ColorMatrix
|
import android.graphics.ColorMatrix
|
||||||
|
|
|
@ -10,6 +10,7 @@ import android.os.SystemClock
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import de.jrpie.android.launcher.R
|
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.apps.AppInfo.Companion.INVALID_USER
|
||||||
import de.jrpie.android.launcher.ui.list.ListActivity
|
import de.jrpie.android.launcher.ui.list.ListActivity
|
||||||
import de.jrpie.android.launcher.ui.settings.SettingsActivity
|
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) {
|
fun openAppsList(context: Context, favorite: Boolean = false, hidden: Boolean = false) {
|
||||||
val intent = Intent(context, ListActivity::class.java)
|
val intent = Intent(context, ListActivity::class.java)
|
||||||
intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString())
|
intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString())
|
||||||
intent.putExtra("favorite", favorite)
|
intent.putExtra(
|
||||||
intent.putExtra("hidden", hidden)
|
"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)
|
context.startActivity(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,19 +6,19 @@ import kotlin.text.Regex.Companion.escapeReplacement
|
||||||
|
|
||||||
class AppFilter(
|
class AppFilter(
|
||||||
var search: String,
|
var search: String,
|
||||||
var showOnlyFavorites: Boolean = false,
|
var favoritesVisibility: AppSetVisibility = AppSetVisibility.VISIBLE,
|
||||||
var showOnlyHidden: Boolean = false
|
var hiddenVisibility: AppSetVisibility = AppSetVisibility.HIDDEN,
|
||||||
) {
|
) {
|
||||||
operator fun invoke(apps: List<DetailedAppInfo>): List<DetailedAppInfo> {
|
operator fun invoke(apps: List<DetailedAppInfo>): List<DetailedAppInfo> {
|
||||||
var apps = apps
|
var apps = apps
|
||||||
|
|
||||||
val hidden = LauncherPreferences.apps().hidden() ?: setOf()
|
val hidden = LauncherPreferences.apps().hidden() ?: setOf()
|
||||||
apps = apps.filter { info -> !showOnlyHidden.xor(hidden.contains(info.app)) }
|
val favorites = LauncherPreferences.apps().favorites() ?: setOf()
|
||||||
|
apps = apps.filter { info ->
|
||||||
if (showOnlyFavorites) {
|
favoritesVisibility.predicate(favorites, info)
|
||||||
val favorites = LauncherPreferences.apps().favorites() ?: setOf()
|
&& hiddenVisibility.predicate(hidden, info)
|
||||||
apps = apps.filter { info -> favorites.contains(info.app) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// normalize text for search
|
// normalize text for search
|
||||||
var allowedSpecialCharacters = search
|
var allowedSpecialCharacters = search
|
||||||
.lowercase(Locale.ROOT)
|
.lowercase(Locale.ROOT)
|
||||||
|
@ -52,4 +52,15 @@ class AppFilter(
|
||||||
return r;
|
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) }),
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -18,6 +18,7 @@ import com.google.android.material.tabs.TabLayout
|
||||||
import de.jrpie.android.launcher.R
|
import de.jrpie.android.launcher.R
|
||||||
import de.jrpie.android.launcher.REQUEST_UNINSTALL
|
import de.jrpie.android.launcher.REQUEST_UNINSTALL
|
||||||
import de.jrpie.android.launcher.actions.LauncherAction
|
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.databinding.ListBinding
|
||||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||||
import de.jrpie.android.launcher.ui.UIObject
|
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)
|
// TODO: Better solution for this intercommunication functionality (used in list-fragments)
|
||||||
var intention = ListActivity.ListActivityIntention.VIEW
|
var intention = ListActivity.ListActivityIntention.VIEW
|
||||||
var showFavorites = false
|
var favoritesVisibility: AppFilter.Companion.AppSetVisibility = AppFilter.Companion.AppSetVisibility.VISIBLE
|
||||||
var showHidden = false
|
var hiddenVisibility: AppFilter.Companion.AppSetVisibility = AppFilter.Companion.AppSetVisibility.HIDDEN
|
||||||
var forGesture: String? = null
|
var forGesture: String? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -57,8 +58,10 @@ class ListActivity : AppCompatActivity(), UIObject {
|
||||||
?.let { ListActivityIntention.valueOf(it) }
|
?.let { ListActivityIntention.valueOf(it) }
|
||||||
?: ListActivityIntention.VIEW
|
?: ListActivityIntention.VIEW
|
||||||
|
|
||||||
showFavorites = bundle.getBoolean("favorite") ?: false
|
favoritesVisibility = bundle.getSerializable("favoritesVisibility")
|
||||||
showHidden = bundle.getBoolean("hidden") ?: false
|
as? AppFilter.Companion.AppSetVisibility ?: favoritesVisibility
|
||||||
|
hiddenVisibility = bundle.getSerializable("hiddenVisibility")
|
||||||
|
as? AppFilter.Companion.AppSetVisibility ?: favoritesVisibility
|
||||||
|
|
||||||
if (intention != ListActivityIntention.VIEW)
|
if (intention != ListActivityIntention.VIEW)
|
||||||
forGesture = bundle.getString("forGesture")
|
forGesture = bundle.getString("forGesture")
|
||||||
|
@ -126,9 +129,9 @@ class ListActivity : AppCompatActivity(), UIObject {
|
||||||
fun updateTitle() {
|
fun updateTitle() {
|
||||||
var titleResource = intention.titleResource
|
var titleResource = intention.titleResource
|
||||||
if (intention == ListActivityIntention.VIEW) {
|
if (intention == ListActivityIntention.VIEW) {
|
||||||
titleResource = if (showHidden) {
|
titleResource = if (hiddenVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
|
||||||
R.string.list_title_hidden
|
R.string.list_title_hidden
|
||||||
} else if (showFavorites) {
|
} else if (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
|
||||||
R.string.list_title_favorite
|
R.string.list_title_favorite
|
||||||
} else {
|
} else {
|
||||||
R.string.list_title_view
|
R.string.list_title_view
|
||||||
|
|
|
@ -258,13 +258,13 @@ class AppsRecyclerAdapter(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setShowOnlyFavorites(show: Boolean) {
|
fun setFavoritesVisibility(v: AppFilter.Companion.AppSetVisibility) {
|
||||||
appFilter.showOnlyFavorites = show
|
appFilter.favoritesVisibility = v;
|
||||||
updateAppsList()
|
updateAppsList()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setShowHiddenApps(show: Boolean) {
|
fun setHiddenAppsVisibility(v: AppFilter.Companion.AppSetVisibility) {
|
||||||
appFilter.showOnlyHidden = show
|
appFilter.hiddenVisibility = v;
|
||||||
updateAppsList()
|
updateAppsList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,10 +13,10 @@ import de.jrpie.android.launcher.openSoftKeyboard
|
||||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||||
import de.jrpie.android.launcher.ui.UIObject
|
import de.jrpie.android.launcher.ui.UIObject
|
||||||
import de.jrpie.android.launcher.ui.list.ListActivity
|
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.forGesture
|
||||||
|
import de.jrpie.android.launcher.ui.list.hiddenVisibility
|
||||||
import de.jrpie.android.launcher.ui.list.intention
|
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()
|
LauncherPreferences.getSharedPreferences()
|
||||||
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
|
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
|
||||||
|
|
||||||
binding.listAppsCheckBoxFavorites.isChecked = showFavorites
|
binding.listAppsCheckBoxFavorites.isChecked =
|
||||||
|
(favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStop() {
|
override fun onStop() {
|
||||||
|
@ -64,7 +65,11 @@ class ListFragmentApps : Fragment(), UIObject {
|
||||||
appsRViewAdapter =
|
appsRViewAdapter =
|
||||||
AppsRecyclerAdapter(
|
AppsRecyclerAdapter(
|
||||||
requireActivity(), binding.root, intention, forGesture,
|
requireActivity(), binding.root, intention, forGesture,
|
||||||
appFilter = AppFilter("", showOnlyFavorites = showFavorites, showOnlyHidden = showHidden)
|
appFilter = AppFilter(
|
||||||
|
"",
|
||||||
|
favoritesVisibility = favoritesVisibility,
|
||||||
|
hiddenVisibility = hiddenVisibility
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
// set up the list / recycler
|
// set up the list / recycler
|
||||||
|
@ -72,6 +77,7 @@ class ListFragmentApps : Fragment(), UIObject {
|
||||||
// improve performance (since content changes don't change the layout size)
|
// improve performance (since content changes don't change the layout size)
|
||||||
setHasFixedSize(true)
|
setHasFixedSize(true)
|
||||||
layoutManager = LinearLayoutManager(context)
|
layoutManager = LinearLayoutManager(context)
|
||||||
|
// TODO: option to change this to GridLayoutManager(context, numCols)
|
||||||
adapter = appsRViewAdapter
|
adapter = appsRViewAdapter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,8 +97,13 @@ class ListFragmentApps : Fragment(), UIObject {
|
||||||
})
|
})
|
||||||
|
|
||||||
binding.listAppsCheckBoxFavorites.setOnClickListener {
|
binding.listAppsCheckBoxFavorites.setOnClickListener {
|
||||||
showFavorites = binding.listAppsCheckBoxFavorites.isChecked
|
favoritesVisibility =
|
||||||
appsRViewAdapter.setShowOnlyFavorites(showFavorites)
|
if (binding.listAppsCheckBoxFavorites.isChecked) {
|
||||||
|
AppFilter.Companion.AppSetVisibility.EXCLUSIVE
|
||||||
|
} else {
|
||||||
|
AppFilter.Companion.AppSetVisibility.VISIBLE
|
||||||
|
}
|
||||||
|
appsRViewAdapter.setFavoritesVisibility(favoritesVisibility)
|
||||||
(activity as? ListActivity)?.updateTitle()
|
(activity as? ListActivity)?.updateTitle()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ import de.jrpie.android.launcher.R
|
||||||
import de.jrpie.android.launcher.REQUEST_CHOOSE_APP
|
import de.jrpie.android.launcher.REQUEST_CHOOSE_APP
|
||||||
import de.jrpie.android.launcher.actions.Action
|
import de.jrpie.android.launcher.actions.Action
|
||||||
import de.jrpie.android.launcher.actions.Gesture
|
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.databinding.SettingsActionsRecyclerBinding
|
||||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||||
import de.jrpie.android.launcher.transformGrayscale
|
import de.jrpie.android.launcher.transformGrayscale
|
||||||
|
@ -155,6 +156,7 @@ class ActionsRecyclerAdapter(val activity: Activity) :
|
||||||
private fun chooseApp(gesture: Gesture) {
|
private fun chooseApp(gesture: Gesture) {
|
||||||
val intent = Intent(activity, ListActivity::class.java)
|
val intent = Intent(activity, ListActivity::class.java)
|
||||||
intent.putExtra("intention", ListActivity.ListActivityIntention.PICK.toString())
|
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
|
intent.putExtra("forGesture", gesture.id) // for which action we choose the app
|
||||||
activity.startActivityForResult(
|
activity.startActivityForResult(
|
||||||
intent,
|
intent,
|
||||||
|
|
Loading…
Add table
Reference in a new issue