Pull down should start search.

b/31458165

Change-Id: If4821e3d89a05a00551af6a5209ebc1693a1389b
This commit is contained in:
Hyunyoung Song
2016-09-15 10:48:25 -07:00
parent 6f28e71e94
commit 46133612b4
2 changed files with 102 additions and 3 deletions

View File

@@ -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;
@@ -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;
@@ -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
@@ -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);
@@ -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);
}

View File

@@ -0,0 +1,85 @@
/*
* 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;
}
}