From 40c324cda4b3d8e415250ed712f85b6a4a81a6d4 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 24 Mar 2021 04:01:27 +0530 Subject: [PATCH 1/2] Lawnchair: Swipe down on Workspace to expand statusbar --- AndroidManifest-common.xml | 1 + .../gestures/DirectionalGestureListener.kt | 66 +++++++++++++++++++ .../lawnchair/gestures/SwipeDownGesture.java | 29 ++++++++ .../touch/WorkspaceTouchListener.java | 5 ++ 4 files changed, 101 insertions(+) create mode 100644 lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt create mode 100644 lawnchair/src/app/lawnchair/gestures/SwipeDownGesture.java diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index 1fc337c818..09783207b7 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -45,6 +45,7 @@ + diff --git a/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt b/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt new file mode 100644 index 0000000000..d903ed1aff --- /dev/null +++ b/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt @@ -0,0 +1,66 @@ +package app.lawnchair.gestures + +import android.view.View.OnTouchListener +import android.view.GestureDetector +import android.annotation.SuppressLint +import android.content.Context +import android.view.MotionEvent +import android.view.GestureDetector.SimpleOnGestureListener +import android.view.View +import java.lang.Exception +import kotlin.math.abs + +open class DirectionalGestureListener(ctx: Context?) : OnTouchListener { + private val mGestureDetector: GestureDetector + @SuppressLint("ClickableViewAccessibility") + override fun onTouch(v: View, event: MotionEvent): Boolean { + return mGestureDetector.onTouchEvent(event) + } + + @Suppress("PrivatePropertyName") + private inner class GestureListener : SimpleOnGestureListener() { + private val SWIPE_THRESHOLD = 100 + private val SWIPE_VELOCITY_THRESHOLD = 100 + + override fun onDown(e: MotionEvent): Boolean { + return true + } + + override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { + var result = false + try { + val diffY = e2.y - e1.y + val diffX = e2.x - e1.x + if (abs(diffX) > abs(diffY)) { + if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { + if (diffX > 0) { + onSwipeRight() + } else { + onSwipeLeft() + } + result = true + } + } else if (abs(diffY) > SWIPE_THRESHOLD && abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { + if (diffY > 0) { + onSwipeBottom() + } else { + onSwipeTop() + } + result = true + } + } catch (exception: Exception) { + exception.printStackTrace() + } + return result + } + } + + fun onSwipeRight() {} + fun onSwipeLeft() {} + fun onSwipeTop() {} + open fun onSwipeBottom() {} + + init { + mGestureDetector = GestureDetector(ctx, GestureListener()) + } +} \ No newline at end of file diff --git a/lawnchair/src/app/lawnchair/gestures/SwipeDownGesture.java b/lawnchair/src/app/lawnchair/gestures/SwipeDownGesture.java new file mode 100644 index 0000000000..690aea309d --- /dev/null +++ b/lawnchair/src/app/lawnchair/gestures/SwipeDownGesture.java @@ -0,0 +1,29 @@ +package app.lawnchair.gestures; + +import android.annotation.SuppressLint; +import android.app.StatusBarManager; +import android.content.Context; +import android.os.Build; + +import androidx.annotation.RequiresApi; + +import com.android.quickstep.TouchInteractionService; + +public class SwipeDownGesture extends DirectionalGestureListener { + + private final Context mContext; + + public SwipeDownGesture(Context context) { + super(context); + mContext = context; + } + + @SuppressLint("WrongConstant") + @RequiresApi(api = Build.VERSION_CODES.Q) + @Override + public void onSwipeBottom() { + if (!TouchInteractionService.isInitialized()) { + ((StatusBarManager) mContext.getSystemService("statusbar")).expandNotificationsPanel(); + } + } +} diff --git a/src/com/android/launcher3/touch/WorkspaceTouchListener.java b/src/com/android/launcher3/touch/WorkspaceTouchListener.java index 4fa658e7d5..e776081a0d 100644 --- a/src/com/android/launcher3/touch/WorkspaceTouchListener.java +++ b/src/com/android/launcher3/touch/WorkspaceTouchListener.java @@ -43,6 +43,8 @@ import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.views.OptionsPopupView; +import app.lawnchair.gestures.SwipeDownGesture; + /** * Helper class to handle touch on empty space in workspace and show options popup on long press */ @@ -69,6 +71,7 @@ public class WorkspaceTouchListener extends GestureDetector.SimpleOnGestureListe private int mLongPressState = STATE_CANCELLED; private final GestureDetector mGestureDetector; + private final SwipeDownGesture mSwipeDown; public WorkspaceTouchListener(Launcher launcher, Workspace workspace) { mLauncher = launcher; @@ -77,10 +80,12 @@ public class WorkspaceTouchListener extends GestureDetector.SimpleOnGestureListe // likely to cause movement. mTouchSlop = 2 * ViewConfiguration.get(launcher).getScaledTouchSlop(); mGestureDetector = new GestureDetector(workspace.getContext(), this); + mSwipeDown = new SwipeDownGesture(workspace.getContext()); } @Override public boolean onTouch(View view, MotionEvent ev) { + mSwipeDown.onTouch(view, ev); mGestureDetector.onTouchEvent(ev); int action = ev.getActionMasked(); From f8dcdf2a0731267765440923e40ac3aa56f7725d Mon Sep 17 00:00:00 2001 From: Patryk Michalik Date: Wed, 24 Mar 2021 08:16:54 +0100 Subject: [PATCH 2/2] Simplify `GestureListener` --- .../gestures/DirectionalGestureListener.kt | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt b/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt index d903ed1aff..1ae10abda1 100644 --- a/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt +++ b/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt @@ -1,17 +1,17 @@ package app.lawnchair.gestures -import android.view.View.OnTouchListener -import android.view.GestureDetector import android.annotation.SuppressLint import android.content.Context -import android.view.MotionEvent +import android.view.GestureDetector import android.view.GestureDetector.SimpleOnGestureListener +import android.view.MotionEvent import android.view.View -import java.lang.Exception +import android.view.View.OnTouchListener import kotlin.math.abs open class DirectionalGestureListener(ctx: Context?) : OnTouchListener { private val mGestureDetector: GestureDetector + @SuppressLint("ClickableViewAccessibility") override fun onTouch(v: View, event: MotionEvent): Boolean { return mGestureDetector.onTouchEvent(event) @@ -26,32 +26,29 @@ open class DirectionalGestureListener(ctx: Context?) : OnTouchListener { return true } + private fun shouldReactToSwipe(diff: Float, velocity: Float): Boolean = + abs(diff) > SWIPE_THRESHOLD && abs(velocity) > SWIPE_VELOCITY_THRESHOLD + override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { - var result = false - try { + return try { val diffY = e2.y - e1.y val diffX = e2.x - e1.x - if (abs(diffX) > abs(diffY)) { - if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { - if (diffX > 0) { - onSwipeRight() - } else { - onSwipeLeft() - } - result = true + + when { + abs(diffX) > abs(diffY) && shouldReactToSwipe(diffX, velocityX) -> { + if (diffX > 0) onSwipeRight() else onSwipeLeft() + true } - } else if (abs(diffY) > SWIPE_THRESHOLD && abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { - if (diffY > 0) { - onSwipeBottom() - } else { - onSwipeTop() + shouldReactToSwipe(diffY, velocityY) -> { + if (diffY > 0) onSwipeBottom() else onSwipeTop() + true } - result = true + else -> false } } catch (exception: Exception) { exception.printStackTrace() + false } - return result } }