- 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. -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.zxing.client.android"
android:versionName="3.31"
android:versionCode="53">
android:versionName="3.32 beta 1"
android:versionCode="54">
<!-- We require Cupcake (Android 1.5) or later, but are really targeting Donut. -->
<uses-sdk android:minSdkVersion="3"
android:targetSdkVersion="4"/>

View file

@ -16,8 +16,6 @@
package com.google.zxing.client.android;
import android.util.TypedValue;
import android.widget.Toast;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import com.google.zxing.ResultMetadataType;
@ -53,6 +51,7 @@ import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.text.ClipboardManager;
import android.util.Log;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@ -64,13 +63,14 @@ import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
@ -81,6 +81,7 @@ import java.util.regex.Pattern;
* example included in the Android SDK.
*
* @author dswitkin@google.com (Daniel Switkin)
* @author Sean Owen
*/
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 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 =
new DialogInterface.OnClickListener() {
@ -209,6 +217,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
@Override
protected void onResume() {
super.onResume();
resetStatusView();
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
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.
source = Source.NATIVE_APP_INTENT;
decodeFormats = parseDecodeFormats(intent);
resetStatusView();
} else if (dataString != null && dataString.contains(PRODUCT_SEARCH_URL_PREFIX) &&
dataString.contains(PRODUCT_SEARCH_URL_SUFFIX)) {
// Scan only products and send the result to mobile Product Search.
source = Source.PRODUCT_SEARCH_LINK;
sourceUrl = dataString;
decodeFormats = PRODUCT_FORMATS;
resetStatusView();
} else if (dataString != null && dataString.startsWith(ZXING_URL)) {
// 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;
sourceUrl = dataString;
Uri inputUri = Uri.parse(sourceUrl);
returnUrlTemplate = inputUri.getQueryParameter(RETURN_URL_PARAM);
decodeFormats = parseDecodeFormats(inputUri);
resetStatusView();
} else {
// Scan all formats and handle the results ourselves (launched from Home).
source = Source.NONE;
decodeFormats = null;
resetStatusView();
}
characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET);
} else {
source = Source.NONE;
decodeFormats = null;
characterSet = null;
if (lastResult == null) {
resetStatusView();
}
}
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)) {
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
try {
Thread.sleep(BULK_MODE_SCAN_DELAY_MS);
} catch (InterruptedException ie) {
// continue
if (handler != null) {
handler.sendEmptyMessageDelayed(R.id.restart_preview, BULK_MODE_SCAN_DELAY_MS);
}
resetStatusView();
if (handler != null) {
handler.sendEmptyMessage(R.id.restart_preview);
}
} else {
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);
CharSequence displayContents = resultHandler.getDisplayContents();
contentsTextView.setText(displayContents);
// Crudely scale betweeen 22 and 36 -- bigger font for shorter text
int scaledSize = Math.max(22, 36 - displayContents.length() / 4);
// Crudely scale betweeen 22 and 32 -- bigger font for shorter text
int scaledSize = Math.max(22, 32 - displayContents.length() / 4);
contentsTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, scaledSize);
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
// 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.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);
}
}
@ -717,8 +715,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
return;
}
if (handler == null) {
boolean beginScanning = lastResult == null;
handler = new CaptureActivityHandler(this, decodeFormats, characterSet, beginScanning);
handler = new CaptureActivityHandler(this, decodeFormats, characterSet);
}
}
@ -745,13 +742,4 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
public void 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
}
CaptureActivityHandler(CaptureActivity activity,
Vector<BarcodeFormat> decodeFormats,
String characterSet,
boolean beginScanning) {
CaptureActivityHandler(CaptureActivity activity, Vector<BarcodeFormat> decodeFormats,
String characterSet) {
this.activity = activity;
decodeThread = new DecodeThread(activity, decodeFormats, characterSet,
new ViewfinderResultPointCallback(activity.getViewfinderView()));
@ -62,9 +60,7 @@ public final class CaptureActivityHandler extends Handler {
// Start ourselves capturing previews and decoding.
CameraManager.get().startPreview();
if (beginScanning) {
restartPreviewAndDecode();
}
restartPreviewAndDecode();
}
@Override
@ -86,7 +82,8 @@ public final class CaptureActivityHandler extends Handler {
Log.d(TAG, "Got decode succeeded message");
state = State.SUCCESS;
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);
break;
case R.id.decode_failed:
@ -103,7 +100,7 @@ public final class CaptureActivityHandler extends Handler {
Log.d(TAG, "Got product query message");
String url = (String) message.obj;
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);
break;
}

View file

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