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