Home | History | Annotate | Download | only in conversation
      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.test.suitebuilder.annotation.SmallTest;
     22 import android.widget.EditText;
     23 
     24 import com.android.messaging.BugleTestCase;
     25 import com.android.messaging.FakeFactory;
     26 import com.android.messaging.R;
     27 import com.android.messaging.datamodel.binding.Binding;
     28 import com.android.messaging.datamodel.binding.BindingBase;
     29 import com.android.messaging.datamodel.data.ConversationData;
     30 import com.android.messaging.datamodel.data.DraftMessageData;
     31 import com.android.messaging.datamodel.data.SubscriptionListData;
     32 import com.android.messaging.ui.conversation.ConversationInputManager.ConversationInputHost;
     33 import com.android.messaging.ui.conversation.ConversationInputManager.ConversationInputSink;
     34 import com.android.messaging.ui.mediapicker.MediaPicker;
     35 import com.android.messaging.util.BugleGservices;
     36 import com.android.messaging.util.ImeUtil;
     37 import com.android.messaging.util.ImeUtil.ImeStateHost;
     38 
     39 import org.mockito.Mock;
     40 import org.mockito.Mockito;
     41 import org.mockito.Spy;
     42 
     43 @SmallTest
     44 public class ConversationInputManagerTest extends BugleTestCase {
     45     @Spy protected ImeUtil spyImeUtil;
     46     @Mock protected BugleGservices mockBugleGservices;
     47     @Mock protected FragmentManager mockFragmentManager;
     48     @Mock protected ConversationInputHost mockConversationInputHost;
     49     @Mock protected ConversationInputSink mockConversationInputSink;
     50     @Mock protected ImeStateHost mockImeStateHost;
     51     @Mock protected ConversationData mockConversationData;
     52     @Mock protected DraftMessageData mockDraftMessageData;
     53     @Mock protected MediaPicker mockMediaPicker;
     54     @Mock protected SubscriptionListData mockSubscriptionListData;
     55     @Mock protected FragmentTransaction mockFragmentTransaction;
     56 
     57     @Override
     58     protected void setUp() throws Exception {
     59         super.setUp();
     60         FakeFactory.register(getTestContext())
     61                 .withBugleGservices(mockBugleGservices);
     62         spyImeUtil = Mockito.spy(new ImeUtil());
     63         ImeUtil.set(spyImeUtil);
     64     }
     65 
     66     private ConversationInputManager initNewInputManager(final Bundle savedState) {
     67         // Set up the mocks.
     68         Mockito.when(mockConversationInputHost.getSimSelectorView())
     69                 .thenReturn(new SimSelectorView(getTestContext(), null));
     70         Mockito.when(mockConversationInputHost.createMediaPicker()).thenReturn(mockMediaPicker);
     71         Mockito.when(mockConversationInputSink.getComposeEditText())
     72                 .thenReturn(new EditText(getTestContext()));
     73         Mockito.doReturn(mockFragmentTransaction).when(mockFragmentTransaction).replace(
     74                 Mockito.eq(R.id.mediapicker_container), Mockito.any(MediaPicker.class),
     75                 Mockito.anyString());
     76         Mockito.when(mockFragmentManager.findFragmentByTag(MediaPicker.FRAGMENT_TAG))
     77                 .thenReturn(null);
     78         Mockito.when(mockFragmentManager.beginTransaction()).thenReturn(mockFragmentTransaction);
     79         Mockito.when(mockSubscriptionListData.hasData()).thenReturn(true);
     80         Mockito.when(mockConversationData.getSubscriptionListData())
     81                 .thenReturn(mockSubscriptionListData);
     82         Mockito.doReturn(true).when(mockConversationData).isBound(Mockito.anyString());
     83         Mockito.doReturn(true).when(mockDraftMessageData).isBound(Mockito.anyString());
     84 
     85         final Binding<ConversationData> dataBinding = BindingBase.createBinding(this);
     86         dataBinding.bind(mockConversationData);
     87         final Binding<DraftMessageData> draftBinding = BindingBase.createBinding(this);
     88         draftBinding.bind(mockDraftMessageData);
     89         final ConversationInputManager inputManager = new ConversationInputManager(getTestContext(),
     90                 mockConversationInputHost, mockConversationInputSink, mockImeStateHost,
     91                 mockFragmentManager, dataBinding, draftBinding, savedState);
     92         return inputManager;
     93     }
     94 
     95     public void testShowHideInputs() {
     96         final ConversationInputManager inputManager = initNewInputManager(new Bundle());
     97         Mockito.when(mockMediaPicker.isOpen()).thenReturn(true);
     98         inputManager.showHideMediaPicker(true /* show */, true /* animate */);
     99         Mockito.verify(mockFragmentTransaction).replace(
    100                 Mockito.eq(R.id.mediapicker_container), Mockito.any(MediaPicker.class),
    101                 Mockito.anyString());
    102         Mockito.verify(mockMediaPicker).open(Mockito.anyInt(), Mockito.eq(true /* animate */));
    103 
    104         assertEquals(true, inputManager.isMediaPickerVisible());
    105         assertEquals(false, inputManager.isSimSelectorVisible());
    106         assertEquals(false, inputManager.isImeKeyboardVisible());
    107 
    108         Mockito.when(mockMediaPicker.isOpen()).thenReturn(false);
    109         inputManager.showHideMediaPicker(false /* show */, true /* animate */);
    110         Mockito.verify(mockMediaPicker).dismiss(Mockito.eq(true /* animate */));
    111 
    112         assertEquals(false, inputManager.isMediaPickerVisible());
    113         assertEquals(false, inputManager.isSimSelectorVisible());
    114         assertEquals(false, inputManager.isImeKeyboardVisible());
    115     }
    116 
    117     public void testShowTwoInputsSequentially() {
    118         // First show the media picker, then show the IME keyboard.
    119         final ConversationInputManager inputManager = initNewInputManager(new Bundle());
    120         Mockito.when(mockMediaPicker.isOpen()).thenReturn(true);
    121         inputManager.showHideMediaPicker(true /* show */, true /* animate */);
    122 
    123         assertEquals(true, inputManager.isMediaPickerVisible());
    124         assertEquals(false, inputManager.isSimSelectorVisible());
    125         assertEquals(false, inputManager.isImeKeyboardVisible());
    126 
    127         Mockito.when(mockMediaPicker.isOpen()).thenReturn(false);
    128         inputManager.showHideImeKeyboard(true /* show */, true /* animate */);
    129 
    130         assertEquals(false, inputManager.isMediaPickerVisible());
    131         assertEquals(false, inputManager.isSimSelectorVisible());
    132         assertEquals(true, inputManager.isImeKeyboardVisible());
    133     }
    134 
    135     public void testOnKeyboardShow() {
    136         final ConversationInputManager inputManager = initNewInputManager(new Bundle());
    137         Mockito.when(mockMediaPicker.isOpen()).thenReturn(true);
    138         inputManager.showHideMediaPicker(true /* show */, true /* animate */);
    139 
    140         assertEquals(true, inputManager.isMediaPickerVisible());
    141         assertEquals(false, inputManager.isSimSelectorVisible());
    142         assertEquals(false, inputManager.isImeKeyboardVisible());
    143 
    144         Mockito.when(mockMediaPicker.isOpen()).thenReturn(false);
    145         inputManager.testNotifyImeStateChanged(true /* imeOpen */);
    146 
    147         assertEquals(false, inputManager.isMediaPickerVisible());
    148         assertEquals(false, inputManager.isSimSelectorVisible());
    149         assertEquals(true, inputManager.isImeKeyboardVisible());
    150     }
    151 
    152     public void testRestoreState() {
    153         final ConversationInputManager inputManager = initNewInputManager(new Bundle());
    154         Mockito.when(mockMediaPicker.isOpen()).thenReturn(true);
    155         inputManager.showHideMediaPicker(true /* show */, true /* animate */);
    156 
    157         assertEquals(true, inputManager.isMediaPickerVisible());
    158         assertEquals(false, inputManager.isSimSelectorVisible());
    159         assertEquals(false, inputManager.isImeKeyboardVisible());
    160 
    161         Bundle savedInstanceState = new Bundle();
    162         inputManager.onSaveInputState(savedInstanceState);
    163 
    164         // Now try to restore the state
    165         final ConversationInputManager restoredInputManager =
    166                 initNewInputManager(savedInstanceState);
    167 
    168         // Make sure the state is preserved.
    169         assertEquals(true, restoredInputManager.isMediaPickerVisible());
    170         assertEquals(false, restoredInputManager.isSimSelectorVisible());
    171         assertEquals(false, restoredInputManager.isImeKeyboardVisible());
    172     }
    173 
    174     public void testBackPress() {
    175         final ConversationInputManager inputManager = initNewInputManager(new Bundle());
    176         Mockito.when(mockMediaPicker.isOpen()).thenReturn(true);
    177         inputManager.showHideMediaPicker(true /* show */, true /* animate */);
    178 
    179         assertEquals(true, inputManager.isMediaPickerVisible());
    180         assertEquals(false, inputManager.isSimSelectorVisible());
    181         assertEquals(false, inputManager.isImeKeyboardVisible());
    182 
    183         Mockito.when(mockMediaPicker.isOpen()).thenReturn(false);
    184         assertEquals(true, inputManager.onBackPressed());
    185 
    186         assertEquals(false, inputManager.isMediaPickerVisible());
    187         assertEquals(false, inputManager.isSimSelectorVisible());
    188         assertEquals(false, inputManager.isImeKeyboardVisible());
    189     }
    190 }
    191