Home | History | Annotate | Download | only in conversationlist
      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 
     17 package com.android.messaging.ui.conversationlist;
     18 
     19 import android.content.Context;
     20 import android.test.suitebuilder.annotation.MediumTest;
     21 import android.text.TextUtils;
     22 import android.view.View;
     23 import android.widget.TextView;
     24 
     25 import com.android.messaging.Factory;
     26 import com.android.messaging.FakeFactory;
     27 import com.android.messaging.R;
     28 import com.android.messaging.datamodel.FakeCursor;
     29 import com.android.messaging.datamodel.FakeDataModel;
     30 import com.android.messaging.datamodel.data.ConversationListItemData;
     31 import com.android.messaging.datamodel.data.TestDataFactory;
     32 import com.android.messaging.ui.AsyncImageView;
     33 import com.android.messaging.ui.UIIntentsImpl;
     34 import com.android.messaging.ui.ViewTest;
     35 import com.android.messaging.ui.conversationlist.ConversationListItemView;
     36 import com.android.messaging.util.Dates;
     37 
     38 import org.mockito.ArgumentMatcher;
     39 import org.mockito.Mock;
     40 import org.mockito.Mockito;
     41 
     42 @MediumTest
     43 public class ConversationListItemViewTest extends ViewTest<ConversationListItemView> {
     44 
     45     @Mock private ConversationListItemView.HostInterface mockHost;
     46     private FakeCursor mCursor;
     47 
     48     @Override
     49     protected void setUp() throws Exception {
     50         super.setUp();
     51         final Context context = getInstrumentation().getTargetContext();
     52         FakeFactory.register(context)
     53             .withDataModel(new FakeDataModel(context))
     54             .withUIIntents(new UIIntentsImpl());
     55         mCursor = TestDataFactory.getConversationListCursor();
     56     }
     57 
     58 
     59     protected void verifyLaunchedConversationForId(final String id,
     60             final ConversationListItemView conversationView) {
     61         // Must be a short click.
     62         final ArgumentMatcher<ConversationListItemData> itemDataIdMatcher =
     63                 new ArgumentMatcher<ConversationListItemData>() {
     64             @Override
     65             public boolean matches(final Object arg) {
     66                 return TextUtils.equals(id, ((ConversationListItemData) arg).getConversationId());
     67             }
     68         };
     69         Mockito.verify(mockHost).onConversationClicked(
     70                 Mockito.argThat(itemDataIdMatcher), Mockito.eq(false),
     71                 Mockito.eq(conversationView));
     72     }
     73 
     74     protected void verifyContent(
     75             final ConversationListItemView view, final FakeCursor cursor, final int index) {
     76         /* ConversationQueryColumns.NAME */
     77         final String  conversationQueryColumnsName = "name";
     78         final String name = (String) cursor.getAt(conversationQueryColumnsName, index);
     79 
     80         /* ConversationQueryColumns.SNIPPET_TEXT */
     81         final String  conversationQueryColumnsSnippetText = "snippet_text";
     82         final String snippet = (String) cursor.getAt(conversationQueryColumnsSnippetText, index);
     83 
     84         /* ConversationQueryColumns.SORT_TIMESTAMP */
     85         final String  conversationQueryColumnsSortTimestamp = "sort_timestamp";
     86         final String timestamp = Dates.getConversationTimeString(
     87                 (Long) cursor.getAt(conversationQueryColumnsSortTimestamp, index)).toString();
     88 
     89         final boolean unread = !isRead(cursor, index);
     90         verifyContent(view, name,  snippet, timestamp, unread);
     91     }
     92 
     93     protected void verifyContent(
     94             final ConversationListItemView view,
     95             final String conversationName,
     96             final String snippet,
     97             final String timestamp,
     98             final boolean unread) {
     99         final TextView conversationNameView =
    100                 (TextView) view.findViewById(R.id.conversation_name);
    101         final TextView snippetTextView = (TextView) view.findViewById(R.id.conversation_snippet);
    102         final TextView timestampTextView = (TextView) view.findViewById(
    103                 R.id.conversation_timestamp);
    104         final AsyncImageView imagePreviewView =
    105                 (AsyncImageView) view.findViewById(R.id.conversation_image_preview);
    106 
    107         final Context context = Factory.get().getApplicationContext();
    108         assertNotNull(conversationNameView);
    109         assertEquals(conversationName, conversationNameView.getText());
    110         assertNotNull(snippetTextView);
    111         if (unread) {
    112             assertEquals(ConversationListItemView.UNREAD_SNIPPET_LINE_COUNT,
    113                     snippetTextView.getMaxLines());
    114             assertEquals(context.getResources().getColor(R.color.conversation_list_item_unread),
    115                     snippetTextView.getCurrentTextColor());
    116             assertEquals(context.getResources().getColor(R.color.conversation_list_item_unread),
    117                     conversationNameView.getCurrentTextColor());
    118 
    119         } else {
    120             assertEquals(ConversationListItemView.NO_UNREAD_SNIPPET_LINE_COUNT,
    121                     snippetTextView.getMaxLines());
    122             assertEquals(context.getResources().getColor(R.color.conversation_list_item_read),
    123                     snippetTextView.getCurrentTextColor());
    124             assertEquals(context.getResources().getColor(R.color.conversation_list_item_read),
    125                     conversationNameView.getCurrentTextColor());
    126         }
    127 
    128         assertEquals(View.VISIBLE, imagePreviewView.getVisibility());
    129         assertTrue(snippetTextView.getText().toString().contains(snippet));
    130         assertEquals(timestamp, timestampTextView.getText());
    131     }
    132 
    133     protected boolean isRead(final FakeCursor cursor, final int index) {
    134         return 1 == ((Integer) cursor.getAt("read", index)).intValue();
    135     }
    136 
    137     public void testBindUnread() {
    138         final ConversationListItemView view = getView();
    139         final int messageIndex = TestDataFactory.CONVERSATION_LIST_CURSOR_UNREAD_MESSAGE_INDEX;
    140         mCursor.moveToPosition(messageIndex);
    141         assertFalse(isRead(mCursor, messageIndex));
    142         view.bind(mCursor, mockHost);
    143         verifyContent(view, mCursor, messageIndex);
    144     }
    145 
    146     public void testBindRead() {
    147         final ConversationListItemView view = getView();
    148 
    149         final int messageIndex = TestDataFactory.CONVERSATION_LIST_CURSOR_READ_MESSAGE_INDEX;
    150         mCursor.moveToPosition(messageIndex);
    151         assertTrue(isRead(mCursor, messageIndex));
    152         view.bind(mCursor, mockHost);
    153         verifyContent(view, mCursor, messageIndex);
    154     }
    155 
    156     public void testClickLaunchesConversation() {
    157         final ConversationListItemView view = getView();
    158         final View swipeableContainer = view.findViewById(R.id.swipeableContainer);
    159         mCursor.moveToFirst();
    160         view.bind(mCursor, mockHost);
    161         swipeableContainer.performClick();
    162         verifyLaunchedConversationForId(
    163                 mCursor.getAt("_id" /* ConversationQueryColumns._ID */, 0).toString(), view);
    164     }
    165 
    166     public void testBindTwice() {
    167         final ConversationListItemView view = getView();
    168 
    169         mCursor.moveToFirst();
    170         view.bind(mCursor, mockHost);
    171 
    172         mCursor.moveToNext();
    173         view.bind(mCursor, mockHost);
    174         verifyContent(view, mCursor, mCursor.getPosition());
    175     }
    176 
    177     @Override
    178     protected int getLayoutIdForView() {
    179         return R.layout.conversation_list_item_view;
    180     }
    181 }
    182