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
17235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.app.Instrumentation;
18235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.content.Intent;
19235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.content.res.Resources;
20235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.app.GuidedStepFragment;
21235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.tests.R;
22235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.GuidanceStylist;
23235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.GuidedAction;
24235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.GuidedDatePickerAction;
25235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.VerticalGridView;
26235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.support.v17.leanback.widget.picker.DatePicker;
27235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.test.ActivityInstrumentationTestCase2;
28235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.util.Log;
29235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.view.KeyEvent;
30235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.view.View;
31235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.view.ViewGroup;
32235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport android.widget.LinearLayout;
33235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
34235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.text.SimpleDateFormat;
35235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.ArrayList;
36235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.Calendar;
37235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.Date;
38235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiriimport java.util.List;
39235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
40235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiripublic class GuidedDatePickerTest extends
41235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        ActivityInstrumentationTestCase2<GuidedStepAttributesTestActivity> {
42235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
43235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static final long TRANSITION_LENGTH = 1000;
44235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static long VERTICAL_SCROLL_WAIT = 500;
45235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static long HORIZONTAL_SCROLL_WAIT = 500;
46235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static final long FINAL_WAIT = 3000;
47235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
48235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    static final String TAG = "GuidedDatePickerTest";
49235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
50235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int DAY_INDEX = 0;
51235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int MONTH_INDEX = 1;
52235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private static final int YEAR_INDEX = 2;
53235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    Instrumentation mInstrumentation;
54235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    GuidedStepAttributesTestActivity mActivity;
55235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
56235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    public GuidedDatePickerTest() {
57235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        super(GuidedStepAttributesTestActivity.class);
58235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
59235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
60235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void initActivity(Intent intent) {
61235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
62235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        setActivityIntent(intent);
63235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        mActivity = getActivity();
64235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        try {
65235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(2000);
66235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } catch(InterruptedException e) {
67235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            e.printStackTrace();
68235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
69235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
70235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
71235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void scrollOnField(int field, int[] columnIndices, DatePicker mPickerView,
72235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                               int SCROLL_DIR) throws Throwable {
73235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
74235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
75235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.getGuidedStepTestFragment();
76235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
77235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColDayIndex = columnIndices[0];
78235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColMonthIndex = columnIndices[1];
79235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int mColYearIndex = columnIndices[2];
80235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int columnIndex = -1;
81235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        switch (field) {
82235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.DAY_OF_MONTH:
83235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColDayIndex;
84235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
85235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.MONTH:
86235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColMonthIndex;
87235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
88235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case Calendar.YEAR:
89235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                columnIndex = mColYearIndex;
90235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
91235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
92235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
93235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        LinearLayout columnsLayout = (LinearLayout) mPickerView.getChildAt(0);
94235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
95235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
96235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (focusedFieldPos == -1) {
97235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
98235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
99235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
100235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
101235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        assertTrue("Date field could not be focused!", (focusedFieldPos != -1));
102235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
103235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // following is to skip the separator fields "/" which are unfocusable but counted as
104235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // children of columnsLayout
105235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        switch (focusedFieldPos) {
106235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 0:
107235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 0;
108235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
109235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 2:
110235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 1;
111235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                break;
112235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            case 4:
113235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                focusedFieldPos = 2;
114235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
115235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
116235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // now scroll right or left to the corresponding date field as indicated by the input field
117235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int horizontalScrollOffset = columnIndex - focusedFieldPos;
118235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
119235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int horizontalScrollDir = KeyEvent.KEYCODE_DPAD_RIGHT;
120235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (horizontalScrollOffset < 0) {
121235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            horizontalScrollOffset = -horizontalScrollOffset;
122235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            horizontalScrollDir = KeyEvent.KEYCODE_DPAD_LEFT;
123235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
124235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        for(int i = 0; i < horizontalScrollOffset; i++) {
125235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            sendKeys(horizontalScrollDir);
126235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(HORIZONTAL_SCROLL_WAIT);
127235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
128235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
129235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
130235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
131235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentActionCal.setTimeInMillis(mPickerView.getDate());
132235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
133235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar minCal = Calendar.getInstance();
134235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.setTimeInMillis(mPickerView.getMinDate());
135235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
136235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar maxCal = Calendar.getInstance();
137235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.setTimeInMillis(mPickerView.getMaxDate());
138235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
139235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
140235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int prevColumnVal = -1;
141235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int currentColumnVal = mPickerView.getColumnAt(columnIndex).getCurrentValue();
142235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        while( currentColumnVal != prevColumnVal ){
143235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_day_value),
144235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    mPickerView.getColumnAt(mColDayIndex).getCurrentValue() ==
145235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                            currentActionCal.get(Calendar.DAY_OF_MONTH)
146235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
147235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_month_value),
148235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    mPickerView.getColumnAt(mColMonthIndex).getCurrentValue() ==
149235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                            currentActionCal.get(Calendar.MONTH)
150235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
151235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_year_value),
152235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    mPickerView.getColumnAt(mColYearIndex).getCurrentValue() ==
153235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                            currentActionCal.get(Calendar.YEAR)
154235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            );
155235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
156235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int offset = SCROLL_DIR == KeyEvent.KEYCODE_DPAD_DOWN ? 1 : -1;
157235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            addDate(currentActionCal, field, offset, minCal, maxCal);
158235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
159235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            sendKeys(SCROLL_DIR);
160235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(VERTICAL_SCROLL_WAIT);
161235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
162235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            prevColumnVal = currentColumnVal;
163235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            currentColumnVal = mPickerView.getColumnAt(columnIndex).getCurrentValue();
164235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
165235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
166235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
167235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void addDate(Calendar mCurrentDate, int field, int offset,
168235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                         Calendar mMinDate, Calendar mMaxDate) {
169235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxOffset = -1;
170235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int actualMinFieldValue, actualMaxFieldValue;
171235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
172235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if ( field == Calendar.YEAR ) {
173235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMinFieldValue = mMinDate.get(Calendar.YEAR);
174235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMaxFieldValue = mMaxDate.get(Calendar.YEAR);
175235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } else {
176235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMinFieldValue = mCurrentDate.getActualMinimum(field);
177235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            actualMaxFieldValue = mCurrentDate.getActualMaximum(field);
178235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
179235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
180235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if ( offset > 0 ) {
181235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            maxOffset = Math.min(
182235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    actualMaxFieldValue - mCurrentDate.get(field), offset);
183235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            mCurrentDate.add(field, maxOffset);
184235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            if (mCurrentDate.after(mMaxDate)) {
185235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
186235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
187235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        } else {
188235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            maxOffset = Math.max(
189235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    actualMinFieldValue - mCurrentDate.get(field), offset);
190235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            mCurrentDate.add(field, Math.max(offset, maxOffset));
191235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            if (mCurrentDate.before(mMinDate)) {
192235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
193235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
194235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
195235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
196235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
197235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    public void testDifferentMonthLengths() throws Throwable {
198235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
199235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        mInstrumentation = getInstrumentation();
200235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Intent intent = new Intent(mInstrumentation.getContext(),
201235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                GuidedStepAttributesTestActivity.class);
202235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Resources res = mInstrumentation.getContext().getResources();
203235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
204235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final int NUM_DATE_ACTIONS = 1;
205235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
206235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String title = "Date Picker Transition Test";
207235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String breadcrumb = "Month Transition Test Demo";
208235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String description = "Testing the transition between longer to shorter months";
209235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
210235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                breadcrumb, null);
211235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
212235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
213235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
214235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar cal = Calendar.getInstance();
215235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
216235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        cal.set(Calendar.YEAR, 2016);
217235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        cal.set(Calendar.MONTH, Calendar.JANUARY);
218235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        cal.set(Calendar.DAY_OF_MONTH, 30);
219235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Date initialDate = cal.getTime();
220235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
221235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
222235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mInstrumentation.getContext())
223235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(0)
224235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title("Date")
225235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(initialDate.getTime())
226235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
227235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
228235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
229235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(action);
230235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
231235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.clear();
232235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
233235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
234235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
235235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        initActivity(intent);
236235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
237235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
238235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.id.guidedactions_activator_item);
239235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
240235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.
241235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                getGuidedStepTestFragment();
242235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        traverseMonths(mPickerView, (GuidedDatePickerAction) actionList.get(0));
243235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(FINAL_WAIT);
244235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
245235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
246235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void traverseMonths(DatePicker mPickerView, GuidedDatePickerAction dateAction)
247235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            throws Throwable{
248235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
249235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
250235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.getGuidedStepTestFragment();
251235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
252235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
253235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentActionCal.setTimeInMillis(dateAction.getDate());
254235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
255235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
256235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
257235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
258235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int prevMonth = -1;
259235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int currentMonth = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
260235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        while (currentMonth != prevMonth) {
261235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int prevDayOfMonth = -1;
262235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
263235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            // scroll down the days till reaching the last day of month
264235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            while (currentDayOfMonth != prevDayOfMonth) {
265235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
266235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                Thread.sleep(VERTICAL_SCROLL_WAIT);
267235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                prevDayOfMonth = currentDayOfMonth;
268235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
269235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            }
270235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int oldDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
271235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int oldMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
272235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            // increment the month
273235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
274235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(VERTICAL_SCROLL_WAIT);
275235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
276235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
277235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
278235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
279235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int newDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
280235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            int newMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
281235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verifyMonthTransition(currentActionCal,
282235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                    oldDayValue, oldMonthValue, newDayValue, newMonthValue);
283235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
284235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
285235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
286235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            prevMonth = currentMonth;
287235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            currentMonth = newMonthValue;
288235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
289235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
290235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
291235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
292235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void verifyMonthTransition(Calendar currentCal, int oldDayValue, int oldMonthValue,
293235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                                       int newDayValue, int newMonthValue) {
294235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
295235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (oldMonthValue == newMonthValue)
296235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            return;
297235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
298235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.DAY_OF_MONTH, 1);
299235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.MONTH, oldMonthValue);
300235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int expectedOldDayValue = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
301235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentCal.set(Calendar.MONTH, newMonthValue);
302235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int numDaysInNewMonth = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
303235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int expectedNewDayValue = (expectedOldDayValue <= numDaysInNewMonth) ?
304235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                expectedOldDayValue : numDaysInNewMonth;
305235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
306235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        assertTrue(getActivity().getString(
307235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.string.datepicker_test_transition_error1, oldMonthValue),
308235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                oldDayValue == expectedOldDayValue
309235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        );
310235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        assertTrue(getActivity().getString(
311235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                R.string.datepicker_test_transition_error2, newDayValue, newMonthValue),
312235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                newDayValue == expectedNewDayValue
313235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        );
314235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
315235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
316235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    public void testDateRanges() throws Throwable {
317235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
318235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        mInstrumentation = getInstrumentation();
319235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Intent intent = new Intent(mInstrumentation.getContext(),
320235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                GuidedStepAttributesTestActivity.class);
321235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Resources res = mInstrumentation.getContext().getResources();
322235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
323235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
324235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
325235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currCal = Calendar.getInstance();
326235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.YEAR, 2016);
327235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.MONTH, Calendar.JULY);
328235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currCal.set(Calendar.DAY_OF_MONTH, 15);
329235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
330235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar minCal = Calendar.getInstance();
331235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.YEAR, 2014);
332235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, Calendar.OCTOBER);
333235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, 20);
334235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
335235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar maxCal = Calendar.getInstance();
336235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.YEAR, 2018);
337235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.MONTH, Calendar.FEBRUARY);
338235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.DAY_OF_MONTH, 10);
339235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
340235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String title = "Date Picker Range Test";
341235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String breadcrumb = "Date Picker Range Test Demo";
342235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        String description = "";
343235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
344235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                breadcrumb, null);
345235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
346235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
347235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
348235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing different date formats and the correctness of range changes as we scroll
349235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction1 = new GuidedDatePickerAction.Builder(
350235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mInstrumentation.getContext())
351235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(0)
352235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
353235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTime()),
354235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTime())))
355235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
356235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
357235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("MDY")
358235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
359235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
360235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
361235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
362235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction2 = new GuidedDatePickerAction.Builder(
363235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mInstrumentation.getContext())
364235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(1)
365235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
366235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
367235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
368235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
369235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
370235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
371235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
372235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
373235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
374235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
375235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when Year is equal
376235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.YEAR, maxCal.get(Calendar.YEAR));
377235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int minMonth = Math.min(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
378235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxMonth = Math.max(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
379235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, minMonth);
380235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.MONTH, maxMonth);
381235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
382235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction3 = new GuidedDatePickerAction.Builder(
383235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mInstrumentation.getContext())
384235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(2)
385235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
386235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
387235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
388235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
389235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
390235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
391235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
392235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
393235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
394235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
395235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
396235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when both Month and Year are equal
397235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.MONTH, maxCal.get(Calendar.MONTH));
398235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int minDay = Math.min(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
399235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int maxDay = Math.max(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
400235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, minDay);
401235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        maxCal.set(Calendar.DAY_OF_MONTH, maxDay);
402235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
403235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction4 = new GuidedDatePickerAction.Builder(
404235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mInstrumentation.getContext())
405235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(3)
406235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
407235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
408235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
409235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
410235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
411235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
412235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
413235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
414235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
415235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
416235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
417235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // testing date ranges when all fields are equal
418235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        minCal.set(Calendar.DAY_OF_MONTH, maxCal.get(Calendar.DAY_OF_MONTH));
419235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
420235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedDatePickerAction dateAction5 = new GuidedDatePickerAction.Builder(
421235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mInstrumentation.getContext())
422235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .id(4)
423235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .title(res.getString(R.string.datepicker_with_range_title,
424235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(minCal.getTimeInMillis()),
425235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                        dateFormat.format(maxCal.getTimeInMillis())))
426235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .multilineDescription(true)
427235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .date(currCal.getTimeInMillis())
428235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .datePickerFormat("DMY")
429235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .minDate(minCal.getTimeInMillis())
430235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .maxDate(maxCal.getTimeInMillis())
431235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .build();
432235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
433235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction1);
434235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction2);
435235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction3);
436235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction4);
437235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        actionList.add(dateAction5);
438235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
439235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.clear();
440235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
441235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
442235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
443235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        initActivity(intent);
444235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
445235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.
446235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                getGuidedStepTestFragment();
447235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
448235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollToMinAndMaxDates(new int[] {1, 0, 2}, dateAction1);
449235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction2);
450235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction3);
451235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction4);
452235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction5);
453235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
454235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(FINAL_WAIT);
455235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
456235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
457235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    private void scrollToMinAndMaxDates(int[] columnIndices, GuidedDatePickerAction dateAction)
458235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            throws Throwable{
459235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
460235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
461235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.getGuidedStepTestFragment();
462235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
463235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        VerticalGridView guidedActionsList = (VerticalGridView)
464235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                mActivity.findViewById(R.id.guidedactions_list);
465235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
466235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int currSelectedAction = mFragment.getSelectedActionPosition();
467235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // scroll up/down to the requested action
468235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        long verticalScrollOffset = dateAction.getId() - currSelectedAction;
469235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
470235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        int verticalScrollDir = KeyEvent.KEYCODE_DPAD_DOWN;
471235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        if (verticalScrollOffset < 0) {
472235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verticalScrollOffset= -verticalScrollOffset;
473235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            verticalScrollDir = KeyEvent.KEYCODE_DPAD_UP;
474235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
475235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        for(int i = 0; i < verticalScrollOffset; i++) {
476235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            sendKeys(verticalScrollDir);
477235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
478235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        }
479235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
480235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        assertTrue("The wrong action was selected!", mFragment.getSelectedActionPosition() ==
481235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                dateAction.getId());
482235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        DatePicker mPickerView = (DatePicker) mFragment.getActionItemView((int) dateAction.getId())
483235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri                .findViewById(R.id.guidedactions_activator_item);
484235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
485235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Calendar currentActionCal = Calendar.getInstance();
486235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        currentActionCal.setTimeInMillis(dateAction.getDate());
487235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
488235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
489235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // scrolling to the minimum date
490235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
491235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollOnField(Calendar.YEAR, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
492235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
493235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
494235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollOnField(Calendar.MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
495235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
496235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
497235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollOnField(Calendar.DAY_OF_MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
498235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
499235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
500235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(VERTICAL_SCROLL_WAIT);
501235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
502235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        // now scrolling to the maximum date
503235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
504235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollOnField(Calendar.YEAR, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
505235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
506235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
507235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollOnField(Calendar.MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
508235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
509235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
510235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        scrollOnField(Calendar.DAY_OF_MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
511235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        dateAction.setDate(mPickerView.getDate());
512235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
513235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
514235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
515235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri    }
516235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri
517235b1ebe1ebdcdeaf8814be397dbeb8ed53e8074Keyvan Amiri}
518