Loading src/com/android/launcher3/Workspace.java +17 −3 Original line number Diff line number Diff line Loading @@ -76,7 +76,6 @@ import com.android.launcher3.dragndrop.SpringLoadedDragController; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutsContainerListener; import com.android.launcher3.userevent.nano.LauncherLogProto; Loading @@ -85,6 +84,7 @@ import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.MultiStateAlphaController; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.VerticalFlingDetector; import com.android.launcher3.util.WallpaperOffsetInterpolator; import com.android.launcher3.widget.PendingAddShortcutInfo; import com.android.launcher3.widget.PendingAddWidgetInfo; Loading Loading @@ -594,7 +594,18 @@ public class Workspace extends PagedView } // Add the first page CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, 0); final VerticalFlingDetector detector = new VerticalFlingDetector(mLauncher){ @Override public boolean onTouch(View v, MotionEvent ev) { if (shouldConsumeTouch(v)) return true; if (super.onTouch(v, ev)) { mLauncher.startSearch("", false, null, false); } return false; } }; firstPage.setOnTouchListener(detector); firstPage.setOnInterceptTouchListener(detector); // Always add a QSB on the first screen. if (qsb == null) { // In transposed layout, we add the QSB in the Grid. As workspace does not touch the Loading Loading @@ -686,7 +697,6 @@ public class Workspace extends PagedView // created CellLayout. CellLayout newScreen = (CellLayout) mLauncher.getLayoutInflater().inflate( R.layout.workspace_screen, this, false /* attachToRoot */); newScreen.setOnLongClickListener(mLongClickListener); newScreen.setOnClickListener(mLauncher); newScreen.setSoundEffectsEnabled(false); Loading Loading @@ -1172,6 +1182,10 @@ public class Workspace extends PagedView @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { return shouldConsumeTouch(v); } private boolean shouldConsumeTouch(View v) { return (workspaceInModalState() || !isFinishedSwitchingState()) || (!workspaceInModalState() && indexOfChild(v) != mCurrentPage); } Loading src/com/android/launcher3/util/VerticalFlingDetector.java 0 → 100644 +85 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.util; import android.content.Context; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; public class VerticalFlingDetector implements View.OnTouchListener { private static final float CUSTOM_SLOP_MULTIPLIER = 2.2f; private static final int SEC_IN_MILLIS = 1000; private VelocityTracker mVelocityTracker; private float mMinimumFlingVelocity; private float mMaximumFlingVelocity; private float mDownX, mDownY; private boolean mShouldCheckFling; private double mCustomTouchSlop; public VerticalFlingDetector(Context context) { ViewConfiguration vc = ViewConfiguration.get(context); mMinimumFlingVelocity = vc.getScaledMinimumFlingVelocity(); mMaximumFlingVelocity = vc.getScaledMaximumFlingVelocity(); mCustomTouchSlop = CUSTOM_SLOP_MULTIPLIER * vc.getScaledTouchSlop(); } @Override public boolean onTouch(View v, MotionEvent ev) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(ev); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mDownX = ev.getX(); mDownY = ev.getY(); mShouldCheckFling = false; break; case MotionEvent.ACTION_MOVE: if (mShouldCheckFling) { break; } if (Math.abs(ev.getY() - mDownY) > mCustomTouchSlop && Math.abs(ev.getY() - mDownY) > Math.abs(ev.getX() - mDownX)) { mShouldCheckFling = true; } break; case MotionEvent.ACTION_UP: if (mShouldCheckFling) { mVelocityTracker.computeCurrentVelocity(SEC_IN_MILLIS, mMaximumFlingVelocity); // only when fling is detected in down direction if (mVelocityTracker.getYVelocity() > mMinimumFlingVelocity) { cleanUp(); return true; } } // fall through. case MotionEvent.ACTION_CANCEL: cleanUp(); } return false; } private void cleanUp() { mVelocityTracker.recycle(); mVelocityTracker = null; } } Loading
src/com/android/launcher3/Workspace.java +17 −3 Original line number Diff line number Diff line Loading @@ -76,7 +76,6 @@ import com.android.launcher3.dragndrop.SpringLoadedDragController; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutsContainerListener; import com.android.launcher3.userevent.nano.LauncherLogProto; Loading @@ -85,6 +84,7 @@ import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.MultiStateAlphaController; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.VerticalFlingDetector; import com.android.launcher3.util.WallpaperOffsetInterpolator; import com.android.launcher3.widget.PendingAddShortcutInfo; import com.android.launcher3.widget.PendingAddWidgetInfo; Loading Loading @@ -594,7 +594,18 @@ public class Workspace extends PagedView } // Add the first page CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, 0); final VerticalFlingDetector detector = new VerticalFlingDetector(mLauncher){ @Override public boolean onTouch(View v, MotionEvent ev) { if (shouldConsumeTouch(v)) return true; if (super.onTouch(v, ev)) { mLauncher.startSearch("", false, null, false); } return false; } }; firstPage.setOnTouchListener(detector); firstPage.setOnInterceptTouchListener(detector); // Always add a QSB on the first screen. if (qsb == null) { // In transposed layout, we add the QSB in the Grid. As workspace does not touch the Loading Loading @@ -686,7 +697,6 @@ public class Workspace extends PagedView // created CellLayout. CellLayout newScreen = (CellLayout) mLauncher.getLayoutInflater().inflate( R.layout.workspace_screen, this, false /* attachToRoot */); newScreen.setOnLongClickListener(mLongClickListener); newScreen.setOnClickListener(mLauncher); newScreen.setSoundEffectsEnabled(false); Loading Loading @@ -1172,6 +1182,10 @@ public class Workspace extends PagedView @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { return shouldConsumeTouch(v); } private boolean shouldConsumeTouch(View v) { return (workspaceInModalState() || !isFinishedSwitchingState()) || (!workspaceInModalState() && indexOfChild(v) != mCurrentPage); } Loading
src/com/android/launcher3/util/VerticalFlingDetector.java 0 → 100644 +85 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.util; import android.content.Context; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; public class VerticalFlingDetector implements View.OnTouchListener { private static final float CUSTOM_SLOP_MULTIPLIER = 2.2f; private static final int SEC_IN_MILLIS = 1000; private VelocityTracker mVelocityTracker; private float mMinimumFlingVelocity; private float mMaximumFlingVelocity; private float mDownX, mDownY; private boolean mShouldCheckFling; private double mCustomTouchSlop; public VerticalFlingDetector(Context context) { ViewConfiguration vc = ViewConfiguration.get(context); mMinimumFlingVelocity = vc.getScaledMinimumFlingVelocity(); mMaximumFlingVelocity = vc.getScaledMaximumFlingVelocity(); mCustomTouchSlop = CUSTOM_SLOP_MULTIPLIER * vc.getScaledTouchSlop(); } @Override public boolean onTouch(View v, MotionEvent ev) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(ev); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mDownX = ev.getX(); mDownY = ev.getY(); mShouldCheckFling = false; break; case MotionEvent.ACTION_MOVE: if (mShouldCheckFling) { break; } if (Math.abs(ev.getY() - mDownY) > mCustomTouchSlop && Math.abs(ev.getY() - mDownY) > Math.abs(ev.getX() - mDownX)) { mShouldCheckFling = true; } break; case MotionEvent.ACTION_UP: if (mShouldCheckFling) { mVelocityTracker.computeCurrentVelocity(SEC_IN_MILLIS, mMaximumFlingVelocity); // only when fling is detected in down direction if (mVelocityTracker.getYVelocity() > mMinimumFlingVelocity) { cleanUp(); return true; } } // fall through. case MotionEvent.ACTION_CANCEL: cleanUp(); } return false; } private void cleanUp() { mVelocityTracker.recycle(); mVelocityTracker = null; } }