summaryrefslogtreecommitdiffstats
path: root/src/com/android/browser/SuggestionsAdapter.java
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2011-02-23 15:49:17 +0000
committerNarayan Kamath <narayan@google.com>2011-03-02 22:45:45 +0000
commit5119edd5744cfc6d3a8ed480a8853586c737bed4 (patch)
treeaa9f3f6382c047a010742324aa307b20b4f7270e /src/com/android/browser/SuggestionsAdapter.java
parent80aad8d851601d39f73214c198111ca49e25f654 (diff)
downloadpackages_apps_browser-5119edd5744cfc6d3a8ed480a8853586c737bed4.zip
packages_apps_browser-5119edd5744cfc6d3a8ed480a8853586c737bed4.tar.gz
packages_apps_browser-5119edd5744cfc6d3a8ed480a8853586c737bed4.tar.bz2
Implement the psychic search engine.
(a) Add a new subclass of SearchEngine that receives suggestions provided by psychic and displays them in the suggestions dropdown. (b) Add a Labs setting that can turn this feature on or off. Change-Id: Icae05b6b55f489278028e5af560d9b36014a0f59
Diffstat (limited to 'src/com/android/browser/SuggestionsAdapter.java')
-rw-r--r--src/com/android/browser/SuggestionsAdapter.java83
1 files changed, 57 insertions, 26 deletions
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index 3636bbf..6a9111f 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -24,6 +24,7 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.BrowserContract;
+import android.text.Html;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -44,12 +45,12 @@ import java.util.List;
public class SuggestionsAdapter extends BaseAdapter implements Filterable,
OnClickListener {
- static final int TYPE_BOOKMARK = 0;
- static final int TYPE_HISTORY = 1;
- static final int TYPE_SUGGEST_URL = 2;
- static final int TYPE_SEARCH = 3;
- static final int TYPE_SUGGEST = 4;
- static final int TYPE_VOICE_SEARCH = 5;
+ public static final int TYPE_BOOKMARK = 0;
+ public static final int TYPE_HISTORY = 1;
+ public static final int TYPE_SUGGEST_URL = 2;
+ public static final int TYPE_SEARCH = 3;
+ public static final int TYPE_SUGGEST = 4;
+ public static final int TYPE_VOICE_SEARCH = 5;
private static final String[] COMBINED_PROJECTION =
{BrowserContract.Combined._ID, BrowserContract.Combined.TITLE,
@@ -58,16 +59,16 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
private static final String COMBINED_SELECTION =
"(url LIKE ? OR url LIKE ? OR url LIKE ? OR url LIKE ? OR title LIKE ?)";
- Context mContext;
- Filter mFilter;
+ final Context mContext;
+ final Filter mFilter;
SuggestionResults mMixedResults;
List<SuggestItem> mSuggestResults, mFilterResults;
List<CursorSource> mSources;
boolean mLandscapeMode;
- CompletionListener mListener;
- int mLinesPortrait;
- int mLinesLandscape;
- Object mResultsLock = new Object();
+ final CompletionListener mListener;
+ final int mLinesPortrait;
+ final int mLinesLandscape;
+ final Object mResultsLock = new Object();
List<String> mVoiceResults;
boolean mReverseResults;
boolean mIncognitoMode;
@@ -87,6 +88,7 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
getInteger(R.integer.max_suggest_lines_portrait);
mLinesLandscape = mContext.getResources().
getInteger(R.integer.max_suggest_lines_landscape);
+
mFilter = new SuggestFilter();
addSource(new CombinedCursor());
}
@@ -111,13 +113,12 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
@Override
public void onClick(View v) {
SuggestItem item = (SuggestItem) ((View) v.getParent()).getTag();
+
if (R.id.icon2 == v.getId()) {
// replace input field text with suggestion text
- mListener.onSearch(item.title);
+ mListener.onSearch(getSuggestionUrl(item));
} else {
- mListener.onSelect(
- (TextUtils.isEmpty(item.url)? item.title : item.url),
- item.type, item.extra);
+ mListener.onSelect(getSuggestionUrl(item), item.type, item.extra);
}
}
@@ -179,7 +180,7 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
ImageView ic1 = (ImageView) view.findViewById(R.id.icon1);
View ic2 = view.findViewById(R.id.icon2);
View div = view.findViewById(R.id.divider);
- tv1.setText(item.title);
+ tv1.setText(Html.fromHtml(item.title));
if (TextUtils.isEmpty(item.url)) {
tv2.setVisibility(View.GONE);
} else {
@@ -282,11 +283,16 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
}
}
+ private boolean shouldProcessEmptyQuery() {
+ final SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine();
+ return searchEngine.wantsEmptyQuery();
+ }
+
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults res = new FilterResults();
if (mVoiceResults == null) {
- if (TextUtils.isEmpty(constraint)) {
+ if (TextUtils.isEmpty(constraint) && !shouldProcessEmptyQuery()) {
res.count = 0;
res.values = null;
return res;
@@ -313,8 +319,7 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
}
void mixResults(List<SuggestItem> results) {
- int maxLines = mLandscapeMode ? mLinesLandscape : mLinesPortrait;
- maxLines = (int) Math.ceil(maxLines / 2.0);
+ int maxLines = getMaxLines();
for (int i = 0; i < mSources.size(); i++) {
CursorSource s = mSources.get(i);
int n = Math.min(s.getCount(), maxLines);
@@ -334,7 +339,12 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
notifyDataSetChanged();
}
}
+ }
+ private int getMaxLines() {
+ int maxLines = mLandscapeMode ? mLinesLandscape : mLinesPortrait;
+ maxLines = (int) Math.ceil(maxLines / 2.0);
+ return maxLines;
}
/**
@@ -366,11 +376,7 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
}
int getLineCount() {
- if (mLandscapeMode) {
- return Math.min(mLinesLandscape, items.size());
- } else {
- return Math.min(mLinesPortrait, items.size());
- }
+ return Math.min((mLandscapeMode ? mLinesLandscape : mLinesPortrait), items.size());
}
@Override
@@ -543,8 +549,8 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
if (mCursor != null) {
mCursor.close();
}
+ SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine();
if (!TextUtils.isEmpty(constraint)) {
- SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine();
if (searchEngine != null && searchEngine.supportsSuggestions()) {
mCursor = searchEngine.getSuggestions(mContext, constraint.toString());
if (mCursor != null) {
@@ -552,19 +558,44 @@ public class SuggestionsAdapter extends BaseAdapter implements Filterable,
}
}
} else {
+ if (searchEngine.wantsEmptyQuery()) {
+ mCursor = searchEngine.getSuggestions(mContext, "");
+ }
mCursor = null;
}
}
}
+ private boolean useInstant() {
+ return BrowserSettings.getInstance().useInstant();
+ }
+
public void clearCache() {
mFilterResults = null;
mSuggestResults = null;
+ notifyDataSetInvalidated();
}
public void setIncognitoMode(boolean incognito) {
mIncognitoMode = incognito;
clearCache();
}
+
+ static String getSuggestionTitle(SuggestItem item) {
+ // There must be a better way to strip HTML from things.
+ // This method is used in multiple places. It is also more
+ // expensive than a standard html escaper.
+ return (item.title != null) ? Html.fromHtml(item.title).toString() : null;
+ }
+
+ static String getSuggestionUrl(SuggestItem item) {
+ final String title = SuggestionsAdapter.getSuggestionTitle(item);
+
+ if (TextUtils.isEmpty(item.url)) {
+ return title;
+ }
+
+ return item.url;
+ }
}