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