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