Feature: Added the ability to close app draw by scrolling down from the top.

This commit is contained in:
HeCodes2Much
2024-11-24 19:53:04 +00:00
parent 64e12b1767
commit b2141eb666
3 changed files with 56 additions and 22 deletions

View File

@@ -16,6 +16,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.github.droidworksstudio.common.hideKeyboard
import com.github.droidworksstudio.common.launchApp
@@ -98,6 +99,7 @@ class DrawFragment : Fragment(),
setupSearch()
observeClickListener()
observeSwipeTouchListener()
observeScrollTouchListener()
// Initialize observation of drawer apps
observeDrawerApps()
@@ -174,6 +176,41 @@ class DrawFragment : Fragment(),
}
}
@SuppressLint("ClickableViewAccessibility")
private fun observeScrollTouchListener() {
binding.apply {
drawAdapter.addOnScrollListener(getRecyclerViewOnScrollListener())
}
}
private fun getRecyclerViewOnScrollListener(): RecyclerView.OnScrollListener {
return object : RecyclerView.OnScrollListener() {
var onTop = false
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
when (newState) {
RecyclerView.SCROLL_STATE_DRAGGING -> {
onTop = !recyclerView.canScrollVertically(-1)
if (onTop) binding.searchViewText.hideKeyboard()
if (onTop && !recyclerView.canScrollVertically(1))
findNavController().popBackStack()
}
RecyclerView.SCROLL_STATE_IDLE -> {
if (!recyclerView.canScrollVertically(1)) {
binding.searchViewText.hideKeyboard()
} else if (!recyclerView.canScrollVertically(-1)) {
if (onTop) findNavController().popBackStack()
else binding.searchViewText.showKeyboard()
}
}
}
}
}
}
private fun getSwipeGestureListener(context: Context): View.OnTouchListener {
return object : OnSwipeTouchListener(context) {
override fun onSwipeLeft() {

View File

@@ -195,32 +195,31 @@ class HomeFragment : Fragment(),
}
private fun setupRecyclerView() {
val marginTopInPixels = 128
val params: ViewGroup.LayoutParams = binding.appListAdapter.layoutParams
val layoutParam = if (params is LinearLayout.LayoutParams) {
params
} else {
LinearLayout.LayoutParams(params)
}
layoutParam.topMargin = marginTopInPixels
val marginInPixels = 128
when (preferenceHelper.homeAppAlignment) {
Gravity.START -> {
layoutParam.gravity = Gravity.START
}
// Ensure correct type for layout params
val layoutParams = (binding.appListAdapter.layoutParams as? LinearLayout.LayoutParams)
?: LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
Gravity.CENTER -> {
layoutParam.gravity = Gravity.CENTER
}
// Set the bottom margin instead of top
layoutParams.bottomMargin = marginInPixels
layoutParams.topMargin = marginInPixels
Gravity.END -> {
layoutParam.gravity = Gravity.END
}
// Set gravity to align RecyclerView to the bottom
layoutParams.gravity = when (preferenceHelper.homeAppAlignment) {
Gravity.START -> Gravity.START or Gravity.BOTTOM
Gravity.CENTER -> Gravity.CENTER or Gravity.BOTTOM
Gravity.END -> Gravity.END or Gravity.BOTTOM
else -> Gravity.BOTTOM
}
// Apply configurations to RecyclerView
binding.appListAdapter.apply {
adapter = homeAdapter
layoutParams = layoutParam
this.layoutParams = layoutParams
setHasFixedSize(false)
layoutManager = StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL)
isNestedScrollingEnabled = false

View File

@@ -78,11 +78,9 @@ class HomeViewHolder @Inject constructor(
}
else -> {
appHomeIcon.visibility = View.GONE
parentLayout.addView(appHomeName)
}
}
} else {
appHomeIcon.visibility = View.GONE
}
}