import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpHead;
+import org.apache.http.client.methods.HttpUriRequest;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
-public class SearchBookContentsActivity extends Activity {
+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.
- private static final String BOOK_SEARCH_URL = "//www.google.com/books?vid=isbn";
- private static final String BOOK_SEARCH_COMMAND = "&jscmd=SearchWithinVolume2&q=";
-
private NetworkThread mNetworkThread;
private String mISBN;
private EditText mQueryTextView;
super.onConfigurationChanged(config);
}
- public Handler mHandler = new Handler() {
+ public final Handler mHandler = new Handler() {
+ @Override
public void handleMessage(Message message) {
switch (message.what) {
case R.id.search_book_contents_succeeded:
mQueryButton.setEnabled(true);
}
- private Button.OnClickListener mButtonListener = new Button.OnClickListener() {
+ private final Button.OnClickListener mButtonListener = new Button.OnClickListener() {
public void onClick(View view) {
launchSearch();
}
};
- private View.OnKeyListener mKeyListener = new View.OnKeyListener() {
+ private final View.OnKeyListener mKeyListener = new View.OnKeyListener() {
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
launchSearch();
if (mNetworkThread == null) {
String query = mQueryTextView.getText().toString();
if (query != null && query.length() > 0) {
- mNetworkThread = new NetworkThread(mISBN, query, mHandler);
+ mNetworkThread = new NetworkThread(mISBN, query, mHandler, mUserAgent);
mNetworkThread.start();
- mHeaderView.setText(R.string.msg_searching_book);
+ mHeaderView.setText(R.string.msg_sbc_searching_book);
mResultListView.setAdapter(null);
mQueryTextView.setEnabled(false);
mQueryButton.setEnabled(false);
}
mResultListView.setAdapter(new SearchBookContentsAdapter(this, items));
} else {
+ String searchable = json.optString("searchable");
+ if (searchable != null && searchable.equals("false")) {
+ mHeaderView.setText(R.string.msg_sbc_book_not_searchable);
+ }
mResultListView.setAdapter(null);
}
} catch (JSONException e) {
}
}
- private class NetworkThread extends Thread {
+ private static final class NetworkThread extends Thread {
- private String mISBN;
- private String mQuery;
- private Handler mHandler;
+ private final String mISBN;
+ private final String mQuery;
+ private final Handler mHandler;
+ private final String mUserAgent;
- public NetworkThread(String isbn, String query, Handler handler) {
+ public NetworkThread(String isbn, String query, Handler handler, String userAgent) {
mISBN = isbn;
mQuery = query;
mHandler = handler;
+ mUserAgent = userAgent;
}
+ @Override
public void run() {
- String url = BOOK_SEARCH_URL + mISBN + BOOK_SEARCH_COMMAND + mQuery;
AndroidHttpClient client = null;
try {
- URI uri = new URI("http", url, null);
- HttpGet get = new HttpGet(uri);
- get.setHeader("cookie", getCookie("http:" + url));
+ // 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(uri.toString()));
client = AndroidHttpClient.newInstance(mUserAgent);
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
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();
}
String cookie = CookieManager.getInstance().getCookie(url);
if (cookie == null || cookie.length() == 0) {
Log.v(TAG, "Book Search cookie was missing or expired");
- HttpHead head = new HttpHead(url);
+ HttpUriRequest head = new HttpHead(url);
AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);
try {
HttpResponse response = client.execute(head);
} catch (IOException e) {
Log.e(TAG, e.toString());
}
+ client.close();
}
return cookie;
}