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