1235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri/*
2235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri * Copyright (C) 2016 The Android Open Source Project
3235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri *
4235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri * in compliance with the License. You may obtain a copy of the License at
6235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri *
7235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri * http://www.apache.org/licenses/LICENSE-2.0
8235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri *
9235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri * Unless required by applicable law or agreed to in writing, software distributed under the License
10235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri * or implied. See the License for the specific language governing permissions and limitations under
12235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri * the License.
13235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri */
14235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
15ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.app.wizard;
16235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
173103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.junit.Assert.assertTrue;
183103f63e99d47573823957f7aa34308555873221Aurimas Liutikas
1923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport android.content.Context;
20235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.content.Intent;
21235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.content.res.Resources;
223103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.test.InstrumentationRegistry;
2335232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikasimport android.support.test.filters.LargeTest;
243103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.test.rule.ActivityTestRule;
253103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.test.runner.AndroidJUnit4;
268619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport android.util.Log;
278619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport android.view.KeyEvent;
288619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport android.widget.LinearLayout;
298619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas
30ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.app.GuidedStepFragment;
31ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.test.R;
32ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.GuidanceStylist;
33ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.GuidedAction;
34ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.GuidedDatePickerAction;
35ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.VerticalGridView;
36ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.picker.DatePicker;
373103f63e99d47573823957f7aa34308555873221Aurimas Liutikas
3823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport org.junit.Before;
3923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport org.junit.Rule;
4023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport org.junit.Test;
4123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport org.junit.runner.RunWith;
42235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
43235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.text.SimpleDateFormat;
44235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.ArrayList;
45235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.Calendar;
46235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.Date;
47235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.List;
48235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
4935232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas@LargeTest
5023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri@RunWith(AndroidJUnit4.class)
5123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiripublic class GuidedDatePickerTest {
52235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
53235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static final long TRANSITION_LENGTH = 1000;
54235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static long VERTICAL_SCROLL_WAIT = 500;
55235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static long HORIZONTAL_SCROLL_WAIT = 500;
5623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    static final long FINAL_WAIT = 1000;
57235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
58235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static final String TAG = "GuidedDatePickerTest";
59235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
60235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int DAY_INDEX = 0;
61235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int MONTH_INDEX = 1;
62235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int YEAR_INDEX = 2;
6323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
6423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Rule
653103f63e99d47573823957f7aa34308555873221Aurimas Liutikas    public ActivityTestRule<GuidedStepAttributesTestActivity> activityTestRule =
663103f63e99d47573823957f7aa34308555873221Aurimas Liutikas            new ActivityTestRule<>(GuidedStepAttributesTestActivity.class, false, false);
6723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
68235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    GuidedStepAttributesTestActivity mActivity;
69235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
70235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
71235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void initActivity(Intent intent) {
7223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        mActivity = activityTestRule.launchActivity(intent);
73235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        try {
74235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(2000);
75235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } catch(InterruptedException e) {
76235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            e.printStackTrace();
77235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
7823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
79235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
80235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
8123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    Context mContext;
8223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Before
8323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void setUp() {
8423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();;
8523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
86235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
8723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public static void sendKey(int keyCode) {
8823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode);
8923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
90235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
9123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    private int getColumnIndexForDateField(int field, int[] columnIndices) {
92235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColDayIndex = columnIndices[0];
93235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColMonthIndex = columnIndices[1];
94235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColYearIndex = columnIndices[2];
95235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int columnIndex = -1;
96235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        switch (field) {
97235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.DAY_OF_MONTH:
98235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColDayIndex;
99235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
100235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.MONTH:
101235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColMonthIndex;
102235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
103235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.YEAR:
104235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColYearIndex;
105235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
10623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        return columnIndex;
10723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
108235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
10923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    private void horizontalScrollToDateField(int field, int[] columnIndices,
11023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                                             DatePicker pickerView) throws Throwable{
11123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int columnIndex = getColumnIndexForDateField(field, columnIndices);
112235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
11323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        LinearLayout columnsLayout = (LinearLayout) pickerView.getChildAt(0);
114235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
115235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
116235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (focusedFieldPos == -1) {
11723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
118235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
119235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
120235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
121235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        assertTrue("Date field could not be focused!", (focusedFieldPos != -1));
122235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
123235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // following is to skip the separator fields "/" which are unfocusable but counted as
124235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // children of columnsLayout
125235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        switch (focusedFieldPos) {
126235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 0:
127235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 0;
128235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
129235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 2:
130235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 1;
131235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
132235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 4:
133235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 2;
134235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
135235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
136235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // now scroll right or left to the corresponding date field as indicated by the input field
137235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int horizontalScrollOffset = columnIndex - focusedFieldPos;
138235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
139235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int horizontalScrollDir = KeyEvent.KEYCODE_DPAD_RIGHT;
140235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (horizontalScrollOffset < 0) {
141235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            horizontalScrollOffset = -horizontalScrollOffset;
142235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            horizontalScrollDir = KeyEvent.KEYCODE_DPAD_LEFT;
143235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
144235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        for(int i = 0; i < horizontalScrollOffset; i++) {
14523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(horizontalScrollDir);
146235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(HORIZONTAL_SCROLL_WAIT);
147235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
148235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
14923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
15023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
15123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    /**
15223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * Scrolls vertically all the way up or down (depending on the provided scrollDir parameter)
15323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * to fieldValue if it's not equal to -1; otherwise, the scrolling goes all the way to the end.
15423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param field The date field over which the scrolling is performed
15523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param fieldValue The field value to scroll to or -1 if the scrolling should go all the way.
15623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param columnIndices The date field indices corresponding to day, month, and the year
15723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param pickerView The DatePicker view.
15823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param scrollDir The direction of scrolling to reach the desired field value.
15923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @throws Throwable
16023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     */
16123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    private void verticalScrollToFieldValue(int field, int fieldValue, int[] columnIndices,
16223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                                                 DatePicker pickerView, int scrollDir)
16323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            throws Throwable {
16423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
16523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int columnIndex = getColumnIndexForDateField(field, columnIndices);
16623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int colDayIndex = columnIndices[0];
16723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int colMonthIndex = columnIndices[1];
16823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int colYearIndex = columnIndices[2];
16923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
17023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        horizontalScrollToDateField(field, columnIndices, pickerView);
171235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
172235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
17323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        currentActionCal.setTimeInMillis(pickerView.getDate());
174235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
175235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar minCal = Calendar.getInstance();
17623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        minCal.setTimeInMillis(pickerView.getMinDate());
177235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
178235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar maxCal = Calendar.getInstance();
17923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        maxCal.setTimeInMillis(pickerView.getMaxDate());
180235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
181235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
182235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int prevColumnVal = -1;
18323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int currentColumnVal = pickerView.getColumnAt(columnIndex).getCurrentValue();
18423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        while( currentColumnVal != prevColumnVal && currentColumnVal != fieldValue){
18523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            assertTrue(mContext.getString(R.string.datepicker_test_wrong_day_value),
1863103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    pickerView.getColumnAt(colDayIndex).getCurrentValue()
1873103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == currentActionCal.get(Calendar.DAY_OF_MONTH)
188235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
18923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            assertTrue(mContext.getString(R.string.datepicker_test_wrong_month_value),
1903103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    pickerView.getColumnAt(colMonthIndex).getCurrentValue()
1913103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == currentActionCal.get(Calendar.MONTH)
192235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
19323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            assertTrue(mContext.getString(R.string.datepicker_test_wrong_year_value),
1943103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    pickerView.getColumnAt(colYearIndex).getCurrentValue()
1953103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == currentActionCal.get(Calendar.YEAR)
196235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
197235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
19823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            int offset = scrollDir == KeyEvent.KEYCODE_DPAD_DOWN ? 1 : -1;
199235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            addDate(currentActionCal, field, offset, minCal, maxCal);
200235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
20123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(scrollDir);
202235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(VERTICAL_SCROLL_WAIT);
203235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
204235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            prevColumnVal = currentColumnVal;
20523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            currentColumnVal = pickerView.getColumnAt(columnIndex).getCurrentValue();
206235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
207235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
208235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
209235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void addDate(Calendar mCurrentDate, int field, int offset,
210235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                         Calendar mMinDate, Calendar mMaxDate) {
211235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxOffset = -1;
212235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int actualMinFieldValue, actualMaxFieldValue;
213235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
214235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if ( field == Calendar.YEAR ) {
215235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMinFieldValue = mMinDate.get(Calendar.YEAR);
216235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMaxFieldValue = mMaxDate.get(Calendar.YEAR);
217235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } else {
218235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMinFieldValue = mCurrentDate.getActualMinimum(field);
219235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMaxFieldValue = mCurrentDate.getActualMaximum(field);
220235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
221235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
222235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if ( offset > 0 ) {
223235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            maxOffset = Math.min(
224235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    actualMaxFieldValue - mCurrentDate.get(field), offset);
225235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            mCurrentDate.add(field, maxOffset);
226235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            if (mCurrentDate.after(mMaxDate)) {
227235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
228235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
229235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } else {
230235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            maxOffset = Math.max(
231235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    actualMinFieldValue - mCurrentDate.get(field), offset);
232235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            mCurrentDate.add(field, Math.max(offset, maxOffset));
233235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            if (mCurrentDate.before(mMinDate)) {
234235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
235235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
236235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
237235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
238235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
23923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
24023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testJanuaryToFebruaryTransitionForLeapYear() throws Throwable {
24123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
24223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
24323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
24423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
24523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
24623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Jan to Feb (leap year)";
24723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
24823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
24923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
25023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
25123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
25223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
25323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
25423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2016);   // 2016 is a leap year
25523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.JANUARY);
25623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
25723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
25823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
25923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
26023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
26123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
26223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
26323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
26423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
26523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
26623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
26723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
26823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
26923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
27023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
27123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
27223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
27323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
27423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
27523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
27623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
277235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
27823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.FEBRUARY, new int[] {0, 1, 2},
27923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
28023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
28123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testJanuaryToFebruaryTransitionForLeapYear() Execution time: " + executionTime);
28223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
28323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
284235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
28523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
28623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testFebruaryToMarchTransitionForLeapYear() throws Throwable {
28723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
28823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
289235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
290235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String title = "Date Picker Transition Test";
291235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String breadcrumb = "Month Transition Test Demo";
29223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Feb to Mar (leap year)";
293235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
294235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                breadcrumb, null);
295235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
296235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
297235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
298235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar cal = Calendar.getInstance();
299235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
300235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        cal.set(Calendar.YEAR, 2016);
30123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.FEBRUARY);
30223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
30323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
30423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
30523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
30623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
30723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
30823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
30923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
31023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
31123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
31223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
31323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
31423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
31523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
31623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
31723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
31823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
31923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
32023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
32123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
32223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
32323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
32423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.MARCH, new int[] {0, 1, 2},
32523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
32623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
32723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testFebruaryToMarchTransition() Execution time: " + executionTime);
32823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
32923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
33023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
33123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
33223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testJanuaryToFebruaryTransitionForNonLeapYear() throws Throwable {
33323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
33423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
33523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
33623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
33723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
33823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Jan to Feb (nonleap year)";
33923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
34023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
34123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
34223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
34323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
34423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
34523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
34623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2017);   // 2017 is a leap year
347235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        cal.set(Calendar.MONTH, Calendar.JANUARY);
34823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
34923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
35023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
35123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
35223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
35323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
35423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
35523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
35623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
35723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
35823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
35923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
36023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
36123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
36223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
36323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
36423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
36523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
36623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
36723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
36823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
36923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
37023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.FEBRUARY, new int[] {0, 1, 2},
37123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
37223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
37323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testJanuaryToFebruaryTransition() Execution time: " + executionTime);
37423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
37523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
37623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
37723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
37823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testFebruaryToMarchTransitionForNonLeapYear() throws Throwable {
37923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
38023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
38123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
38223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
38323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
38423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Feb to Mar (nonleap year)";
38523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
38623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
38723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
38823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
38923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
39023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
39123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
39223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2017);
39323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.FEBRUARY);
39423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
39523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
39623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
39723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
39823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
39923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
40023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
40123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
40223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
40323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
40423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
40523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
40623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
40723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
40823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
40923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
41023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
41123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
41223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
41323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
41423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
41523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
41623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.MARCH, new int[] {0, 1, 2},
41723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
41823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
41923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testFebruaryToMarchTransition() Execution time: " + executionTime);
42023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
42123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
42223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
42323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
42423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDecemberToNovemberTransition() throws Throwable {
42523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
42623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
42723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
42823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
42923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
43023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Dec to Nov";
43123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
43223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
43323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
43423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
43523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
43623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
43723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
43823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2016);
43923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.DECEMBER);
44023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
44123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
44223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
44323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
44423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
44523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
44623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
44723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
44823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
44923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
45023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
45123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
45223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
45323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
45423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
45523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
45623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
45723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
45823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
45923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
46023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
46123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
46223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.NOVEMBER, new int[] {0, 1, 2},
46323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_UP);
46423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
46523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDecemberToNovember() Execution time: " + executionTime);
46623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
46723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
46823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
46923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
47023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testNovemberToOctoberTransition() throws Throwable {
47123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
47223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
47323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
47423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
47523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
47623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Nov to Oct";
47723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
47823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
47923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
48023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
48123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
48223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
48323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
48423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2016);
48523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.NOVEMBER);
48623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
487235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Date initialDate = cal.getTime();
488235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
489235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
49023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
491235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(0)
492235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title("Date")
493235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(initialDate.getTime())
494235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
495235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
496235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
497235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(action);
498235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
499235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.clear();
500235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
501235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
502235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
503235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        initActivity(intent);
504235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
505235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
506235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.id.guidedactions_activator_item);
507235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
50823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.OCTOBER, new int[] {0, 1, 2},
50923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_UP);
51023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
51123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testNovemberToOctober() Execution time: " + executionTime);
51223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
51323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
51423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
51523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
51623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testLeapToNonLeapYearTransition() throws Throwable {
51723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
51823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
51923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
52023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
52123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Leap Year Transition Test Demo";
52223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing Feb transition from leap to nonlneap year";
52323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
52423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
52523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
52623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
52723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
52823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
52923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
53023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2016);   // 2016 is a leap year
53123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.FEBRUARY);
53223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
53323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
53423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
53523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
53623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
53723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
53823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
53923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
54023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
54123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
54223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
54323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
54423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
54523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
54623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
54723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
54823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
54923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
55023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
55123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
55223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
55323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
55423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.YEAR, 2017, new int[] {0, 1, 2},
55523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
55623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
55723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testLeapToNonLeapYearTransition() Execution time: " + executionTime);
55823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
55923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
56023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
56123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
56223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testNonLeapToLeapYearTransition() throws Throwable {
56323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
56423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
56523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
56623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
56723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Leap Year Transition Test Demo";
56823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing Feb transition from nonleap to leap year";
56923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
57023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
57123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
57223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
57323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
57423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
57523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
57623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2017);   // 2017 is a non-leap year
57723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.FEBRUARY);
57823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
57923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
58023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
58123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
58223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
58323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
58423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
58523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
58623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
58723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
58823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
58923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
59023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
59123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
59223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
59323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
59423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
59523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
59623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
59723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
59823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
59923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
60023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.YEAR, 2016, new int[] {0, 1, 2},
60123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_UP);
60223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
60323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testNonLeapToLeapYearTransition() Execution time: " + executionTime);
604235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(FINAL_WAIT);
605235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
606235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
607235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void traverseMonths(DatePicker mPickerView, GuidedDatePickerAction dateAction)
60823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            throws Throwable {
609235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
610235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
611235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.getGuidedStepTestFragment();
612235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
613235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
614235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentActionCal.setTimeInMillis(dateAction.getDate());
615235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
61623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
617235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
618235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
619235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int prevMonth = -1;
620235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int currentMonth = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
621235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        while (currentMonth != prevMonth) {
622235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int prevDayOfMonth = -1;
623235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
624235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            // scroll down the days till reaching the last day of month
625235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            while (currentDayOfMonth != prevDayOfMonth) {
62623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                sendKey(KeyEvent.KEYCODE_DPAD_DOWN);
627235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                Thread.sleep(VERTICAL_SCROLL_WAIT);
628235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                prevDayOfMonth = currentDayOfMonth;
629235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
630235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
631235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int oldDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
632235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int oldMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
633235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            // increment the month
63423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_RIGHT);
635235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(VERTICAL_SCROLL_WAIT);
636235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
63723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_DOWN);
638235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
639235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
640235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int newDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
641235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int newMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
642235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verifyMonthTransition(currentActionCal,
643235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    oldDayValue, oldMonthValue, newDayValue, newMonthValue);
644235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
64523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_LEFT);
646235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
647235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            prevMonth = currentMonth;
648235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            currentMonth = newMonthValue;
649235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
650235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
651235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
652235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
65323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
654235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void verifyMonthTransition(Calendar currentCal, int oldDayValue, int oldMonthValue,
655235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                                       int newDayValue, int newMonthValue) {
656235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
657235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (oldMonthValue == newMonthValue)
658235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            return;
659235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
660235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.DAY_OF_MONTH, 1);
661235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.MONTH, oldMonthValue);
662235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int expectedOldDayValue = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
663235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.MONTH, newMonthValue);
664235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int numDaysInNewMonth = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
6653103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        int expectedNewDayValue = (expectedOldDayValue <= numDaysInNewMonth)
6663103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                ? expectedOldDayValue : numDaysInNewMonth;
667235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
66823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        assertTrue(mContext.getString(
669235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.string.datepicker_test_transition_error1, oldMonthValue),
670235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                oldDayValue == expectedOldDayValue
671235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        );
67223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        assertTrue(mContext.getString(
673235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.string.datepicker_test_transition_error2, newDayValue, newMonthValue),
674235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                newDayValue == expectedNewDayValue
675235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        );
676235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
677235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
67823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
67923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesMDYFormat() throws Throwable {
68023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
68123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
68223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
68323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
68423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
68523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {1, 0, 2}, datePickerActions[0]);
68623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
68723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesMDYFormat() Execution time: " + executionTime);
68823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
68923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
69023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
69123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesDMYFormat() throws Throwable {
69223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
69323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
69423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
69523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
69623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "setup dateactions complete!");
69723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, datePickerActions[1]);
69823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
69923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesDMYFormat() Execution time: " + executionTime);
70023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
70123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
70223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
70323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
70423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesWithYearEqual() throws Throwable {
70523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
70623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
70723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
70823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
70923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
71023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, datePickerActions[2]);
71123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
71223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesWithYearEqual() Execution time: " + executionTime);
71323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
71423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
71523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
71623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
71723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesWithMonthAndYearEqual() throws Throwable {
71823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
71923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
72023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
72123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
72223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
72323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, datePickerActions[3]);
72423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
72523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesWithMonthAndYearEqual() Execution time: " + executionTime);
72623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
72723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
72823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
72923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
73023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesWithAllFieldsEqual() throws Throwable {
73123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
73223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
733235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
73423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
73523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
73623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, datePickerActions[4]);
73723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
73823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesWithAllFieldsEqual() Execution time: " + executionTime);
73923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
74023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
74123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
74223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    private GuidedDatePickerAction[] setupDateActionsForMinAndMaxRangeTests() {
74323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
74423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Resources res = mContext.getResources();
745235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
746235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
747235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
748235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currCal = Calendar.getInstance();
749235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.YEAR, 2016);
750235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.MONTH, Calendar.JULY);
751235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.DAY_OF_MONTH, 15);
752235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
753235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar minCal = Calendar.getInstance();
754235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.YEAR, 2014);
755235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, Calendar.OCTOBER);
756235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, 20);
757235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
758235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar maxCal = Calendar.getInstance();
759235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.YEAR, 2018);
760235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.MONTH, Calendar.FEBRUARY);
761235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.DAY_OF_MONTH, 10);
762235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
763235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String title = "Date Picker Range Test";
764235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String breadcrumb = "Date Picker Range Test Demo";
765235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String description = "";
766235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
767235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                breadcrumb, null);
768235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
769235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
770235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
771235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing different date formats and the correctness of range changes as we scroll
772235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction1 = new GuidedDatePickerAction.Builder(
77323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
774235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(0)
775235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
776235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTime()),
777235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTime())))
778235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
779235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
780235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("MDY")
781235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
782235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
783235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
784235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
785235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction2 = new GuidedDatePickerAction.Builder(
78623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
787235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(1)
788235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
789235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
790235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
791235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
792235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
793235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
794235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
795235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
796235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
797235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
798235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when Year is equal
799235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.YEAR, maxCal.get(Calendar.YEAR));
800235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int minMonth = Math.min(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
801235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxMonth = Math.max(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
802235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, minMonth);
803235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.MONTH, maxMonth);
804235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
805235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction3 = new GuidedDatePickerAction.Builder(
80623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
807235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(2)
808235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
809235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
810235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
811235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
812235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
813235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
814235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
815235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
816235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
817235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
818235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
819235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when both Month and Year are equal
820235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, maxCal.get(Calendar.MONTH));
821235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int minDay = Math.min(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
822235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxDay = Math.max(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
823235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, minDay);
824235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.DAY_OF_MONTH, maxDay);
825235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
826235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction4 = new GuidedDatePickerAction.Builder(
82723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
828235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(3)
829235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
830235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
831235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
832235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
833235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
834235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
835235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
836235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
837235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
838235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
839235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
840235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when all fields are equal
841235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, maxCal.get(Calendar.DAY_OF_MONTH));
842235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
843235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction5 = new GuidedDatePickerAction.Builder(
84423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
845235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(4)
846235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
847235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
848235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
849235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
850235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
851235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
852235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
853235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
854235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
855235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
856235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction1);
857235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction2);
858235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction3);
859235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction4);
860235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction5);
861235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
862235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.clear();
863235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
864235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
865235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
866235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        initActivity(intent);
86723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        return new GuidedDatePickerAction[] {dateAction1, dateAction2, dateAction3, dateAction4,
86823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                dateAction5};
869235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
870235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
871235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void scrollToMinAndMaxDates(int[] columnIndices, GuidedDatePickerAction dateAction)
872235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            throws Throwable{
873235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
874235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
875235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.getGuidedStepTestFragment();
876235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
877235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        VerticalGridView guidedActionsList = (VerticalGridView)
878235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.findViewById(R.id.guidedactions_list);
879235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
880235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int currSelectedAction = mFragment.getSelectedActionPosition();
881235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // scroll up/down to the requested action
882235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        long verticalScrollOffset = dateAction.getId() - currSelectedAction;
883235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
884235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int verticalScrollDir = KeyEvent.KEYCODE_DPAD_DOWN;
885235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (verticalScrollOffset < 0) {
886235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verticalScrollOffset= -verticalScrollOffset;
887235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verticalScrollDir = KeyEvent.KEYCODE_DPAD_UP;
888235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
889235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        for(int i = 0; i < verticalScrollOffset; i++) {
89023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(verticalScrollDir);
891235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
892235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
893235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
8943103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        assertTrue("The wrong action was selected!", mFragment.getSelectedActionPosition()
8953103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                == dateAction.getId());
896235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        DatePicker mPickerView = (DatePicker) mFragment.getActionItemView((int) dateAction.getId())
897235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .findViewById(R.id.guidedactions_activator_item);
898235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
899235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
900235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentActionCal.setTimeInMillis(dateAction.getDate());
901235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
902235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
903235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // scrolling to the minimum date
904235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
90523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.YEAR, -1, columnIndices, mPickerView,
90623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_UP);
907235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
908235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
90923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, -1, columnIndices, mPickerView,
91023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_UP);
911235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
912235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
91323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.DAY_OF_MONTH, -1, columnIndices, mPickerView,
91423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_UP);
915235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
916235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
917235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(VERTICAL_SCROLL_WAIT);
918235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
919235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // now scrolling to the maximum date
920235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
92123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.YEAR, -1, columnIndices, mPickerView,
92223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_DOWN);
923235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
924235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
92523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, -1, columnIndices, mPickerView,
92623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_DOWN);
927235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
928235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
92923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.DAY_OF_MONTH, -1, columnIndices, mPickerView,
93023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_DOWN);
931235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
932235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
93323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
934235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
935235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
936235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
937235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri}
938