summaryrefslogtreecommitdiffstats
path: root/tests/src/com/android/launcher3/QuickAddWidgetTest.java
blob: 8c563f38047bbd4191d19b3915fd73a081500e11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package com.android.launcher3;

import android.content.Intent;
import android.graphics.Point;
import android.os.SystemClock;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.Direction;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.Until;
import android.test.InstrumentationTestCase;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

import java.util.List;

/**
 * Add an arbitrary widget from the widget picker very quickly to test potential race conditions.
 */
public class QuickAddWidgetTest extends InstrumentationTestCase {
    private UiDevice mDevice;
    private String mTargetPackage;

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        mDevice = UiDevice.getInstance(getInstrumentation());

        // Set Launcher3 as home.
        mTargetPackage = getInstrumentation().getTargetContext().getPackageName();
        Intent homeIntent = new Intent(Intent.ACTION_MAIN)
                .addCategory(Intent.CATEGORY_HOME)
                .setPackage(mTargetPackage)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getInstrumentation().getContext().startActivity(homeIntent);
        mDevice.wait(Until.hasObject(By.pkg(mTargetPackage).depth(0)), 3000);
    }

    public void testAddWidgetQuickly() throws Exception {
        mDevice.pressMenu(); // Enter overview mode.
        mDevice.wait(Until.findObject(By.text("Widgets")), 3000).click();
        UiObject2 calendarWidget = getWidgetByName("Calendar");
        Point center = calendarWidget.getVisibleCenter();
        // Touch widget just long enough to pick it up (longPressTimeout), then let go immediately.
        getInstrumentation().sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
                SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, center.x, center.y, 0));
        Thread.sleep(ViewConfiguration.getLongPressTimeout());
        getInstrumentation().sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
                SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, center.x, center.y, 0));

        assertTrue("Drag was never started", isOnHomescreen());
    }

    private UiObject2 getWidgetByName(String name) {
        UiObject2 widgetsList = mDevice.wait(Until.findObject(By.res(mTargetPackage,
                "widgets_list_view")), 3000);
        do {
            UiObject2 widget = getVisibleWidgetByName(name);
            if (widget != null) {
                return widget;
            }
        } while (widgetsList.scroll(Direction.DOWN, 1f));
        return getVisibleWidgetByName(name);
    }

    private UiObject2 getVisibleWidgetByName(String name) {
        List<UiObject2> visibleWidgets = mDevice.wait(Until.findObjects(By.clazz(
                "android.widget.LinearLayout")), 3000);
        for (UiObject2 widget : visibleWidgets) {
            if (widget.hasObject(By.text(name))) {
                return widget;
            }
        }
        return null;
    }

    private boolean isOnHomescreen() {
        return mDevice.wait(Until.hasObject(By.res(mTargetPackage, "hotseat")), 3000);
    }
}