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
15b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiripackage android.support.v17.leanback.app.wizard;
16b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
173103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.junit.Assert.assertTrue;
183103f63e99d47573823957f7aa34308555873221Aurimas Liutikas
190b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiriimport android.content.Context;
20b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiriimport android.content.Intent;
21b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiriimport android.content.res.Resources;
223103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.test.InstrumentationRegistry;
2335232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikasimport android.support.test.filters.LargeTest;
243103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.test.rule.ActivityTestRule;
253103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.test.runner.AndroidJUnit4;
26b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiriimport android.support.v17.leanback.app.GuidedStepFragment;
277d7bf9541e0203ec67df0fe53367e2c126355b9esusnataimport android.support.v17.leanback.test.R;
28b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiriimport android.support.v17.leanback.widget.GuidanceStylist;
29b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiriimport android.support.v17.leanback.widget.GuidedAction;
30b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiriimport android.view.KeyEvent;
31b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
320b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiriimport org.junit.Before;
330b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiriimport org.junit.Rule;
340b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiriimport org.junit.Test;
350b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiriimport org.junit.runner.RunWith;
360b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
373103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport java.util.ArrayList;
383103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport java.util.Arrays;
393103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport java.util.Collections;
403103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport java.util.List;
410b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
4235232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas@LargeTest
430b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri@RunWith(AndroidJUnit4.class)
440b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiripublic class GuidedStepAttributesTest {
45b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    static final long TRANSITION_LENGTH = 1000;
46b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
47b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    static final String TAG = "GuidedStepAttributesTest";
48b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
490b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Rule
503103f63e99d47573823957f7aa34308555873221Aurimas Liutikas    public ActivityTestRule<GuidedStepAttributesTestActivity> activityTestRule =
513103f63e99d47573823957f7aa34308555873221Aurimas Liutikas            new ActivityTestRule<>(GuidedStepAttributesTestActivity.class, false, false);
52b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
530b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    GuidedStepAttributesTestActivity mActivity;
54b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
55b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    private void initActivity(Intent intent) {
560b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        mActivity = activityTestRule.launchActivity(intent);
57b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        try {
58b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(2000);
59b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        } catch(InterruptedException e) {
60b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            e.printStackTrace();
61b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
62b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
63b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
640b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    Context mContext;
650b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Before
660b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    public void setUp() {
670b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();;
680b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
690b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
700b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    public static void sendKey(int keyCode) {
710b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode);
720b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
730b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
740b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Test
75b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    public void testFocusDisabledOnActions() throws Throwable {
76b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
770b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Intent intent = new Intent();
780b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Resources res = mContext.getResources();
79b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
80b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int NUM_SEARCH_ACTIONS = 10;
81b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final List<Integer> ACTIONS_WITH_DISABLED_FOCUS = new ArrayList<>(
82b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                Arrays.asList(1, 3, 4, 5, 8));
83b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int ACTION_ID_SEARCH = 1;
84b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<Integer> EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT = new ArrayList<>();
85b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
86b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        // we will traverse actions from top to bottom and then back to the top
87b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = 0; i < NUM_SEARCH_ACTIONS; i++) {
88b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            if (!ACTIONS_WITH_DISABLED_FOCUS.contains(i))
89b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.add(i);
90b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
91b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.size(); i-- != 0;) {
92b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.add(EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(i));
93b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
94b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
95b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
96b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String title = "Guided Actions Focusable Test";
97b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String breadcrumb = "Focusable Test Demo";
98b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String description = "";
99b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
100b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                breadcrumb, null);
101b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
102b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
103b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for (int i = 0; i < NUM_SEARCH_ACTIONS; i++ ) {
1040b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            actionList.add(new GuidedAction.Builder(mContext)
105b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .id(ACTION_ID_SEARCH)
106b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .title(res.getString(R.string.search) + "" + i)
107b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .description(res.getString(R.string.search_description) + i)
108b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .build()
109b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            );
110b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
111b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int action_id : ACTIONS_WITH_DISABLED_FOCUS )
112b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            actionList.get(action_id).setFocusable(false);
113b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
114b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
115b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
116b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
117b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        initActivity(intent);
118b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
119b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int lastSelectedActionId = -1;
120b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int selectIndex = 0;
121b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.getGuidedStepTestFragment();
122b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int prevSelectedActionPosition = -1;
123b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int nextSelectedActionPosition = mFragment.getSelectedActionPosition();
124b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        while ( nextSelectedActionPosition != prevSelectedActionPosition ) {
125b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            lastSelectedActionId = mFragment.getSelectedActionPosition();
126b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            assertTrue(res.getString(R.string.focusable_test_error_message,
127b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    actionList.get(lastSelectedActionId).getTitle()),
128b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    lastSelectedActionId == EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(selectIndex));
129b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            selectIndex++;
1300b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_DOWN);
131b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            prevSelectedActionPosition = nextSelectedActionPosition;
132b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            nextSelectedActionPosition = mFragment.getSelectedActionPosition();
133b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
134b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
135b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
136b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        prevSelectedActionPosition = -1;
137b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        while ( nextSelectedActionPosition != prevSelectedActionPosition ) {
138b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            lastSelectedActionId = mFragment.getSelectedActionPosition();
139b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            assertTrue(res.getString(R.string.focusable_test_error_message,
140b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    actionList.get(lastSelectedActionId).getTitle()),
141b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    lastSelectedActionId == EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(selectIndex));
142b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            selectIndex++;
1430b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_UP);
144b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            prevSelectedActionPosition = nextSelectedActionPosition;
145b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            nextSelectedActionPosition = mFragment.getSelectedActionPosition();
146b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
147b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
148b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
149b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
150b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
151b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    // Note: do not remove final or sRevertCallback gets null from 2nd test on!
152b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri     static final GuidedStepAttributesTestFragment.Callback sRevertCallback = new
153b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            GuidedStepAttributesTestFragment.Callback() {
154b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        @Override
155b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        public void onActionClicked(GuidedStepFragment fragment, long id) {
156b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            List<GuidedAction> allActions = fragment.getActions();
157b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            for(int i = 1; i < allActions.size(); i++) {
158b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                GuidedAction action = allActions.get(i);
159b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                action.setEnabled(!action.isEnabled());
160b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                fragment.notifyActionChanged(fragment.findActionPositionById(action.getId()));
161b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            }
162b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
163b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    };
164b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
1650b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    /**
1660b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * Creates a number of enabled and disable actions and tests whether the flag is correctly set
1670b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * by clicking on each individual action and checking whether the click event is triggered.
1680b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * @throws Throwable
1690b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     */
1700b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Test
171b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    public void testDisabledActions() throws Throwable {
172b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
1730b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Intent intent = new Intent();
1740b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Resources res = mContext.getResources();
175b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
176b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int NUM_SEARCH_ACTIONS = 10;
177b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final List<Integer> DISABLED_ACTIONS = new ArrayList<>(
178b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                Arrays.asList(1, 3, 5, 7));
179b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int ACTION_ID_REVERT_BUTTON = 0;
180b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int ACTION_ID_SEARCH_BEGIN = ACTION_ID_REVERT_BUTTON + 1;
181b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int ACTION_ID_SEARCH_END = ACTION_ID_SEARCH_BEGIN;
182b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
183b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        // sequence of clicked actions simulated in the test
184b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<Integer> CLICK_SEQUENCE = new ArrayList<>();
185b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
186b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        // Expected Clicked sequence can be different from focused ones since some of the actions
187b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        // are disabled hence not clickable
188b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<Integer> EXPECTED_FOCUSED_SEQUENCE = new ArrayList<>();
189b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<Integer> EXPECTED_CLICKED_SEQUENCE = new ArrayList<>();
190b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        // Expected actions state according to list of DISABLED_ACTIONS: false for disabled actions
191b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<Boolean> EXPECTED_ACTIONS_STATE = new ArrayList<>(
192b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                Arrays.asList(new Boolean[NUM_SEARCH_ACTIONS])
193b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        );
194b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        Collections.fill(EXPECTED_ACTIONS_STATE, Boolean.TRUE);
195b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
196b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = 0; i < NUM_SEARCH_ACTIONS; i++) {
197b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            CLICK_SEQUENCE.add(i + 1);
198b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
199b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int clickedActionId : CLICK_SEQUENCE) {
200b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            EXPECTED_FOCUSED_SEQUENCE.add(clickedActionId);
201b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            if (!DISABLED_ACTIONS.contains(clickedActionId - 1))
202b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                EXPECTED_CLICKED_SEQUENCE.add(clickedActionId);
203b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            else
204b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                EXPECTED_CLICKED_SEQUENCE.add(-1);
205b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
206b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
207b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String title = "Guided Actions Enabled Test";
208b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String breadcrumb = "Enabled Test Demo";
209b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String description = "";
210b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
211b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                breadcrumb, null);
212b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
213b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
2140b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        actionList.add(new GuidedAction.Builder(mContext)
215b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .id(ACTION_ID_REVERT_BUTTON)
216b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .title(res.getString(R.string.invert_title))
217b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .description(res.getString(R.string.revert_description))
218b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .build()
219b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        );
220b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
221b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for (int i = 0; i < NUM_SEARCH_ACTIONS; i++ ) {
2220b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            actionList.add(new GuidedAction.Builder(mContext)
223b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .id(ACTION_ID_SEARCH_END++)
224b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .title(res.getString(R.string.search) + "" + i)
225b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .description(res.getString(R.string.search_description) + i)
226b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .build()
227b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            );
228b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
229b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int action_id : DISABLED_ACTIONS ) {
230b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            if ( action_id >= 0 && action_id < NUM_SEARCH_ACTIONS ) {
231b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                actionList.get(action_id + 1).setEnabled(false);
232b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                EXPECTED_ACTIONS_STATE.set(action_id, Boolean.FALSE);
233b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            }
234b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
235b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
236b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
237b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
238b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
239b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.setActionClickCallback(ACTION_ID_REVERT_BUTTON,
240b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                sRevertCallback);
241b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
242b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        initActivity(intent);
243b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
2440b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        examineEnabledAndDisabledActions(actionList, CLICK_SEQUENCE, EXPECTED_FOCUSED_SEQUENCE,
2450b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                EXPECTED_CLICKED_SEQUENCE);
2460b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
2470b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
2480b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    /**
2490b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * Toggles Enabled flags in oll the actions of the prior test, and tests whether they are
2500b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * correctly reverted.
2510b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     */
2520b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Test
2530b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    public void testToggleEnabledFlags() throws Throwable {
2540b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
2550b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Intent intent = new Intent();
2560b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Resources res = mContext.getResources();
2570b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
2580b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final int NUM_SEARCH_ACTIONS = 10;
2590b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final List<Integer> DISABLED_ACTIONS = new ArrayList<>(
2600b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                Arrays.asList(1, 3, 5, 7));
2610b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final int ACTION_ID_REVERT_BUTTON = 0;
2620b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final int ACTION_ID_SEARCH_BEGIN = ACTION_ID_REVERT_BUTTON + 1;
2630b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        int ACTION_ID_SEARCH_END = ACTION_ID_SEARCH_BEGIN;
2640b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
2650b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        // sequence of clicked actions simulated in the test
2660b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> CLICK_SEQUENCE = new ArrayList<>();
2670b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
2680b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        // Expected Clicked sequence can be different from focused ones since some of the actions
2690b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        // are disabled hence not clickable
2700b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> EXPECTED_FOCUSED_SEQUENCE = new ArrayList<>();
2710b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> EXPECTED_CLICKED_SEQUENCE = new ArrayList<>();
2720b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        // Expected actions state according to list of DISABLED_ACTIONS: false for disabled actions
2730b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Boolean> EXPECTED_ACTIONS_STATE = new ArrayList<>(
2740b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                Arrays.asList(new Boolean[NUM_SEARCH_ACTIONS])
2750b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        );
2760b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Collections.fill(EXPECTED_ACTIONS_STATE, Boolean.FALSE);
2770b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
2780b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        for(int i = 0; i < NUM_SEARCH_ACTIONS; i++) {
2790b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            CLICK_SEQUENCE.add(i + 1);
2800b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        }
2810b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        for(int clickedActionId : CLICK_SEQUENCE) {
2820b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            EXPECTED_FOCUSED_SEQUENCE.add(clickedActionId);
2830b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            if (DISABLED_ACTIONS.contains(clickedActionId - 1))
2840b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                EXPECTED_CLICKED_SEQUENCE.add(clickedActionId);
2850b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            else
2860b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                EXPECTED_CLICKED_SEQUENCE.add(-1);
2870b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        }
2880b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
2890b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        String title = "Guided Actions Enabled Test";
2900b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        String breadcrumb = "Toggle Enabled Flag Test Demo";
2910b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        String description = "";
2920b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
2930b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                breadcrumb, null);
2940b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
2950b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
2960b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        actionList.add(new GuidedAction.Builder(mContext)
2970b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                .id(ACTION_ID_REVERT_BUTTON)
2980b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                .title(res.getString(R.string.invert_title))
2990b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                .description(res.getString(R.string.revert_description))
3000b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                .build()
3010b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        );
3020b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
3030b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        for (int i = 0; i < NUM_SEARCH_ACTIONS; i++ ) {
3040b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            actionList.add(new GuidedAction.Builder(mContext)
3050b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    .id(ACTION_ID_SEARCH_END++)
3060b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    .title(res.getString(R.string.search) + "" + i)
3070b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    .description(res.getString(R.string.search_description) + i)
3080b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    .build()
3090b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            );
3100b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        }
3110b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        for(int action_id : DISABLED_ACTIONS ) {
3120b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            if ( action_id >= 0 && action_id < NUM_SEARCH_ACTIONS ) {
3130b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                actionList.get(action_id + 1).setEnabled(false);
3140b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                EXPECTED_ACTIONS_STATE.set(action_id, Boolean.TRUE);
3150b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            }
3160b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        }
3170b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
3180b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        GuidedStepAttributesTestFragment.clear();
3190b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
3200b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
3210b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        GuidedStepAttributesTestFragment.setActionClickCallback(ACTION_ID_REVERT_BUTTON,
3220b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                sRevertCallback);
3230b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
3240b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        initActivity(intent);
3250b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
326b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
327b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                mActivity.getGuidedStepTestFragment();
328b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
3290b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        mActivity.runOnUiThread(new Runnable() {
330b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            @Override
331b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            public void run() {
332b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                mFragment.setSelectedActionPosition(0);
333b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            }
334b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        });
335b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
3360b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
337b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
338b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        examineEnabledAndDisabledActions(actionList, CLICK_SEQUENCE, EXPECTED_FOCUSED_SEQUENCE,
339b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                EXPECTED_CLICKED_SEQUENCE);
340b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
341b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
342b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    private void examineEnabledAndDisabledActions(
343b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            List<GuidedAction> actionList, List<Integer> CLICK_SEQUENCE,
344b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                                List<Integer> EXPECTED_FOCUSED_SEQUENCE,
345b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                                List<Integer> EXPECTED_CLICKED_SEQUENCE)
346b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            throws Throwable {
347b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
348b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final GuidedStepFragment mFragment = (GuidedStepFragment)
349b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                mActivity.getGuidedStepTestFragment();
350b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
351b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = 0; i < CLICK_SEQUENCE.size(); i++) {
352b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID =
353b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID = -1;
354b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            final int id = CLICK_SEQUENCE.get(i);
3550b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            mActivity.runOnUiThread(new Runnable() {
356b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                @Override
357b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                public void run() {
358b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    mFragment.setSelectedActionPosition(id);
359b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                }
360b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            });
361b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
362b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
3630b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
364b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
365b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
3660b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            assertTrue(mContext.getResources().getString(
367b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    R.string.enabled_test_wrong_focus_error_message),
3683103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID
3693103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == EXPECTED_FOCUSED_SEQUENCE.get(i)
370b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            );
3710b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            assertTrue(mContext.getResources().getString(
372b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    R.string.enabled_test_wrong_click_error_message),
3733103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID
3743103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == EXPECTED_CLICKED_SEQUENCE.get(i)
375b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            );
3760b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            assertTrue(mContext.getResources().getString(
377b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    R.string.enabled_test_wrong_flag_error_message),
3783103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    (GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID == -1)
3793103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            ? !actionList.get(id).isEnabled()
3803103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            : actionList.get(id).isEnabled()
381b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            );
382b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
383b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
384b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
3850b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Test
386b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    public void testCheckedActions() throws Throwable {
387b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
3880b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Intent intent = new Intent();
3890b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Resources res = mContext.getResources();
390b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
391b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int NUM_RADIO_ACTIONS = 3;
392b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int NUM_CHECK_BOX_ACTIONS = 3;
393b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int INITIALLY_CHECKED_RADIO_ACTION = 0;
394b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final List<Integer> INITIALLY_CHECKED_CHECKBOX_ACTIONS = new ArrayList<>(
395b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                Arrays.asList(1, 2)
396b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        );
397b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
398b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<Integer> CLICK_SEQUENCE = new ArrayList<>();
399b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = 0; i < NUM_RADIO_ACTIONS + NUM_CHECK_BOX_ACTIONS; i++) {
400b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            CLICK_SEQUENCE.add(i);
401b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
402b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
403b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK = new ArrayList<>(
404b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                Arrays.asList(new Boolean[CLICK_SEQUENCE.size()])
405b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        );
406b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        Collections.fill(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK, Boolean.FALSE);
407b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
408b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        // initial state of actions before any clicks happen
409b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(INITIALLY_CHECKED_RADIO_ACTION, true);
410b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int checkedCheckBox : INITIALLY_CHECKED_CHECKBOX_ACTIONS) {
411b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(NUM_RADIO_ACTIONS + checkedCheckBox, true);
412b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
413b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
414b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String title = "Guided Actions Checked Test";
415b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String breadcrumb = "Checked Test Demo";
416b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String description = "";
417b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
418b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                breadcrumb, null);
419b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
420b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
4210b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        actionList.add(new GuidedAction.Builder(mContext)
422b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .title(res.getString(R.string.radio_actions_info_title))
423b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .description(res.getString(R.string.radio_actions_info_desc))
424b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .infoOnly(true)
425b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .enabled(true)
426b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .focusable(false)
427b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .build()
428b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        );
429b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
430b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int firstRadioActionIndex = actionList.size();
431b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = 0; i < NUM_RADIO_ACTIONS; i++) {
4320b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            actionList.add(new GuidedAction.Builder(mContext)
433b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .title(res.getString(R.string.checkbox_title) + i)
434b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .description(res.getString(R.string.checkbox_desc) + i)
435b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .checkSetId(GuidedAction.DEFAULT_CHECK_SET_ID)
436b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .build()
437b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            );
438b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            if (i == INITIALLY_CHECKED_RADIO_ACTION)
439b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                actionList.get(firstRadioActionIndex + i).setChecked(true);
440b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
441b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
4420b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        actionList.add(new GuidedAction.Builder(mContext)
443b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .title(res.getString(R.string.checkbox_actions_info_title))
444b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .description(res.getString(R.string.checkbox_actions_info_desc))
445b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .infoOnly(true)
446b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .enabled(true)
447b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .focusable(false)
448b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                .build()
449b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        );
450b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int firstCheckBoxActionIndex = actionList.size();
451b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = 0; i < NUM_CHECK_BOX_ACTIONS; i++) {
4520b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            actionList.add(new GuidedAction.Builder(mContext)
453b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .title(res.getString(R.string.checkbox_title) + i)
454b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .description(res.getString(R.string.checkbox_desc) + i)
455b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .checkSetId(GuidedAction.CHECKBOX_CHECK_SET_ID)
456b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .build()
457b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            );
458b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
459b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = 0; i < INITIALLY_CHECKED_CHECKBOX_ACTIONS.size(); i++ ) {
460b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            actionList.get(firstCheckBoxActionIndex + INITIALLY_CHECKED_CHECKBOX_ACTIONS.get(i))
461b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .setChecked(true);
462b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
463b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
464b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
465b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
466b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        initActivity(intent);
467b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
468b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        examineCheckedAndUncheckedActions(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
469b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS);
470b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
471b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
472b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    private void updateExpectedActionsStateAfterClick(
473b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK, int NUM_RADIO_ACTIONS,
474b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            int NUM_CHECK_BOX_ACTIONS, int clickedActionIndex) {
475b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
476b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        if (clickedActionIndex < NUM_RADIO_ACTIONS) {
477b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            for(int i = 0; i < NUM_RADIO_ACTIONS; i++)
478b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(i, false);
479b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(clickedActionIndex, true);
480b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
481b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        else if (clickedActionIndex < NUM_RADIO_ACTIONS + NUM_CHECK_BOX_ACTIONS) {
482b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(clickedActionIndex,
483b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    !EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.get(clickedActionIndex));
484b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
485b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
486b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
487b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    private void verifyIfActionsStateIsCorrect(List<GuidedAction> actionList,
488b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK) {
489b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
490b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int actionIndex = 0;
491b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(GuidedAction checkAction : actionList) {
492b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            if (checkAction.infoOnly())
493b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                continue;
4943103f63e99d47573823957f7aa34308555873221Aurimas Liutikas            assertTrue("Action " + actionIndex + " is " + (!checkAction.isChecked() ? "un-" : "")
4953103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    + "checked while it shouldn't be!", checkAction.isChecked()
4963103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.get(actionIndex));
497b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            actionIndex++;
498b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
499b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
500b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
501b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    private void examineCheckedAndUncheckedActions(List<GuidedAction> actionList,
502b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                                List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
503b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                                int NUM_RADIO_ACTIONS,
504b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                                int NUM_CHECK_BOX_ACTIONS) throws Throwable {
505b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
506b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final GuidedStepFragment guidedStepCheckedFragment = (GuidedStepFragment)
507b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                mActivity.getGuidedStepTestFragment();
508b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int firstRadioActionIndex = 1;
509b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int firstCheckBoxActionIndex = firstRadioActionIndex + NUM_RADIO_ACTIONS + 1;
510b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int actionId = 0; actionId < NUM_RADIO_ACTIONS; actionId++) {
511b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            final int id = actionId;
5120b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            mActivity.runOnUiThread(new Runnable() {
513b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                @Override
514b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                public void run() {
515b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    guidedStepCheckedFragment
516b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                            .setSelectedActionPosition(firstRadioActionIndex + id);
517b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                }
518b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            });
519b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
520b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
5210b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
522b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
523b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            updateExpectedActionsStateAfterClick(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
524b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS, actionId);
525b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            verifyIfActionsStateIsCorrect(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK);
526b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
527b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
528b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int actionId = 0; actionId < NUM_CHECK_BOX_ACTIONS; actionId++) {
529b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            final int id = actionId;
5300b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            mActivity.runOnUiThread(new Runnable() {
531b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                @Override
532b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                public void run() {
533b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    guidedStepCheckedFragment
534b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                            .setSelectedActionPosition(firstCheckBoxActionIndex + id);
535b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                }
536b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            });
537b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
538b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
5390b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
540b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
541b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            updateExpectedActionsStateAfterClick(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
542b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS, NUM_RADIO_ACTIONS + actionId);
543b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            verifyIfActionsStateIsCorrect(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK);
544b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
545b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
546b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
5470b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Test
5480b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    public void testActionWithTwoSubActions() throws Throwable {
5490b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        ExpectedSubActionResult result = setUpActionsForSubActionsTest();
5500b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5510b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final int actionPos = 0;
5520b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final GuidedAction selectedAction = result.actionList.get(actionPos);
5530b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> expectedFocusedSeq = result.expectedFocusedSeq.get(actionPos);
5540b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> expectedClickedSeq = result.expectedClickedSeq.get(actionPos);
5550b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5560b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        traverseSubActionsAndVerifyFocusAndClickEvents(selectedAction, actionPos, expectedFocusedSeq,
5570b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                expectedClickedSeq);
5580b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
5590b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5600b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Test
5610b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    public void testActionWithOneSubAction() throws Throwable {
5620b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        ExpectedSubActionResult result = setUpActionsForSubActionsTest();
5630b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5640b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final int actionPos = 1;
5650b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final GuidedAction selectedAction = result.actionList.get(actionPos);
5660b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> expectedFocusedSeq = result.expectedFocusedSeq.get(actionPos);
5670b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> expectedClickedSeq = result.expectedClickedSeq.get(actionPos);
5680b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5690b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        traverseSubActionsAndVerifyFocusAndClickEvents(selectedAction, actionPos, expectedFocusedSeq,
5700b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                expectedClickedSeq);
5710b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
5720b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5730b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Test
5740b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    public void testActionWithZeroSubActions() throws Throwable {
5750b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        ExpectedSubActionResult result = setUpActionsForSubActionsTest();
576b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
5770b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final int actionPos = 2;
5780b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final GuidedAction selectedAction = result.actionList.get(actionPos);
5790b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> expectedFocusedSeq = result.expectedFocusedSeq.get(actionPos);
5800b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> expectedClickedSeq = result.expectedClickedSeq.get(actionPos);
5810b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5820b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        traverseSubActionsAndVerifyFocusAndClickEvents(selectedAction, actionPos, expectedFocusedSeq,
5830b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                expectedClickedSeq);
5840b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
5850b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5860b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    @Test
5870b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    public void testActionWithThreeSubActions() throws Throwable {
5880b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        ExpectedSubActionResult result = setUpActionsForSubActionsTest();
5890b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5900b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final int actionPos = 3;
5910b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final GuidedAction selectedAction = result.actionList.get(actionPos);
5920b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> expectedFocusedSeq = result.expectedFocusedSeq.get(actionPos);
5930b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<Integer> expectedClickedSeq = result.expectedClickedSeq.get(actionPos);
5940b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5950b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        traverseSubActionsAndVerifyFocusAndClickEvents(selectedAction, actionPos, expectedFocusedSeq,
5960b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                expectedClickedSeq);
5970b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
5980b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
5990b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    /**
6000b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * Traverses the list of sub actions of a gudied action. It also verifies the correct action
6010b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * or sub action is focused or clicked as the traversal is performed.
6020b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * @param selectedAction The action of interest
6030b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * @param actionPos The position of selectedAction within the array of guidedactions
6040b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * @param expectedFocusedSeq The actual actions IDs used as a reference to verify focused actions
6050b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * @param expectedClickedSeq The actual action IDs used as a reference to verify clicked actions
6060b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * @throws Throwable
6070b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     */
6080b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    private void traverseSubActionsAndVerifyFocusAndClickEvents(GuidedAction selectedAction,
6090b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                                                                int actionPos,
6100b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                                                                List<Integer> expectedFocusedSeq,
6110b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                                                                List<Integer> expectedClickedSeq)
6120b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            throws Throwable{
6130b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
6143103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        final GuidedStepFragment mFragment =
6153103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                (GuidedStepFragment) mActivity.getGuidedStepTestFragment();
6160b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        int focusStep = 0, clickStep = 0;
6170b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID =
6180b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID = -1;
6190b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
6200b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
6210b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        final int pos = actionPos;
6220b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        mActivity.runOnUiThread(new Runnable() {
6230b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            @Override
6240b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            public void run() {
6250b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                mFragment.setSelectedActionPosition(pos);
6260b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            }
6270b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        });
6280b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Thread.sleep(TRANSITION_LENGTH);
6290b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
6300b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        if (mFragment.getSelectedActionPosition() != actionPos) {
6310b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            assertTrue(mContext.getResources().getString(
6320b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    R.string.subaction_test_wrong_focus_error_message),
6333103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID
6343103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == expectedFocusedSeq.get(focusStep++)
6350b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            );
6360b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        } else {
6370b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            // If the currently focused position is the same as the position of the action of interest,
6380b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            // then GuidedStepFragment won't received onGuidedActionFocused callback. Since the first
6390b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            // element in the expectedFocusSeq is always the id of this action, we need to move focusStep
6400b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            // one step forward.
6410b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            focusStep++;
6420b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        }
6430b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        if (selectedAction.hasSubActions()) {
6440b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            // Following for loop clicks on a specific action and scrolls & clicks through
6450b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            // all its subactions
6460b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            for (int j = 0; j < selectedAction.getSubActions().size(); j++) {
6470b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
6480b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                Thread.sleep(TRANSITION_LENGTH);
6490b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                assertTrue(mContext.getResources().getString(
6500b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                        R.string.subaction_test_wrong_focus_error_message),
6513103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID
6523103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                                == expectedFocusedSeq.get(focusStep++)
6530b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                );
6540b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                assertTrue(mContext.getResources().getString(
6550b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                        R.string.subaction_test_wrong_click_error_message),
6563103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID
6573103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                                == expectedClickedSeq.get(clickStep++)
6580b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                );
6590b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
6600b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                for (int k = 0; k < j; k++) {
6610b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    sendKey(KeyEvent.KEYCODE_DPAD_DOWN);
6620b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    Thread.sleep(TRANSITION_LENGTH);
6630b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    assertTrue(mContext.getResources().getString(
6640b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                            R.string.subaction_test_wrong_focus_error_message),
6653103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID
6663103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                                    == expectedFocusedSeq.get(focusStep++)
6670b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    );
6680b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                }
6690b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
6700b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                Thread.sleep(TRANSITION_LENGTH);
6710b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
6720b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                assertTrue(mContext.getResources().getString(
6730b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                        R.string.subaction_test_wrong_focus_error_message),
6743103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID
6753103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                                == expectedFocusedSeq.get(focusStep++)
6760b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                );
6770b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                assertTrue(mContext.getResources().getString(
6780b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                        R.string.subaction_test_wrong_click_error_message),
6793103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID
6803103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                                == expectedClickedSeq.get(clickStep++)
6810b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                );
6820b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            }
6830b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        } else {
6840b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
6850b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            Thread.sleep(TRANSITION_LENGTH);
6860b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            assertTrue(mContext.getResources().getString(
6870b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    R.string.subaction_test_wrong_focus_error_message),
6883103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID
6893103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == expectedFocusedSeq.get(focusStep++)
6900b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            );
6910b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            assertTrue(mContext.getResources().getString(
6920b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    R.string.subaction_test_wrong_click_error_message),
6933103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID
6943103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                            == expectedClickedSeq.get(clickStep++)
6950b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            );
6960b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        }
6970b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
6980b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
6990b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    static class ExpectedSubActionResult {
7000b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<List<Integer>> expectedFocusedSeq; // Expected sequence of action (or subaction) ids to receive focus events;
7010b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        // Each entry corresponds to an action item in the guidedactions pane
7020b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<List<Integer>> expectedClickedSeq; // Expected sequence of action (or subaction) ids to receive click events;
7030b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        // Each entry corresponds to an action item in the guidedactions pane
7040b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        List<GuidedAction> actionList;          // List of GuidedActions in the guidedactions pane
7050b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    }
7060b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
7070b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    /**
7080b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * Populates a sample list of actions and subactions in the guidedactions pane.
7090b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * @return  An object holding the expected sequence of action and subactions IDs that receive
7100b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     * focus and click events as well as the list of GuidedActions.
7110b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri     */
7120b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri    private ExpectedSubActionResult setUpActionsForSubActionsTest() {
7130b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Intent intent = new Intent();
7140b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        Resources res = mContext.getResources();
7150b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri
7160b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        ExpectedSubActionResult result = new ExpectedSubActionResult();
7170b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        result.expectedFocusedSeq = new ArrayList<>();
7180b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        result.expectedClickedSeq = new ArrayList<>();
719b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
720b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int NUM_REGULAR_ACTIONS = 4;
721b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int[] NUM_SUBACTIONS_PER_ACTION = {2, 1, 0, 3};
722b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int[] REGULAR_ACTIONS_INDEX =  new int[NUM_REGULAR_ACTIONS];
723b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int[] BEGIN_SUBACTION_INDEX_PER_ACTION = new int[NUM_REGULAR_ACTIONS];
724b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        final int[] END_SUBACTION_INDEX_PER_ACTION = new int[NUM_REGULAR_ACTIONS];
7250b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        // Actions and SubActions are assigned unique sequential IDs
726b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        int lastIndex = 0;
727b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for(int i = 0; i < NUM_REGULAR_ACTIONS; i++) {
728b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            REGULAR_ACTIONS_INDEX[i] = lastIndex;
729b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            lastIndex++;
730b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            BEGIN_SUBACTION_INDEX_PER_ACTION[i] = lastIndex;
731b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            END_SUBACTION_INDEX_PER_ACTION[i] = (lastIndex += NUM_SUBACTIONS_PER_ACTION[i]);
732b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
733b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
7340b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        for (int i = 0; i < NUM_REGULAR_ACTIONS; i++) {
7350b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            List<Integer> expectedFocusSeqForEachAction = new ArrayList<>();
7360b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            List<Integer> expectedClickedSeqForEachAction = new ArrayList<>();
7370b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            expectedFocusSeqForEachAction.add(REGULAR_ACTIONS_INDEX[i]);
738b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
7390b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            if (NUM_SUBACTIONS_PER_ACTION[i] > 0) {
7403103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                for (int j = BEGIN_SUBACTION_INDEX_PER_ACTION[i];
7413103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        j < END_SUBACTION_INDEX_PER_ACTION[i]; j++) {
7420b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    expectedClickedSeqForEachAction.add(REGULAR_ACTIONS_INDEX[i]);
7430b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    for (int k = BEGIN_SUBACTION_INDEX_PER_ACTION[i]; k <= j; k++) {
7440b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                        expectedFocusSeqForEachAction.add(k);
745b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    }
7460b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    expectedClickedSeqForEachAction.add(j);
7470b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    expectedFocusSeqForEachAction.add(REGULAR_ACTIONS_INDEX[i]);
748b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                }
749b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            } else {
7500b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                expectedClickedSeqForEachAction.add(REGULAR_ACTIONS_INDEX[i]);
7510b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                expectedFocusSeqForEachAction.add(REGULAR_ACTIONS_INDEX[i]);
752b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            }
7530b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            result.expectedFocusedSeq.add(expectedFocusSeqForEachAction);
7540b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            result.expectedClickedSeq.add(expectedClickedSeqForEachAction);
755b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
756b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
757b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String title = "Guided SubActions Test";
758b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String breadcrumb = "SubActions Test Demo";
759b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        String description = "";
760b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
761b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                breadcrumb, null);
762b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
763b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        List<GuidedAction> actionList = new ArrayList<>();
764b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
765b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        lastIndex = 0;
766b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        for (int i = 0; i < NUM_REGULAR_ACTIONS; i++ ) {
7670b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri            GuidedAction action = new GuidedAction.Builder(mContext)
768b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .id(lastIndex++)
769b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .title(res.getString(R.string.dropdown_action_title, i))
770b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .description(res.getString(R.string.dropdown_action_desc, i))
771b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    .build();
772b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            if (NUM_SUBACTIONS_PER_ACTION[i] > 0) {
773b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                List<GuidedAction> subActions = new ArrayList<>();
774b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                action.setSubActions(subActions);
775b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                for(int j = 0; j < NUM_SUBACTIONS_PER_ACTION[i]; j++) {
7760b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri                    subActions.add(new GuidedAction.Builder(mContext)
777b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                            .id(lastIndex++)
778b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                            .title(res.getString(R.string.subaction_title, j))
779b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                            .description("")
780b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                            .build()
781b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                    );
782b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri                }
783b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            }
784b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri            actionList.add(action);
785b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        }
7860b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        result.actionList = actionList;
787b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
788b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.clear();
789b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
790b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
791b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri
792b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri        initActivity(intent);
7930b168ed894445f4e128c6edb52a8797a0ee532c9Keyvan Amiri        return result;
794b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri    }
795b9c5c04779dbd2b6f2f617da825a02bdfb3dab4fKeyvan Amiri}
796