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