Revert to pre-Cupcake preview callback system since seems to be some collision betwee...
[zxing.git] / android / src / com / google / zxing / client / android / SearchBookContentsActivity.java
index 8616767..9ebe61e 100644 (file)
@@ -45,19 +45,13 @@ import org.json.JSONObject;
 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;
@@ -65,7 +59,6 @@ public final class SearchBookContentsActivity extends Activity {
   private Button mQueryButton;
   private ListView mResultListView;
   private TextView mHeaderView;
-  private String mUserAgent;
 
   @Override
   public void onCreate(Bundle icicle) {
@@ -103,8 +96,6 @@ public final class SearchBookContentsActivity extends Activity {
     mHeaderView = (TextView) factory.inflate(R.layout.search_book_contents_header,
         mResultListView, false);
     mResultListView.addHeaderView(mHeaderView);
-
-    mUserAgent = getString(R.string.zxing_user_agent);
   }
 
   @Override
@@ -120,6 +111,7 @@ public final class SearchBookContentsActivity extends Activity {
   }
 
   public final Handler mHandler = new Handler() {
+    @Override
     public void handleMessage(Message message) {
       switch (message.what) {
         case R.id.search_book_contents_succeeded:
@@ -161,7 +153,7 @@ public final class SearchBookContentsActivity extends Activity {
     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);
@@ -176,7 +168,7 @@ public final class SearchBookContentsActivity extends Activity {
   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());
@@ -186,6 +178,10 @@ public final class SearchBookContentsActivity extends Activity {
         }
         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) {
@@ -200,7 +196,7 @@ public final class SearchBookContentsActivity extends Activity {
     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);
@@ -216,7 +212,7 @@ public final class SearchBookContentsActivity extends Activity {
         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);
@@ -231,23 +227,25 @@ public final class SearchBookContentsActivity extends Activity {
     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();
@@ -261,8 +259,7 @@ public final class SearchBookContentsActivity extends Activity {
           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();
         }
@@ -285,13 +282,13 @@ public final class SearchBookContentsActivity extends Activity {
       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);
@@ -304,7 +301,7 @@ public final class SearchBookContentsActivity extends Activity {
       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.