mirror of
https://github.com/zxing/zxing.git
synced 2024-11-10 04:54:04 -08:00
Issue 923 user supplied patch to remember supplemental info in history
git-svn-id: https://zxing.googlecode.com/svn/trunk@1873 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
c9d8400936
commit
3f26da0f80
|
@ -501,8 +501,11 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
|
|||
supplementTextView.setOnClickListener(null);
|
||||
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(
|
||||
PreferencesActivity.KEY_SUPPLEMENTAL, true)) {
|
||||
SupplementalInfoRetriever.maybeInvokeRetrieval(supplementTextView, resultHandler.getResult(),
|
||||
handler, this);
|
||||
SupplementalInfoRetriever.maybeInvokeRetrieval(supplementTextView,
|
||||
resultHandler.getResult(),
|
||||
handler,
|
||||
historyManager,
|
||||
this);
|
||||
}
|
||||
|
||||
int buttonCount = resultHandler.getButtonCount();
|
||||
|
|
|
@ -25,7 +25,7 @@ import android.content.Context;
|
|||
*/
|
||||
final class DBHelper extends SQLiteOpenHelper {
|
||||
|
||||
private static final int DB_VERSION = 4;
|
||||
private static final int DB_VERSION = 5;
|
||||
private static final String DB_NAME = "barcode_scanner_history.db";
|
||||
static final String TABLE_NAME = "history";
|
||||
static final String ID_COL = "id";
|
||||
|
@ -33,6 +33,7 @@ final class DBHelper extends SQLiteOpenHelper {
|
|||
static final String FORMAT_COL = "format";
|
||||
static final String DISPLAY_COL = "display";
|
||||
static final String TIMESTAMP_COL = "timestamp";
|
||||
static final String DETAILS_COL = "details";
|
||||
|
||||
DBHelper(Context context) {
|
||||
super(context, DB_NAME, null, DB_VERSION);
|
||||
|
@ -46,8 +47,8 @@ final class DBHelper extends SQLiteOpenHelper {
|
|||
TEXT_COL + " TEXT, " +
|
||||
FORMAT_COL + " TEXT, " +
|
||||
DISPLAY_COL + " TEXT, " +
|
||||
TIMESTAMP_COL + " INTEGER" +
|
||||
");");
|
||||
TIMESTAMP_COL + " INTEGER, " +
|
||||
DETAILS_COL + " TEXT);");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -54,22 +54,19 @@ import java.util.List;
|
|||
* @author Sean Owen
|
||||
*/
|
||||
public final class HistoryManager {
|
||||
|
||||
private static final String TAG = HistoryManager.class.getSimpleName();
|
||||
|
||||
private static final int MAX_ITEMS = 500;
|
||||
|
||||
private static final String[] GET_ITEM_COL_PROJECTION = {
|
||||
DBHelper.TEXT_COL,
|
||||
DBHelper.DISPLAY_COL,
|
||||
DBHelper.FORMAT_COL,
|
||||
DBHelper.TIMESTAMP_COL,
|
||||
};
|
||||
private static final String[] EXPORT_COL_PROJECTION = {
|
||||
private static final String[] COLUMNS = {
|
||||
DBHelper.TEXT_COL,
|
||||
DBHelper.DISPLAY_COL,
|
||||
DBHelper.FORMAT_COL,
|
||||
DBHelper.TIMESTAMP_COL,
|
||||
DBHelper.DETAILS_COL,
|
||||
};
|
||||
|
||||
private static final String[] ID_COL_PROJECTION = { DBHelper.ID_COL };
|
||||
private static final DateFormat EXPORT_DATE_TIME_FORMAT = DateFormat.getDateTimeInstance();
|
||||
|
||||
|
@ -80,25 +77,42 @@ public final class HistoryManager {
|
|||
}
|
||||
|
||||
public AlertDialog buildAlert() {
|
||||
|
||||
SQLiteOpenHelper helper = new DBHelper(activity);
|
||||
|
||||
List<Result> items = new ArrayList<Result>();
|
||||
List<String> dialogItems = new ArrayList<String>();
|
||||
|
||||
SQLiteDatabase db = null;
|
||||
Cursor cursor = null;
|
||||
|
||||
try {
|
||||
db = helper.getWritableDatabase();
|
||||
cursor = db.query(DBHelper.TABLE_NAME, GET_ITEM_COL_PROJECTION, null, null, null, null,
|
||||
DBHelper.TIMESTAMP_COL + " DESC");
|
||||
|
||||
db = helper.getReadableDatabase();
|
||||
cursor = db.query(DBHelper.TABLE_NAME, COLUMNS, null, null, null, null, DBHelper.TIMESTAMP_COL + " DESC");
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
Result result = new Result(cursor.getString(0), null, null,
|
||||
BarcodeFormat.valueOf(cursor.getString(2)), cursor.getLong(3));
|
||||
|
||||
String text = cursor.getString(0);
|
||||
String format = cursor.getString(2);
|
||||
long timestamp = cursor.getLong(3);
|
||||
Result result = new Result(text, null, null, BarcodeFormat.valueOf(format), timestamp);
|
||||
items.add(result);
|
||||
|
||||
StringBuilder displayResult = new StringBuilder();
|
||||
String display = cursor.getString(1);
|
||||
if (display == null || display.length() == 0) {
|
||||
display = result.getText();
|
||||
}
|
||||
dialogItems.add(display);
|
||||
displayResult.append(display);
|
||||
|
||||
String details = cursor.getString(4);
|
||||
if (details != null && details.length() > 0) {
|
||||
displayResult.append(" : ").append(details);
|
||||
}
|
||||
dialogItems.add(displayResult.toString());
|
||||
}
|
||||
|
||||
} catch (SQLiteException sqle) {
|
||||
Log.w(TAG, "Error while opening database", sqle);
|
||||
} finally {
|
||||
|
@ -133,6 +147,12 @@ public final class HistoryManager {
|
|||
deletePrevious(result.getText());
|
||||
}
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(DBHelper.TEXT_COL, result.getText());
|
||||
values.put(DBHelper.FORMAT_COL, result.getBarcodeFormat().toString());
|
||||
values.put(DBHelper.DISPLAY_COL, handler.getDisplayContents().toString());
|
||||
values.put(DBHelper.TIMESTAMP_COL, System.currentTimeMillis());
|
||||
|
||||
SQLiteOpenHelper helper = new DBHelper(activity);
|
||||
SQLiteDatabase db;
|
||||
try {
|
||||
|
@ -143,17 +163,37 @@ public final class HistoryManager {
|
|||
}
|
||||
try {
|
||||
// Insert the new entry into the DB.
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(DBHelper.TEXT_COL, result.getText());
|
||||
values.put(DBHelper.FORMAT_COL, result.getBarcodeFormat().toString());
|
||||
values.put(DBHelper.DISPLAY_COL, handler.getDisplayContents().toString());
|
||||
values.put(DBHelper.TIMESTAMP_COL, System.currentTimeMillis());
|
||||
db.insert(DBHelper.TABLE_NAME, DBHelper.TIMESTAMP_COL, values);
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
public void addHistoryItemDetails(String itemID, String itemDetails) {
|
||||
|
||||
// As we're going to do an update only we don't need need to worry
|
||||
// about the preferences; if the item wasn't saved it won't be udpated
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(DBHelper.DETAILS_COL, itemDetails);
|
||||
|
||||
SQLiteOpenHelper helper = new DBHelper(activity);
|
||||
SQLiteDatabase db;
|
||||
try {
|
||||
db = helper.getWritableDatabase();
|
||||
} catch (SQLiteException sqle) {
|
||||
Log.w(TAG, "Error while opening database", sqle);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// Update the details for the ID entry into the DB.
|
||||
db.update(DBHelper.TABLE_NAME, values, DBHelper.TEXT_COL + "=?", new String[] {itemID});
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
private void deletePrevious(String text) {
|
||||
SQLiteOpenHelper helper = new DBHelper(activity);
|
||||
SQLiteDatabase db;
|
||||
|
@ -227,15 +267,15 @@ public final class HistoryManager {
|
|||
Cursor cursor = null;
|
||||
try {
|
||||
cursor = db.query(DBHelper.TABLE_NAME,
|
||||
EXPORT_COL_PROJECTION,
|
||||
COLUMNS,
|
||||
null, null, null, null,
|
||||
DBHelper.TIMESTAMP_COL + " DESC");
|
||||
while (cursor.moveToNext()) {
|
||||
for (int col = 0; col < EXPORT_COL_PROJECTION.length; col++) {
|
||||
for (int col = 0; col < COLUMNS.length; col++) {
|
||||
historyText.append('"').append(massageHistoryField(cursor.getString(col))).append("\",");
|
||||
}
|
||||
// Add timestamp again, formatted
|
||||
long timestamp = cursor.getLong(EXPORT_COL_PROJECTION.length - 1);
|
||||
long timestamp = cursor.getLong(3);
|
||||
historyText.append('"').append(massageHistoryField(
|
||||
EXPORT_DATE_TIME_FORMAT.format(new Date(timestamp)))).append("\"\r\n");
|
||||
}
|
||||
|
@ -276,7 +316,7 @@ public final class HistoryManager {
|
|||
}
|
||||
|
||||
private static String massageHistoryField(String value) {
|
||||
return value.replace("\"","\"\"");
|
||||
return value == null ? "" : value.replace("\"","\"\"");
|
||||
}
|
||||
|
||||
void clearHistory() {
|
||||
|
|
|
@ -20,6 +20,7 @@ import android.content.Context;
|
|||
import android.os.Handler;
|
||||
import android.util.Log;
|
||||
import android.widget.TextView;
|
||||
import com.google.zxing.client.android.history.HistoryManager;
|
||||
import com.google.zxing.client.android.AndroidHttpClient;
|
||||
import com.google.zxing.client.android.LocaleManager;
|
||||
import org.apache.http.HttpEntity;
|
||||
|
@ -48,9 +49,12 @@ final class ProductResultInfoRetriever extends SupplementalInfoRetriever {
|
|||
|
||||
private final String productID;
|
||||
|
||||
ProductResultInfoRetriever(TextView textView, String productID, Handler handler,
|
||||
Context context) {
|
||||
super(textView, handler, context);
|
||||
ProductResultInfoRetriever(TextView textView,
|
||||
String productID,
|
||||
Handler handler,
|
||||
HistoryManager historyManager,
|
||||
Context context) {
|
||||
super(textView, handler, historyManager, context);
|
||||
this.productID = productID;
|
||||
}
|
||||
|
||||
|
@ -71,8 +75,8 @@ final class ProductResultInfoRetriever extends SupplementalInfoRetriever {
|
|||
String content = consume(response.getEntity());
|
||||
Matcher matcher = PRODUCT_NAME_PRICE_PATTERN.matcher(content);
|
||||
if (matcher.find()) {
|
||||
append(matcher.group(1));
|
||||
append(matcher.group(2));
|
||||
String details = matcher.group(1) + ' ' + matcher.group(2);
|
||||
append(productID, details);
|
||||
}
|
||||
setLink(uri);
|
||||
}
|
||||
|
|
|
@ -21,13 +21,13 @@ import android.content.Intent;
|
|||
import android.net.Uri;
|
||||
import android.os.Handler;
|
||||
import android.text.Html;
|
||||
import android.text.Spanned;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import com.google.zxing.client.result.ISBNParsedResult;
|
||||
import com.google.zxing.client.result.ParsedResult;
|
||||
import com.google.zxing.client.result.ProductParsedResult;
|
||||
import com.google.zxing.client.result.URIParsedResult;
|
||||
import com.google.zxing.client.android.history.HistoryManager;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
@ -55,17 +55,26 @@ public abstract class SupplementalInfoRetriever implements Callable<Void> {
|
|||
return executorInstance;
|
||||
}
|
||||
|
||||
public static void maybeInvokeRetrieval(TextView textView, ParsedResult result, Handler handler,
|
||||
Context context) {
|
||||
public static void maybeInvokeRetrieval(TextView textView,
|
||||
ParsedResult result,
|
||||
Handler handler,
|
||||
HistoryManager historyManager,
|
||||
Context context) {
|
||||
SupplementalInfoRetriever retriever = null;
|
||||
if (result instanceof URIParsedResult) {
|
||||
retriever = new URIResultInfoRetriever(textView, (URIParsedResult) result, handler, context);
|
||||
retriever = new URIResultInfoRetriever(textView, (URIParsedResult) result, handler, historyManager, context);
|
||||
} else if (result instanceof ProductParsedResult) {
|
||||
retriever = new ProductResultInfoRetriever(textView,
|
||||
((ProductParsedResult) result).getProductID(), handler, context);
|
||||
((ProductParsedResult) result).getProductID(),
|
||||
handler,
|
||||
historyManager,
|
||||
context);
|
||||
} else if (result instanceof ISBNParsedResult) {
|
||||
retriever = new ProductResultInfoRetriever(textView, ((ISBNParsedResult) result).getISBN(),
|
||||
handler, context);
|
||||
retriever = new ProductResultInfoRetriever(textView,
|
||||
((ISBNParsedResult) result).getISBN(),
|
||||
handler,
|
||||
historyManager,
|
||||
context);
|
||||
}
|
||||
if (retriever != null) {
|
||||
ExecutorService executor = getExecutorService();
|
||||
|
@ -78,11 +87,13 @@ public abstract class SupplementalInfoRetriever implements Callable<Void> {
|
|||
private final WeakReference<TextView> textViewRef;
|
||||
private final Handler handler;
|
||||
private final Context context;
|
||||
private final HistoryManager historyManager;
|
||||
|
||||
SupplementalInfoRetriever(TextView textView, Handler handler, Context context) {
|
||||
SupplementalInfoRetriever(TextView textView, Handler handler, HistoryManager historyManager, Context context) {
|
||||
this.textViewRef = new WeakReference<TextView>(textView);
|
||||
this.handler = handler;
|
||||
this.context = context;
|
||||
this.historyManager = historyManager;
|
||||
}
|
||||
|
||||
public final Void call() throws IOException, InterruptedException {
|
||||
|
@ -92,17 +103,18 @@ public abstract class SupplementalInfoRetriever implements Callable<Void> {
|
|||
|
||||
abstract void retrieveSupplementalInfo() throws IOException, InterruptedException;
|
||||
|
||||
final void append(final String newText) throws InterruptedException {
|
||||
final void append(String itemID, final String newText) throws InterruptedException {
|
||||
final TextView textView = textViewRef.get();
|
||||
if (textView == null) {
|
||||
throw new InterruptedException();
|
||||
}
|
||||
handler.post(new Runnable() {
|
||||
public void run() {
|
||||
Spanned html = Html.fromHtml(newText + '\n');
|
||||
textView.append(html);
|
||||
textView.append(Html.fromHtml(newText + '\n'));
|
||||
}
|
||||
});
|
||||
// Add the text to the history.
|
||||
historyManager.addHistoryItemDetails(itemID, newText);
|
||||
}
|
||||
|
||||
final void setLink(final String uri) {
|
||||
|
|
|
@ -19,6 +19,7 @@ package com.google.zxing.client.android.result.supplement;
|
|||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.widget.TextView;
|
||||
import com.google.zxing.client.android.history.HistoryManager;
|
||||
import com.google.zxing.client.android.AndroidHttpClient;
|
||||
import com.google.zxing.client.android.R;
|
||||
import com.google.zxing.client.result.URIParsedResult;
|
||||
|
@ -42,9 +43,12 @@ final class URIResultInfoRetriever extends SupplementalInfoRetriever {
|
|||
private final URIParsedResult result;
|
||||
private final String redirectString;
|
||||
|
||||
URIResultInfoRetriever(TextView textView, URIParsedResult result, Handler handler,
|
||||
Context context) {
|
||||
super(textView, handler, context);
|
||||
URIResultInfoRetriever(TextView textView,
|
||||
URIParsedResult result,
|
||||
Handler handler,
|
||||
HistoryManager historyManager,
|
||||
Context context) {
|
||||
super(textView, handler, historyManager, context);
|
||||
redirectString = context.getString(R.string.msg_redirect);
|
||||
this.result = result;
|
||||
}
|
||||
|
@ -55,7 +59,7 @@ final class URIResultInfoRetriever extends SupplementalInfoRetriever {
|
|||
String newURI = unredirect(oldURI);
|
||||
int count = 0;
|
||||
while (count < 3 && !oldURI.equals(newURI)) {
|
||||
append(redirectString + ": " + newURI);
|
||||
append(result.getDisplayResult(), redirectString + " : " + newURI);
|
||||
count++;
|
||||
oldURI = newURI;
|
||||
newURI = unredirect(newURI);
|
||||
|
|
Loading…
Reference in a new issue