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