summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDirk Sierd de Vries <contact@lecapuchon.nl>2026-08-12 01:10:02 +0200
committerDirk Sierd de Vries <contact@lecapuchon.nl>2026-08-12 01:10:02 +0200
commit78b5e4f678fdc96cca2905a6bde0397269bfca3d (patch)
treeedc445cee2e9f74e39d0ffc3ea553d7b2819e315 /app
parent056f2cc89b6489b19d9f10fb7c11c4db0ee68bb8 (diff)
downloadSidePhOnelauncher-78b5e4f678fdc96cca2905a6bde0397269bfca3d.tar.gz
SidePhOnelauncher-78b5e4f678fdc96cca2905a6bde0397269bfca3d.tar.bz2
SidePhOnelauncher-78b5e4f678fdc96cca2905a6bde0397269bfca3d.zip
Add app drawer spacer and dpad-left back navigation
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/app/sidephonelauncher/MainViewModel.kt6
-rw-r--r--app/src/main/java/app/sidephonelauncher/data/AppModel.kt9
-rw-r--r--app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt52
-rw-r--r--app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt3
-rw-r--r--app/src/main/res/layout/adapter_app_drawer_spacer.xml6
5 files changed, 56 insertions, 20 deletions
diff --git a/app/src/main/java/app/sidephonelauncher/MainViewModel.kt b/app/src/main/java/app/sidephonelauncher/MainViewModel.kt
index 0dec083..d1f5d8d 100644
--- a/app/src/main/java/app/sidephonelauncher/MainViewModel.kt
+++ b/app/src/main/java/app/sidephonelauncher/MainViewModel.kt
@@ -66,7 +66,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
// val showRecentApps = SingleLiveEvent<Unit?>()
fun selectedApp(appModel: AppModel, flag: Int) {
- if (appModel is AppModel.PrivateSpaceHeader) return
+ if (appModel is AppModel.PrivateSpaceHeader || appModel is AppModel.Spacer) return
when (flag) {
Constants.FLAG_LAUNCH_APP -> {
when (appModel) {
@@ -114,7 +114,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
private fun saveHomeApp(appModel: AppModel, position: Int) {
when (appModel) {
- is AppModel.PrivateSpaceHeader -> return
+ is AppModel.PrivateSpaceHeader, is AppModel.Spacer -> return
is AppModel.App -> {
when (position) {
1 -> {
@@ -272,7 +272,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
private fun saveSwipeApp(appModel: AppModel, isLeft: Boolean) {
when (appModel) {
- is AppModel.PrivateSpaceHeader -> return
+ is AppModel.PrivateSpaceHeader, is AppModel.Spacer -> return
is AppModel.App -> {
if (isLeft) {
prefs.appNameSwipeLeft = appModel.appLabel
diff --git a/app/src/main/java/app/sidephonelauncher/data/AppModel.kt b/app/src/main/java/app/sidephonelauncher/data/AppModel.kt
index 8f64714..7409c9a 100644
--- a/app/src/main/java/app/sidephonelauncher/data/AppModel.kt
+++ b/app/src/main/java/app/sidephonelauncher/data/AppModel.kt
@@ -38,6 +38,15 @@ sealed class AppModel : Comparable<AppModel> {
override val isNew: Boolean = false
}
+ data class Spacer(
+ override val user: UserHandle = android.os.Process.myUserHandle(),
+ ) : AppModel() {
+ override val appLabel: String = ""
+ override val key: CollationKey? = null
+ override val appPackage: String = ""
+ override val isNew: Boolean = false
+ }
+
override fun compareTo(other: AppModel): Int = when {
key != null && other.key != null -> key!!.compareTo(other.key)
else -> appLabel.compareTo(other.appLabel, true)
diff --git a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt
index ba3138e..65ed4ba 100644
--- a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt
+++ b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt
@@ -20,6 +20,7 @@ import app.sidephonelauncher.R
import app.sidephonelauncher.data.AppModel
import app.sidephonelauncher.data.Constants
import app.sidephonelauncher.databinding.AdapterAppDrawerBinding
+import app.sidephonelauncher.databinding.AdapterAppDrawerSpacerBinding
import app.sidephonelauncher.databinding.AdapterPrivateSpaceHeaderBinding
import app.sidephonelauncher.helper.hideKeyboard
import app.sidephonelauncher.helper.isSystemApp
@@ -34,6 +35,7 @@ class AppDrawerAdapter(
private val appDeleteListener: (AppModel) -> Unit,
private val appHideListener: (AppModel, Int) -> Unit,
private val appRenameListener: (AppModel, String) -> Unit,
+ private val appLeftListener: () -> Boolean = { false },
private val privateSpaceToggleListener: () -> Unit = {},
private val privateSpaceSettingsListener: () -> Unit = {},
) : ListAdapter<AppModel, RecyclerView.ViewHolder>(DIFF_CALLBACK), Filterable {
@@ -41,6 +43,7 @@ class AppDrawerAdapter(
companion object {
const val VIEW_TYPE_APP = 0
const val VIEW_TYPE_PRIVATE_HEADER = 1
+ const val VIEW_TYPE_SPACER = 2
val DIFF_CALLBACK = object : DiffUtil.ItemCallback<AppModel>() {
override fun areItemsTheSame(oldItem: AppModel, newItem: AppModel): Boolean = when {
@@ -51,6 +54,7 @@ class AppDrawerAdapter(
oldItem.shortcutId == newItem.shortcutId && oldItem.user == newItem.user
oldItem is AppModel.PrivateSpaceHeader && newItem is AppModel.PrivateSpaceHeader -> true
+ oldItem is AppModel.Spacer && newItem is AppModel.Spacer -> true
else -> false
}
@@ -74,6 +78,7 @@ class AppDrawerAdapter(
override fun getItemViewType(position: Int): Int {
return when (appFilteredList.getOrNull(position)) {
is AppModel.PrivateSpaceHeader -> VIEW_TYPE_PRIVATE_HEADER
+ is AppModel.Spacer -> VIEW_TYPE_SPACER
else -> VIEW_TYPE_APP
}
}
@@ -87,6 +92,13 @@ class AppDrawerAdapter(
false
)
)
+ VIEW_TYPE_SPACER -> SpacerViewHolder(
+ AdapterAppDrawerSpacerBinding.inflate(
+ LayoutInflater.from(parent.context),
+ parent,
+ false
+ )
+ )
else -> ViewHolder(
AdapterAppDrawerBinding.inflate(
LayoutInflater.from(parent.context),
@@ -118,8 +130,10 @@ class AppDrawerAdapter(
appDeleteListener,
appInfoListener,
appHideListener,
- appRenameListener
+ appRenameListener,
+ appLeftListener,
)
+ is SpacerViewHolder -> Unit
}
} catch (e: Exception) {
e.printStackTrace()
@@ -138,9 +152,11 @@ class AppDrawerAdapter(
appsList.toMutableList()
} else {
appsList.filter { app ->
- app !is AppModel.PrivateSpaceHeader && appLabelMatches(app.appLabel, charSearch)
+ app !is AppModel.PrivateSpaceHeader
+ && app !is AppModel.Spacer
+ && appLabelMatches(app.appLabel, charSearch)
}.toMutableList()
- }
+ }.appendSpacerItem()
val filterResults = FilterResults()
filterResults.values = appFilteredList
@@ -187,19 +203,10 @@ class AppDrawerAdapter(
.replace(separatorsRegex, "")
fun setAppList(appsList: MutableList<AppModel>) {
- appsList.add(
- AppModel.App(
- appLabel = "",
- key = null,
- appPackage = "",
- activityClassName = "",
- isNew = false,
- user = android.os.Process.myUserHandle()
- )
- )
- this.appsList = appsList
- this.appFilteredList = appsList
- submitList(appsList)
+ val listWithSpacer = appsList.toMutableList().appendSpacerItem()
+ this.appsList = listWithSpacer
+ this.appFilteredList = listWithSpacer
+ submitList(listWithSpacer)
}
fun hasLaunchableResults(): Boolean {
@@ -213,6 +220,12 @@ class AppDrawerAdapter(
if (first != null) appClickListener(first)
}
+ private fun MutableList<AppModel>.appendSpacerItem(): MutableList<AppModel> {
+ removeAll { it is AppModel.Spacer }
+ add(AppModel.Spacer())
+ return this
+ }
+
class PrivateSpaceHeaderViewHolder(private val binding: AdapterPrivateSpaceHeaderBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(
@@ -229,6 +242,9 @@ class AppDrawerAdapter(
}
}
+ class SpacerViewHolder(binding: AdapterAppDrawerSpacerBinding) :
+ RecyclerView.ViewHolder(binding.root)
+
class ViewHolder(private val binding: AdapterAppDrawerBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(
@@ -241,6 +257,7 @@ class AppDrawerAdapter(
appInfoListener: (AppModel) -> Unit,
appHideListener: (AppModel, Int) -> Unit,
appRenameListener: (AppModel, String) -> Unit,
+ appLeftListener: () -> Boolean,
) = with(binding) {
appHideLayout.visibility = View.GONE
renameLayout.visibility = View.GONE
@@ -295,6 +312,9 @@ class AppDrawerAdapter(
else -> false
}
}
+ KeyEvent.KEYCODE_DPAD_LEFT -> {
+ if (event.action == KeyEvent.ACTION_DOWN) appLeftListener() else false
+ }
else -> false
}
}
diff --git a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt
index 6a08c70..1565170 100644
--- a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt
+++ b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt
@@ -233,7 +233,7 @@ class AppDrawerFragment : Fragment() {
},
appDeleteListener = { appModel ->
when (appModel) {
- is AppModel.PrivateSpaceHeader -> {}
+ is AppModel.PrivateSpaceHeader, is AppModel.Spacer -> {}
is AppModel.PinnedShortcut ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
requireContext().deletePinnedShortcut(
@@ -293,6 +293,7 @@ class AppDrawerFragment : Fragment() {
prefs.setAppRenameLabel(identifier, renameLabel)
viewModel.getAppList()
},
+ appLeftListener = ::handleSearchLeftKey,
privateSpaceToggleListener = {
viewModel.togglePrivateSpaceLock()
},
diff --git a/app/src/main/res/layout/adapter_app_drawer_spacer.xml b/app/src/main/res/layout/adapter_app_drawer_spacer.xml
new file mode 100644
index 0000000..d5aefe0
--- /dev/null
+++ b/app/src/main/res/layout/adapter_app_drawer_spacer.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Space xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="72dp"
+ android:focusable="false"
+ android:focusableInTouchMode="false" />