2 * Copyright (C) 2017 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.android.settings.dashboard.suggestions;
18 import static com.google.common.truth.Truth.assertThat;
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.spy;
21 import static org.mockito.Mockito.verify;
23 import android.app.PendingIntent;
24 import android.content.Context;
25 import android.graphics.drawable.Icon;
26 import android.service.settings.suggestions.Suggestion;
27 import android.view.LayoutInflater;
28 import android.view.View;
29 import android.widget.FrameLayout;
30 import android.widget.LinearLayout;
32 import com.android.internal.logging.nano.MetricsProto;
33 import com.android.settings.R;
34 import com.android.settings.SettingsActivity;
35 import com.android.settings.TestConfig;
36 import com.android.settings.dashboard.DashboardAdapter;
37 import com.android.settings.testutils.FakeFeatureFactory;
38 import com.android.settings.testutils.SettingsRobolectricTestRunner;
39 import com.android.settingslib.suggestions.SuggestionControllerMixin;
41 import org.junit.Before;
42 import org.junit.Test;
43 import org.junit.runner.RunWith;
44 import org.mockito.Answers;
45 import org.mockito.Mock;
46 import org.mockito.MockitoAnnotations;
47 import org.robolectric.RuntimeEnvironment;
48 import org.robolectric.annotation.Config;
50 import java.util.ArrayList;
51 import java.util.List;
53 @RunWith(SettingsRobolectricTestRunner.class)
54 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
55 public class SuggestionAdapterTest {
57 @Mock(answer = Answers.RETURNS_DEEP_STUBS)
58 private SettingsActivity mActivity;
60 private SuggestionControllerMixin mSuggestionControllerMixin;
61 private FakeFeatureFactory mFeatureFactory;
62 private Context mContext;
63 private SuggestionAdapter mSuggestionAdapter;
64 private DashboardAdapter.DashboardItemHolder mSuggestionHolder;
65 private List<Suggestion> mOneSuggestion;
66 private List<Suggestion> mTwoSuggestions;
70 MockitoAnnotations.initMocks(this);
71 mContext = RuntimeEnvironment.application;
72 mFeatureFactory = FakeFeatureFactory.setupForTest();
74 final Suggestion suggestion1 = new Suggestion.Builder("id1")
75 .setTitle("Test suggestion 1")
77 final Suggestion suggestion2 = new Suggestion.Builder("id2")
78 .setTitle("Test suggestion 2")
80 mOneSuggestion = new ArrayList<>();
81 mOneSuggestion.add(suggestion1);
82 mTwoSuggestions = new ArrayList<>();
83 mTwoSuggestions.add(suggestion1);
84 mTwoSuggestions.add(suggestion2);
88 public void getItemCount_shouldReturnListSize() {
89 mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
90 mOneSuggestion, new ArrayList<>());
91 assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(1);
93 mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
94 mTwoSuggestions, new ArrayList<>());
95 assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(2);
99 public void getItemViewType_shouldReturnSuggestionTile() {
100 mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
101 mOneSuggestion, new ArrayList<>());
102 assertThat(mSuggestionAdapter.getItemViewType(0))
103 .isEqualTo(R.layout.suggestion_tile);
107 public void getItemType_hasButton_shouldReturnSuggestionWithButton() {
108 final List<Suggestion> suggestions = new ArrayList<>();
109 suggestions.add(new Suggestion.Builder("id")
110 .setFlags(Suggestion.FLAG_HAS_BUTTON)
114 mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
115 suggestions, new ArrayList<>());
117 assertThat(mSuggestionAdapter.getItemViewType(0))
118 .isEqualTo(R.layout.suggestion_tile_with_button);
122 public void onBindViewHolder_shouldLog() {
123 final View view = spy(LayoutInflater.from(mContext).inflate(
124 R.layout.suggestion_tile, new LinearLayout(mContext), true));
125 mSuggestionHolder = new DashboardAdapter.DashboardItemHolder(view);
126 mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
127 mOneSuggestion, new ArrayList<>());
130 mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
131 mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
134 verify(mFeatureFactory.metricsFeatureProvider).action(
135 mContext, MetricsProto.MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
136 mOneSuggestion.get(0).getId());
140 public void onBindViewHolder_itemViewShouldHandleClick()
141 throws PendingIntent.CanceledException {
142 final List<Suggestion> suggestions = makeSuggestions("pkg1");
143 setupSuggestions(mActivity, suggestions);
145 mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
146 mSuggestionHolder.itemView.performClick();
148 verify(mSuggestionControllerMixin).launchSuggestion(suggestions.get(0));
149 verify(suggestions.get(0).getPendingIntent()).send();
153 public void getSuggestions_shouldReturnSuggestionWhenMatch() {
154 final List<Suggestion> suggestions = makeSuggestions("pkg1");
155 setupSuggestions(mActivity, suggestions);
157 assertThat(mSuggestionAdapter.getSuggestion(0)).isNotNull();
160 private void setupSuggestions(Context context, List<Suggestion> suggestions) {
161 mSuggestionAdapter = new SuggestionAdapter(context, mSuggestionControllerMixin,
162 suggestions, new ArrayList<>());
163 mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
164 new FrameLayout(RuntimeEnvironment.application),
165 mSuggestionAdapter.getItemViewType(0));
168 private List<Suggestion> makeSuggestions(String... pkgNames) {
169 final List<Suggestion> suggestions = new ArrayList<>();
170 for (String pkgName : pkgNames) {
171 final Suggestion suggestion = new Suggestion.Builder(pkgName)
172 .setPendingIntent(mock(PendingIntent.class))
174 suggestions.add(suggestion);