blob: dfd6fb05807d597b8924b485783663aae92a852a [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quicksearchbox;
import com.android.quicksearchbox.util.Util;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.util.Patterns;
import android.webkit.URLUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
/**
* The web search source.
*/
public class WebCorpus extends MultiSourceCorpus {
private static final String TAG = "QSB.WebCorpus";
private static final boolean DBG = false;
private static final String WEB_CORPUS_NAME = "web";
private final SearchSettings mSettings;
private Source mWebSearchSource;
private final Source mBrowserSource;
public WebCorpus(Context context, Config config, SearchSettings settings, Executor executor,
Source webSearchSource, Source browserSource) {
super(context, config, executor, webSearchSource, browserSource);
if (DBG) {
Log.d(TAG, "init webSource=" + webSearchSource + "; browser source = " + browserSource);
}
mSettings = settings;
mWebSearchSource = webSearchSource;
mBrowserSource = browserSource;
}
protected SearchSettings getSettings() {
return mSettings;
}
public void setWebSource(Source web) {
if (DBG) Log.d(TAG, "setWebSource(" + web + ")");
mWebSearchSource = web;
}
public CharSequence getLabel() {
return getContext().getText(R.string.corpus_label_web);
}
public CharSequence getHint() {
// The web corpus uses a drawable hint instead
return null;
}
private boolean isUrl(String query) {
return Patterns.WEB_URL.matcher(query).matches();
}
public Intent createSearchIntent(String query, Bundle appData) {
if (isUrl(query)) {
return createBrowseIntent(query);
} else if (mWebSearchSource != null){
return mWebSearchSource.createSearchIntent(query, appData);
} else {
return null;
}
}
private Intent createBrowseIntent(String query) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
String url = URLUtil.guessUrl(query);
intent.setData(Uri.parse(url));
return intent;
}
public Intent createVoiceSearchIntent(Bundle appData) {
// TODO in 2-pane mode, mWebSearchSource may be NULL
// this functionality should be moved elsewhere.
if (mWebSearchSource != null){
return mWebSearchSource.createVoiceSearchIntent(appData);
} else {
return null;
}
}
private int getCorpusIconResource() {
return R.drawable.corpus_icon_web;
}
public Drawable getCorpusIcon() {
return getContext().getResources().getDrawable(getCorpusIconResource());
}
public Uri getCorpusIconUri() {
return Util.getResourceUri(getContext(), getCorpusIconResource());
}
public String getName() {
return WEB_CORPUS_NAME;
}
@Override
public int getQueryThreshold() {
return 0;
}
@Override
public boolean queryAfterZeroResults() {
return true;
}
@Override
public boolean voiceSearchEnabled() {
return true;
}
public boolean isWebCorpus() {
return true;
}
public CharSequence getSettingsDescription() {
return getContext().getText(R.string.corpus_description_web);
}
@Override
protected List<Source> getSourcesToQuery(String query, boolean onlyCorpus) {
ArrayList<Source> sourcesToQuery = new ArrayList<Source>(2);
if (mWebSearchSource != null) sourcesToQuery.add(mWebSearchSource);
if (mBrowserSource != null && query.length() > 0) {
sourcesToQuery.add(mBrowserSource);
}
if (DBG) Log.d(TAG, "getSourcesToQuery sourcesToQuery=" + sourcesToQuery);
return sourcesToQuery;
}
@Override
protected Result createResult(String query, ArrayList<SourceResult> results, int latency) {
return new WebResult(query, results, latency);
}
protected class WebResult extends Result {
public WebResult(String query, ArrayList<SourceResult> results, int latency) {
super(query, results, latency);
}
@Override
public void fill() {
SourceResult webSearchResult = null;
SourceResult browserResult = null;
for (SourceResult result : getResults()) {
if (result.getSource().equals(mWebSearchSource)) {
webSearchResult = result;
} else {
browserResult = result;
}
}
if (browserResult != null && browserResult.getCount() > 0) {
add(new SuggestionPosition(browserResult, 0));
}
if (webSearchResult != null) {
int count = webSearchResult.getCount();
for (int i = 0; i < count; i++) {
add(new SuggestionPosition(webSearchResult, i));
}
}
}
}
}