1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.ui.conversation; 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.app.FragmentManager; 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.app.FragmentTransaction; 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Bundle; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.test.suitebuilder.annotation.SmallTest; 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.EditText; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.BugleTestCase; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.FakeFactory; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.R; 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.Binding; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.BindingBase; 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationData; 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.DraftMessageData; 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.SubscriptionListData; 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.conversation.ConversationInputManager.ConversationInputHost; 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.conversation.ConversationInputManager.ConversationInputSink; 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.mediapicker.MediaPicker; 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.BugleGservices; 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ImeUtil; 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ImeUtil.ImeStateHost; 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport org.mockito.Mock; 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport org.mockito.Mockito; 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport org.mockito.Spy; 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd@SmallTest 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class ConversationInputManagerTest extends BugleTestCase { 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Spy protected ImeUtil spyImeUtil; 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected BugleGservices mockBugleGservices; 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected FragmentManager mockFragmentManager; 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected ConversationInputHost mockConversationInputHost; 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected ConversationInputSink mockConversationInputSink; 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected ImeStateHost mockImeStateHost; 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected ConversationData mockConversationData; 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected DraftMessageData mockDraftMessageData; 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected MediaPicker mockMediaPicker; 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected SubscriptionListData mockSubscriptionListData; 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Mock protected FragmentTransaction mockFragmentTransaction; 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected void setUp() throws Exception { 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.setUp(); 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd FakeFactory.register(getTestContext()) 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd .withBugleGservices(mockBugleGservices); 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd spyImeUtil = Mockito.spy(new ImeUtil()); 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ImeUtil.set(spyImeUtil); 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private ConversationInputManager initNewInputManager(final Bundle savedState) { 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Set up the mocks. 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockConversationInputHost.getSimSelectorView()) 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd .thenReturn(new SimSelectorView(getTestContext(), null)); 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockConversationInputHost.createMediaPicker()).thenReturn(mockMediaPicker); 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockConversationInputSink.getComposeEditText()) 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd .thenReturn(new EditText(getTestContext())); 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.doReturn(mockFragmentTransaction).when(mockFragmentTransaction).replace( 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.eq(R.id.mediapicker_container), Mockito.any(MediaPicker.class), 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.anyString()); 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockFragmentManager.findFragmentByTag(MediaPicker.FRAGMENT_TAG)) 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd .thenReturn(null); 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockFragmentManager.beginTransaction()).thenReturn(mockFragmentTransaction); 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockSubscriptionListData.hasData()).thenReturn(true); 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockConversationData.getSubscriptionListData()) 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd .thenReturn(mockSubscriptionListData); 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.doReturn(true).when(mockConversationData).isBound(Mockito.anyString()); 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.doReturn(true).when(mockDraftMessageData).isBound(Mockito.anyString()); 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Binding<ConversationData> dataBinding = BindingBase.createBinding(this); 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd dataBinding.bind(mockConversationData); 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Binding<DraftMessageData> draftBinding = BindingBase.createBinding(this); 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd draftBinding.bind(mockDraftMessageData); 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationInputManager inputManager = new ConversationInputManager(getTestContext(), 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mockConversationInputHost, mockConversationInputSink, mockImeStateHost, 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mockFragmentManager, dataBinding, draftBinding, savedState); 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return inputManager; 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void testShowHideInputs() { 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationInputManager inputManager = initNewInputManager(new Bundle()); 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(true); 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.showHideMediaPicker(true /* show */, true /* animate */); 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.verify(mockFragmentTransaction).replace( 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.eq(R.id.mediapicker_container), Mockito.any(MediaPicker.class), 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.anyString()); 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.verify(mockMediaPicker).open(Mockito.anyInt(), Mockito.eq(true /* animate */)); 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, inputManager.isMediaPickerVisible()); 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isImeKeyboardVisible()); 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(false); 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.showHideMediaPicker(false /* show */, true /* animate */); 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.verify(mockMediaPicker).dismiss(Mockito.eq(true /* animate */)); 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isMediaPickerVisible()); 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isImeKeyboardVisible()); 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void testShowTwoInputsSequentially() { 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // First show the media picker, then show the IME keyboard. 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationInputManager inputManager = initNewInputManager(new Bundle()); 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(true); 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.showHideMediaPicker(true /* show */, true /* animate */); 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, inputManager.isMediaPickerVisible()); 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isImeKeyboardVisible()); 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(false); 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.showHideImeKeyboard(true /* show */, true /* animate */); 129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isMediaPickerVisible()); 131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, inputManager.isImeKeyboardVisible()); 133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void testOnKeyboardShow() { 136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationInputManager inputManager = initNewInputManager(new Bundle()); 137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(true); 138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.showHideMediaPicker(true /* show */, true /* animate */); 139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, inputManager.isMediaPickerVisible()); 141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isImeKeyboardVisible()); 143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(false); 145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.testNotifyImeStateChanged(true /* imeOpen */); 146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isMediaPickerVisible()); 148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, inputManager.isImeKeyboardVisible()); 150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void testRestoreState() { 153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationInputManager inputManager = initNewInputManager(new Bundle()); 154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(true); 155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.showHideMediaPicker(true /* show */, true /* animate */); 156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, inputManager.isMediaPickerVisible()); 158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isImeKeyboardVisible()); 160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Bundle savedInstanceState = new Bundle(); 162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.onSaveInputState(savedInstanceState); 163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Now try to restore the state 165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationInputManager restoredInputManager = 166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd initNewInputManager(savedInstanceState); 167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Make sure the state is preserved. 169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, restoredInputManager.isMediaPickerVisible()); 170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, restoredInputManager.isSimSelectorVisible()); 171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, restoredInputManager.isImeKeyboardVisible()); 172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void testBackPress() { 175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationInputManager inputManager = initNewInputManager(new Bundle()); 176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(true); 177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd inputManager.showHideMediaPicker(true /* show */, true /* animate */); 178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, inputManager.isMediaPickerVisible()); 180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isImeKeyboardVisible()); 182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Mockito.when(mockMediaPicker.isOpen()).thenReturn(false); 184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(true, inputManager.onBackPressed()); 185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isMediaPickerVisible()); 187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isSimSelectorVisible()); 188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd assertEquals(false, inputManager.isImeKeyboardVisible()); 189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 191