import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URI;
-import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
public final class SearchBookContentsActivity extends Activity {
private static final String TAG = "SearchBookContents";
-
- // These return a JSON result which describes if and where the query was found. This API may
- // break or disappear at any time in the future. Since this is an API call rather than a website,
- // we don't use LocaleManager to change the TLD.
- private static final String BOOK_SEARCH_URL = "//www.google.com/books?vid=isbn";
- private static final String BOOK_SEARCH_COMMAND = "&jscmd=SearchWithinVolume2&q=";
+ private static final String USER_AGENT = "ZXing (Android)";
private NetworkThread mNetworkThread;
private String mISBN;
private Button mQueryButton;
private ListView mResultListView;
private TextView mHeaderView;
- private String mUserAgent;
@Override
public void onCreate(Bundle icicle) {
mHeaderView = (TextView) factory.inflate(R.layout.search_book_contents_header,
mResultListView, false);
mResultListView.addHeaderView(mHeaderView);
-
- mUserAgent = getString(R.string.zxing_user_agent);
}
@Override
}
public final Handler mHandler = new Handler() {
+ @Override
public void handleMessage(Message message) {
switch (message.what) {
case R.id.search_book_contents_succeeded:
if (mNetworkThread == null) {
String query = mQueryTextView.getText().toString();
if (query != null && query.length() > 0) {
- mNetworkThread = new NetworkThread(mISBN, query, mHandler, mUserAgent);
+ mNetworkThread = new NetworkThread(mISBN, query, mHandler);
mNetworkThread.start();
mHeaderView.setText(R.string.msg_sbc_searching_book);
mResultListView.setAdapter(null);
private void handleSearchResults(JSONObject json) {
try {
int count = json.getInt("number_of_results");
- mHeaderView.setText("Found " + ((count == 1) ? "1 result" : count + " results"));
+ mHeaderView.setText("Found " + (count == 1 ? "1 result" : count + " results"));
if (count > 0) {
JSONArray results = json.getJSONArray("search_results");
SearchBookContentsResult.setQuery(mQueryTextView.getText().toString());
}
mResultListView.setAdapter(new SearchBookContentsAdapter(this, items));
} else {
+ String searchable = json.optString("searchable");
+ if ("false".equals(searchable)) {
+ mHeaderView.setText(R.string.msg_sbc_book_not_searchable);
+ }
mResultListView.setAdapter(null);
}
} catch (JSONException e) {
try {
String pageNumber = json.getString("page_number");
if (pageNumber.length() > 0) {
- pageNumber = getString(R.string.msg_sbc_page) + " " + pageNumber;
+ pageNumber = getString(R.string.msg_sbc_page) + ' ' + pageNumber;
} else {
// This can happen for text on the jacket, and possibly other reasons.
pageNumber = getString(R.string.msg_sbc_unknown_page);
snippet = snippet.replaceAll("'", "'");
snippet = snippet.replaceAll(""", "\"");
} else {
- snippet = "(" + getString(R.string.msg_sbc_snippet_unavailable) + ")";
+ snippet = '(' + getString(R.string.msg_sbc_snippet_unavailable) + ')';
valid = false;
}
return new SearchBookContentsResult(pageNumber, snippet, valid);
private final String mISBN;
private final String mQuery;
private final Handler mHandler;
- private final String mUserAgent;
- public NetworkThread(String isbn, String query, Handler handler, String userAgent) {
+ NetworkThread(String isbn, String query, Handler handler) {
mISBN = isbn;
mQuery = query;
mHandler = handler;
- mUserAgent = userAgent;
}
- public final void run() {
+ @Override
+ public void run() {
AndroidHttpClient client = null;
try {
- String url = BOOK_SEARCH_URL + mISBN + BOOK_SEARCH_COMMAND + URLEncoder.encode(mQuery, "UTF8");
- URI uri = new URI("http", url, null);
+ // These return a JSON result which describes if and where the query was found. This API may
+ // break or disappear at any time in the future. Since this is an API call rather than a
+ // website, we don't use LocaleManager to change the TLD.
+ URI uri = new URI("http", null, "www.google.com", -1, "/books", "vid=isbn" + mISBN +
+ "&jscmd=SearchWithinVolume2&q=" + mQuery, null);
HttpUriRequest get = new HttpGet(uri);
- get.setHeader("cookie", getCookie("http:" + url));
- client = AndroidHttpClient.newInstance(mUserAgent);
+ get.setHeader("cookie", getCookie(uri.toString()));
+ client = AndroidHttpClient.newInstance(USER_AGENT);
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
message.obj = json;
message.sendToTarget();
} else {
- Log.e(TAG, "HTTP returned " + response.getStatusLine().getStatusCode() +
- " for http:" + url);
+ Log.e(TAG, "HTTP returned " + response.getStatusLine().getStatusCode() + " for " + uri);
Message message = Message.obtain(mHandler, R.id.search_book_contents_failed);
message.sendToTarget();
}
if (cookie == null || cookie.length() == 0) {
Log.v(TAG, "Book Search cookie was missing or expired");
HttpUriRequest head = new HttpHead(url);
- AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);
+ AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT);
try {
HttpResponse response = client.execute(head);
if (response.getStatusLine().getStatusCode() == 200) {
Header[] cookies = response.getHeaders("set-cookie");
- for (int x = 0; x < cookies.length; x++) {
- CookieManager.getInstance().setCookie(url, cookies[x].getValue());
+ for (Header theCookie : cookies) {
+ CookieManager.getInstance().setCookie(url, theCookie.getValue());
}
CookieSyncManager.getInstance().sync();
cookie = CookieManager.getInstance().getCookie(url);
return cookie;
}
- private String getEncoding(HttpEntity entity) {
+ private static String getEncoding(HttpEntity entity) {
// FIXME: The server is returning ISO-8859-1 but the content is actually windows-1252.
// Once Jeff fixes the HTTP response, remove this hardcoded value and go back to getting
// the encoding dynamically.