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