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