/*
* Copyright (C) 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.client.android;
import java.text.DateFormat;
import java.util.Date;
import java.util.EnumSet;
import java.util.Map;
import java.util.Set;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.zxing.Result;
import com.google.zxing.ResultMetadataType;
/**
* This activity opens the camera and does the actual scanning on a background
* thread. It draws a viewfinder to help the user place the barcode correctly,
* shows feedback as the image processing is happening, and then overlays the
* results when a scan is successful.
*
* @author dswitkin@google.com (Daniel Switkin)
* @author Sean Owen
*/
public final class CaptureActivity extends DecoderActivity {
private static final String TAG = CaptureActivity.class.getSimpleName();
private static final Set<ResultMetadataType> DISPLAYABLE_METADATA_TYPES = EnumSet
.of(ResultMetadataType.ISSUE_NUMBER,
ResultMetadataType.SUGGESTED_PRICE,
ResultMetadataType.ERROR_CORRECTION_LEVEL,
ResultMetadataType.POSSIBLE_COUNTRY);
private Result savedResultToShow;
private TextView statusView;
private View resultView;
private Result lastResult;
private IntentSource source;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.capture);
}
@Override
protected void onResume() {
super.onResume();
resultView = findViewById(R.id.result_view);
statusView = (TextView) findViewById(R.id.status_view);
lastResult = null;
resetStatusView();
// Intent intent = getIntent();
// SharedPreferences prefs =
// PreferenceManager.getDefaultSharedPreferences(this);
source = IntentSource.NONE;
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if ((source == IntentSource.NONE || source == IntentSource.ZXING_LINK)
&& lastResult != null) {
restartPreviewAfterDelay(0L);
return true;
}
}
return super.onKeyDown(keyCode, event);
}
/*
* @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater
* menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.capture,
* menu); return super.onCreateOptionsMenu(menu); }
*
* @Override public boolean onOptionsItemSelected(MenuItem item) { Intent
* intent = new Intent(Intent.ACTION_VIEW);
* intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); switch
* (item.getItemId()) { case R.id.menu_settings: intent.setClassName(this,
* PreferencesActivity.class.getName()); startActivity(intent); break; case
* R.id.menu_help: intent.setClassName(this, HelpActivity.class.getName());
* startActivity(intent); break; default: return
* super.onOptionsItemSelected(item); } return true; }
*/
// Put up our own UI for how to handle the decoded contents.
public void handleDecodeInternally(Result rawResult, Bitmap barcode) {
viewfinderView.setVisibility(View.GONE);
statusView.setVisibility(View.GONE);
resultView.setVisibility(View.VISIBLE);
ImageView barcodeImageView = (ImageView) findViewById(R.id.barcode_image_view);
if (barcode == null) {
barcodeImageView.setImageBitmap(BitmapFactory.decodeResource(
getResources(), R.drawable.launcher_icon));
} else {
barcodeImageView.setImageBitmap(barcode);
}
TextView formatTextView = (TextView) findViewById(R.id.format_text_view);
formatTextView.setText(rawResult.getBarcodeFormat().toString());
TextView typeTextView = (TextView) findViewById(R.id.type_text_view);
typeTextView.setText("QR_Code");
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<ResultMetadataType, Object> metadata = rawResult
.getResultMetadata();
if (metadata != null) {
StringBuilder metadataText = new StringBuilder(20);
for (Map.Entry<ResultMetadataType, Object> 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 displayContents = rawResult.getText();
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);
}
public void restartPreviewAfterDelay(long delayMS) {
super.restartPreviewAfterDelay(delayMS);
resetStatusView();
}
private void resetStatusView() {
resultView.setVisibility(View.GONE);
statusView.setText(R.string.msg_default_status);
statusView.setVisibility(View.VISIBLE);
viewfinderView.setVisibility(View.VISIBLE);
lastResult = null;
}
}