- Made sure barcode scanning always restarts when the activity is resumed.

- Fixed a potential ANR - we can never sleep on the main thread.
- Bumped the version number.
- Minor cleanup and 100 columns fixes.

git-svn-id: https://zxing.googlecode.com/svn/trunk@1447 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
dswitkin@google.com 2010-06-18 16:17:12 +00:00
parent 7255ac8443
commit b94d44c5a1
4 changed files with 33 additions and 47 deletions

View file

@ -20,8 +20,8 @@ version to be published. The next versionCode will be 7, regardless of whether t
versionName is 2.31, 2.4, or 3.0. --> versionName is 2.31, 2.4, or 3.0. -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.zxing.client.android" package="com.google.zxing.client.android"
android:versionName="3.31" android:versionName="3.32 beta 1"
android:versionCode="53"> android:versionCode="54">
<!-- We require Cupcake (Android 1.5) or later, but are really targeting Donut. --> <!-- We require Cupcake (Android 1.5) or later, but are really targeting Donut. -->
<uses-sdk android:minSdkVersion="3" <uses-sdk android:minSdkVersion="3"
android:targetSdkVersion="4"/> android:targetSdkVersion="4"/>

View file

@ -16,8 +16,6 @@
package com.google.zxing.client.android; package com.google.zxing.client.android;
import android.util.TypedValue;
import android.widget.Toast;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.ResultMetadataType; import com.google.zxing.ResultMetadataType;
@ -53,6 +51,7 @@ import android.os.Vibrator;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.text.ClipboardManager; import android.text.ClipboardManager;
import android.util.Log; import android.util.Log;
import android.util.TypedValue;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
@ -64,13 +63,14 @@ import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException; import java.io.IOException;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.Vector; import java.util.Vector;
@ -81,6 +81,7 @@ import java.util.regex.Pattern;
* example included in the Android SDK. * example included in the Android SDK.
* *
* @author dswitkin@google.com (Daniel Switkin) * @author dswitkin@google.com (Daniel Switkin)
* @author Sean Owen
*/ */
public final class CaptureActivity extends Activity implements SurfaceHolder.Callback { public final class CaptureActivity extends Activity implements SurfaceHolder.Callback {
@ -166,7 +167,14 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
private String versionName; private String versionName;
private HistoryManager historyManager; private HistoryManager historyManager;
private final OnCompletionListener beepListener = new BeepListener(); /**
* When the beep has finished playing, rewind to queue up another one.
*/
private final OnCompletionListener beepListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.seekTo(0);
}
};
private final DialogInterface.OnClickListener aboutListener = private final DialogInterface.OnClickListener aboutListener =
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
@ -209,6 +217,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
resetStatusView();
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder(); SurfaceHolder surfaceHolder = surfaceView.getHolder();
@ -230,37 +239,30 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
// Scan the formats the intent requested, and return the result to the calling activity. // Scan the formats the intent requested, and return the result to the calling activity.
source = Source.NATIVE_APP_INTENT; source = Source.NATIVE_APP_INTENT;
decodeFormats = parseDecodeFormats(intent); decodeFormats = parseDecodeFormats(intent);
resetStatusView();
} else if (dataString != null && dataString.contains(PRODUCT_SEARCH_URL_PREFIX) && } else if (dataString != null && dataString.contains(PRODUCT_SEARCH_URL_PREFIX) &&
dataString.contains(PRODUCT_SEARCH_URL_SUFFIX)) { dataString.contains(PRODUCT_SEARCH_URL_SUFFIX)) {
// Scan only products and send the result to mobile Product Search. // Scan only products and send the result to mobile Product Search.
source = Source.PRODUCT_SEARCH_LINK; source = Source.PRODUCT_SEARCH_LINK;
sourceUrl = dataString; sourceUrl = dataString;
decodeFormats = PRODUCT_FORMATS; decodeFormats = PRODUCT_FORMATS;
resetStatusView();
} else if (dataString != null && dataString.startsWith(ZXING_URL)) { } else if (dataString != null && dataString.startsWith(ZXING_URL)) {
// Scan formats requested in query string (all formats if none specified). // Scan formats requested in query string (all formats if none specified).
// If a return URL is specified, send the results there. Otherwise, handle the results ourselves. // If a return URL is specified, send the results there. Otherwise, handle it ourselves.
source = Source.ZXING_LINK; source = Source.ZXING_LINK;
sourceUrl = dataString; sourceUrl = dataString;
Uri inputUri = Uri.parse(sourceUrl); Uri inputUri = Uri.parse(sourceUrl);
returnUrlTemplate = inputUri.getQueryParameter(RETURN_URL_PARAM); returnUrlTemplate = inputUri.getQueryParameter(RETURN_URL_PARAM);
decodeFormats = parseDecodeFormats(inputUri); decodeFormats = parseDecodeFormats(inputUri);
resetStatusView();
} else { } else {
// Scan all formats and handle the results ourselves (launched from Home). // Scan all formats and handle the results ourselves (launched from Home).
source = Source.NONE; source = Source.NONE;
decodeFormats = null; decodeFormats = null;
resetStatusView();
} }
characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET); characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET);
} else { } else {
source = Source.NONE; source = Source.NONE;
decodeFormats = null; decodeFormats = null;
characterSet = null; characterSet = null;
if (lastResult == null) {
resetStatusView();
}
} }
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
@ -471,15 +473,10 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
if (prefs.getBoolean(PreferencesActivity.KEY_BULK_MODE, false)) { if (prefs.getBoolean(PreferencesActivity.KEY_BULK_MODE, false)) {
Toast.makeText(this, R.string.msg_bulk_mode_scanned, Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.msg_bulk_mode_scanned, Toast.LENGTH_SHORT).show();
// Wait a moment or else it will scan the same barcode continuously about 3 times // Wait a moment or else it will scan the same barcode continuously about 3 times
try { if (handler != null) {
Thread.sleep(BULK_MODE_SCAN_DELAY_MS); handler.sendEmptyMessageDelayed(R.id.restart_preview, BULK_MODE_SCAN_DELAY_MS);
} catch (InterruptedException ie) {
// continue
} }
resetStatusView(); resetStatusView();
if (handler != null) {
handler.sendEmptyMessage(R.id.restart_preview);
}
} else { } else {
handleDecodeInternally(rawResult, barcode); handleDecodeInternally(rawResult, barcode);
} }
@ -570,8 +567,8 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
TextView contentsTextView = (TextView) findViewById(R.id.contents_text_view); TextView contentsTextView = (TextView) findViewById(R.id.contents_text_view);
CharSequence displayContents = resultHandler.getDisplayContents(); CharSequence displayContents = resultHandler.getDisplayContents();
contentsTextView.setText(displayContents); contentsTextView.setText(displayContents);
// Crudely scale betweeen 22 and 36 -- bigger font for shorter text // Crudely scale betweeen 22 and 32 -- bigger font for shorter text
int scaledSize = Math.max(22, 36 - displayContents.length() / 4); int scaledSize = Math.max(22, 32 - displayContents.length() / 4);
contentsTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, scaledSize); contentsTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, scaledSize);
int buttonCount = resultHandler.getButtonCount(); int buttonCount = resultHandler.getButtonCount();
@ -631,7 +628,8 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
// Replace each occurrence of RETURN_CODE_PLACEHOLDER in the returnUrlTemplate // Replace each occurrence of RETURN_CODE_PLACEHOLDER in the returnUrlTemplate
// with the scanned code. This allows both queries and REST-style URLs to work. // with the scanned code. This allows both queries and REST-style URLs to work.
Message message = Message.obtain(handler, R.id.launch_product_query); Message message = Message.obtain(handler, R.id.launch_product_query);
message.obj = returnUrlTemplate.replace(RETURN_CODE_PLACEHOLDER, resultHandler.getDisplayContents().toString()); message.obj = returnUrlTemplate.replace(RETURN_CODE_PLACEHOLDER,
resultHandler.getDisplayContents().toString());
handler.sendMessageDelayed(message, INTENT_RESULT_DURATION); handler.sendMessageDelayed(message, INTENT_RESULT_DURATION);
} }
} }
@ -717,8 +715,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
return; return;
} }
if (handler == null) { if (handler == null) {
boolean beginScanning = lastResult == null; handler = new CaptureActivityHandler(this, decodeFormats, characterSet);
handler = new CaptureActivityHandler(this, decodeFormats, characterSet, beginScanning);
} }
} }
@ -745,13 +742,4 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
public void drawViewfinder() { public void drawViewfinder() {
viewfinderView.drawViewfinder(); viewfinderView.drawViewfinder();
} }
/**
* When the beep has finished playing, rewind to queue up another one.
*/
private static class BeepListener implements OnCompletionListener {
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.seekTo(0);
}
}
} }

View file

@ -50,10 +50,8 @@ public final class CaptureActivityHandler extends Handler {
DONE DONE
} }
CaptureActivityHandler(CaptureActivity activity, CaptureActivityHandler(CaptureActivity activity, Vector<BarcodeFormat> decodeFormats,
Vector<BarcodeFormat> decodeFormats, String characterSet) {
String characterSet,
boolean beginScanning) {
this.activity = activity; this.activity = activity;
decodeThread = new DecodeThread(activity, decodeFormats, characterSet, decodeThread = new DecodeThread(activity, decodeFormats, characterSet,
new ViewfinderResultPointCallback(activity.getViewfinderView())); new ViewfinderResultPointCallback(activity.getViewfinderView()));
@ -62,9 +60,7 @@ public final class CaptureActivityHandler extends Handler {
// Start ourselves capturing previews and decoding. // Start ourselves capturing previews and decoding.
CameraManager.get().startPreview(); CameraManager.get().startPreview();
if (beginScanning) { restartPreviewAndDecode();
restartPreviewAndDecode();
}
} }
@Override @Override
@ -86,7 +82,8 @@ public final class CaptureActivityHandler extends Handler {
Log.d(TAG, "Got decode succeeded message"); Log.d(TAG, "Got decode succeeded message");
state = State.SUCCESS; state = State.SUCCESS;
Bundle bundle = message.getData(); Bundle bundle = message.getData();
Bitmap barcode = bundle == null ? null : (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP); Bitmap barcode = bundle == null ? null :
(Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);
activity.handleDecode((Result) message.obj, barcode); activity.handleDecode((Result) message.obj, barcode);
break; break;
case R.id.decode_failed: case R.id.decode_failed:
@ -103,7 +100,7 @@ public final class CaptureActivityHandler extends Handler {
Log.d(TAG, "Got product query message"); Log.d(TAG, "Got product query message");
String url = (String) message.obj; String url = (String) message.obj;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
activity.startActivity(intent); activity.startActivity(intent);
break; break;
} }

View file

@ -16,8 +16,6 @@
package com.google.zxing.client.android.camera; package com.google.zxing.client.android.camera;
import java.util.regex.Pattern;
import android.content.Context; import android.content.Context;
import android.graphics.Point; import android.graphics.Point;
import android.hardware.Camera; import android.hardware.Camera;
@ -26,6 +24,8 @@ import android.util.Log;
import android.view.Display; import android.view.Display;
import android.view.WindowManager; import android.view.WindowManager;
import java.util.regex.Pattern;
final class CameraConfigurationManager { final class CameraConfigurationManager {
private static final String TAG = CameraConfigurationManager.class.getSimpleName(); private static final String TAG = CameraConfigurationManager.class.getSimpleName();
@ -118,7 +118,8 @@ final class CameraConfigurationManager {
return cameraResolution; return cameraResolution;
} }
private static Point findBestPreviewSizeValue(String previewSizeValueString, Point screenResolution) { private static Point findBestPreviewSizeValue(String previewSizeValueString,
Point screenResolution) {
int bestX = 0; int bestX = 0;
int bestY = 0; int bestY = 0;
int diff = Integer.MAX_VALUE; int diff = Integer.MAX_VALUE;