/* * Copyright (C) 2013 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.uiautomator.common.helpers; import com.android.uiautomator.core.UiObject; import com.android.uiautomator.core.UiObjectNotFoundException; import com.android.uiautomator.core.UiSelector; import java.util.Calendar; /** * Use this helper anywhere there is a date picker to manage. This helper * will set date specified in a Calendar object. */ public class DatePickerHelper { public static final int MONTH = 0; public static final int DAY = 1; public static final int YEAR = 2; public static String getCurrentMonth() throws UiObjectNotFoundException { return getNumberPickerField(MONTH).getText(); } public static String getCurrentDay() throws UiObjectNotFoundException { return getNumberPickerField(DAY).getText(); } public static String getCurrentYear() throws UiObjectNotFoundException { return getNumberPickerField(YEAR).getText(); } public static void incrementMonth() throws UiObjectNotFoundException { incrementMonth(1); } public static void incrementMonth(int count) throws UiObjectNotFoundException { for (int x = 0; x < count; x++) getNumberPickerIncrementButton(MONTH).click(); } public static void decrementMonth() throws UiObjectNotFoundException { decrementMonth(1); } public static void decrementMonth(int count) throws UiObjectNotFoundException { for (int x = 0; x < count; x++) getNumberPickerDecrementButton(MONTH).click(); } public static void incrementDay() throws UiObjectNotFoundException { incrementDay(1); } public static void incrementDay(int count) throws UiObjectNotFoundException { for (int x = 0; x < count; x++) getNumberPickerIncrementButton(DAY).click(); } public static void decrementDay() throws UiObjectNotFoundException { decrementDay(1); } public static void decrementDay(int count) throws UiObjectNotFoundException { for (int x = 0; x < count; x++) getNumberPickerDecrementButton(DAY).click(); } public static void incrementYear() throws UiObjectNotFoundException { incrementYear(1); } public static void incrementYear(int count) throws UiObjectNotFoundException { for (int x = 0; x < count; x++) getNumberPickerIncrementButton(YEAR).click(); } public static void decrementYear() throws UiObjectNotFoundException { decrementYear(1); } public static void decrementYear(int count) throws UiObjectNotFoundException { for (int x = 0; x < count; x++) getNumberPickerDecrementButton(YEAR).click(); } public static UiObject getNumberPicker(int instance) { return new UiObject(new UiSelector().className( android.widget.NumberPicker.class.getName()).instance(instance)); } public static UiObject getNumberPickerField(int instance) throws UiObjectNotFoundException { return getNumberPicker(instance).getChild( new UiSelector().className(android.widget.EditText.class.getName())); } public static UiObject getNumberPickerDecrementButton(int instance) throws UiObjectNotFoundException { return getNumberPicker(instance).getChild( new UiSelector().className(android.widget.Button.class.getName()).instance(0)); } public static UiObject getNumberPickerIncrementButton(int instance) throws UiObjectNotFoundException { return getNumberPicker(instance).getChild( new UiSelector().className(android.widget.Button.class.getName()).instance(1)); } public static void clickDone() throws UiObjectNotFoundException { new UiObject(new UiSelector().text("Done")).click(); } public static void setDate(Calendar cal) throws UiObjectNotFoundException { int calYear = cal.get(Calendar.YEAR); int calMonth = cal.get(Calendar.MONTH); int calDay = cal.get(Calendar.DAY_OF_MONTH); // Adjust day - increment or decrement using the shortest path // while accounting for number of days in month and considering // special case for Feb and leap years. int dpDay = Integer.parseInt(getCurrentDay()); if (calDay > dpDay) { if (calDay - dpDay < getDaysInMonth(calYear, calMonth) / 2) incrementDay(calDay - dpDay); else decrementDay(dpDay - calDay + getDaysInMonth(calYear, calMonth)); } else if (dpDay > calDay) { if (dpDay - calDay < getDaysInMonth(calYear, calMonth) / 2) decrementDay(dpDay - calDay); else incrementDay(calDay - dpDay + getDaysInMonth(calYear, calMonth)); } // Adjust month - increment or decrement using the shortest path int dpMonth = toMonthNumber(getCurrentMonth()); if (calMonth > dpMonth) { if (calMonth - dpMonth < 6) incrementMonth(calMonth - dpMonth); else decrementMonth(dpMonth - calMonth + 12); } else if (dpMonth > calMonth) { if (dpMonth - calMonth < 6) decrementMonth(dpMonth - calMonth); else incrementMonth(calMonth - dpMonth + 12); } // Adjust year int dpYear = Integer.parseInt(getCurrentYear()); if (calYear > dpYear) { incrementYear(calYear - dpYear); } else if (dpYear > calYear) { decrementYear(dpYear - calYear); } } private static int toMonthNumber(String monthName) { String months[] = new String[] {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; for (int x = 0; x < months.length; x++) { if (months[x].contains(monthName)) return x; } return 0; } /** * Get the number of days in the month * @param year * @param month * @return */ private static int getDaysInMonth(int year, int month) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); return cal.getActualMaximum(Calendar.DAY_OF_MONTH); } }