10e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang/* 20e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * Copyright (C) 2013 The Android Open Source Project 30e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * 40e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 50e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * you may not use this file except in compliance with the License. 60e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * You may obtain a copy of the License at 70e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * 80e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * http://www.apache.org/licenses/LICENSE-2.0 90e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * 100e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * Unless required by applicable law or agreed to in writing, software 110e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * distributed under the License is distributed on an "AS IS" BASIS, 120e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * See the License for the specific language governing permissions and 140e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * limitations under the License. 150e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang */ 160e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wangpackage com.android.uiautomator.common.helpers; 170e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 180e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wangimport com.android.uiautomator.core.UiObject; 190e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wangimport com.android.uiautomator.core.UiObjectNotFoundException; 200e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wangimport com.android.uiautomator.core.UiSelector; 210e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 220e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wangimport java.util.Calendar; 230e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wangimport java.util.Locale; 240e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 250e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang/** 260e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * Use this helper anywhere there is a time picker to manage. This helper 270e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang * will set time specified in a Calendar object. 280e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang */ 290e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wangpublic class TimePickerHelper { 300e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 310e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static final int HOUR = 0; 320e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static final int MINUTE = 1; 330e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static final int MERIDIEM = 2; 340e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 350e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static String getCurrentHour() throws UiObjectNotFoundException { 360e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang return getNumberPickerField(HOUR).getText(); 370e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 380e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 390e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static String getCurrentMinute() throws UiObjectNotFoundException { 400e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang return getNumberPickerField(MINUTE).getText(); 410e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 420e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 430e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static String getCurrentMeridiem() throws UiObjectNotFoundException { 440e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang return getNumberPickerField(MERIDIEM).getText(); 450e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 460e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 470e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 480e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void incrementHour() throws UiObjectNotFoundException { 490e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang incrementHour(1); 500e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 510e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 520e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void incrementHour(int count) throws UiObjectNotFoundException { 530e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang for (int x = 0; x < count; x++) 540e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang getNumberPickerIncrementButton(HOUR).click(); 550e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 560e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 570e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void decrementHour() throws UiObjectNotFoundException { 580e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang decrementHour(1); 590e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 600e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 610e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void decrementHour(int count) throws UiObjectNotFoundException { 620e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang for (int x = 0; x < count; x++) 630e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang getNumberPickerDecrementButton(HOUR).click(); 640e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 650e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 660e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void incrementMinute() throws UiObjectNotFoundException { 670e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang incrementMinute(1); 680e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 690e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 700e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void incrementMinute(int count) throws UiObjectNotFoundException { 710e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang for (int x = 0; x < count; x++) 720e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang getNumberPickerIncrementButton(MINUTE).click(); 730e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 740e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 750e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void decrementMinute() throws UiObjectNotFoundException { 760e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang decrementMinute(1); 770e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 780e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 790e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void decrementMinute(int count) throws UiObjectNotFoundException { 800e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang for (int x = 0; x < count; x++) 810e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang getNumberPickerDecrementButton(MINUTE).click(); 820e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 830e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 840e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void selectPM() throws UiObjectNotFoundException { 850e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang getNumberPicker(MERIDIEM).getChild(new UiSelector().text("PM")).click(); 860e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 870e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 880e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void selectAM() throws UiObjectNotFoundException { 890e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang getNumberPicker(MERIDIEM).getChild(new UiSelector().text("AM")).click(); 900e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 910e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 920e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static UiObject getNumberPicker(int instance) { 930e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang return new UiObject(new UiSelector().className( 940e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang android.widget.NumberPicker.class.getName()).instance(instance)); 950e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 960e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 970e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static UiObject getNumberPickerField(int instance) 980e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang throws UiObjectNotFoundException { 990e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang return getNumberPicker(instance).getChild( 1000e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang new UiSelector().className(android.widget.EditText.class.getName())); 1010e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 1020e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 1030e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static UiObject getNumberPickerDecrementButton(int instance) 1040e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang throws UiObjectNotFoundException { 1050e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang return getNumberPicker(instance).getChild( 1060e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang new UiSelector().className(android.widget.Button.class.getName()).instance(0)); 1070e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 1080e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 1090e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static UiObject getNumberPickerIncrementButton(int instance) 1100e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang throws UiObjectNotFoundException { 1110e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang return getNumberPicker(instance).getChild( 1120e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang new UiSelector().className(android.widget.Button.class.getName()).instance(1)); 1130e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 1140e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 1150e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void clickDone() throws UiObjectNotFoundException { 1160e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang new UiObject(new UiSelector().text("Done")).click(); 1170e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 1180e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 1190e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang public static void setTime(Calendar cal) throws UiObjectNotFoundException { 1200e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang // Adjust minutes - increment or decrement using the shortest path 1210e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang int tpMinute = Integer.parseInt(getCurrentMinute()); 1220e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang int calMinute = cal.get(Calendar.MINUTE); 1230e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang if (calMinute > tpMinute) { 1240e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang if (calMinute - tpMinute < 30) 1250e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang incrementMinute(calMinute - tpMinute); 1260e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang else 1270e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang decrementMinute(tpMinute - calMinute + 60); 1280e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } else if (tpMinute > calMinute) { 1290e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang if (tpMinute - calMinute < 30) 1300e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang decrementMinute(tpMinute - calMinute); 1310e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang else 1320e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang incrementMinute(calMinute - tpMinute + 60); 1330e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 1340e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 1350e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang // Adjust hour - increment or decrement using the shortest path 1360e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang int tpHour = Integer.parseInt(getCurrentHour()); 1370e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang int calHour = cal.get(Calendar.HOUR); 1380e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang if (calHour > tpHour) { 1390e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang if (calHour - tpHour < 6) 1400e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang incrementHour(calHour - tpHour); 1410e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang else 1420e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang decrementHour(tpHour - calHour + 12); 1430e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } else if (tpHour > calHour) { 1440e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang if (tpHour - calHour < 6) 1450e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang decrementHour(tpHour - calHour); 1460e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang else 1470e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang incrementHour(calHour - tpHour + 12); 1480e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 1490e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 1500e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang // Adjust meridiem 1510e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang String calMer = cal.getDisplayName(Calendar.AM_PM, Calendar.SHORT, Locale.US); 1520e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang String tpMer = getCurrentMeridiem(); 1530e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang if (tpMer.equalsIgnoreCase(calMer)) 1540e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang return; 1550e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang 1560e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang if (!calMer.equalsIgnoreCase("AM")) { 1570e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang selectPM(); 1580e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } else { 1590e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang selectAM(); 1600e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 1610e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang } 1620e52fd6f867cb9b6a612ef224423a18b34d577f4Xia Wang} 163