mirror of
https://github.com/zxing/zxing.git
synced 2024-11-09 20:44:03 -08:00
Issue 155: allow custom product search, and, other small tweaks I think nobody will yell at me for
git-svn-id: https://zxing.googlecode.com/svn/trunk@967 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
5edd5dab77
commit
eed790a0bf
|
@ -18,12 +18,13 @@
|
|||
<string name="app_name">Barcode Scanner</string>
|
||||
<string name="bookmark_picker_name">Bookmarks</string>
|
||||
|
||||
<string name="button_add_calendar">Add event to calendar</string>
|
||||
<string name="button_add_calendar">Add to calendar</string>
|
||||
<string name="button_add_contact">Add contact</string>
|
||||
<string name="button_back">Back</string>
|
||||
<string name="button_book_search">Open Book Search</string>
|
||||
<string name="button_book_search">Book Search</string>
|
||||
<string name="button_cancel">Cancel</string>
|
||||
<string name="button_clipboard_empty">Clipboard empty</string>
|
||||
<string name="button_custom_product_search">Custom search</string>
|
||||
<string name="button_dial">Dial number</string>
|
||||
<string name="button_done">Done</string>
|
||||
<string name="button_email">Send email</string>
|
||||
|
@ -31,8 +32,8 @@
|
|||
<string name="button_mms">Send MMS</string>
|
||||
<string name="button_ok">OK</string>
|
||||
<string name="button_open_browser">Open browser</string>
|
||||
<string name="button_product_search">Open Product Search</string>
|
||||
<string name="button_search_book_contents">Search book contents</string>
|
||||
<string name="button_product_search">Product Search</string>
|
||||
<string name="button_search_book_contents">Search book</string>
|
||||
<string name="button_share_bookmark">Share bookmark</string>
|
||||
<string name="button_share_by_email">Share via email</string>
|
||||
<string name="button_share_by_sms">Share via SMS</string>
|
||||
|
@ -86,6 +87,9 @@
|
|||
<string name="preferences_name">Settings</string>
|
||||
<string name="preferences_play_beep_title">Beep</string>
|
||||
<string name="preferences_vibrate_title">Vibrate</string>
|
||||
<string name="preferences_result_title">Result Settings</string>
|
||||
<string name="preferences_custom_product_search_title">Custom product search URL</string>
|
||||
<string name="preferences_custom_product_search_summary">Use %s as placeholder for product ID</string>
|
||||
|
||||
<string name="result_address_book">Found contact info</string>
|
||||
<string name="result_calendar">Found calendar event</string>
|
||||
|
|
|
@ -39,4 +39,10 @@
|
|||
android:defaultValue="true"
|
||||
android:title="@string/preferences_copy_to_clipboard_title"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/preferences_result_title">
|
||||
<EditTextPreference
|
||||
android:key="preferences_custom_product_search"
|
||||
android:title="@string/preferences_custom_product_search_title"
|
||||
android:summary="@string/preferences_custom_product_search_summary"/>
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
|
|
@ -16,10 +16,7 @@
|
|||
|
||||
package com.google.zxing.client.android;
|
||||
|
||||
import org.apache.http.Header;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.http.HttpMessage;
|
||||
import org.apache.http.HttpRequest;
|
||||
import org.apache.http.HttpRequestInterceptor;
|
||||
import org.apache.http.HttpResponse;
|
||||
|
@ -33,8 +30,6 @@ import org.apache.http.conn.scheme.PlainSocketFactory;
|
|||
import org.apache.http.conn.scheme.Scheme;
|
||||
import org.apache.http.conn.scheme.SchemeRegistry;
|
||||
import org.apache.http.conn.ssl.SSLSocketFactory;
|
||||
import org.apache.http.entity.AbstractHttpEntity;
|
||||
import org.apache.http.entity.ByteArrayEntity;
|
||||
import org.apache.http.impl.client.DefaultHttpClient;
|
||||
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
|
||||
import org.apache.http.params.BasicHttpParams;
|
||||
|
@ -45,12 +40,7 @@ import org.apache.http.protocol.BasicHttpContext;
|
|||
import org.apache.http.protocol.BasicHttpProcessor;
|
||||
import org.apache.http.protocol.HttpContext;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
/**
|
||||
* <p>Subclass of the Apache {@link DefaultHttpClient} that is configured with
|
||||
|
@ -65,9 +55,6 @@ import java.util.zip.GZIPOutputStream;
|
|||
*/
|
||||
public final class AndroidHttpClient implements HttpClient {
|
||||
|
||||
// Gzip of data shorter than this probably won't be worthwhile
|
||||
private static final long DEFAULT_SYNC_MIN_GZIP_BYTES = 256;
|
||||
|
||||
/**
|
||||
* Set if HTTP requests are blocked from being executed on this thread
|
||||
*/
|
||||
|
@ -80,7 +67,7 @@ public final class AndroidHttpClient implements HttpClient {
|
|||
private static final HttpRequestInterceptor sThreadCheckInterceptor =
|
||||
new HttpRequestInterceptor() {
|
||||
public void process(HttpRequest request, HttpContext context) {
|
||||
if (sThreadBlocked.get() != null && sThreadBlocked.get()) {
|
||||
if (Boolean.TRUE.equals(sThreadBlocked.get())) {
|
||||
throw new RuntimeException("This thread forbids HTTP requests");
|
||||
}
|
||||
}
|
||||
|
@ -149,54 +136,6 @@ public final class AndroidHttpClient implements HttpClient {
|
|||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Block this thread from executing HTTP requests.
|
||||
* Used to guard against HTTP requests blocking the main application thread.
|
||||
*
|
||||
* @param blocked if HTTP requests run on this thread should be denied
|
||||
*/
|
||||
public static void setThreadBlocked(boolean blocked) {
|
||||
sThreadBlocked.set(blocked);
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifies a request to indicate to the server that we would like a
|
||||
* gzipped response. (Uses the "Accept-Encoding" HTTP header.)
|
||||
*
|
||||
* @param request the request to modify
|
||||
* @see #getUngzippedContent
|
||||
*/
|
||||
public static void modifyRequestToAcceptGzipResponse(HttpMessage request) {
|
||||
request.addHeader("Accept-Encoding", "gzip");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the input stream from a response entity. If the entity is gzipped
|
||||
* then this will get a stream over the uncompressed data.
|
||||
*
|
||||
* @param entity the entity whose content should be read
|
||||
* @return the input stream to read from
|
||||
* @throws IOException
|
||||
*/
|
||||
public static InputStream getUngzippedContent(HttpEntity entity) throws IOException {
|
||||
InputStream responseStream = entity.getContent();
|
||||
if (responseStream == null) {
|
||||
return responseStream;
|
||||
}
|
||||
Header header = entity.getContentEncoding();
|
||||
if (header == null) {
|
||||
return responseStream;
|
||||
}
|
||||
String contentEncoding = header.getValue();
|
||||
if (contentEncoding == null) {
|
||||
return responseStream;
|
||||
}
|
||||
if (contentEncoding.contains("gzip")) {
|
||||
responseStream = new GZIPInputStream(responseStream);
|
||||
}
|
||||
return responseStream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Release resources associated with this client. You must call this,
|
||||
* or significant resources (sockets and memory) may be leaked.
|
||||
|
@ -251,30 +190,4 @@ public final class AndroidHttpClient implements HttpClient {
|
|||
return delegate.execute(target, request, responseHandler, context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compress data to send to server.
|
||||
* Creates a Http Entity holding the gzipped data.
|
||||
* The data will not be compressed if it is too short.
|
||||
*
|
||||
* @param data The bytes to compress
|
||||
* @return Entity holding the data
|
||||
*/
|
||||
public static AbstractHttpEntity getCompressedEntity(byte[] data) throws IOException {
|
||||
AbstractHttpEntity entity;
|
||||
if (data.length < DEFAULT_SYNC_MIN_GZIP_BYTES) {
|
||||
entity = new ByteArrayEntity(data);
|
||||
} else {
|
||||
ByteArrayOutputStream arr = new ByteArrayOutputStream();
|
||||
OutputStream zipper = new GZIPOutputStream(arr);
|
||||
try {
|
||||
zipper.write(data);
|
||||
} finally {
|
||||
zipper.close();
|
||||
}
|
||||
entity = new ByteArrayEntity(arr.toByteArray());
|
||||
entity.setContentEncoding("gzip");
|
||||
}
|
||||
return entity;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -94,7 +94,7 @@ final class DecodeThread extends Thread {
|
|||
|
||||
private void setDecodeProductMode() {
|
||||
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(3);
|
||||
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>();
|
||||
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>(4);
|
||||
vector.addElement(BarcodeFormat.UPC_A);
|
||||
vector.addElement(BarcodeFormat.UPC_E);
|
||||
vector.addElement(BarcodeFormat.EAN_13);
|
||||
|
@ -108,7 +108,7 @@ final class DecodeThread extends Thread {
|
|||
*/
|
||||
private void setDecode1DMode() {
|
||||
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(3);
|
||||
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>();
|
||||
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>(7);
|
||||
vector.addElement(BarcodeFormat.UPC_A);
|
||||
vector.addElement(BarcodeFormat.UPC_E);
|
||||
vector.addElement(BarcodeFormat.EAN_13);
|
||||
|
@ -122,7 +122,7 @@ final class DecodeThread extends Thread {
|
|||
|
||||
private void setDecodeQRMode() {
|
||||
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(3);
|
||||
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>();
|
||||
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>(1);
|
||||
vector.addElement(BarcodeFormat.QR_CODE);
|
||||
hints.put(DecodeHintType.POSSIBLE_FORMATS, vector);
|
||||
mMultiFormatReader.setHints(hints);
|
||||
|
@ -134,7 +134,7 @@ final class DecodeThread extends Thread {
|
|||
*/
|
||||
private void setDecodeAllMode() {
|
||||
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(3);
|
||||
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>();
|
||||
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>(8);
|
||||
vector.addElement(BarcodeFormat.UPC_A);
|
||||
vector.addElement(BarcodeFormat.UPC_E);
|
||||
vector.addElement(BarcodeFormat.EAN_13);
|
||||
|
|
|
@ -74,7 +74,7 @@ public final class EncodeActivity extends Activity {
|
|||
View layout = findViewById(R.id.encode_view);
|
||||
int width = layout.getWidth();
|
||||
int height = layout.getHeight();
|
||||
int smallerDimension = (width < height) ? width : height;
|
||||
int smallerDimension = width < height ? width : height;
|
||||
smallerDimension = smallerDimension * 7 / 8;
|
||||
|
||||
Intent intent = getIntent();
|
||||
|
|
|
@ -20,13 +20,15 @@ import android.content.SharedPreferences;
|
|||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||
import android.os.Bundle;
|
||||
import android.preference.CheckBoxPreference;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.PreferenceScreen;
|
||||
|
||||
public final class PreferencesActivity extends android.preference.PreferenceActivity
|
||||
public final class PreferencesActivity extends PreferenceActivity
|
||||
implements OnSharedPreferenceChangeListener {
|
||||
|
||||
static final String KEY_DECODE_1D = "preferences_decode_1D";
|
||||
static final String KEY_DECODE_QR = "preferences_decode_QR";
|
||||
public static final String KEY_CUSTOM_PRODUCT_SEARCH = "preferences_custom_product_search";
|
||||
|
||||
static final String KEY_PLAY_BEEP = "preferences_play_beep";
|
||||
static final String KEY_VIBRATE = "preferences_vibrate";
|
||||
|
|
|
@ -51,7 +51,7 @@ import java.util.List;
|
|||
public final class SearchBookContentsActivity extends Activity {
|
||||
|
||||
private static final String TAG = "SearchBookContents";
|
||||
private static final String USER_AGENT = "ZXing/1.3 (Android)";
|
||||
private static final String USER_AGENT = "ZXing/1.5 (Android)";
|
||||
|
||||
private NetworkThread mNetworkThread;
|
||||
private String mISBN;
|
||||
|
@ -168,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());
|
||||
|
@ -179,7 +179,7 @@ public final class SearchBookContentsActivity extends Activity {
|
|||
mResultListView.setAdapter(new SearchBookContentsAdapter(this, items));
|
||||
} else {
|
||||
String searchable = json.optString("searchable");
|
||||
if (searchable != null && searchable.equals("false")) {
|
||||
if ("false".equals(searchable)) {
|
||||
mHeaderView.setText(R.string.msg_sbc_book_not_searchable);
|
||||
}
|
||||
mResultListView.setAdapter(null);
|
||||
|
@ -287,8 +287,8 @@ public final class SearchBookContentsActivity extends Activity {
|
|||
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);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
package com.google.zxing.client.android;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Typeface;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Spannable;
|
||||
import android.text.style.StyleSpan;
|
||||
|
@ -52,7 +53,7 @@ public final class SearchBookContentsListItem extends LinearLayout {
|
|||
String lowerQuery = SearchBookContentsResult.getQuery().toLowerCase();
|
||||
String lowerSnippet = snippet.toLowerCase();
|
||||
Spannable styledSnippet = new SpannableString(snippet);
|
||||
StyleSpan boldSpan = new StyleSpan(android.graphics.Typeface.BOLD);
|
||||
StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
|
||||
int queryLength = lowerQuery.length();
|
||||
int offset = 0;
|
||||
while (true) {
|
||||
|
|
|
@ -32,7 +32,7 @@ import android.view.View;
|
|||
public final class ViewfinderView extends View {
|
||||
|
||||
private static final int[] SCANNER_ALPHA = {0, 64, 128, 192, 255, 192, 128, 64};
|
||||
private static final int ANIMATION_DELAY = 100;
|
||||
private static final long ANIMATION_DELAY = 100L;
|
||||
|
||||
private final Paint mPaint;
|
||||
private final Rect mBox;
|
||||
|
|
|
@ -17,7 +17,10 @@
|
|||
package com.google.zxing.client.android.result;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
import com.google.zxing.client.android.R;
|
||||
import com.google.zxing.client.android.PreferencesActivity;
|
||||
import com.google.zxing.client.result.ISBNParsedResult;
|
||||
import com.google.zxing.client.result.ParsedResult;
|
||||
|
||||
|
@ -26,16 +29,21 @@ public final class ISBNResultHandler extends ResultHandler {
|
|||
private static final int[] mButtons = {
|
||||
R.string.button_product_search,
|
||||
R.string.button_book_search,
|
||||
R.string.button_search_book_contents
|
||||
R.string.button_search_book_contents,
|
||||
R.string.button_custom_product_search,
|
||||
};
|
||||
|
||||
private final String mCustomProductSearch;
|
||||
|
||||
public ISBNResultHandler(Activity activity, ParsedResult result) {
|
||||
super(activity, result);
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||
mCustomProductSearch = prefs.getString(PreferencesActivity.KEY_CUSTOM_PRODUCT_SEARCH, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getButtonCount() {
|
||||
return mButtons.length;
|
||||
return mCustomProductSearch != null && mCustomProductSearch.length() > 0 ? mButtons.length : mButtons.length - 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -56,6 +64,10 @@ public final class ISBNResultHandler extends ResultHandler {
|
|||
case 2:
|
||||
searchBookContents(isbnResult.getISBN());
|
||||
break;
|
||||
case 3:
|
||||
String url = mCustomProductSearch.replace("%s", isbnResult.getISBN());
|
||||
openURL(url);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,10 @@
|
|||
package com.google.zxing.client.android.result;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
import com.google.zxing.client.android.R;
|
||||
import com.google.zxing.client.android.PreferencesActivity;
|
||||
import com.google.zxing.client.result.ParsedResult;
|
||||
import com.google.zxing.client.result.ProductParsedResult;
|
||||
|
||||
|
@ -25,16 +28,21 @@ public final class ProductResultHandler extends ResultHandler {
|
|||
|
||||
private static final int[] mButtons = {
|
||||
R.string.button_product_search,
|
||||
R.string.button_web_search
|
||||
R.string.button_web_search,
|
||||
R.string.button_custom_product_search,
|
||||
};
|
||||
|
||||
private final String mCustomProductSearch;
|
||||
|
||||
public ProductResultHandler(Activity activity, ParsedResult result) {
|
||||
super(activity, result);
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||
mCustomProductSearch = prefs.getString(PreferencesActivity.KEY_CUSTOM_PRODUCT_SEARCH, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getButtonCount() {
|
||||
return mButtons.length;
|
||||
return mCustomProductSearch != null ? mButtons.length : mButtons.length - 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -52,6 +60,10 @@ public final class ProductResultHandler extends ResultHandler {
|
|||
case 1:
|
||||
webSearch(productResult.getNormalizedProductID());
|
||||
break;
|
||||
case 2:
|
||||
String url = mCustomProductSearch.replace("%s", productResult.getNormalizedProductID());
|
||||
openURL(url);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue