Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46133612 authored by Hyunyoung Song's avatar Hyunyoung Song
Browse files

Pull down should start search.

b/31458165

Change-Id: If4821e3d89a05a00551af6a5209ebc1693a1389b
parent 6f28e71e
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -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);
    }
+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;
    }
}