From 051335107deb4f8db599ab74847d3d27b1f7e8ea Mon Sep 17 00:00:00 2001 From: HeCodes2Much Date: Tue, 26 Nov 2024 16:00:52 +0000 Subject: [PATCH] Fix: Fixed the home screen gestures not working in blank spaces. --- .../listener/OnItemClickedListener.kt | 10 +-- .../launcher/listener/OnSwipeTouchListener.kt | 2 +- .../listener/ViewSwipeTouchListener.kt | 79 +++++++++++++++++++ .../AppInfoBottomSheetFragment.kt | 5 -- .../launcher/ui/drawer/DrawFragment.kt | 2 - .../launcher/ui/favorite/FavoriteFragment.kt | 1 - .../launcher/ui/hidden/HiddenFragment.kt | 2 - .../launcher/ui/home/HomeFragment.kt | 58 +++++++++++++- 8 files changed, 137 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/github/droidworksstudio/launcher/listener/ViewSwipeTouchListener.kt diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemClickedListener.kt b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemClickedListener.kt index e4c482a..b7a9b84 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemClickedListener.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemClickedListener.kt @@ -4,19 +4,15 @@ import com.github.droidworksstudio.launcher.data.entities.AppInfo class OnItemClickedListener { - interface OnAppsClickedListener{ + interface OnAppsClickedListener { fun onAppClicked(appInfo: AppInfo) {} } - interface OnAppLongClickedListener{ + interface OnAppLongClickedListener { fun onAppLongClicked(appInfo: AppInfo) {} } - interface BottomSheetDismissListener { - fun onBottomSheetDismissed() {} - } - - interface OnAppStateClickListener{ + interface OnAppStateClickListener { fun onAppStateClicked(appInfo: AppInfo) {} } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt index 619cc63..c138cbc 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt @@ -85,7 +85,7 @@ internal open class OnSwipeTouchListener(c: Context?) : OnTouchListener { if (diffY < 0) onSwipeUp() else onSwipeDown() } } - } catch (exception: NullPointerException) { + } catch (_: NullPointerException) { return false } return false diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/listener/ViewSwipeTouchListener.kt b/app/src/main/java/com/github/droidworksstudio/launcher/listener/ViewSwipeTouchListener.kt new file mode 100644 index 0000000..638cd57 --- /dev/null +++ b/app/src/main/java/com/github/droidworksstudio/launcher/listener/ViewSwipeTouchListener.kt @@ -0,0 +1,79 @@ +package com.github.droidworksstudio.launcher.listener + +import android.annotation.SuppressLint +import android.content.Context +import android.view.GestureDetector +import android.view.GestureDetector.SimpleOnGestureListener +import android.view.MotionEvent +import android.view.View +import android.view.View.OnTouchListener +import kotlin.math.abs + +internal open class ViewSwipeTouchListener(c: Context?, v: View) : OnTouchListener { + private val gestureDetector: GestureDetector = GestureDetector(c, GestureListener(v)) + + @SuppressLint("ClickableViewAccessibility") + override fun onTouch(view: View, motionEvent: MotionEvent): Boolean { + when (motionEvent.action) { + MotionEvent.ACTION_DOWN -> view.isPressed = true + MotionEvent.ACTION_UP -> view.isPressed = false + } + return gestureDetector.onTouchEvent(motionEvent) + } + + private inner class GestureListener(private val view: View) : SimpleOnGestureListener() { + private val swipeThreshold: Int = 100 + private val swipeVelocityThreshold: Int = 100 + + override fun onDown(e: MotionEvent): Boolean { + return true + } + + override fun onSingleTapUp(e: MotionEvent): Boolean { + onClick(view) + return super.onSingleTapUp(e) + } + + override fun onDoubleTap(e: MotionEvent): Boolean { + onDoubleClick() + return super.onDoubleTap(e) + } + + override fun onLongPress(e: MotionEvent) { + onLongClick(view) + super.onLongPress(e) + } + + override fun onFling( + event1: MotionEvent?, + event2: MotionEvent, + velocityX: Float, + velocityY: Float + ): Boolean { + try { + val diffY = event2.y - event1!!.y + val diffX = event2.x - event1.x + if (abs(diffX) > abs(diffY)) { + if (abs(diffX) > swipeThreshold && abs(velocityX) > swipeVelocityThreshold) { + if (diffX > 0) onSwipeRight() else onSwipeLeft() + } + } else { + if (abs(diffY) > swipeThreshold && abs(velocityY) > swipeVelocityThreshold) { + if (diffY < 0) onSwipeUp() else onSwipeDown() + } + } + } catch (exception: Exception) { + exception.printStackTrace() + } + return false + } + } + + open fun onSwipeRight() {} + open fun onSwipeLeft() {} + open fun onSwipeUp() {} + open fun onSwipeDown() {} + open fun onLongClick(view: View) {} + open fun onDoubleClick() {} + open fun onClick(view: View) {} +} \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/AppInfoBottomSheetFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/AppInfoBottomSheetFragment.kt index 8e8e4bf..5117ecc 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/AppInfoBottomSheetFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/AppInfoBottomSheetFragment.kt @@ -47,16 +47,11 @@ class AppInfoBottomSheetFragment(private val appInfo: AppInfo) : BottomSheetDial private var appStateClickListener: OnItemClickedListener.OnAppStateClickListener? = null - private var dismissListener: OnItemClickedListener.BottomSheetDismissListener? = null fun setOnAppStateClickListener(listener: OnItemClickedListener.OnAppStateClickListener) { appStateClickListener = listener } - fun setOnBottomSheetDismissedListener(listener: OnItemClickedListener.BottomSheetDismissListener) { - dismissListener = listener - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt index 4d8be42..e8234d6 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt @@ -50,7 +50,6 @@ import javax.inject.Inject class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, OnItemClickedListener.OnAppLongClickedListener, - OnItemClickedListener.BottomSheetDismissListener, OnItemClickedListener.OnAppStateClickListener, BiometricHelper.Callback, ScrollEventListener { private var _binding: FragmentDrawBinding? = null @@ -307,7 +306,6 @@ class DrawFragment : Fragment(), binding.searchViewText.setQuery("", false) val bottomSheetFragment = AppInfoBottomSheetFragment(appInfo) - bottomSheetFragment.setOnBottomSheetDismissedListener(this) bottomSheetFragment.setOnAppStateClickListener(this) bottomSheetFragment.show(parentFragmentManager, "BottomSheetDialog") } diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/favorite/FavoriteFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/favorite/FavoriteFragment.kt index d3074c6..44a4ec9 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/favorite/FavoriteFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/favorite/FavoriteFragment.kt @@ -38,7 +38,6 @@ import javax.inject.Inject @AndroidEntryPoint class FavoriteFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, - OnItemClickedListener.BottomSheetDismissListener, OnItemClickedListener.OnAppStateClickListener, OnItemMoveListener.OnItemActionListener, BiometricHelper.Callback { diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/hidden/HiddenFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/hidden/HiddenFragment.kt index 2f77485..25890b8 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/hidden/HiddenFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/hidden/HiddenFragment.kt @@ -33,7 +33,6 @@ import javax.inject.Inject class HiddenFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, OnItemClickedListener.OnAppLongClickedListener, - OnItemClickedListener.BottomSheetDismissListener, OnItemClickedListener.OnAppStateClickListener, BiometricHelper.Callback { private var _binding: FragmentHiddenBinding? = null @@ -140,7 +139,6 @@ class HiddenFragment : Fragment(), private fun showSelectedApp(appInfo: AppInfo) { val bottomSheetFragment = AppInfoBottomSheetFragment(appInfo) - bottomSheetFragment.setOnBottomSheetDismissedListener(this) bottomSheetFragment.setOnAppStateClickListener(this) bottomSheetFragment.show(parentFragmentManager, "BottomSheetDialog") diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt index a9a243f..1f42c5c 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt @@ -20,7 +20,9 @@ import android.view.ViewGroup import android.widget.LinearLayout import androidx.annotation.RequiresApi import androidx.appcompat.widget.AppCompatTextView +import androidx.appcompat.widget.LinearLayoutCompat import androidx.biometric.BiometricPrompt +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -46,6 +48,7 @@ import com.github.droidworksstudio.launcher.helper.PreferenceHelper import com.github.droidworksstudio.launcher.listener.OnItemClickedListener import com.github.droidworksstudio.launcher.listener.OnSwipeTouchListener import com.github.droidworksstudio.launcher.listener.ScrollEventListener +import com.github.droidworksstudio.launcher.listener.ViewSwipeTouchListener import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.AppInfoBottomSheetFragment import com.github.droidworksstudio.launcher.utils.Constants import com.github.droidworksstudio.launcher.viewmodel.AppViewModel @@ -64,7 +67,6 @@ import javax.inject.Inject class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, OnItemClickedListener.OnAppLongClickedListener, - OnItemClickedListener.BottomSheetDismissListener, OnItemClickedListener.OnAppStateClickListener, BiometricHelper.Callback, ScrollEventListener { @@ -224,16 +226,25 @@ class HomeFragment : Fragment(), } } - @SuppressLint("ClickableViewAccessibility") + @SuppressLint("ClickableViewAccessibility", "InflateParams") private fun observeSwipeTouchListener() { binding.apply { touchArea.setOnTouchListener(getSwipeGestureListener(context)) - nestScrollView.setOnTouchListener(getSwipeGestureListener(context)) appListTouchArea.setOnTouchListener(getSwipeGestureListener(context)) clock.setOnClickListener { context.launchClock() } date.setOnClickListener { context.launchCalendar() } battery.setOnClickListener { context.openBatteryManager() } + + val appListViews = + layoutInflater.inflate(R.layout.item_home, null) as ConstraintLayout + appListViews.apply { + // Find the TextView by its ID + val appLayout = findViewById(R.id.linear_layout) + + // Set the OnTouchListener on the TextView + appLayout.setOnTouchListener(getHomeAppsGestureListener(context, this)) + } } } @@ -323,7 +334,6 @@ class HomeFragment : Fragment(), private fun showSelectedApp(appInfo: AppInfo) { val bottomSheetFragment = AppInfoBottomSheetFragment(appInfo) - bottomSheetFragment.setOnBottomSheetDismissedListener(this) bottomSheetFragment.setOnAppStateClickListener(this) bottomSheetFragment.show(parentFragmentManager, "BottomSheetDialog") @@ -369,6 +379,46 @@ class HomeFragment : Fragment(), } } + private fun getHomeAppsGestureListener(context: Context, view: View): View.OnTouchListener { + return object : ViewSwipeTouchListener(context, view) { + override fun onLongClick(view: View) { + super.onLongClick(view) + trySettings() + return + } + + @RequiresApi(Build.VERSION_CODES.P) + override fun onDoubleClick() { + super.onDoubleClick() + handleOtherAction(preferenceHelper.doubleTapAction, Constants.Swipe.DoubleTap) + } + + @RequiresApi(Build.VERSION_CODES.P) + override fun onSwipeUp() { + super.onSwipeUp() + handleOtherAction(preferenceHelper.swipeUpAction, Constants.Swipe.Up) + } + + @RequiresApi(Build.VERSION_CODES.P) + override fun onSwipeDown() { + super.onSwipeDown() + handleOtherAction(preferenceHelper.swipeDownAction, Constants.Swipe.Down) + } + + @RequiresApi(Build.VERSION_CODES.P) + override fun onSwipeLeft() { + super.onSwipeLeft() + handleOtherAction(preferenceHelper.swipeLeftAction, Constants.Swipe.Left) + } + + @RequiresApi(Build.VERSION_CODES.P) + override fun onSwipeRight() { + super.onSwipeRight() + handleOtherAction(preferenceHelper.swipeRightAction, Constants.Swipe.Right) + } + } + } + private fun openApp(packageName: String) { val context = binding.root.context val pm: PackageManager = context.packageManager