diff options
| author | Dirk Sierd de Vries <contact@lecapuchon.nl> | 2026-08-12 01:10:02 +0200 |
|---|---|---|
| committer | Dirk Sierd de Vries <contact@lecapuchon.nl> | 2026-08-12 01:10:02 +0200 |
| commit | 78b5e4f678fdc96cca2905a6bde0397269bfca3d (patch) | |
| tree | edc445cee2e9f74e39d0ffc3ea553d7b2819e315 /app | |
| parent | 056f2cc89b6489b19d9f10fb7c11c4db0ee68bb8 (diff) | |
| download | SidePhOnelauncher-78b5e4f678fdc96cca2905a6bde0397269bfca3d.tar.gz SidePhOnelauncher-78b5e4f678fdc96cca2905a6bde0397269bfca3d.tar.bz2 SidePhOnelauncher-78b5e4f678fdc96cca2905a6bde0397269bfca3d.zip | |
Add app drawer spacer and dpad-left back navigation
Diffstat (limited to 'app')
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" /> |
