1d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal/*
2d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * Copyright (C) 2017 The Android Open Source Project
3d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal *
4d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * use this file except in compliance with the License. You may obtain a copy of
6d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * the License at
7d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal *
8d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * http://www.apache.org/licenses/LICENSE-2.0
9d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal *
10d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * Unless required by applicable law or agreed to in writing, software
11d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * License for the specific language governing permissions and limitations under
14d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * the License.
15d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal */
16d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalpackage com.android.launcher3.ui.widget;
17d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
18d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.app.Activity;
19d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.app.Application;
20d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.app.PendingIntent;
21d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.appwidget.AppWidgetManager;
22d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.content.Intent;
23c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyalimport android.graphics.Color;
24d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.support.test.uiautomator.By;
25d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.support.test.uiautomator.UiObject2;
26d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.support.test.uiautomator.Until;
27d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.test.suitebuilder.annotation.LargeTest;
28d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport android.view.View;
29d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
30d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.ItemInfo;
31d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.Launcher;
32d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.LauncherAppWidgetInfo;
33d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.LauncherSettings.Favorites;
34d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.MainThreadExecutor;
35d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.R;
36d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.ShortcutInfo;
37d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.Utilities;
38d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.Workspace.ItemOperator;
39d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.shortcuts.ShortcutKey;
40d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.testcomponent.AppWidgetNoConfig;
41d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.testcomponent.AppWidgetWithConfig;
42d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.testcomponent.RequestPinItemActivity;
43d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.ui.LauncherInstrumentationTestCase;
44d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.util.Condition;
45d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.util.SimpleActivityMonitor;
46d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.util.Wait;
47d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport com.android.launcher3.widget.WidgetCell;
48d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
49d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport java.util.UUID;
50d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalimport java.util.concurrent.Callable;
51d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
52d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal/**
53d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal * Test to verify pin item request flow.
54d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal */
55d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal@LargeTest
56d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyalpublic class RequestPinItemTest  extends LauncherInstrumentationTestCase {
57d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
58d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    private SimpleActivityMonitor mActivityMonitor;
59d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    private MainThreadExecutor mMainThreadExecutor;
60d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
61d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    private String mCallbackAction;
62d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    private String mShortcutId;
63d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    private int mAppWidgetId;
64d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
65d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    @Override
66d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    protected void setUp() throws Exception {
67d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        super.setUp();
68d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        grantWidgetPermission();
69d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        setDefaultLauncher();
70d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
71d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mActivityMonitor = new SimpleActivityMonitor();
72d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        ((Application) getInstrumentation().getTargetContext().getApplicationContext())
73d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                .registerActivityLifecycleCallbacks(mActivityMonitor);
74d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mMainThreadExecutor = new MainThreadExecutor();
75d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
76d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mCallbackAction = UUID.randomUUID().toString();
77d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mShortcutId = UUID.randomUUID().toString();
78d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    }
79d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
80d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    @Override
81d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    protected void tearDown() throws Exception {
82d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        ((Application) getInstrumentation().getTargetContext().getApplicationContext())
83d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                .unregisterActivityLifecycleCallbacks(mActivityMonitor);
84d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        super.tearDown();
85d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    }
86d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
87d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    public void testPinWidgetNoConfig() throws Throwable {
88d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        runTest("pinWidgetNoConfig", true, new ItemOperator() {
89d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            @Override
90d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            public boolean evaluate(ItemInfo info, View view) {
91d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                return info instanceof LauncherAppWidgetInfo &&
92d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                        ((LauncherAppWidgetInfo) info).appWidgetId == mAppWidgetId &&
93d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                        ((LauncherAppWidgetInfo) info).providerName.getClassName()
94d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                                .equals(AppWidgetNoConfig.class.getName());
95d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            }
96d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        });
97d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    }
98d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
99c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal    public void testPinWidgetNoConfig_customPreview() throws Throwable {
100c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal        // Command to set custom preview
101c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal        Intent command =  RequestPinItemActivity.getCommandIntent(
102c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal                RequestPinItemActivity.class, "setRemoteViewColor").putExtra(
103c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal                RequestPinItemActivity.EXTRA_PARAM + "0", Color.RED);
104c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal
105c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal        runTest("pinWidgetNoConfig", true, new ItemOperator() {
106c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal            @Override
107c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal            public boolean evaluate(ItemInfo info, View view) {
108c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal                return info instanceof LauncherAppWidgetInfo &&
109c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal                        ((LauncherAppWidgetInfo) info).appWidgetId == mAppWidgetId &&
110c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal                        ((LauncherAppWidgetInfo) info).providerName.getClassName()
111c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal                                .equals(AppWidgetNoConfig.class.getName());
112c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal            }
113c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal        }, command);
114c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal    }
115c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal
116d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    public void testPinWidgetWithConfig() throws Throwable {
117d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        runTest("pinWidgetWithConfig", true, new ItemOperator() {
118d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            @Override
119d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            public boolean evaluate(ItemInfo info, View view) {
120d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                return info instanceof LauncherAppWidgetInfo &&
121d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                        ((LauncherAppWidgetInfo) info).appWidgetId == mAppWidgetId &&
122d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                        ((LauncherAppWidgetInfo) info).providerName.getClassName()
123d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                                .equals(AppWidgetWithConfig.class.getName());
124d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            }
125d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        });
126d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    }
127d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
128c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal    public void testPinShortcut() throws Throwable {
129c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal        // Command to set the shortcut id
130c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal        Intent command = RequestPinItemActivity.getCommandIntent(
131c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal                RequestPinItemActivity.class, "setShortcutId").putExtra(
132c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal                RequestPinItemActivity.EXTRA_PARAM + "0", mShortcutId);
133d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
134d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        runTest("pinShortcut", false, new ItemOperator() {
135d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            @Override
136d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            public boolean evaluate(ItemInfo info, View view) {
137d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                return info instanceof ShortcutInfo &&
138d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                        info.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT &&
139d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                        ShortcutKey.fromItemInfo(info).getId().equals(mShortcutId);
140d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            }
141c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal        }, command);
142d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    }
143d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
144c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal    private void runTest(String activityMethod, boolean isWidget, ItemOperator itemMatcher,
145c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal            Intent... commandIntents) throws Throwable {
146d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        if (!Utilities.isAtLeastO()) {
147d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            return;
148d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        }
149d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        lockRotation(true);
150d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
151d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        clearHomescreen();
152d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        startLauncher();
153d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
154d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        // Open all apps and wait for load complete
155d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        final UiObject2 appsContainer = openAllApps();
156d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        assertTrue(Wait.atMost(Condition.minChildCount(appsContainer, 2), DEFAULT_UI_TIMEOUT));
157d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
158d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        // Open Pin item activity
159d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        BlockingBroadcastReceiver openMonitor = new BlockingBroadcastReceiver(
160d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                RequestPinItemActivity.class.getName());
161d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        scrollAndFind(appsContainer, By.text("Test Pin Item")).click();
162d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        assertNotNull(openMonitor.blockingGetExtraIntent());
163d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
164d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        // Set callback
165d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        PendingIntent callback = PendingIntent.getBroadcast(mTargetContext, 0,
166d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                new Intent(mCallbackAction), PendingIntent.FLAG_ONE_SHOT);
167d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mTargetContext.sendBroadcast(RequestPinItemActivity.getCommandIntent(
168d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                RequestPinItemActivity.class, "setCallback").putExtra(
169d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                RequestPinItemActivity.EXTRA_PARAM + "0", callback));
170d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
171c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal        for (Intent command : commandIntents) {
172c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal            mTargetContext.sendBroadcast(command);
173d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        }
174d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
175d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        // call the requested method to start the flow
176d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mTargetContext.sendBroadcast(RequestPinItemActivity.getCommandIntent(
177d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                RequestPinItemActivity.class, activityMethod));
178d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        UiObject2 widgetCell = mDevice.wait(
179d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                Until.findObject(By.clazz(WidgetCell.class)), DEFAULT_ACTIVITY_TIMEOUT);
180d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        assertNotNull(widgetCell);
181d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
182d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        // Accept confirmation:
183d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        BlockingBroadcastReceiver resultReceiver = new BlockingBroadcastReceiver(mCallbackAction);
184d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mDevice.wait(Until.findObject(By.text(mTargetContext.getString(
185d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                R.string.place_automatically).toUpperCase())), DEFAULT_UI_TIMEOUT).click();
186d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        Intent result = resultReceiver.blockingGetIntent();
187d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        assertNotNull(result);
188d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mAppWidgetId = result.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
189d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        if (isWidget) {
190d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            assertNotSame(-1, mAppWidgetId);
191d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        }
192d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
193d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        // Go back to home
194d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        mTargetContext.startActivity(getHomeIntent());
195d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        assertTrue(Wait.atMost(new ItemSearchCondition(itemMatcher), DEFAULT_ACTIVITY_TIMEOUT));
196d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    }
197d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
198d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    /**
199d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal     * Condition for for an item
200d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal     */
201d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    private class ItemSearchCondition extends Condition implements Callable<Boolean> {
202d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
203d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        private final ItemOperator mOp;
204d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
205d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        ItemSearchCondition(ItemOperator op) {
206d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            mOp = op;
207d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        }
208d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
209d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        @Override
210d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        public boolean isTrue() throws Throwable {
211d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            return mMainThreadExecutor.submit(this).get();
212d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        }
213d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal
214d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        @Override
215d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        public Boolean call() throws Exception {
216d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            // Find the resumed launcher
217d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            Launcher launcher = null;
218d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            for (Activity a : mActivityMonitor.resumed) {
219d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                if (a instanceof Launcher) {
220d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                    launcher = (Launcher) a;
221d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                }
222d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            }
223d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            if (launcher == null) {
224d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal                return false;
225d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            }
226d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal            return launcher.getWorkspace().getFirstMatch(mOp) != null;
227d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal        }
228d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal    }
229d9843357d0fa8e4bbe0d42007bfdfebe37db7451Sunny Goyal}
230