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
15235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiripackage android.support.v17.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;
26235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.app.GuidedStepFragment;
277d7bf9541e0203ec67df0fe53367e2c126355b9esusnataimport android.support.v17.leanback.test.R;
28235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.GuidanceStylist;
29235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.GuidedAction;
30235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.GuidedDatePickerAction;
31235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.VerticalGridView;
32235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.picker.DatePicker;
33235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.util.Log;
34235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.view.KeyEvent;
35235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.widget.LinearLayout;
363103f63e99d47573823957f7aa34308555873221Aurimas Liutikas
3723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport org.junit.Before;
3823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport org.junit.Rule;
3923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport org.junit.Test;
4023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiriimport org.junit.runner.RunWith;
41235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
42235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.text.SimpleDateFormat;
43235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.ArrayList;
44235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.Calendar;
45235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.Date;
46235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.List;
47235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
4835232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas@LargeTest
4923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri@RunWith(AndroidJUnit4.class)
5023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiripublic class GuidedDatePickerTest {
51235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
52235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static final long TRANSITION_LENGTH = 1000;
53235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static long VERTICAL_SCROLL_WAIT = 500;
54235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static long HORIZONTAL_SCROLL_WAIT = 500;
5523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    static final long FINAL_WAIT = 1000;
56235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
57235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static final String TAG = "GuidedDatePickerTest";
58235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
59235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int DAY_INDEX = 0;
60235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int MONTH_INDEX = 1;
61235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int YEAR_INDEX = 2;
6223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
6323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Rule
643103f63e99d47573823957f7aa34308555873221Aurimas Liutikas    public ActivityTestRule<GuidedStepAttributesTestActivity> activityTestRule =
653103f63e99d47573823957f7aa34308555873221Aurimas Liutikas            new ActivityTestRule<>(GuidedStepAttributesTestActivity.class, false, false);
6623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
67235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    GuidedStepAttributesTestActivity mActivity;
68235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
69235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
70235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void initActivity(Intent intent) {
7123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        mActivity = activityTestRule.launchActivity(intent);
72235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        try {
73235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(2000);
74235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } catch(InterruptedException e) {
75235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            e.printStackTrace();
76235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
7723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
78235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
79235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
8023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    Context mContext;
8123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Before
8223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void setUp() {
8323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();;
8423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
85235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
8623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public static void sendKey(int keyCode) {
8723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode);
8823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
89235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
9023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    private int getColumnIndexForDateField(int field, int[] columnIndices) {
91235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColDayIndex = columnIndices[0];
92235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColMonthIndex = columnIndices[1];
93235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColYearIndex = columnIndices[2];
94235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int columnIndex = -1;
95235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        switch (field) {
96235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.DAY_OF_MONTH:
97235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColDayIndex;
98235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
99235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.MONTH:
100235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColMonthIndex;
101235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
102235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.YEAR:
103235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColYearIndex;
104235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
10523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        return columnIndex;
10623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
107235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
10823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    private void horizontalScrollToDateField(int field, int[] columnIndices,
10923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                                             DatePicker pickerView) throws Throwable{
11023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int columnIndex = getColumnIndexForDateField(field, columnIndices);
111235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
11223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        LinearLayout columnsLayout = (LinearLayout) pickerView.getChildAt(0);
113235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
114235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
115235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (focusedFieldPos == -1) {
11623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
117235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
118235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
119235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
120235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        assertTrue("Date field could not be focused!", (focusedFieldPos != -1));
121235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
122235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // following is to skip the separator fields "/" which are unfocusable but counted as
123235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // children of columnsLayout
124235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        switch (focusedFieldPos) {
125235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 0:
126235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 0;
127235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
128235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 2:
129235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 1;
130235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
131235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 4:
132235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 2;
133235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
134235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
135235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // now scroll right or left to the corresponding date field as indicated by the input field
136235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int horizontalScrollOffset = columnIndex - focusedFieldPos;
137235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
138235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int horizontalScrollDir = KeyEvent.KEYCODE_DPAD_RIGHT;
139235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (horizontalScrollOffset < 0) {
140235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            horizontalScrollOffset = -horizontalScrollOffset;
141235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            horizontalScrollDir = KeyEvent.KEYCODE_DPAD_LEFT;
142235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
143235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        for(int i = 0; i < horizontalScrollOffset; i++) {
14423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(horizontalScrollDir);
145235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(HORIZONTAL_SCROLL_WAIT);
146235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
147235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
14823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
14923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
15023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    /**
15123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * Scrolls vertically all the way up or down (depending on the provided scrollDir parameter)
15223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * to fieldValue if it's not equal to -1; otherwise, the scrolling goes all the way to the end.
15323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param field The date field over which the scrolling is performed
15423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param fieldValue The field value to scroll to or -1 if the scrolling should go all the way.
15523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param columnIndices The date field indices corresponding to day, month, and the year
15623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param pickerView The DatePicker view.
15723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @param scrollDir The direction of scrolling to reach the desired field value.
15823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     * @throws Throwable
15923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri     */
16023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    private void verticalScrollToFieldValue(int field, int fieldValue, int[] columnIndices,
16123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                                                 DatePicker pickerView, int scrollDir)
16223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            throws Throwable {
16323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
16423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int columnIndex = getColumnIndexForDateField(field, columnIndices);
16523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int colDayIndex = columnIndices[0];
16623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int colMonthIndex = columnIndices[1];
16723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int colYearIndex = columnIndices[2];
16823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
16923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        horizontalScrollToDateField(field, columnIndices, pickerView);
170235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
171235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
17223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        currentActionCal.setTimeInMillis(pickerView.getDate());
173235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
174235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar minCal = Calendar.getInstance();
17523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        minCal.setTimeInMillis(pickerView.getMinDate());
176235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
177235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar maxCal = Calendar.getInstance();
17823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        maxCal.setTimeInMillis(pickerView.getMaxDate());
179235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
180235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
181235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int prevColumnVal = -1;
18223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        int currentColumnVal = pickerView.getColumnAt(columnIndex).getCurrentValue();
18323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        while( currentColumnVal != prevColumnVal && currentColumnVal != fieldValue){
18423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            assertTrue(mContext.getString(R.string.datepicker_test_wrong_day_value),
1853103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    pickerView.getColumnAt(colDayIndex).getCurrentValue()
1863103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == currentActionCal.get(Calendar.DAY_OF_MONTH)
187235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
18823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            assertTrue(mContext.getString(R.string.datepicker_test_wrong_month_value),
1893103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    pickerView.getColumnAt(colMonthIndex).getCurrentValue()
1903103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == currentActionCal.get(Calendar.MONTH)
191235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
19223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            assertTrue(mContext.getString(R.string.datepicker_test_wrong_year_value),
1933103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    pickerView.getColumnAt(colYearIndex).getCurrentValue()
1943103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == currentActionCal.get(Calendar.YEAR)
195235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
196235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
19723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            int offset = scrollDir == KeyEvent.KEYCODE_DPAD_DOWN ? 1 : -1;
198235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            addDate(currentActionCal, field, offset, minCal, maxCal);
199235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
20023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(scrollDir);
201235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(VERTICAL_SCROLL_WAIT);
202235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
203235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            prevColumnVal = currentColumnVal;
20423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            currentColumnVal = pickerView.getColumnAt(columnIndex).getCurrentValue();
205235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
206235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
207235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
208235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void addDate(Calendar mCurrentDate, int field, int offset,
209235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                         Calendar mMinDate, Calendar mMaxDate) {
210235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxOffset = -1;
211235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int actualMinFieldValue, actualMaxFieldValue;
212235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
213235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if ( field == Calendar.YEAR ) {
214235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMinFieldValue = mMinDate.get(Calendar.YEAR);
215235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMaxFieldValue = mMaxDate.get(Calendar.YEAR);
216235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } else {
217235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMinFieldValue = mCurrentDate.getActualMinimum(field);
218235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMaxFieldValue = mCurrentDate.getActualMaximum(field);
219235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
220235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
221235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if ( offset > 0 ) {
222235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            maxOffset = Math.min(
223235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    actualMaxFieldValue - mCurrentDate.get(field), offset);
224235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            mCurrentDate.add(field, maxOffset);
225235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            if (mCurrentDate.after(mMaxDate)) {
226235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
227235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
228235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } else {
229235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            maxOffset = Math.max(
230235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    actualMinFieldValue - mCurrentDate.get(field), offset);
231235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            mCurrentDate.add(field, Math.max(offset, maxOffset));
232235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            if (mCurrentDate.before(mMinDate)) {
233235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
234235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
235235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
236235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
237235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
23823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
23923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testJanuaryToFebruaryTransitionForLeapYear() throws Throwable {
24023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
24123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
24223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
24323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
24423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
24523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Jan to Feb (leap year)";
24623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
24723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
24823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
24923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
25023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
25123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
25223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
25323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2016);   // 2016 is a leap year
25423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.JANUARY);
25523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
25623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
25723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
25823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
25923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
26023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
26123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
26223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
26323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
26423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
26523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
26623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
26723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
26823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
26923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
27023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
27123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
27223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
27323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
27423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
27523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
276235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
27723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.FEBRUARY, new int[] {0, 1, 2},
27823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
27923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
28023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testJanuaryToFebruaryTransitionForLeapYear() Execution time: " + executionTime);
28123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
28223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
283235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
28423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
28523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testFebruaryToMarchTransitionForLeapYear() throws Throwable {
28623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
28723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
288235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
289235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String title = "Date Picker Transition Test";
290235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String breadcrumb = "Month Transition Test Demo";
29123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Feb to Mar (leap year)";
292235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
293235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                breadcrumb, null);
294235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
295235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
296235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
297235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar cal = Calendar.getInstance();
298235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
299235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        cal.set(Calendar.YEAR, 2016);
30023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.FEBRUARY);
30123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
30223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
30323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
30423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
30523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
30623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
30723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
30823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
30923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
31023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
31123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
31223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
31323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
31423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
31523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
31623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
31723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
31823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
31923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
32023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
32123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
32223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
32323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.MARCH, new int[] {0, 1, 2},
32423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
32523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
32623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testFebruaryToMarchTransition() Execution time: " + executionTime);
32723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
32823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
32923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
33023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
33123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testJanuaryToFebruaryTransitionForNonLeapYear() throws Throwable {
33223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
33323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
33423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
33523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
33623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
33723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Jan to Feb (nonleap year)";
33823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
33923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
34023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
34123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
34223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
34323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
34423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
34523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2017);   // 2017 is a leap year
346235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        cal.set(Calendar.MONTH, Calendar.JANUARY);
34723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
34823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
34923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
35023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
35123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
35223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
35323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
35423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
35523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
35623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
35723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
35823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
35923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
36023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
36123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
36223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
36323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
36423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
36523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
36623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
36723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
36823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
36923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.FEBRUARY, new int[] {0, 1, 2},
37023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
37123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
37223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testJanuaryToFebruaryTransition() Execution time: " + executionTime);
37323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
37423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
37523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
37623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
37723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testFebruaryToMarchTransitionForNonLeapYear() throws Throwable {
37823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
37923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
38023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
38123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
38223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
38323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Feb to Mar (nonleap year)";
38423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
38523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
38623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
38723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
38823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
38923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
39023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
39123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2017);
39223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.FEBRUARY);
39323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
39423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
39523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
39623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
39723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
39823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
39923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
40023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
40123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
40223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
40323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
40423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
40523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
40623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
40723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
40823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
40923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
41023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
41123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
41223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
41323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
41423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
41523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.MARCH, new int[] {0, 1, 2},
41623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
41723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
41823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testFebruaryToMarchTransition() Execution time: " + executionTime);
41923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
42023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
42123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
42223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
42323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDecemberToNovemberTransition() throws Throwable {
42423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
42523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
42623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
42723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
42823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
42923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Dec to Nov";
43023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
43123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
43223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
43323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
43423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
43523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
43623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
43723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2016);
43823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.DECEMBER);
43923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
44023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
44123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
44223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
44323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
44423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
44523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
44623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
44723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
44823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
44923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
45023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
45123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
45223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
45323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
45423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
45523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
45623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
45723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
45823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
45923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
46023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
46123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.NOVEMBER, new int[] {0, 1, 2},
46223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_UP);
46323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
46423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDecemberToNovember() Execution time: " + executionTime);
46523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
46623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
46723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
46823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
46923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testNovemberToOctoberTransition() throws Throwable {
47023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
47123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
47223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
47323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
47423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Month Transition Test Demo";
47523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing the transition from Nov to Oct";
47623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
47723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
47823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
47923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
48023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
48123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
48223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
48323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2016);
48423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.NOVEMBER);
48523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
486235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Date initialDate = cal.getTime();
487235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
488235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
48923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
490235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(0)
491235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title("Date")
492235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(initialDate.getTime())
493235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
494235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
495235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
496235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(action);
497235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
498235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.clear();
499235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
500235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
501235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
502235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        initActivity(intent);
503235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
504235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
505235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.id.guidedactions_activator_item);
506235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
50723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, Calendar.OCTOBER, new int[] {0, 1, 2},
50823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_UP);
50923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
51023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testNovemberToOctober() Execution time: " + executionTime);
51123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
51223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
51323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
51423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
51523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testLeapToNonLeapYearTransition() throws Throwable {
51623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
51723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
51823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
51923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
52023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Leap Year Transition Test Demo";
52123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing Feb transition from leap to nonlneap year";
52223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
52323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
52423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
52523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
52623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
52723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
52823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
52923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2016);   // 2016 is a leap year
53023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.FEBRUARY);
53123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
53223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
53323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
53423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
53523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
53623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
53723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
53823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
53923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
54023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
54123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
54223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
54323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
54423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
54523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
54623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
54723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
54823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
54923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
55023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
55123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
55223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
55323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.YEAR, 2017, new int[] {0, 1, 2},
55423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
55523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
55623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testLeapToNonLeapYearTransition() Execution time: " + executionTime);
55723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
55823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
55923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
56023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
56123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testNonLeapToLeapYearTransition() throws Throwable {
56223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
56323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
56423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
56523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String title = "Date Picker Transition Test";
56623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String breadcrumb = "Leap Year Transition Test Demo";
56723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        String description = "Testing Feb transition from nonleap to leap year";
56823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
56923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                breadcrumb, null);
57023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
57123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
57223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
57323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Calendar cal = Calendar.getInstance();
57423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
57523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.YEAR, 2017);   // 2017 is a non-leap year
57623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.MONTH, Calendar.FEBRUARY);
57723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
57823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Date initialDate = cal.getTime();
57923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
58023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
58123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
58223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .id(0)
58323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .title("Date")
58423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .date(initialDate.getTime())
58523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .datePickerFormat("DMY")
58623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                .build();
58723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
58823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        actionList.add(action);
58923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
59023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
59123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
59223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
59323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
59423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        initActivity(intent);
59523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
59623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
59723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                R.id.guidedactions_activator_item);
59823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
59923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.YEAR, 2016, new int[] {0, 1, 2},
60023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mPickerView, KeyEvent.KEYCODE_DPAD_UP);
60123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
60223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testNonLeapToLeapYearTransition() Execution time: " + executionTime);
603235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(FINAL_WAIT);
604235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
605235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
606235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void traverseMonths(DatePicker mPickerView, GuidedDatePickerAction dateAction)
60723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            throws Throwable {
608235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
609235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
610235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.getGuidedStepTestFragment();
611235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
612235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
613235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentActionCal.setTimeInMillis(dateAction.getDate());
614235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
61523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
616235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
617235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
618235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int prevMonth = -1;
619235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int currentMonth = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
620235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        while (currentMonth != prevMonth) {
621235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int prevDayOfMonth = -1;
622235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
623235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            // scroll down the days till reaching the last day of month
624235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            while (currentDayOfMonth != prevDayOfMonth) {
62523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                sendKey(KeyEvent.KEYCODE_DPAD_DOWN);
626235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                Thread.sleep(VERTICAL_SCROLL_WAIT);
627235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                prevDayOfMonth = currentDayOfMonth;
628235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
629235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
630235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int oldDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
631235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int oldMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
632235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            // increment the month
63323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_RIGHT);
634235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(VERTICAL_SCROLL_WAIT);
635235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
63623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_DOWN);
637235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
638235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
639235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int newDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
640235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int newMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
641235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verifyMonthTransition(currentActionCal,
642235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    oldDayValue, oldMonthValue, newDayValue, newMonthValue);
643235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
64423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_LEFT);
645235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
646235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            prevMonth = currentMonth;
647235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            currentMonth = newMonthValue;
648235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
649235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
650235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
651235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
65223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
653235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void verifyMonthTransition(Calendar currentCal, int oldDayValue, int oldMonthValue,
654235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                                       int newDayValue, int newMonthValue) {
655235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
656235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (oldMonthValue == newMonthValue)
657235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            return;
658235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
659235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.DAY_OF_MONTH, 1);
660235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.MONTH, oldMonthValue);
661235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int expectedOldDayValue = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
662235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.MONTH, newMonthValue);
663235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int numDaysInNewMonth = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
6643103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        int expectedNewDayValue = (expectedOldDayValue <= numDaysInNewMonth)
6653103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                ? expectedOldDayValue : numDaysInNewMonth;
666235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
66723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        assertTrue(mContext.getString(
668235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.string.datepicker_test_transition_error1, oldMonthValue),
669235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                oldDayValue == expectedOldDayValue
670235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        );
67123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        assertTrue(mContext.getString(
672235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.string.datepicker_test_transition_error2, newDayValue, newMonthValue),
673235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                newDayValue == expectedNewDayValue
674235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        );
675235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
676235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
67723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
67823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesMDYFormat() throws Throwable {
67923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
68023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
68123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
68223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
68323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
68423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {1, 0, 2}, datePickerActions[0]);
68523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
68623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesMDYFormat() Execution time: " + executionTime);
68723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
68823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
68923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
69023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesDMYFormat() throws Throwable {
69123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
69223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
69323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
69423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
69523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "setup dateactions complete!");
69623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, datePickerActions[1]);
69723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
69823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesDMYFormat() Execution time: " + executionTime);
69923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
70023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
70123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
70223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
70323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesWithYearEqual() throws Throwable {
70423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
70523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
70623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
70723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
70823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
70923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, datePickerActions[2]);
71023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
71123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesWithYearEqual() Execution time: " + executionTime);
71223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
71323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
71423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
71523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
71623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesWithMonthAndYearEqual() throws Throwable {
71723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
71823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
71923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
72023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
72123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
72223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, datePickerActions[3]);
72323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
72423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesWithMonthAndYearEqual() Execution time: " + executionTime);
72523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
72623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
72723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
72823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    @Test
72923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    public void testDateRangesWithAllFieldsEqual() throws Throwable {
73023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
73123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long startTime = System.currentTimeMillis();
732235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
73323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        GuidedDatePickerAction[] datePickerActions = setupDateActionsForMinAndMaxRangeTests();
73423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
73523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, datePickerActions[4]);
73623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        long executionTime = System.currentTimeMillis() - startTime;
73723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Log.d(TAG, "testDateRangesWithAllFieldsEqual() Execution time: " + executionTime);
73823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Thread.sleep(FINAL_WAIT);
73923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    }
74023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri
74123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri    private GuidedDatePickerAction[] setupDateActionsForMinAndMaxRangeTests() {
74223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Intent intent = new Intent();
74323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        Resources res = mContext.getResources();
744235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
745235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
746235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
747235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currCal = Calendar.getInstance();
748235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.YEAR, 2016);
749235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.MONTH, Calendar.JULY);
750235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.DAY_OF_MONTH, 15);
751235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
752235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar minCal = Calendar.getInstance();
753235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.YEAR, 2014);
754235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, Calendar.OCTOBER);
755235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, 20);
756235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
757235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar maxCal = Calendar.getInstance();
758235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.YEAR, 2018);
759235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.MONTH, Calendar.FEBRUARY);
760235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.DAY_OF_MONTH, 10);
761235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
762235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String title = "Date Picker Range Test";
763235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String breadcrumb = "Date Picker Range Test Demo";
764235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String description = "";
765235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
766235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                breadcrumb, null);
767235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
768235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
769235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
770235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing different date formats and the correctness of range changes as we scroll
771235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction1 = new GuidedDatePickerAction.Builder(
77223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
773235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(0)
774235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
775235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTime()),
776235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTime())))
777235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
778235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
779235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("MDY")
780235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
781235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
782235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
783235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
784235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction2 = new GuidedDatePickerAction.Builder(
78523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
786235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(1)
787235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
788235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
789235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
790235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
791235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
792235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
793235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
794235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
795235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
796235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
797235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when Year is equal
798235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.YEAR, maxCal.get(Calendar.YEAR));
799235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int minMonth = Math.min(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
800235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxMonth = Math.max(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
801235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, minMonth);
802235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.MONTH, maxMonth);
803235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
804235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction3 = new GuidedDatePickerAction.Builder(
80523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
806235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(2)
807235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
808235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
809235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
810235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
811235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
812235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
813235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
814235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
815235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
816235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
817235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
818235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when both Month and Year are equal
819235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, maxCal.get(Calendar.MONTH));
820235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int minDay = Math.min(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
821235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxDay = Math.max(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
822235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, minDay);
823235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.DAY_OF_MONTH, maxDay);
824235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
825235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction4 = new GuidedDatePickerAction.Builder(
82623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
827235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(3)
828235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
829235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
830235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
831235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
832235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
833235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
834235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
835235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
836235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
837235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
838235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
839235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when all fields are equal
840235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, maxCal.get(Calendar.DAY_OF_MONTH));
841235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
842235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction5 = new GuidedDatePickerAction.Builder(
84323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                mContext)
844235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(4)
845235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
846235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
847235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
848235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
849235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
850235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
851235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
852235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
853235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
854235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
855235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction1);
856235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction2);
857235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction3);
858235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction4);
859235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction5);
860235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
861235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.clear();
862235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
863235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
864235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
865235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        initActivity(intent);
86623cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        return new GuidedDatePickerAction[] {dateAction1, dateAction2, dateAction3, dateAction4,
86723cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                dateAction5};
868235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
869235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
870235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void scrollToMinAndMaxDates(int[] columnIndices, GuidedDatePickerAction dateAction)
871235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            throws Throwable{
872235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
873235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
874235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.getGuidedStepTestFragment();
875235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
876235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        VerticalGridView guidedActionsList = (VerticalGridView)
877235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.findViewById(R.id.guidedactions_list);
878235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
879235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int currSelectedAction = mFragment.getSelectedActionPosition();
880235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // scroll up/down to the requested action
881235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        long verticalScrollOffset = dateAction.getId() - currSelectedAction;
882235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
883235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int verticalScrollDir = KeyEvent.KEYCODE_DPAD_DOWN;
884235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (verticalScrollOffset < 0) {
885235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verticalScrollOffset= -verticalScrollOffset;
886235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verticalScrollDir = KeyEvent.KEYCODE_DPAD_UP;
887235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
888235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        for(int i = 0; i < verticalScrollOffset; i++) {
88923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri            sendKey(verticalScrollDir);
890235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
891235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
892235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
8933103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        assertTrue("The wrong action was selected!", mFragment.getSelectedActionPosition()
8943103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                == dateAction.getId());
895235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        DatePicker mPickerView = (DatePicker) mFragment.getActionItemView((int) dateAction.getId())
896235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .findViewById(R.id.guidedactions_activator_item);
897235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
898235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
899235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentActionCal.setTimeInMillis(dateAction.getDate());
900235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
901235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
902235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // scrolling to the minimum date
903235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
90423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.YEAR, -1, columnIndices, mPickerView,
90523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_UP);
906235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
907235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
90823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, -1, columnIndices, mPickerView,
90923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_UP);
910235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
911235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
91223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.DAY_OF_MONTH, -1, columnIndices, mPickerView,
91323cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_UP);
914235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
915235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
916235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(VERTICAL_SCROLL_WAIT);
917235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
918235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // now scrolling to the maximum date
919235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
92023cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.YEAR, -1, columnIndices, mPickerView,
92123cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_DOWN);
922235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
923235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
92423cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.MONTH, -1, columnIndices, mPickerView,
92523cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_DOWN);
926235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
927235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
92823cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        verticalScrollToFieldValue(Calendar.DAY_OF_MONTH, -1, columnIndices, mPickerView,
92923cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri                KeyEvent.KEYCODE_DPAD_DOWN);
930235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
931235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
93223cd461516e1cb7862ce49f533178460c73b678bKeyvan Amiri        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
933235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
934235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
935235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
936235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri}
937