1/*
2 * Copyright (C) 2009 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
17package com.android.quicksearchbox;
18
19import com.google.common.annotations.VisibleForTesting;
20
21import android.content.ComponentName;
22import android.content.Intent;
23
24
25/**
26 * Holds data for each suggest item including the display data and how to launch the result.
27 * Used for passing from the provider to the suggest cursor.
28 */
29public class SuggestionData implements Suggestion {
30
31    private final Source mSource;
32    private String mFormat;
33    private String mText1;
34    private String mText2;
35    private String mText2Url;
36    private String mIcon1;
37    private String mIcon2;
38    private String mShortcutId;
39    private boolean mSpinnerWhileRefreshing;
40    private String mIntentAction;
41    private String mIntentData;
42    private String mIntentExtraData;
43    private String mSuggestionQuery;
44    private String mLogType;
45    private boolean mIsShortcut;
46    private boolean mIsHistory;
47    private SuggestionExtras mExtras;
48
49    public SuggestionData(Source source) {
50        mSource = source;
51    }
52
53    public Source getSuggestionSource() {
54        return mSource;
55    }
56
57    public String getSuggestionFormat() {
58        return mFormat;
59    }
60
61    public String getSuggestionText1() {
62        return mText1;
63    }
64
65    public String getSuggestionText2() {
66        return mText2;
67    }
68
69    public String getSuggestionText2Url() {
70        return mText2Url;
71    }
72
73    public String getSuggestionIcon1() {
74        return mIcon1;
75    }
76
77    public String getSuggestionIcon2() {
78        return mIcon2;
79    }
80
81    public boolean isSpinnerWhileRefreshing() {
82        return mSpinnerWhileRefreshing;
83    }
84
85    public String getIntentExtraData() {
86        return mIntentExtraData;
87    }
88
89    public String getShortcutId() {
90        return mShortcutId;
91    }
92
93    public String getSuggestionIntentAction() {
94        if (mIntentAction != null) return mIntentAction;
95        return mSource.getDefaultIntentAction();
96    }
97
98    public ComponentName getSuggestionIntentComponent() {
99        return mSource.getIntentComponent();
100    }
101
102    public String getSuggestionIntentDataString() {
103        return mIntentData;
104    }
105
106    public String getSuggestionIntentExtraData() {
107        return mIntentExtraData;
108    }
109
110    public String getSuggestionQuery() {
111        return mSuggestionQuery;
112    }
113
114    public String getSuggestionLogType() {
115        return mLogType;
116    }
117
118    public boolean isSuggestionShortcut() {
119        return mIsShortcut;
120    }
121
122    public boolean isWebSearchSuggestion() {
123        return Intent.ACTION_WEB_SEARCH.equals(getSuggestionIntentAction());
124    }
125
126    public boolean isHistorySuggestion() {
127        return mIsHistory;
128    }
129
130    @VisibleForTesting
131    public SuggestionData setFormat(String format) {
132        mFormat = format;
133        return this;
134    }
135
136    @VisibleForTesting
137    public SuggestionData setText1(String text1) {
138        mText1 = text1;
139        return this;
140    }
141
142    @VisibleForTesting
143    public SuggestionData setText2(String text2) {
144        mText2 = text2;
145        return this;
146    }
147
148    @VisibleForTesting
149    public SuggestionData setText2Url(String text2Url) {
150        mText2Url = text2Url;
151        return this;
152    }
153
154    @VisibleForTesting
155    public SuggestionData setIcon1(String icon1) {
156        mIcon1 = icon1;
157        return this;
158    }
159
160    @VisibleForTesting
161    public SuggestionData setIcon2(String icon2) {
162        mIcon2 = icon2;
163        return this;
164    }
165
166    @VisibleForTesting
167    public SuggestionData setIntentAction(String intentAction) {
168        mIntentAction = intentAction;
169        return this;
170    }
171
172    @VisibleForTesting
173    public SuggestionData setIntentData(String intentData) {
174        mIntentData = intentData;
175        return this;
176    }
177
178    @VisibleForTesting
179    public SuggestionData setIntentExtraData(String intentExtraData) {
180        mIntentExtraData = intentExtraData;
181        return this;
182    }
183
184    @VisibleForTesting
185    public SuggestionData setSuggestionQuery(String suggestionQuery) {
186        mSuggestionQuery = suggestionQuery;
187        return this;
188    }
189
190    @VisibleForTesting
191    public SuggestionData setShortcutId(String shortcutId) {
192        mShortcutId = shortcutId;
193        return this;
194    }
195
196    @VisibleForTesting
197    public SuggestionData setSpinnerWhileRefreshing(boolean spinnerWhileRefreshing) {
198        mSpinnerWhileRefreshing = spinnerWhileRefreshing;
199        return this;
200    }
201
202    @VisibleForTesting
203    public SuggestionData setSuggestionLogType(String logType) {
204        mLogType = logType;
205        return this;
206    }
207
208    @VisibleForTesting
209    public SuggestionData setIsShortcut(boolean isShortcut) {
210        mIsShortcut = isShortcut;
211        return this;
212    }
213
214    @VisibleForTesting
215    public SuggestionData setIsHistory(boolean isHistory) {
216        mIsHistory = isHistory;
217        return this;
218    }
219
220    @Override
221    public int hashCode() {
222        final int prime = 31;
223        int result = 1;
224        result = prime * result + ((mFormat == null) ? 0 : mFormat.hashCode());
225        result = prime * result + ((mIcon1 == null) ? 0 : mIcon1.hashCode());
226        result = prime * result + ((mIcon2 == null) ? 0 : mIcon2.hashCode());
227        result = prime * result + ((mIntentAction == null) ? 0 : mIntentAction.hashCode());
228        result = prime * result + ((mIntentData == null) ? 0 : mIntentData.hashCode());
229        result = prime * result + ((mIntentExtraData == null) ? 0 : mIntentExtraData.hashCode());
230        result = prime * result + ((mLogType == null) ? 0 : mLogType.hashCode());
231        result = prime * result + ((mShortcutId == null) ? 0 : mShortcutId.hashCode());
232        result = prime * result + ((mSource == null) ? 0 : mSource.hashCode());
233        result = prime * result + (mSpinnerWhileRefreshing ? 1231 : 1237);
234        result = prime * result + ((mSuggestionQuery == null) ? 0 : mSuggestionQuery.hashCode());
235        result = prime * result + ((mText1 == null) ? 0 : mText1.hashCode());
236        result = prime * result + ((mText2 == null) ? 0 : mText2.hashCode());
237        return result;
238    }
239
240    @Override
241    public boolean equals(Object obj) {
242        if (this == obj)
243            return true;
244        if (obj == null)
245            return false;
246        if (getClass() != obj.getClass())
247            return false;
248        SuggestionData other = (SuggestionData)obj;
249        if (mFormat == null) {
250            if (other.mFormat != null)
251                return false;
252        } else if (!mFormat.equals(other.mFormat))
253            return false;
254        if (mIcon1 == null) {
255            if (other.mIcon1 != null)
256                return false;
257        } else if (!mIcon1.equals(other.mIcon1))
258            return false;
259        if (mIcon2 == null) {
260            if (other.mIcon2 != null)
261                return false;
262        } else if (!mIcon2.equals(other.mIcon2))
263            return false;
264        if (mIntentAction == null) {
265            if (other.mIntentAction != null)
266                return false;
267        } else if (!mIntentAction.equals(other.mIntentAction))
268            return false;
269        if (mIntentData == null) {
270            if (other.mIntentData != null)
271                return false;
272        } else if (!mIntentData.equals(other.mIntentData))
273            return false;
274        if (mIntentExtraData == null) {
275            if (other.mIntentExtraData != null)
276                return false;
277        } else if (!mIntentExtraData.equals(other.mIntentExtraData))
278            return false;
279        if (mLogType == null) {
280            if (other.mLogType != null)
281                return false;
282        } else if (!mLogType.equals(other.mLogType))
283            return false;
284        if (mShortcutId == null) {
285            if (other.mShortcutId != null)
286                return false;
287        } else if (!mShortcutId.equals(other.mShortcutId))
288            return false;
289        if (mSource == null) {
290            if (other.mSource != null)
291                return false;
292        } else if (!mSource.equals(other.mSource))
293            return false;
294        if (mSpinnerWhileRefreshing != other.mSpinnerWhileRefreshing)
295            return false;
296        if (mSuggestionQuery == null) {
297            if (other.mSuggestionQuery != null)
298                return false;
299        } else if (!mSuggestionQuery.equals(other.mSuggestionQuery))
300            return false;
301        if (mText1 == null) {
302            if (other.mText1 != null)
303                return false;
304        } else if (!mText1.equals(other.mText1))
305            return false;
306        if (mText2 == null) {
307            if (other.mText2 != null)
308                return false;
309        } else if (!mText2.equals(other.mText2))
310            return false;
311        return true;
312    }
313
314    /**
315     * Returns a string representation of the contents of this SuggestionData,
316     * for debugging purposes.
317     */
318    @Override
319    public String toString() {
320        StringBuilder builder = new StringBuilder("SuggestionData(");
321        appendField(builder, "source", mSource.getName());
322        appendField(builder, "text1", mText1);
323        appendField(builder, "intentAction", mIntentAction);
324        appendField(builder, "intentData", mIntentData);
325        appendField(builder, "query", mSuggestionQuery);
326        appendField(builder, "shortcutid", mShortcutId);
327        appendField(builder, "logtype", mLogType);
328        return builder.toString();
329    }
330
331    private void appendField(StringBuilder builder, String name, String value) {
332        if (value != null) {
333            builder.append(",").append(name).append("=").append(value);
334        }
335    }
336
337    @VisibleForTesting
338    public void setExtras(SuggestionExtras extras) {
339        mExtras = extras;
340    }
341
342    public SuggestionExtras getExtras() {
343        return mExtras;
344    }
345
346}
347