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

Commit 167ff731 authored by Vadim Tryshev's avatar Vadim Tryshev Committed by Automerger Merge Worker
Browse files

Merge "Revert "Fix NPE of handling ACTION_MOVE in StatusBarTouchController and...

Merge "Revert "Fix NPE of handling ACTION_MOVE in StatusBarTouchController and added unit test"" into udc-dev am: af641a6e am: 27e2251b

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/23662872



Change-Id: I81d60e0d7d92267cadad309450a90ed39be0bc84
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 405e79df 27e2251b
Loading
Loading
Loading
Loading
+9 −12
Original line number Diff line number Diff line
@@ -30,8 +30,6 @@ import android.view.ViewConfiguration;
import android.view.Window;
import android.view.WindowManager;

import androidx.annotation.VisibleForTesting;

import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
@@ -52,13 +50,12 @@ public class StatusBarTouchController implements TouchController {

    private final Launcher mLauncher;
    private final SystemUiProxy mSystemUiProxy;
    @VisibleForTesting final float mTouchSlop;
    private final float mTouchSlop;
    private int mLastAction;
    private final SparseArray<PointF> mDownEvents;

    /* If {@code false}, this controller should not handle the input {@link MotionEvent}.*/
    @VisibleForTesting
    boolean mCanIntercept;
    private boolean mCanIntercept;

    public StatusBarTouchController(Launcher l) {
        mLauncher = l;
@@ -85,9 +82,9 @@ public class StatusBarTouchController implements TouchController {

    @Override
    public final boolean onControllerInterceptTouchEvent(MotionEvent ev) {
        final int action = ev.getActionMasked();
        final int idx = ev.getActionIndex();
        final int pid = ev.getPointerId(idx);
        int action = ev.getActionMasked();
        int idx = ev.getActionIndex();
        int pid = ev.getPointerId(idx);
        if (action == ACTION_DOWN) {
            mCanIntercept = canInterceptTouch(ev);
            if (!mCanIntercept) {
@@ -95,14 +92,14 @@ public class StatusBarTouchController implements TouchController {
            }
            mDownEvents.clear();
            mDownEvents.put(pid, new PointF(ev.getX(), ev.getY()));
        } else if (action == MotionEvent.ACTION_POINTER_DOWN) {
        } else if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
            // Check!! should only set it only when threshold is not entered.
            mDownEvents.put(pid, new PointF(ev.getX(idx), ev.getY(idx)));
        }
        if (!mCanIntercept) {
            return false;
        }
        if (action == ACTION_MOVE && mDownEvents.contains(pid)) {
        if (action == ACTION_MOVE) {
            float dy = ev.getY(idx) - mDownEvents.get(pid).y;
            float dx = ev.getX(idx) - mDownEvents.get(pid).x;
            // Currently input dispatcher will not do touch transfer if there are more than
@@ -129,6 +126,7 @@ public class StatusBarTouchController implements TouchController {
            mLauncher.getStatsLogManager().logger()
                    .log(LAUNCHER_SWIPE_DOWN_WORKSPACE_NOTISHADE_OPEN);
            setWindowSlippery(false);
            return true;
        }
        return true;
    }
@@ -142,8 +140,7 @@ public class StatusBarTouchController implements TouchController {
     * Touches can slide out of the window but they cannot necessarily slide
     * back in (unless the other window with touch focus permits it).
     */
    @VisibleForTesting
    void setWindowSlippery(boolean enable) {
    private void setWindowSlippery(boolean enable) {
        Window w = mLauncher.getWindow();
        WindowManager.LayoutParams wlp = w.getAttributes();
        if (enable) {
+0 −152
Original line number Diff line number Diff line
/*
 * Copyright (C) 202 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.uioverrides.touchcontrollers

import android.view.MotionEvent
import android.view.WindowManager
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
import com.android.launcher3.Launcher
import com.android.launcher3.ui.AbstractLauncherUiTest
import com.android.launcher3.ui.TaplTestsLauncher3
import junit.framework.Assert.assertEquals
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class StatusBarTouchControllerTest : AbstractLauncherUiTest() {
    @Before
    @Throws(Exception::class)
    fun setup() {
        TaplTestsLauncher3.initialize(this)
    }

    @Test
    fun interceptActionDown_canIntercept() {
        executeOnLauncher { launcher: Launcher? ->
            val underTest = StatusBarTouchController(launcher)
            assertFalse(underTest.mCanIntercept)
            val downEvent = MotionEvent.obtain(1, 1, MotionEvent.ACTION_DOWN, 0f, 0f, 0)

            underTest.onControllerInterceptTouchEvent(downEvent)

            assertTrue(underTest.mCanIntercept)
        }
    }

    @Test
    fun interceptActionMove_handledAndSetSlippery() {
        executeOnLauncher { launcher: Launcher ->
            val underTest = StatusBarTouchController(launcher)
            val downEvent = MotionEvent.obtain(1, 1, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
            underTest.onControllerInterceptTouchEvent(downEvent)
            val w = launcher.window
            assertEquals(0, w.attributes.flags and WindowManager.LayoutParams.FLAG_SLIPPERY)
            val moveEvent =
                MotionEvent.obtain(
                    2,
                    2,
                    MotionEvent.ACTION_MOVE,
                    underTest.mTouchSlop,
                    underTest.mTouchSlop + 10,
                    0
                )

            val handled = underTest.onControllerInterceptTouchEvent(moveEvent)

            assertTrue(handled)
            assertEquals(
                WindowManager.LayoutParams.FLAG_SLIPPERY,
                w.attributes.flags and WindowManager.LayoutParams.FLAG_SLIPPERY
            )
        }
    }

    @Test
    fun interceptActionMove_not_handled() {
        executeOnLauncher { launcher: Launcher? ->
            val underTest = StatusBarTouchController(launcher)
            val downEvent = MotionEvent.obtain(1, 1, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
            underTest.onControllerInterceptTouchEvent(downEvent)
            val moveEvent =
                MotionEvent.obtain(
                    2,
                    2,
                    MotionEvent.ACTION_MOVE,
                    underTest.mTouchSlop + 10,
                    underTest.mTouchSlop,
                    0
                )

            val handled = underTest.onControllerInterceptTouchEvent(moveEvent)

            assertFalse(handled)
        }
    }

    @Test
    fun interceptActionMoveAsFirstGestureEvent_notCrashedNorHandled() {
        executeOnLauncher { launcher: Launcher? ->
            val underTest = StatusBarTouchController(launcher)
            underTest.mCanIntercept = true
            val moveEvent = MotionEvent.obtain(2, 2, MotionEvent.ACTION_MOVE, 10f, 10f, 0)

            val handled = underTest.onControllerInterceptTouchEvent(moveEvent)

            assertFalse(handled)
        }
    }

    @Test
    fun handleActionUp_setNotSlippery() {
        executeOnLauncher { launcher: Launcher ->
            val underTest = StatusBarTouchController(launcher)
            underTest.mCanIntercept = true
            underTest.setWindowSlippery(true)
            val moveEvent = MotionEvent.obtain(2, 2, MotionEvent.ACTION_UP, 10f, 10f, 0)

            val handled = underTest.onControllerTouchEvent(moveEvent)

            assertTrue(handled)
            assertEquals(
                0,
                launcher.window.attributes.flags and WindowManager.LayoutParams.FLAG_SLIPPERY
            )
        }
    }

    @Test
    fun handleActionCancel_setNotSlippery() {
        executeOnLauncher { launcher: Launcher ->
            val underTest = StatusBarTouchController(launcher)
            underTest.mCanIntercept = true
            underTest.setWindowSlippery(true)
            val moveEvent = MotionEvent.obtain(2, 2, MotionEvent.ACTION_CANCEL, 10f, 10f, 0)

            val handled = underTest.onControllerTouchEvent(moveEvent)

            assertTrue(handled)
            assertEquals(
                0,
                launcher.window.attributes.flags and WindowManager.LayoutParams.FLAG_SLIPPERY
            )
        }
    }
}