1b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu/*
2b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Copyright (C) 2016 The Android Open Source Project
3b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu *
4b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Licensed under the Apache License, Version 2.0 (the "License");
5b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * you may not use this file except in compliance with the License.
6b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * You may obtain a copy of the License at
7b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu *
8b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu *      http://www.apache.org/licenses/LICENSE-2.0
9b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu *
10b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Unless required by applicable law or agreed to in writing, software
11b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * distributed under the License is distributed on an "AS IS" BASIS,
12b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * See the License for the specific language governing permissions and
14b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * limitations under the License.
15b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu */
16b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gupackage android.support.v17.leanback.app;
17b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
18754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertEquals;
19754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertFalse;
20754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.junit.Assert.assertTrue;
213c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikasimport static org.mockito.ArgumentMatchers.nullable;
22754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.any;
23754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.doAnswer;
2442df898f89e60afe9d45b95c8ce86e6b6fce89ceDake Guimport static org.mockito.Mockito.timeout;
25754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.times;
26754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.verify;
27754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas
28b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.os.Bundle;
2935232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikasimport android.support.test.filters.LargeTest;
30b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.support.test.runner.AndroidJUnit4;
31754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.v17.leanback.testutils.PollingCheck;
32b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.support.v17.leanback.widget.GuidedAction;
33a51a405279fb81135abbb7c25ba431842582c8c8Dake Guimport android.support.v17.leanback.widget.GuidedActionsStylist;
34754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.view.KeyEvent;
35754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.view.LayoutInflater;
36754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.view.View;
37754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.view.ViewGroup;
38b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
39b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport org.junit.Test;
40b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport org.junit.runner.RunWith;
41734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Guimport org.mockito.ArgumentCaptor;
42b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport org.mockito.invocation.InvocationOnMock;
43754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport org.mockito.stubbing.Answer;
44b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
45734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Guimport java.util.ArrayList;
46b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport java.util.List;
47b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
4835232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas@LargeTest
49b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu@RunWith(AndroidJUnit4.class)
50b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gupublic class GuidedStepFragmentTest extends GuidedStepFragmentTestBase {
51b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
5242df898f89e60afe9d45b95c8ce86e6b6fce89ceDake Gu    private static final int ON_DESTROY_TIMEOUT = 5000;
5342df898f89e60afe9d45b95c8ce86e6b6fce89ceDake Gu
54b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    @Test
55b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    public void nextAndBack() throws Throwable {
56b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final String firstFragmentName = generateMethodTestName("first");
57b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final String secondFragmentName = generateMethodTestName("second");
58b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepTestFragment.Provider first = mockProvider(firstFragmentName);
59b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        doAnswer(new Answer<Void>() {
60e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
61b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            public Void answer(InvocationOnMock invocation) {
62b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                List actions = (List) invocation.getArguments()[0];
63b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                actions.add(new GuidedAction.Builder().id(1000).title("OK").build());
64b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                return null;
65b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            }
663c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        }).when(first).onCreateActions(any(List.class), nullable(Bundle.class));
67b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        doAnswer(new Answer<Void>() {
68e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
69b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            public Void answer(InvocationOnMock invocation) {
70b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                GuidedAction action = (GuidedAction) invocation.getArguments()[0];
71b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                GuidedStepTestFragment.Provider obj = (GuidedStepTestFragment.Provider)
72b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                        invocation.getMock();
73b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                if (action.getId() == 1000) {
74b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                    GuidedStepFragment.add(obj.getFragmentManager(),
75b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu                            new GuidedStepTestFragment(secondFragmentName));
76b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                }
77b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                return null;
78b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            }
79b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        }).when(first).onGuidedActionClicked(any(GuidedAction.class));
80b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
81b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepTestFragment.Provider second = mockProvider(secondFragmentName);
82b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
83b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepFragmentTestActivity activity = launchTestActivity(firstFragmentName);
843c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(1)).onCreate(nullable(Bundle.class));
853c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(1)).onCreateGuidance(nullable(Bundle.class));
863c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(1)).onCreateActions(any(List.class), nullable(Bundle.class));
873c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(1)).onCreateButtonActions(any(List.class), nullable(Bundle.class));
88b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onCreateView(any(LayoutInflater.class), any(ViewGroup.class),
893c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
903c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(1)).onViewStateRestored(nullable(Bundle.class));
91b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onStart();
92b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onResume();
93b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
94b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
95b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onGuidedActionClicked(any(GuidedAction.class));
96b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
97734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new EnterTransitionFinish(second));
98b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onPause();
99b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onStop();
100b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onDestroyView();
1013c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(second, times(1)).onCreate(nullable(Bundle.class));
1023c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(second, times(1)).onCreateGuidance(nullable(Bundle.class));
1033c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(second, times(1)).onCreateActions(any(List.class), nullable(Bundle.class));
1043c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(second, times(1)).onCreateButtonActions(any(List.class), nullable(Bundle.class));
1053c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(second, times(1)).onCreateView(any(LayoutInflater.class), nullable(ViewGroup.class),
1063c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
1073c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(second, times(1)).onViewStateRestored(nullable(Bundle.class));
108b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(1)).onStart();
109b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(1)).onResume();
110b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
111b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        sendKey(KeyEvent.KEYCODE_BACK);
112b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
113734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new EnterTransitionFinish(first));
114b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(1)).onPause();
115b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(1)).onStop();
116b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(1)).onDestroyView();
117b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(1)).onDestroy();
1183c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(1)).onCreateActions(any(List.class), nullable(Bundle.class));
119b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(2)).onCreateView(any(LayoutInflater.class), any(ViewGroup.class),
1203c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
1213c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(2)).onViewStateRestored(nullable(Bundle.class));
122b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(2)).onStart();
123b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(2)).onResume();
124b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
125b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        sendKey(KeyEvent.KEYCODE_BACK);
126734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new PollingCheck.ActivityDestroy(activity));
12742df898f89e60afe9d45b95c8ce86e6b6fce89ceDake Gu        verify(first, timeout(ON_DESTROY_TIMEOUT).times(1)).onDestroy();
128b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        assertTrue(activity.isDestroyed());
129b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    }
130b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
131b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    @Test
132b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    public void restoreFragments() throws Throwable {
133b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final String firstFragmentName = generateMethodTestName("first");
134b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final String secondFragmentName = generateMethodTestName("second");
135b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepTestFragment.Provider first = mockProvider(firstFragmentName);
136b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        doAnswer(new Answer<Void>() {
137e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
138b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            public Void answer(InvocationOnMock invocation) {
139b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                List actions = (List) invocation.getArguments()[0];
140b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                actions.add(new GuidedAction.Builder().id(1000).title("OK").build());
141b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                actions.add(new GuidedAction.Builder().id(1001).editable(true).title("text")
142b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                        .build());
143b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                actions.add(new GuidedAction.Builder().id(1002).editable(true).title("text")
144b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                        .autoSaveRestoreEnabled(false).build());
145b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                return null;
146b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            }
1473c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        }).when(first).onCreateActions(any(List.class), nullable(Bundle.class));
148b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        doAnswer(new Answer<Void>() {
149e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
150b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            public Void answer(InvocationOnMock invocation) {
151b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                GuidedAction action = (GuidedAction) invocation.getArguments()[0];
152b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                GuidedStepTestFragment.Provider obj = (GuidedStepTestFragment.Provider)
153b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                        invocation.getMock();
154b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                if (action.getId() == 1000) {
155b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                    GuidedStepFragment.add(obj.getFragmentManager(),
156b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu                            new GuidedStepTestFragment(secondFragmentName));
157b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                }
158b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                return null;
159b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            }
160b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        }).when(first).onGuidedActionClicked(any(GuidedAction.class));
161b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
162b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepTestFragment.Provider second = mockProvider(secondFragmentName);
163b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
164b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final GuidedStepFragmentTestActivity activity = launchTestActivity(firstFragmentName);
165b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        first.getFragment().findActionById(1001).setTitle("modified text");
166b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        first.getFragment().findActionById(1002).setTitle("modified text");
167b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
168734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new EnterTransitionFinish(second));
169b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
17042e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        activityTestRule.runOnUiThread(new Runnable() {
171b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            @Override
172b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            public void run() {
173b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                activity.recreate();
174b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            }
175b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        });
176734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new EnterTransitionFinish(second));
177b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onCreateView(any(LayoutInflater.class), any(ViewGroup.class),
1783c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
179b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(1)).onDestroy();
1803c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(second, times(2)).onCreate(nullable(Bundle.class));
181b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(2)).onCreateView(any(LayoutInflater.class), any(ViewGroup.class),
1823c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
183b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(1)).onDestroy();
184b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
185b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        sendKey(KeyEvent.KEYCODE_BACK);
186734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new EnterTransitionFinish(first));
187b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(2)).onPause();
188b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(2)).onStop();
189b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(2)).onDestroyView();
190b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(second, times(2)).onDestroy();
19133745571090988658626bb853e6ea981d175c78bDake Gu        assertEquals("modified text", first.getFragment().findActionById(1001).getTitle());
19233745571090988658626bb853e6ea981d175c78bDake Gu        assertEquals("text", first.getFragment().findActionById(1002).getTitle());
1933c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(2)).onCreate(nullable(Bundle.class));
1943c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        verify(first, times(2)).onCreateActions(any(List.class), nullable(Bundle.class));
195b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        verify(first, times(2)).onCreateView(any(LayoutInflater.class), any(ViewGroup.class),
1963c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
197b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    }
198734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
199734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
200734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    @Test
201734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    public void finishGuidedStepFragment_finishes_activity() throws Throwable {
202b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final String firstFragmentName = generateMethodTestName("first");
203b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepTestFragment.Provider first = mockProvider(firstFragmentName);
204734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        doAnswer(new Answer<Void>() {
205e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
206734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            public Void answer(InvocationOnMock invocation) {
207734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                List actions = (List) invocation.getArguments()[0];
208734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                actions.add(new GuidedAction.Builder().id(1001).title("Finish activity").build());
209734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                return null;
210734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            }
2113c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        }).when(first).onCreateActions(any(List.class), nullable(Bundle.class));
212734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        doAnswer(new Answer<Void>() {
213e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
214734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            public Void answer(InvocationOnMock invocation) {
215734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                GuidedAction action = (GuidedAction) invocation.getArguments()[0];
216734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                GuidedStepTestFragment.Provider obj = (GuidedStepTestFragment.Provider)
217734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                        invocation.getMock();
218734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                if (action.getId() == 1001) {
219734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    obj.getFragment().finishGuidedStepFragments();
220734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                }
221734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                return null;
222734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            }
223734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        }).when(first).onGuidedActionClicked(any(GuidedAction.class));
224734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
225b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final GuidedStepFragmentTestActivity activity = launchTestActivity(firstFragmentName);
226734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
227734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        View viewFinish = first.getFragment().getActionItemView(0);
228734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertTrue(viewFinish.hasFocus());
229734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
230734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new PollingCheck.ActivityDestroy(activity));
23142df898f89e60afe9d45b95c8ce86e6b6fce89ceDake Gu        verify(first, timeout(ON_DESTROY_TIMEOUT).times(1)).onDestroy();
232734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    }
233734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
234734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    @Test
235734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    public void finishGuidedStepFragment_finishes_fragments() throws Throwable {
236b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final String firstFragmentName = generateMethodTestName("first");
237b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepTestFragment.Provider first = mockProvider(firstFragmentName);
238734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        doAnswer(new Answer<Void>() {
239e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
240734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            public Void answer(InvocationOnMock invocation) {
241734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                List actions = (List) invocation.getArguments()[0];
242734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                actions.add(new GuidedAction.Builder().id(1001).title("Finish fragments").build());
243734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                return null;
244734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            }
2453c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        }).when(first).onCreateActions(any(List.class), nullable(Bundle.class));
246734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        doAnswer(new Answer<Void>() {
247e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
248734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            public Void answer(InvocationOnMock invocation) {
249734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                GuidedAction action = (GuidedAction) invocation.getArguments()[0];
250734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                GuidedStepTestFragment.Provider obj = (GuidedStepTestFragment.Provider)
251734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                        invocation.getMock();
252734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                if (action.getId() == 1001) {
253734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    obj.getFragment().finishGuidedStepFragments();
254734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                }
255734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                return null;
256734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            }
257734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        }).when(first).onGuidedActionClicked(any(GuidedAction.class));
258734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
259b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final GuidedStepFragmentTestActivity activity = launchTestActivity(firstFragmentName,
260734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                false /*asRoot*/);
261734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
262734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        View viewFinish = first.getFragment().getActionItemView(0);
263734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertTrue(viewFinish.hasFocus());
264734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
265734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
266734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        // fragment should be destroyed, activity should not destroyed
267734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        waitOnDestroy(first, 1);
268734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertFalse(activity.isDestroyed());
269734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    }
270734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
271734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    @Test
272734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    public void subActions() throws Throwable {
273b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final String firstFragmentName = generateMethodTestName("first");
274b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final String secondFragmentName = generateMethodTestName("second");
275734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        final boolean[] expandSubActionInOnCreateView = new boolean[] {false};
276b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepTestFragment.Provider first = mockProvider(firstFragmentName);
277734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        doAnswer(new Answer<Void>() {
278e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
279734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            public Void answer(InvocationOnMock invocation) {
280734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                GuidedStepTestFragment.Provider obj = (GuidedStepTestFragment.Provider)
281734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                        invocation.getMock();
282734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                if (expandSubActionInOnCreateView[0]) {
283734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    obj.getFragment().expandAction(obj.getFragment().findActionById(1000), false);
284734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                }
285734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                return null;
286734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            }
287734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        }).when(first).onCreateView(any(LayoutInflater.class), any(ViewGroup.class),
2883c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
289734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        doAnswer(new Answer<Void>() {
290e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
291734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            public Void answer(InvocationOnMock invocation) {
292734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                List actions = (List) invocation.getArguments()[0];
293734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                List<GuidedAction> subActions = new ArrayList<GuidedAction>();
294734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                subActions.add(new GuidedAction.Builder().id(2000).title("item1").build());
295734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                subActions.add(new GuidedAction.Builder().id(2001).title("item2").build());
296734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                actions.add(new GuidedAction.Builder().id(1000).subActions(subActions)
297734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                        .title("list").build());
298734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                return null;
299734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            }
3003c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        }).when(first).onCreateActions(any(List.class), nullable(Bundle.class));
301734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        doAnswer(new Answer<Boolean>() {
302e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
303734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            public Boolean answer(InvocationOnMock invocation) {
304734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                GuidedStepTestFragment.Provider obj = (GuidedStepTestFragment.Provider)
305734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                        invocation.getMock();
306734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                GuidedAction action = (GuidedAction) invocation.getArguments()[0];
307734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                if (action.getId() == 2000) {
308734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    return true;
309734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                } else if (action.getId() == 2001) {
310734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    GuidedStepFragment.add(obj.getFragmentManager(),
311b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu                            new GuidedStepTestFragment(secondFragmentName));
312734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    return false;
313734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                }
314734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                return false;
315734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            }
316734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        }).when(first).onSubGuidedActionClicked(any(GuidedAction.class));
317734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
318b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        GuidedStepTestFragment.Provider second = mockProvider(secondFragmentName);
319734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
320b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        final GuidedStepFragmentTestActivity activity = launchTestActivity(firstFragmentName);
321734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
322734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        // after clicked, it sub actions list should expand
323734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        View viewForList = first.getFragment().getActionItemView(0);
324734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertTrue(viewForList.hasFocus());
325734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
326734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new ExpandTransitionFinish(first));
327734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertFalse(viewForList.hasFocus());
328734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
329734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
330734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        ArgumentCaptor<GuidedAction> actionCapture = ArgumentCaptor.forClass(GuidedAction.class);
331734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        verify(first, times(1)).onSubGuidedActionClicked(actionCapture.capture());
332734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertEquals(2000, actionCapture.getValue().getId());
333734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        // after clicked a sub action, it sub actions list should close
334734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new ExpandTransitionFinish(first));
335734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertTrue(viewForList.hasFocus());
336734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
337734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
338734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new ExpandTransitionFinish(first));
339734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
340734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertFalse(viewForList.hasFocus());
341734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_DOWN);
342734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
343734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        ArgumentCaptor<GuidedAction> actionCapture2 = ArgumentCaptor.forClass(GuidedAction.class);
344734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        verify(first, times(2)).onSubGuidedActionClicked(actionCapture2.capture());
345734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertEquals(2001, actionCapture2.getValue().getId());
346734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
347734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new EnterTransitionFinish(second));
348734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        verify(second, times(1)).onCreateView(any(LayoutInflater.class), any(ViewGroup.class),
3493c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
350734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
351734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        // test expand sub action when return to first fragment
352734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        expandSubActionInOnCreateView[0] = true;
353734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_BACK);
354734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new EnterTransitionFinish(first));
355734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        verify(first, times(2)).onCreateView(any(LayoutInflater.class), any(ViewGroup.class),
3563c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas                nullable(Bundle.class), any(View.class));
357734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertTrue(first.getFragment().isExpanded());
358734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
359734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_BACK);
360734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new ExpandTransitionFinish(first));
361734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        assertFalse(first.getFragment().isExpanded());
362734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
363734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        sendKey(KeyEvent.KEYCODE_BACK);
364734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.waitFor(new PollingCheck.ActivityDestroy(activity));
36542df898f89e60afe9d45b95c8ce86e6b6fce89ceDake Gu        verify(first, timeout(ON_DESTROY_TIMEOUT).times(1)).onDestroy();
366734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    }
367a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu
368a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu    @Test
369a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu    public void setActionsWhenSubActionsExpanded() throws Throwable {
370a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        final String firstFragmentName = generateMethodTestName("first");
371a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        GuidedStepTestFragment.Provider first = mockProvider(firstFragmentName);
372a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        doAnswer(new Answer<Void>() {
373e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
374a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu            public Void answer(InvocationOnMock invocation) {
375a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                List actions = (List) invocation.getArguments()[0];
376a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                List<GuidedAction> subActions = new ArrayList<GuidedAction>();
377a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                subActions.add(new GuidedAction.Builder().id(2000).title("item1").build());
378a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                actions.add(new GuidedAction.Builder().id(1000).subActions(subActions)
379a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                        .title("list").build());
380a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                return null;
381a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu            }
3823c6977fb4bdc63446bc54fd726c41cbbdf85f1b5Aurimas Liutikas        }).when(first).onCreateActions(any(List.class), nullable(Bundle.class));
383a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        doAnswer(new Answer<Boolean>() {
384e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
385a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu            public Boolean answer(InvocationOnMock invocation) {
386a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                GuidedStepTestFragment.Provider obj = (GuidedStepTestFragment.Provider)
387a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                        invocation.getMock();
388a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                GuidedAction action = (GuidedAction) invocation.getArguments()[0];
389a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                if (action.getId() == 2000) {
390a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                    List<GuidedAction> newActions = new ArrayList<GuidedAction>();
391a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                    newActions.add(new GuidedAction.Builder().id(1001).title("item2").build());
392a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                    obj.getFragment().setActions(newActions);
393a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                    return false;
394a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                }
395a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                return false;
396a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu            }
397a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        }).when(first).onSubGuidedActionClicked(any(GuidedAction.class));
398a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu
399a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        final GuidedStepFragmentTestActivity activity = launchTestActivity(firstFragmentName);
400a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu
401a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        // after clicked, it sub actions list should expand
402a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        View firstView = first.getFragment().getActionItemView(0);
403a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        assertTrue(firstView.hasFocus());
404a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
405a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        PollingCheck.waitFor(new ExpandTransitionFinish(first));
406a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        assertFalse(firstView.hasFocus());
407a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu
408a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        sendKey(KeyEvent.KEYCODE_DPAD_CENTER);
409a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        ArgumentCaptor<GuidedAction> actionCapture = ArgumentCaptor.forClass(GuidedAction.class);
410a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        verify(first, times(1)).onSubGuidedActionClicked(actionCapture.capture());
411a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        // after clicked a sub action, whole action list is replaced.
412a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        PollingCheck.waitFor(new ExpandTransitionFinish(first));
413a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        assertFalse(first.getFragment().isExpanded());
414a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        View newFirstView  = first.getFragment().getActionItemView(0);
415a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        assertTrue(newFirstView.hasFocus());
416a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        assertTrue(newFirstView.getVisibility() == View.VISIBLE);
417a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        GuidedActionsStylist.ViewHolder vh = (GuidedActionsStylist.ViewHolder) first.getFragment()
418a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu                .getGuidedActionsStylist().getActionsGridView().getChildViewHolder(newFirstView);
419a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu        assertEquals(1001, vh.getAction().getId());
420a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu
421a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu    }
422a51a405279fb81135abbb7c25ba431842582c8c8Dake Gu
42326d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu    @Test
42426d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu    public void buttonActionsRtl() throws Throwable {
42526d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        final String firstFragmentName = generateMethodTestName("first");
42626d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        GuidedStepTestFragment.Provider first = mockProvider(firstFragmentName);
42726d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        doAnswer(new Answer<Void>() {
42826d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu            @Override
42926d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu            public Void answer(InvocationOnMock invocation) {
43026d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu                List actions = (List) invocation.getArguments()[0];
43126d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu                actions.add(new GuidedAction.Builder().id(1000).title("action").build());
43226d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu                return null;
43326d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu            }
43426d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        }).when(first).onCreateActions(any(List.class), nullable(Bundle.class));
43526d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        doAnswer(new Answer<Void>() {
43626d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu            @Override
43726d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu            public Void answer(InvocationOnMock invocation) {
43826d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu                List actions = (List) invocation.getArguments()[0];
43926d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu                actions.add(new GuidedAction.Builder().id(1001).title("button action").build());
44026d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu                return null;
44126d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu            }
44226d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        }).when(first).onCreateButtonActions(any(List.class), nullable(Bundle.class));
44326d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu
44426d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        final GuidedStepFragmentTestActivity activity = launchTestActivity(firstFragmentName,
44526d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu                true, View.LAYOUT_DIRECTION_RTL);
44626d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu
44726d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        assertEquals(View.LAYOUT_DIRECTION_RTL, first.getFragment().getView().getLayoutDirection());
44826d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        View firstView = first.getFragment().getActionItemView(0);
44926d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        assertTrue(firstView.hasFocus());
45026d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu    }
451b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu}
452