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