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

Commit 02e57b3d authored by Schneider Victor-tulias's avatar Schneider Victor-tulias
Browse files

Add ExtendedLongPressTimeoutRule to all AbstractLauncherUiTest

When devices run slow in pre/post-submit, it is possible for a drag to be processed at a long press before the first move event can be created and dispatched. Added a rule to artificially increase this long press timeout in tests.

Flag: N/A
Fixes: 319257820
Test: TAPL tests
Change-Id: I24e0f3baec15db7558351d0cb2bd93a4e49640e8
parent 41e4290d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import com.android.launcher3.tapl.TestHelpers;
import com.android.launcher3.testcomponent.TestCommandReceiver;
import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.util.Wait;
import com.android.launcher3.util.rule.ExtendedLongPressTimeoutRule;
import com.android.launcher3.util.rule.FailureWatcher;
import com.android.launcher3.util.rule.SamplerRule;
import com.android.launcher3.util.rule.ScreenRecordRule;
@@ -105,6 +106,9 @@ public class FallbackRecentsTest {
    @Rule
    public ScreenRecordRule mScreenRecordRule = new ScreenRecordRule();

    @Rule
    public ExtendedLongPressTimeoutRule mLongPressTimeoutRule = new ExtendedLongPressTimeoutRule();

    public FallbackRecentsTest() throws RemoteException {
        Instrumentation instrumentation = getInstrumentation();
        Context context = instrumentation.getContext();
+4 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ import com.android.launcher3.util.LooperExecutor;
import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.launcher3.util.TestUtil;
import com.android.launcher3.util.Wait;
import com.android.launcher3.util.rule.ExtendedLongPressTimeoutRule;
import com.android.launcher3.util.rule.FailureWatcher;
import com.android.launcher3.util.rule.SamplerRule;
import com.android.launcher3.util.rule.ScreenRecordRule;
@@ -219,6 +220,9 @@ public abstract class AbstractLauncherUiTest {
    @Rule
    public SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);

    @Rule
    public ExtendedLongPressTimeoutRule mLongPressTimeoutRule = new ExtendedLongPressTimeoutRule();

    public static void initialize(AbstractLauncherUiTest test) throws Exception {
        test.reinitializeLauncherData();
        test.mDevice.pressHome();
+74 −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.util.rule;

import android.content.ContentResolver;
import android.provider.Settings;
import android.util.Log;
import android.view.ViewConfiguration;

import androidx.test.InstrumentationRegistry;

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class ExtendedLongPressTimeoutRule implements TestRule {

    private static final String TAG = "ExtendedLongPressTimeoutRule";

    private static final float LONG_PRESS_TIMEOUT_MULTIPLIER = 10f;

    @Override
    public Statement apply(Statement base, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                ContentResolver contentResolver = InstrumentationRegistry.getInstrumentation()
                        .getContext()
                        .getContentResolver();
                int prevLongPressTimeout = Settings.Secure.getInt(
                        contentResolver,
                        Settings.Secure.LONG_PRESS_TIMEOUT,
                        ViewConfiguration.getLongPressTimeout());
                int newLongPressTimeout =
                        (int) (prevLongPressTimeout * LONG_PRESS_TIMEOUT_MULTIPLIER);

                try {
                    Log.d(TAG, "In try-block: Setting long press timeout from "
                            + prevLongPressTimeout + "ms to " + newLongPressTimeout + "ms");
                    Settings.Secure.putInt(
                            contentResolver,
                            Settings.Secure.LONG_PRESS_TIMEOUT,
                            (int) (prevLongPressTimeout * LONG_PRESS_TIMEOUT_MULTIPLIER));

                    base.evaluate();
                } catch (Exception e) {
                    Log.e(TAG, "Error", e);
                    throw e;
                } finally {
                    Log.d(TAG, "In finally-block: resetting long press timeout to "
                            + prevLongPressTimeout + "ms");
                    Settings.Secure.putInt(
                            contentResolver,
                            Settings.Secure.LONG_PRESS_TIMEOUT,
                            prevLongPressTimeout);
                }
            }
        };
    }
}
+28 −7
Original line number Diff line number Diff line
@@ -1919,17 +1919,21 @@ public final class LauncherInstrumentation {
    }

    private static MotionEvent getMotionEvent(long downTime, long eventTime, int action,
            float x, float y, int source) {
            float x, float y, int source, int toolType) {
        return MotionEvent.obtain(downTime, eventTime, action, 1,
                new MotionEvent.PointerProperties[]{getPointerProperties(0)},
                new MotionEvent.PointerProperties[]{getPointerProperties(0, toolType)},
                new MotionEvent.PointerCoords[]{getPointerCoords(x, y)},
                0, 0, 1.0f, 1.0f, 0, 0, source, 0);
    }

    private static MotionEvent.PointerProperties getPointerProperties(int pointerId) {
        return getPointerProperties(pointerId, Configurator.getInstance().getToolType());
    }

    private static MotionEvent.PointerProperties getPointerProperties(int pointerId, int toolType) {
        MotionEvent.PointerProperties properties = new MotionEvent.PointerProperties();
        properties.id = pointerId;
        properties.toolType = Configurator.getInstance().getToolType();
        properties.toolType = toolType;
        return properties;
    }

@@ -1975,6 +1979,19 @@ public final class LauncherInstrumentation {

    public void sendPointer(long downTime, long currentTime, int action, Point point,
            GestureScope gestureScope, int source, boolean isRightClick) {
        sendPointer(
                downTime,
                currentTime,
                action,
                point,
                gestureScope,
                source,
                isRightClick,
                Configurator.getInstance().getToolType());
    }

    public void sendPointer(long downTime, long currentTime, int action, Point point,
            GestureScope gestureScope, int source, boolean isRightClick, int toolType) {
        final boolean hasTIS = hasTIS();
        int pointerCount = mPointerCount;

@@ -2009,13 +2026,13 @@ public final class LauncherInstrumentation {
                ? getTrackpadMotionEvent(
                downTime, currentTime, action, point.x, point.y, pointerCount,
                mTrackpadGestureType)
                : getMotionEvent(downTime, currentTime, action, point.x, point.y, source);
                : getMotionEvent(downTime, currentTime, action, point.x, point.y, source, toolType);
        if (action == MotionEvent.ACTION_BUTTON_PRESS
                || action == MotionEvent.ACTION_BUTTON_RELEASE) {
            event.setActionButton(MotionEvent.BUTTON_PRIMARY);
        }
        if (isRightClick) {
            event.setButtonState(event.getButtonState() & MotionEvent.BUTTON_SECONDARY);
            event.setButtonState(event.getButtonState() | MotionEvent.BUTTON_SECONDARY);
        }
        injectEvent(event);
    }
@@ -2114,15 +2131,19 @@ public final class LauncherInstrumentation {
            @NonNull final UiObject2 target, @NonNull String resName, Pattern longClickEvent) {
        final Point targetCenter = target.getVisibleCenter();
        final long downTime = SystemClock.uptimeMillis();
        // Use stylus secondary button press to prevent using the exteded long press timeout rule
        // unnecessarily
        sendPointer(downTime, downTime, MotionEvent.ACTION_DOWN, targetCenter,
                GestureScope.DONT_EXPECT_PILFER);
                GestureScope.DONT_EXPECT_PILFER, InputDevice.SOURCE_TOUCHSCREEN,
                /* isRightClick= */ true, MotionEvent.TOOL_TYPE_STYLUS);
        try {
            expectEvent(TestProtocol.SEQUENCE_MAIN, longClickEvent);
            final UiObject2 result = waitForLauncherObject(resName);
            return result;
        } finally {
            sendPointer(downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, targetCenter,
                    GestureScope.DONT_EXPECT_PILFER);
                    GestureScope.DONT_EXPECT_PILFER, InputDevice.SOURCE_TOUCHSCREEN,
                    /* isRightClick= */ true, MotionEvent.TOOL_TYPE_STYLUS);
        }
    }