IntentSearchViewHolderTest.java revision 4e7bd693b20b471f1d170909e9609fe5c97a72f0
1/* 2 * Copyright (C) 2017 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 18package com.android.settings.search; 19 20import static com.google.common.truth.Truth.assertThat; 21 22import static org.mockito.Matchers.any; 23import static org.mockito.Matchers.eq; 24import static org.mockito.Mockito.doReturn; 25import static org.mockito.Mockito.spy; 26import static org.mockito.Mockito.verify; 27import static org.mockito.Mockito.when; 28 29import android.content.ComponentName; 30import android.content.Context; 31import android.content.Intent; 32import android.content.pm.ApplicationInfo; 33import android.content.pm.PackageManager; 34import android.graphics.drawable.Drawable; 35import android.os.UserHandle; 36import android.view.LayoutInflater; 37import android.view.View; 38 39import com.android.settings.R; 40import com.android.settings.TestConfig; 41import com.android.settings.search.SearchResult.Builder; 42import com.android.settings.testutils.FakeFeatureFactory; 43import com.android.settings.testutils.SettingsRobolectricTestRunner; 44 45import org.junit.Before; 46import org.junit.Test; 47import org.junit.runner.RunWith; 48import org.mockito.Answers; 49import org.mockito.Mock; 50import org.mockito.MockitoAnnotations; 51import org.robolectric.RuntimeEnvironment; 52import org.robolectric.annotation.Config; 53 54import java.util.ArrayList; 55import java.util.List; 56import java.util.Objects; 57 58@RunWith(SettingsRobolectricTestRunner.class) 59@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 60public class IntentSearchViewHolderTest { 61 62 private static final String TITLE = "title"; 63 private static final String SUMMARY = "summary"; 64 private static final int USER_ID = 10; 65 private static final String BADGED_LABEL = "work title"; 66 67 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 68 private Context mContext; 69 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 70 private SearchFragment mFragment; 71 @Mock 72 private PackageManager mPackageManager; 73 private FakeFeatureFactory mFeatureFactory; 74 private IntentSearchViewHolder mHolder; 75 private Drawable mIcon; 76 private Drawable mBadgedIcon; 77 78 @Before 79 public void setUp() { 80 MockitoAnnotations.initMocks(this); 81 FakeFeatureFactory.setupForTest(mContext); 82 mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); 83 84 final Context context = RuntimeEnvironment.application; 85 View view = LayoutInflater.from(context).inflate(R.layout.search_intent_item, null); 86 mHolder = new IntentSearchViewHolder(view); 87 88 mIcon = context.getDrawable(R.drawable.ic_search_24dp); 89 mBadgedIcon = context.getDrawable(R.drawable.ic_add); 90 when(mFragment.getActivity().getPackageManager()).thenReturn(mPackageManager); 91 } 92 93 @Test 94 public void testConstructor_membersNotNull() { 95 assertThat(mHolder.titleView).isNotNull(); 96 assertThat(mHolder.summaryView).isNotNull(); 97 assertThat(mHolder.iconView).isNotNull(); 98 assertThat(mHolder.breadcrumbView).isNotNull(); 99 } 100 101 @Test 102 public void testBindViewElements_allUpdated() { 103 SearchResult result = getSearchResult(TITLE, SUMMARY, mIcon); 104 mHolder.onBind(mFragment, result); 105 mHolder.itemView.performClick(); 106 107 assertThat(mHolder.titleView.getText()).isEqualTo(TITLE); 108 assertThat(mHolder.summaryView.getText()).isEqualTo(SUMMARY); 109 assertThat(mHolder.iconView.getDrawable()).isEqualTo(mIcon); 110 assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.VISIBLE); 111 assertThat(mHolder.breadcrumbView.getVisibility()).isEqualTo(View.GONE); 112 113 verify(mFragment).onSearchResultClicked(eq(mHolder), any(SearchResult.class)); 114 verify(mFragment).startActivity(any(Intent.class)); 115 } 116 117 @Test 118 public void testBindViewIcon_nullIcon_imageDrawableIsNull() { 119 final SearchResult result = getSearchResult(TITLE, SUMMARY, null); 120 mHolder.onBind(mFragment, result); 121 122 assertThat(mHolder.iconView.getDrawable()).isNull(); 123 } 124 125 @Test 126 public void testBindViewElements_emptySummary_hideSummaryView() { 127 final SearchResult result = new Builder() 128 .setTitle(TITLE) 129 .setRank(1) 130 .setPayload(new ResultPayload(null)) 131 .setIcon(mIcon) 132 .setStableId(1) 133 .build(); 134 135 mHolder.onBind(mFragment, result); 136 assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.GONE); 137 } 138 139 @Test 140 public void testBindViewElements_withBreadcrumb_shouldFormatBreadcrumb() { 141 final List<String> breadcrumbs = new ArrayList<>(); 142 breadcrumbs.add("a"); 143 breadcrumbs.add("b"); 144 breadcrumbs.add("c"); 145 final SearchResult result = new Builder() 146 .setTitle(TITLE) 147 .setRank(1) 148 .setPayload(new ResultPayload(null)) 149 .addBreadcrumbs(breadcrumbs) 150 .setIcon(mIcon) 151 .setStableId(1) 152 .build(); 153 154 mHolder.onBind(mFragment, result); 155 assertThat(mHolder.breadcrumbView.getVisibility()).isEqualTo(View.VISIBLE); 156 assertThat(mHolder.breadcrumbView.getText()).isEqualTo("a > b > c"); 157 } 158 159 @Test 160 public void testBindElements_placeholderSummary_visibilityIsGone() { 161 String nonBreakingSpace = mContext.getString(R.string.summary_placeholder); 162 SearchResult result = new Builder() 163 .setTitle(TITLE) 164 .setSummary(nonBreakingSpace) 165 .setPayload(new ResultPayload(null)) 166 .setStableId(1) 167 .build(); 168 169 mHolder.onBind(mFragment, result); 170 171 assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.GONE); 172 } 173 174 @Test 175 public void testBindElements_dynamicSummary_visibilityIsGone() { 176 String dynamicSummary = "%s"; 177 SearchResult result = new Builder() 178 .setTitle(TITLE) 179 .setSummary(dynamicSummary) 180 .setPayload(new ResultPayload(null)) 181 .setStableId(1) 182 .build(); 183 184 mHolder.onBind(mFragment, result); 185 186 assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.GONE); 187 } 188 189 @Test 190 public void testBindViewElements_appSearchResult() { 191 when(mPackageManager.getUserBadgedLabel(any(CharSequence.class), 192 eq(new UserHandle(USER_ID)))).thenReturn(BADGED_LABEL); 193 194 SearchResult result = getAppSearchResult( 195 TITLE, SUMMARY, mIcon, getApplicationInfo(USER_ID, TITLE, mIcon)); 196 mHolder.onBind(mFragment, result); 197 mHolder.itemView.performClick(); 198 199 assertThat(mHolder.titleView.getText()).isEqualTo(TITLE); 200 assertThat(mHolder.summaryView.getText()).isEqualTo(SUMMARY); 201 assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.VISIBLE); 202 assertThat(mHolder.breadcrumbView.getVisibility()).isEqualTo(View.GONE); 203 assertThat(mHolder.titleView.getContentDescription()).isEqualTo(BADGED_LABEL); 204 205 verify(mFragment).onSearchResultClicked(eq(mHolder), any(SearchResult.class)); 206 verify(mFragment.getActivity()).startActivityAsUser( 207 any(Intent.class), eq(new UserHandle(USER_ID))); 208 } 209 210 private SearchResult getSearchResult(String title, String summary, Drawable icon) { 211 Builder builder = new Builder(); 212 builder.setStableId(Objects.hash(title, summary, icon)) 213 .setTitle(title) 214 .setSummary(summary) 215 .setRank(1) 216 .setPayload(new ResultPayload( 217 new Intent().setComponent(new ComponentName("pkg", "class")))) 218 .addBreadcrumbs(new ArrayList<>()) 219 .setStableId(1) 220 .setIcon(icon); 221 222 return builder.build(); 223 } 224 225 private SearchResult getAppSearchResult( 226 String title, String summary, Drawable icon, ApplicationInfo applicationInfo) { 227 AppSearchResult.Builder builder = new AppSearchResult.Builder(); 228 builder.setTitle(title) 229 .setSummary(summary) 230 .setRank(1) 231 .setPayload(new ResultPayload( 232 new Intent().setComponent(new ComponentName("pkg", "class")))) 233 .addBreadcrumbs(new ArrayList<>()) 234 .setIcon(icon); 235 builder.setAppInfo(applicationInfo); 236 return builder.build(); 237 } 238 239 private ApplicationInfo getApplicationInfo(int userId, CharSequence appLabel, Drawable icon) { 240 ApplicationInfo applicationInfo = spy(new ApplicationInfo()); 241 applicationInfo.uid = UserHandle.getUid(userId, 12345); 242 doReturn(icon).when(applicationInfo).loadIcon(any(PackageManager.class)); 243 doReturn(appLabel).when(applicationInfo).loadLabel(any(PackageManager.class)); 244 return applicationInfo; 245 } 246} 247