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                 arg -> TextUtils.equals(id, arg.getConversationId());
64         Mockito.verify(mockHost).onConversationClicked(
65                 Mockito.argThat(itemDataIdMatcher), Mockito.eq(false),
66                 Mockito.eq(conversationView));
67     }
68 
verifyContent( final ConversationListItemView view, final FakeCursor cursor, final int index)69     protected void verifyContent(
70             final ConversationListItemView view, final FakeCursor cursor, final int index) {
71         /* ConversationQueryColumns.NAME */
72         final String  conversationQueryColumnsName = "name";
73         final String name = (String) cursor.getAt(conversationQueryColumnsName, index);
74 
75         /* ConversationQueryColumns.SNIPPET_TEXT */
76         final String  conversationQueryColumnsSnippetText = "snippet_text";
77         final String snippet = (String) cursor.getAt(conversationQueryColumnsSnippetText, index);
78 
79         /* ConversationQueryColumns.SORT_TIMESTAMP */
80         final String  conversationQueryColumnsSortTimestamp = "sort_timestamp";
81         final String timestamp = Dates.getConversationTimeString(
82                 (Long) cursor.getAt(conversationQueryColumnsSortTimestamp, index)).toString();
83 
84         final boolean unread = !isRead(cursor, index);
85         verifyContent(view, name,  snippet, timestamp, unread);
86     }
87 
verifyContent( final ConversationListItemView view, final String conversationName, final String snippet, final String timestamp, final boolean unread)88     protected void verifyContent(
89             final ConversationListItemView view,
90             final String conversationName,
91             final String snippet,
92             final String timestamp,
93             final boolean unread) {
94         final TextView conversationNameView =
95                 (TextView) view.findViewById(R.id.conversation_name);
96         final TextView snippetTextView = (TextView) view.findViewById(R.id.conversation_snippet);
97         final TextView timestampTextView = (TextView) view.findViewById(
98                 R.id.conversation_timestamp);
99         final AsyncImageView imagePreviewView =
100                 (AsyncImageView) view.findViewById(R.id.conversation_image_preview);
101 
102         final Context context = Factory.get().getApplicationContext();
103         assertNotNull(conversationNameView);
104         assertEquals(conversationName, conversationNameView.getText());
105         assertNotNull(snippetTextView);
106         if (unread) {
107             assertEquals(ConversationListItemView.UNREAD_SNIPPET_LINE_COUNT,
108                     snippetTextView.getMaxLines());
109             assertEquals(context.getResources().getColor(R.color.conversation_list_item_unread),
110                     snippetTextView.getCurrentTextColor());
111             assertEquals(context.getResources().getColor(R.color.conversation_list_item_unread),
112                     conversationNameView.getCurrentTextColor());
113 
114         } else {
115             assertEquals(ConversationListItemView.NO_UNREAD_SNIPPET_LINE_COUNT,
116                     snippetTextView.getMaxLines());
117             assertEquals(context.getResources().getColor(R.color.conversation_list_item_read),
118                     snippetTextView.getCurrentTextColor());
119             assertEquals(context.getResources().getColor(R.color.conversation_list_item_read),
120                     conversationNameView.getCurrentTextColor());
121         }
122 
123         assertEquals(View.VISIBLE, imagePreviewView.getVisibility());
124         assertTrue(snippetTextView.getText().toString().contains(snippet));
125         assertEquals(timestamp, timestampTextView.getText());
126     }
127 
isRead(final FakeCursor cursor, final int index)128     protected boolean isRead(final FakeCursor cursor, final int index) {
129         return 1 == ((Integer) cursor.getAt("read", index)).intValue();
130     }
131 
testBindUnread()132     public void testBindUnread() {
133         final ConversationListItemView view = getView();
134         final int messageIndex = TestDataFactory.CONVERSATION_LIST_CURSOR_UNREAD_MESSAGE_INDEX;
135         mCursor.moveToPosition(messageIndex);
136         assertFalse(isRead(mCursor, messageIndex));
137         view.bind(mCursor, mockHost);
138         verifyContent(view, mCursor, messageIndex);
139     }
140 
testBindRead()141     public void testBindRead() {
142         final ConversationListItemView view = getView();
143 
144         final int messageIndex = TestDataFactory.CONVERSATION_LIST_CURSOR_READ_MESSAGE_INDEX;
145         mCursor.moveToPosition(messageIndex);
146         assertTrue(isRead(mCursor, messageIndex));
147         view.bind(mCursor, mockHost);
148         verifyContent(view, mCursor, messageIndex);
149     }
150 
testClickLaunchesConversation()151     public void testClickLaunchesConversation() {
152         final ConversationListItemView view = getView();
153         final View swipeableContainer = view.findViewById(R.id.swipeableContainer);
154         mCursor.moveToFirst();
155         view.bind(mCursor, mockHost);
156         swipeableContainer.performClick();
157         verifyLaunchedConversationForId(
158                 mCursor.getAt("_id" /* ConversationQueryColumns._ID */, 0).toString(), view);
159     }
160 
testBindTwice()161     public void testBindTwice() {
162         final ConversationListItemView view = getView();
163 
164         mCursor.moveToFirst();
165         view.bind(mCursor, mockHost);
166 
167         mCursor.moveToNext();
168         view.bind(mCursor, mockHost);
169         verifyContent(view, mCursor, mCursor.getPosition());
170     }
171 
172     @Override
getLayoutIdForView()173     protected int getLayoutIdForView() {
174         return R.layout.conversation_list_item_view;
175     }
176 }
177