| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.chrome.browser.omnibox; |
| |
| import android.text.TextUtils; |
| |
| import com.google.common.annotations.VisibleForTesting; |
| |
| /** |
| * Container class with information about each omnibox suggestion item. |
| */ |
| @VisibleForTesting |
| public class OmniboxSuggestion { |
| |
| private final Type mType; |
| private final String mDisplayText; |
| private final String mDescription; |
| private final String mAnswerContents; |
| private final String mAnswerType; |
| private final SuggestionAnswer mAnswer; |
| private final String mFillIntoEdit; |
| private final String mUrl; |
| private final String mFormattedUrl; |
| private final int mRelevance; |
| private final int mTransition; |
| private final boolean mIsStarred; |
| private final boolean mIsDeletable; |
| |
| /** |
| * This should be kept in sync with AutocompleteMatch::Type |
| * (see components/autocomplete/autocomplete_match_type.h). |
| * Negative types are specific to Chrome on Android front-end. |
| */ |
| public static enum Type { |
| VOICE_SUGGEST (-100), // A suggested search from the voice recognizer. |
| |
| URL_WHAT_YOU_TYPED (0), // The input as a URL. |
| HISTORY_URL (1), // A past page whose URL contains the input. |
| HISTORY_TITLE (2), // A past page whose title contains the input. |
| HISTORY_BODY (3), // A past page whose body contains the input. |
| HISTORY_KEYWORD (4), // A past page whose keyword contains the input. |
| NAVSUGGEST (5), // A suggested URL. |
| SEARCH_WHAT_YOU_TYPED (6), // The input as a search query (with the default |
| // engine). |
| SEARCH_HISTORY (7), // A past search (with the default engine) |
| // containing the input. |
| SEARCH_SUGGEST (8), // A suggested search (with the default engine). |
| SEARCH_SUGGEST_ENTITY (9), // A suggested search for an entity. |
| SEARCH_SUGGEST_INFINITE (10), // A suggested search (with the default engine) |
| // to complete the tail part of the input. |
| SEARCH_SUGGEST_PERSONALIZED (11), // A personalized suggested search. |
| SEARCH_SUGGEST_PROFILE (12), // A personalized suggested search for a |
| // Google+ profile. |
| SEARCH_OTHER_ENGINE (13), // A search with a non-default engine. |
| OPEN_HISTORY_PAGE (17), // A synthetic result that opens the history page |
| // to search for the input. |
| SEARCH_SUGGEST_ANSWER (18); // A short result for a suggested search. |
| |
| private final int mNativeType; |
| |
| Type(int nativeType) { |
| mNativeType = nativeType; |
| } |
| |
| static Type getTypeFromNativeType(int nativeType) { |
| for (Type t : Type.values()) { |
| if (t.mNativeType == nativeType) return t; |
| } |
| |
| return URL_WHAT_YOU_TYPED; |
| } |
| |
| public boolean isHistoryUrl() { |
| return this == HISTORY_URL || this == HISTORY_TITLE || |
| this == HISTORY_BODY || this == HISTORY_KEYWORD; |
| } |
| |
| public boolean isUrl() { |
| return this == URL_WHAT_YOU_TYPED || this.isHistoryUrl() || this == NAVSUGGEST; |
| } |
| |
| /** |
| * @return The ID of the type used by the native code. |
| */ |
| public int nativeType() { |
| return mNativeType; |
| } |
| } |
| |
| public OmniboxSuggestion(int nativeType, int relevance, int transition, |
| String text, String description, String answerContents, |
| String answerType, String fillIntoEdit, String url, |
| String formattedUrl, boolean isStarred, boolean isDeletable) { |
| mType = Type.getTypeFromNativeType(nativeType); |
| mRelevance = relevance; |
| mTransition = transition; |
| mDisplayText = text; |
| mDescription = description; |
| mAnswerContents = answerContents; |
| mAnswerType = answerType; |
| mFillIntoEdit = TextUtils.isEmpty(fillIntoEdit) ? text : fillIntoEdit; |
| mUrl = url; |
| mFormattedUrl = formattedUrl; |
| mIsStarred = isStarred; |
| mIsDeletable = isDeletable; |
| |
| if (!TextUtils.isEmpty(mAnswerContents)) { |
| // If any errors are encountered parsing the answer contents, this will return null and |
| // hasAnswer will return false, just as if there were no answer contents at all. |
| mAnswer = SuggestionAnswer.parseAnswerContents(mAnswerContents); |
| } else { |
| mAnswer = null; |
| } |
| } |
| |
| public Type getType() { |
| return mType; |
| } |
| |
| public int getTransition() { |
| return mTransition; |
| } |
| |
| public String getDisplayText() { |
| return mDisplayText; |
| } |
| |
| public String getDescription() { |
| return mDescription; |
| } |
| |
| public String getAnswerContents() { |
| return mAnswerContents; |
| } |
| |
| public String getAnswerType() { |
| return mAnswerType; |
| } |
| |
| public SuggestionAnswer getAnswer() { |
| return mAnswer; |
| } |
| |
| public boolean hasAnswer() { |
| return mAnswer != null; |
| } |
| |
| public String getFillIntoEdit() { |
| return mFillIntoEdit; |
| } |
| |
| public String getUrl() { |
| return mUrl; |
| } |
| |
| public String getFormattedUrl() { |
| return mFormattedUrl; |
| } |
| |
| public boolean isUrlSuggestion() { |
| return mType.isUrl(); |
| } |
| |
| /** |
| * @return Whether this suggestion represents a starred/bookmarked URL. |
| */ |
| public boolean isStarred() { |
| return mIsStarred; |
| } |
| |
| public boolean isDeletable() { |
| return mIsDeletable; |
| } |
| |
| /** |
| * @return The relevance score of this suggestion. |
| */ |
| public int getRelevance() { |
| return mRelevance; |
| } |
| |
| @Override |
| public String toString() { |
| return mType + " relevance=" + mRelevance + " \"" + mDisplayText + "\" -> " + mUrl; |
| } |
| |
| @Override |
| public int hashCode() { |
| int hash = 37 * mType.mNativeType + mDisplayText.hashCode() + mFillIntoEdit.hashCode() + |
| (mIsStarred ? 1 : 0) + (mIsDeletable ? 1 : 0); |
| if (mAnswerContents != null) { |
| hash = hash + mAnswerContents.hashCode(); |
| } |
| return hash; |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (!(obj instanceof OmniboxSuggestion)) { |
| return false; |
| } |
| |
| OmniboxSuggestion suggestion = (OmniboxSuggestion) obj; |
| |
| boolean answersAreEqual = |
| (mAnswerContents == null && suggestion.mAnswerContents == null) || |
| (mAnswerContents != null && |
| suggestion.mAnswerContents != null && |
| mAnswerContents.equals(suggestion.mAnswerContents)); |
| return mType == suggestion.mType |
| && mFillIntoEdit.equals(suggestion.mFillIntoEdit) |
| && mDisplayText.equals(suggestion.mDisplayText) |
| && answersAreEqual |
| && mIsStarred == suggestion.mIsStarred |
| && mIsDeletable == suggestion.mIsDeletable; |
| } |
| } |