• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
setUp()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 
verifyLaunchedConversationForId(final String id, final ConversationListItemView conversationView)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 
verifyContent( final ConversationListItemView view, final FakeCursor cursor, final int index)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 
verifyContent( final ConversationListItemView view, final String conversationName, final String snippet, final String timestamp, final boolean unread)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 
isRead(final FakeCursor cursor, final int index)133     protected boolean isRead(final FakeCursor cursor, final int index) {
134         return 1 == ((Integer) cursor.getAt("read", index)).intValue();
135     }
136 
testBindUnread()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 
testBindRead()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 
testClickLaunchesConversation()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 
testBindTwice()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
getLayoutIdForView()178     protected int getLayoutIdForView() {
179         return R.layout.conversation_list_item_view;
180     }
181 }
182