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

Commit 1f0465e9 authored by Fengjiang Li's avatar Fengjiang Li
Browse files

Add unit test for StatusBarTouchController.java

Test: this one
Flag: NONE
Bug: 282945183
Change-Id: I76eb4389d71d7a03e038ed6b01b6f5b7923fd11a
parent 6474a3b4
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ 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;
@@ -51,12 +53,12 @@ public class StatusBarTouchController implements TouchController {

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

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

    private boolean mIsTrackpadReverseScroll;

@@ -85,9 +87,9 @@ public class StatusBarTouchController implements TouchController {

    @Override
    public final boolean onControllerInterceptTouchEvent(MotionEvent ev) {
        int action = ev.getActionMasked();
        int idx = ev.getActionIndex();
        int pid = ev.getPointerId(idx);
        final int action = ev.getActionMasked();
        final int idx = ev.getActionIndex();
        final int pid = ev.getPointerId(idx);
        if (action == ACTION_DOWN) {
            mCanIntercept = canInterceptTouch(ev);
            if (!mCanIntercept) {
@@ -135,7 +137,6 @@ public class StatusBarTouchController implements TouchController {
                    .log(LAUNCHER_SWIPE_DOWN_WORKSPACE_NOTISHADE_OPEN);
            setWindowSlippery(false);
            mIsTrackpadReverseScroll = false;
            return true;
        }
        return true;
    }
@@ -149,7 +150,8 @@ 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).
     */
    private void setWindowSlippery(boolean enable) {
    @VisibleForTesting
    void setWindowSlippery(boolean enable) {
        Window w = mLauncher.getWindow();
        WindowManager.LayoutParams wlp = w.getAttributes();
        if (enable) {
+152 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.launcher3.Launcher
import com.android.launcher3.ui.AbstractLauncherUiTest
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() {
        super.setUp()
        initialize(this)
    }

    @Test
    fun interceptActionDown_canIntercept() {
        executeOnLauncher { 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 interceptVerticalActionMove_handledAndSetSlippery() {
        executeOnLauncher { 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 interceptHorizontalActionMove_not_handled() {
        executeOnLauncher { 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 ->
            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 ->
            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
            )
        }
    }
}