X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;ds=sidebyside;f=android%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fclient%2Fandroid%2FCaptureActivity.java;h=02437ea9a20ed6dfe650204fefc4efc95cdcdf2e;hb=118cc9f113634f4d6227e7ccc2ec6137c52999af;hp=7ff6ad093389c6d7ac531438e9aede11d353dcb6;hpb=983da3cbc8dcb9080df1bc6d43497545c9e57a2b;p=zxing.git diff --git a/android/src/com/google/zxing/client/android/CaptureActivity.java b/android/src/com/google/zxing/client/android/CaptureActivity.java index 7ff6ad09..02437ea9 100755 --- a/android/src/com/google/zxing/client/android/CaptureActivity.java +++ b/android/src/com/google/zxing/client/android/CaptureActivity.java @@ -16,8 +16,11 @@ package com.google.zxing.client.android; +import com.google.zxing.BarcodeFormat; import com.google.zxing.Result; +import com.google.zxing.ResultMetadataType; import com.google.zxing.ResultPoint; +import com.google.zxing.client.android.camera.CameraManager; import com.google.zxing.client.android.history.HistoryManager; import com.google.zxing.client.android.result.ResultButtonListener; import com.google.zxing.client.android.result.ResultHandler; @@ -34,10 +37,10 @@ import android.content.pm.PackageManager; import android.content.res.AssetFileDescriptor; import android.content.res.Configuration; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; @@ -48,10 +51,8 @@ import android.os.Message; import android.os.Vibrator; import android.preference.PreferenceManager; import android.text.ClipboardManager; -import android.text.SpannableStringBuilder; -import android.text.style.UnderlineSpan; import android.util.Log; -import android.view.Gravity; +import android.util.TypedValue; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; @@ -63,17 +64,31 @@ 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.Map; +import java.util.Set; +import java.util.Vector; +import java.util.regex.Pattern; /** * The barcode reader activity itself. This is loosely based on the CameraPreview * example included in the Android SDK. * * @author dswitkin@google.com (Daniel Switkin) + * @author Sean Owen */ public final class CaptureActivity extends Activity implements SurfaceHolder.Callback { - private static final String TAG = "CaptureActivity"; + + private static final String TAG = CaptureActivity.class.getSimpleName(); + + private static final Pattern COMMA_PATTERN = Pattern.compile(","); private static final int SHARE_ID = Menu.FIRST; private static final int HISTORY_ID = Menu.FIRST + 1; @@ -81,8 +96,8 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal private static final int HELP_ID = Menu.FIRST + 3; private static final int ABOUT_ID = Menu.FIRST + 4; - private static final int MAX_RESULT_IMAGE_SIZE = 150; private static final long INTENT_RESULT_DURATION = 1500L; + private static final long BULK_MODE_SCAN_DELAY_MS = 1000L; private static final float BEEP_VOLUME = 0.10f; private static final long VIBRATE_DURATION = 200L; @@ -90,6 +105,42 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal private static final String PRODUCT_SEARCH_URL_PREFIX = "http://www.google"; private static final String PRODUCT_SEARCH_URL_SUFFIX = "/m/products/scan"; private static final String ZXING_URL = "http://zxing.appspot.com/scan"; + private static final String RETURN_CODE_PLACEHOLDER = "{CODE}"; + private static final String RETURN_URL_PARAM = "ret"; + + static final Vector PRODUCT_FORMATS; + static final Vector ONE_D_FORMATS; + static final Vector QR_CODE_FORMATS; + static final Vector ALL_FORMATS; + + static { + PRODUCT_FORMATS = new Vector(5); + PRODUCT_FORMATS.add(BarcodeFormat.UPC_A); + PRODUCT_FORMATS.add(BarcodeFormat.UPC_E); + PRODUCT_FORMATS.add(BarcodeFormat.EAN_13); + PRODUCT_FORMATS.add(BarcodeFormat.EAN_8); + PRODUCT_FORMATS.add(BarcodeFormat.RSS14); + ONE_D_FORMATS = new Vector(PRODUCT_FORMATS.size() + 4); + ONE_D_FORMATS.addAll(PRODUCT_FORMATS); + ONE_D_FORMATS.add(BarcodeFormat.CODE_39); + ONE_D_FORMATS.add(BarcodeFormat.CODE_93); + ONE_D_FORMATS.add(BarcodeFormat.CODE_128); + ONE_D_FORMATS.add(BarcodeFormat.ITF); + QR_CODE_FORMATS = new Vector(1); + QR_CODE_FORMATS.add(BarcodeFormat.QR_CODE); + ALL_FORMATS = new Vector(ONE_D_FORMATS.size() + QR_CODE_FORMATS.size()); + ALL_FORMATS.addAll(ONE_D_FORMATS); + ALL_FORMATS.addAll(QR_CODE_FORMATS); + } + + private static final Set DISPLAYABLE_METADATA_TYPES; + static { + DISPLAYABLE_METADATA_TYPES = new HashSet(5); + DISPLAYABLE_METADATA_TYPES.add(ResultMetadataType.ISSUE_NUMBER); + DISPLAYABLE_METADATA_TYPES.add(ResultMetadataType.SUGGESTED_PRICE); + DISPLAYABLE_METADATA_TYPES.add(ResultMetadataType.ERROR_CORRECTION_LEVEL); + DISPLAYABLE_METADATA_TYPES.add(ResultMetadataType.POSSIBLE_COUNTRY); + } private enum Source { NATIVE_APP_INTENT, @@ -101,7 +152,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal private CaptureActivityHandler handler; private ViewfinderView viewfinderView; - private View statusView; + private TextView statusView; private View resultView; private MediaPlayer mediaPlayer; private Result lastResult; @@ -111,20 +162,34 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal private boolean copyToClipboard; private Source source; private String sourceUrl; - private String decodeMode; + private String returnUrlTemplate; + private Vector decodeFormats; + private String characterSet; 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() { public void onClick(DialogInterface dialogInterface, int i) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.zxing_url))); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); startActivity(intent); } }; + ViewfinderView getViewfinderView() { + return viewfinderView; + } + public Handler getHandler() { return handler; } @@ -140,7 +205,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal CameraManager.init(getApplication()); viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view); resultView = findViewById(R.id.result_view); - statusView = findViewById(R.id.status_view); + statusView = (TextView) findViewById(R.id.status_view); handler = null; lastResult = null; hasSurface = false; @@ -153,6 +218,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(); @@ -173,43 +239,91 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal if (action.equals(Intents.Scan.ACTION)) { // Scan the formats the intent requested, and return the result to the calling activity. source = Source.NATIVE_APP_INTENT; - decodeMode = intent.getStringExtra(Intents.Scan.MODE); - resetStatusView(); + decodeFormats = parseDecodeFormats(intent); } 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; - decodeMode = Intents.Scan.PRODUCT_MODE; - resetStatusView(); - } else if (dataString != null && dataString.equals(ZXING_URL)) { - // Scan all formats and handle the results ourselves. - // TODO: In the future we could allow the hyperlink to include a URL to send the results to. + decodeFormats = PRODUCT_FORMATS; + } 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 it ourselves. source = Source.ZXING_LINK; sourceUrl = dataString; - decodeMode = null; - resetStatusView(); + Uri inputUri = Uri.parse(sourceUrl); + returnUrlTemplate = inputUri.getQueryParameter(RETURN_URL_PARAM); + decodeFormats = parseDecodeFormats(inputUri); } else { // Scan all formats and handle the results ourselves (launched from Home). source = Source.NONE; - decodeMode = null; - resetStatusView(); + decodeFormats = null; } + characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET); } else { source = Source.NONE; - decodeMode = null; - if (lastResult == null) { - resetStatusView(); - } + decodeFormats = null; + characterSet = null; } SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); playBeep = prefs.getBoolean(PreferencesActivity.KEY_PLAY_BEEP, true); + if (playBeep) { + // See if sound settings overrides this + AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE); + if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) { + playBeep = false; + } + } vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false); copyToClipboard = prefs.getBoolean(PreferencesActivity.KEY_COPY_TO_CLIPBOARD, true); initBeepSound(); } + private static Vector parseDecodeFormats(Intent intent) { + List scanFormats = null; + String scanFormatsString = intent.getStringExtra(Intents.Scan.SCAN_FORMATS); + if (scanFormatsString != null) { + scanFormats = Arrays.asList(COMMA_PATTERN.split(scanFormatsString)); + } + return parseDecodeFormats(scanFormats, intent.getStringExtra(Intents.Scan.MODE)); + } + + private static Vector parseDecodeFormats(Uri inputUri) { + List formats = inputUri.getQueryParameters(Intents.Scan.SCAN_FORMATS); + if (formats != null && formats.size() == 1 && formats.get(0) != null){ + formats = Arrays.asList(COMMA_PATTERN.split(formats.get(0))); + } + return parseDecodeFormats(formats, inputUri.getQueryParameter(Intents.Scan.MODE)); + } + + private static Vector parseDecodeFormats(List scanFormats, + String decodeMode) { + if (scanFormats != null) { + Vector formats = new Vector(); + try { + for (String format : scanFormats) { + formats.add(BarcodeFormat.valueOf(format)); + } + return formats; + } catch (IllegalArgumentException iae) { + // ignore it then + } + } + if (decodeMode != null) { + if (Intents.Scan.PRODUCT_MODE.equals(decodeMode)) { + return PRODUCT_FORMATS; + } + if (Intents.Scan.QR_CODE_MODE.equals(decodeMode)) { + return QR_CODE_FORMATS; + } + if (Intents.Scan.ONE_D_MODE.equals(decodeMode)) { + return ONE_D_FORMATS; + } + } + return null; + } + @Override protected void onPause() { super.onPause(); @@ -229,7 +343,9 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal return true; } else if ((source == Source.NONE || source == Source.ZXING_LINK) && lastResult != null) { resetStatusView(); - handler.sendEmptyMessage(R.id.restart_preview); + if (handler != null) { + handler.sendEmptyMessage(R.id.restart_preview); + } return true; } } else if (keyCode == KeyEvent.KEYCODE_FOCUS || keyCode == KeyEvent.KEYCODE_CAMERA) { @@ -242,7 +358,8 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); - menu.add(0, SHARE_ID, 0, R.string.menu_share).setIcon(R.drawable.share_menu_item); + menu.add(0, SHARE_ID, 0, R.string.menu_share) + .setIcon(android.R.drawable.ic_menu_share); menu.add(0, HISTORY_ID, 0, R.string.menu_history) .setIcon(android.R.drawable.ic_menu_recent_history); menu.add(0, SETTINGS_ID, 0, R.string.menu_settings) @@ -267,6 +384,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal switch (item.getItemId()) { case SHARE_ID: { Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); intent.setClassName(this, ShareActivity.class.getName()); startActivity(intent); break; @@ -278,12 +396,14 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal } case SETTINGS_ID: { Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); intent.setClassName(this, PreferencesActivity.class.getName()); startActivity(intent); break; } case HELP_ID: { Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); intent.setClassName(this, HelpActivity.class.getName()); startActivity(intent); break; @@ -292,7 +412,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.title_about) + versionName); builder.setMessage(getString(R.string.msg_about) + "\n\n" + getString(R.string.zxing_url)); - builder.setIcon(R.drawable.zxing_icon); + builder.setIcon(R.drawable.launcher_icon); builder.setPositiveButton(R.string.button_open_browser, aboutListener); builder.setNegativeButton(R.string.button_cancel, null); builder.show(); @@ -343,8 +463,24 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal handleDecodeExternally(rawResult, barcode); break; case ZXING_LINK: + if (returnUrlTemplate == null){ + handleDecodeInternally(rawResult, barcode); + } else { + handleDecodeExternally(rawResult, barcode); + } + break; case NONE: - handleDecodeInternally(rawResult, barcode); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + 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 + if (handler != null) { + handler.sendEmptyMessageDelayed(R.id.restart_preview, BULK_MODE_SCAN_DELAY_MS); + } + resetStatusView(); + } else { + handleDecodeInternally(rawResult, barcode); + } break; } } @@ -370,8 +506,13 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal paint.setColor(getResources().getColor(R.color.result_points)); if (points.length == 2) { paint.setStrokeWidth(4.0f); - canvas.drawLine(points[0].getX(), points[0].getY(), points[1].getX(), - points[1].getY(), paint); + drawLine(canvas, paint, points[0], points[1]); + } else if (points.length == 4 && + (rawResult.getBarcodeFormat().equals(BarcodeFormat.UPC_A)) || + (rawResult.getBarcodeFormat().equals(BarcodeFormat.EAN_13))) { + // Hacky special case -- draw two lines, for the barcode and metadata + drawLine(canvas, paint, points[0], points[1]); + drawLine(canvas, paint, points[2], points[3]); } else { paint.setStrokeWidth(10.0f); for (ResultPoint point : points) { @@ -381,38 +522,64 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal } } + private static void drawLine(Canvas canvas, Paint paint, ResultPoint a, ResultPoint b) { + canvas.drawLine(a.getX(), a.getY(), b.getX(), b.getY(), paint); + } + // Put up our own UI for how to handle the decoded contents. private void handleDecodeInternally(Result rawResult, Bitmap barcode) { statusView.setVisibility(View.GONE); viewfinderView.setVisibility(View.GONE); resultView.setVisibility(View.VISIBLE); + ImageView barcodeImageView = (ImageView) findViewById(R.id.barcode_image_view); if (barcode == null) { - barcode = ((BitmapDrawable) getResources().getDrawable(R.drawable.unknown_barcode)).getBitmap(); + barcodeImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), + R.drawable.launcher_icon)); + } else { + barcodeImageView.setImageBitmap(barcode); } - ImageView barcodeImageView = (ImageView) findViewById(R.id.barcode_image_view); - barcodeImageView.setVisibility(View.VISIBLE); - barcodeImageView.setMaxWidth(MAX_RESULT_IMAGE_SIZE); - barcodeImageView.setMaxHeight(MAX_RESULT_IMAGE_SIZE); - barcodeImageView.setImageBitmap(barcode); TextView formatTextView = (TextView) findViewById(R.id.format_text_view); - formatTextView.setVisibility(View.VISIBLE); - formatTextView.setText(getString(R.string.msg_default_format) + ": " + - rawResult.getBarcodeFormat().toString()); + formatTextView.setText(rawResult.getBarcodeFormat().toString()); ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult); TextView typeTextView = (TextView) findViewById(R.id.type_text_view); - typeTextView.setText(getString(R.string.msg_default_type) + ": " + - resultHandler.getType().toString()); + typeTextView.setText(resultHandler.getType().toString()); + + DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + String formattedTime = formatter.format(new Date(rawResult.getTimestamp())); + TextView timeTextView = (TextView) findViewById(R.id.time_text_view); + timeTextView.setText(formattedTime); + + + TextView metaTextView = (TextView) findViewById(R.id.meta_text_view); + View metaTextViewLabel = findViewById(R.id.meta_text_view_label); + metaTextView.setVisibility(View.GONE); + metaTextViewLabel.setVisibility(View.GONE); + Map metadata = + (Map) rawResult.getResultMetadata(); + if (metadata != null) { + StringBuilder metadataText = new StringBuilder(20); + for (Map.Entry entry : metadata.entrySet()) { + if (DISPLAYABLE_METADATA_TYPES.contains(entry.getKey())) { + metadataText.append(entry.getValue()).append('\n'); + } + } + if (metadataText.length() > 0) { + metadataText.setLength(metadataText.length() - 1); + metaTextView.setText(metadataText); + metaTextView.setVisibility(View.VISIBLE); + metaTextViewLabel.setVisibility(View.VISIBLE); + } + } TextView contentsTextView = (TextView) findViewById(R.id.contents_text_view); - CharSequence title = getString(resultHandler.getDisplayTitle()); - SpannableStringBuilder styled = new SpannableStringBuilder(title + "\n\n"); - styled.setSpan(new UnderlineSpan(), 0, title.length(), 0); CharSequence displayContents = resultHandler.getDisplayContents(); - styled.append(displayContents); - contentsTextView.setText(styled); + contentsTextView.setText(displayContents); + // 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(); ViewGroup buttonView = (ViewGroup) findViewById(R.id.result_button_view); @@ -442,12 +609,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal // barcode was found (e.g. contact info) rather than the full contents, which they won't // have time to read. ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult); - TextView textView = (TextView) findViewById(R.id.status_text_view); - textView.setGravity(Gravity.CENTER); - textView.setTextSize(18.0f); - textView.setText(getString(resultHandler.getDisplayTitle())); - - statusView.setBackgroundColor(getResources().getColor(R.color.transparent)); + statusView.setText(getString(resultHandler.getDisplayTitle())); if (copyToClipboard) { ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); @@ -458,6 +620,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal // Hand back whatever action they requested - this can be changed to Intents.Scan.ACTION when // the deprecated intent is retired. Intent intent = new Intent(getIntent().getAction()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); intent.putExtra(Intents.Scan.RESULT, rawResult.toString()); intent.putExtra(Intents.Scan.RESULT_FORMAT, rawResult.getBarcodeFormat().toString()); Message message = Message.obtain(handler, R.id.return_scan_result); @@ -471,6 +634,13 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal message.obj = sourceUrl.substring(0, end) + "?q=" + resultHandler.getDisplayContents().toString() + "&source=zxing"; handler.sendMessageDelayed(message, INTENT_RESULT_DURATION); + } else if (source == Source.ZXING_LINK) { + // 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()); + handler.sendMessageDelayed(message, INTENT_RESULT_DURATION); } } @@ -490,8 +660,11 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal int lastVersion = prefs.getInt(PreferencesActivity.KEY_HELP_VERSION_SHOWN, 0); if (currentVersion > lastVersion) { prefs.edit().putInt(PreferencesActivity.KEY_HELP_VERSION_SHOWN, currentVersion).commit(); - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setClassName(this, HelpActivity.class.getName()); + Intent intent = new Intent(this, HelpActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + // Show the default page on a clean install, and the what's new page on an upgrade. + String page = (lastVersion == 0) ? HelpActivity.DEFAULT_PAGE : HelpActivity.WHATS_NEW_PAGE; + intent.putExtra(HelpActivity.REQUESTED_PAGE_KEY, page); startActivity(intent); return true; } @@ -542,37 +715,38 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal CameraManager.get().openDriver(surfaceHolder); } catch (IOException ioe) { Log.w(TAG, ioe); + displayFrameworkBugMessageAndExit(); + return; + } catch (RuntimeException e) { + // Barcode Scanner has seen crashes in the wild of this variety: + // java.?lang.?RuntimeException: Fail to connect to camera service + Log.w(TAG, "Unexpected error initializating camera", e); + displayFrameworkBugMessageAndExit(); return; } if (handler == null) { - boolean beginScanning = lastResult == null; - handler = new CaptureActivityHandler(this, decodeMode, beginScanning); + handler = new CaptureActivityHandler(this, decodeFormats, characterSet); } } + private void displayFrameworkBugMessageAndExit() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.app_name)); + builder.setMessage(getString(R.string.msg_camera_framework_bug)); + builder.setPositiveButton(R.string.button_ok, new FinishListener(this)); + builder.setOnCancelListener(new FinishListener(this)); + builder.show(); + } + private void resetStatusView() { resultView.setVisibility(View.GONE); + statusView.setText(R.string.msg_default_status); statusView.setVisibility(View.VISIBLE); - statusView.setBackgroundColor(getResources().getColor(R.color.status_view)); viewfinderView.setVisibility(View.VISIBLE); - - TextView textView = (TextView) findViewById(R.id.status_text_view); - textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); - textView.setTextSize(14.0f); - textView.setText(R.string.msg_default_status); lastResult = null; } 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); - } - } }