1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.test.uiautomator.demos;
17 
18 import android.widget.TextView;
19 
20 import com.android.uiautomator.core.UiObject;
21 import com.android.uiautomator.core.UiObjectNotFoundException;
22 import com.android.uiautomator.core.UiScrollable;
23 import com.android.uiautomator.core.UiSelector;
24 import com.android.uiautomator.testrunner.UiAutomatorTestCase;
25 
26 /**
27  * Test demonstrates using the UiAutomator APIs to set an alarm to
28  * go off in 2 minutes
29  */
30 public class SetTwoMinuteAlarm extends UiAutomatorTestCase {
31 
32     /**
33      * For the purpose of this demo, we're declaring the Launcher signatures here.
34      * It may be more appropriate to declare signatures and methods related
35      * to Launcher in their own reusable Launcher helper file.
36      */
37     public static class LauncherHelper {
38         public static final UiSelector ALL_APPS_BUTTON = new UiSelector().description("Apps");
39         public static final UiSelector LAUNCHER_CONTAINER = new UiSelector().scrollable(true);
40         public static final UiSelector LAUNCHER_ITEM =
41                 new UiSelector().className(android.widget.TextView.class.getName());
42     }
43 
44     /**
45      * Set an alarm 2 minutes from now and verify it goes off. Also check the notification
46      * shades for an alarm. (Crude test but it demos the use of Android resources)
47      * @throws UiObjectNotFoundException
48      */
testDemo()49     public void testDemo() throws UiObjectNotFoundException {
50         // The following code is documented in the LaunchSettings demo. For detailed description
51         // of how this code works, look at the demo LaunchSettings
52 
53         // Good to start from here
54         getUiDevice().pressHome();
55 
56         // open the All Apps view
57         UiObject allAppsButton = new UiObject(LauncherHelper.ALL_APPS_BUTTON);
58         allAppsButton.click();
59 
60         // clicking the APPS tab
61         UiSelector appsTabSelector =
62                 new UiSelector().className(android.widget.TabWidget.class.getName())
63                     .childSelector(new UiSelector().text("Apps"));
64         UiObject appsTab = new UiObject(appsTabSelector);
65         appsTab.click();
66 
67         // Clicking the Settings
68         UiScrollable allAppsScreen = new UiScrollable(LauncherHelper.LAUNCHER_CONTAINER);
69         allAppsScreen.setAsHorizontalList();
70         UiObject clockApp =
71                 allAppsScreen.getChildByText(LauncherHelper.LAUNCHER_ITEM, "Clock");
72         clockApp.click();
73 
74         // Set an alarm to go off in about 2 minutes
75         setAlarm(2);
76 
77         // wait for the alarm alert dialog
78         UiObject alarmAlert =
79                 new UiObject(new UiSelector().packageName("com.google.android.deskclock")
80                         .className(TextView.class.getName()).text("Alarm"));
81 
82         assertTrue("Timeout while waiting for alarm to go off",
83                 alarmAlert.waitForExists(2 * 60 * 1000));
84 
85         clickByText("Dismiss");
86     }
87 
88     /**
89      * Helper function to set an alarm
90      * @param minutesFromNow
91      * @throws UiObjectNotFoundException
92      */
setAlarm(int minutesFromNow)93     private void setAlarm(int minutesFromNow) throws UiObjectNotFoundException {
94         UiObject setAlarm = new UiObject(new UiSelector().textStartsWith("Alarm set"));
95         if (!setAlarm.exists())
96             setAlarm = new UiObject(new UiSelector().textStartsWith("Set alarm"));
97         setAlarm.click();
98 
99         // let's add an alarm
100         clickByDescription("Add alarm");
101         // let's set the time
102         clickByText("Time");
103 
104         // we want the minutes only
105         UiSelector minuteAreaSelector = new UiSelector().className(
106                 android.widget.NumberPicker.class.getName()).instance(1);
107         UiSelector minuteIncreaseButtonSelector = minuteAreaSelector.childSelector(
108                 new UiSelector().className(android.widget.Button.class.getName()).instance(1));
109 
110         // increment minutes a couple of times
111         for (int x = 0; x < minutesFromNow; x++)
112             new UiObject(minuteIncreaseButtonSelector).click();
113         clickByText("Done");
114 
115         // few confirmations to click thru
116         UiObject doneButton = new UiObject(new UiSelector().text("Done"));
117         UiObject okButton = new UiObject(new UiSelector().text("OK"));
118         // working around some inconsistencies in phone vs tablet UI
119         if (doneButton.exists()) {
120             doneButton.click();
121         } else {
122             okButton.click(); // let it fail if neither exists
123         }
124 
125         // we're done. Let's return to home screen
126         clickByText("Done");
127         getUiDevice().pressHome();
128     }
129 
130     /**
131      * Helper to click on objects that match the content-description text
132      * @param text
133      * @throws UiObjectNotFoundException
134      */
clickByDescription(String text)135     private void clickByDescription(String text) throws UiObjectNotFoundException {
136         UiObject obj = new UiObject(new UiSelector().description(text));
137         obj.clickAndWaitForNewWindow();
138     }
139 
140     /**
141      * Helper to click on object that match the text value
142      * @param text
143      * @throws UiObjectNotFoundException
144      */
clickByText(String text)145     private void clickByText(String text) throws UiObjectNotFoundException {
146         UiObject obj = new UiObject(new UiSelector().text(text));
147         obj.clickAndWaitForNewWindow();
148     }
149 }