package com.google.zxing.client.android;
import android.content.Intent;
-import android.net.ContentURI;
-import android.os.Handler;
-import android.os.Message;
+import android.net.Uri;
import android.provider.Contacts;
-import com.google.zxing.client.result.AddressBookAUResult;
-import com.google.zxing.client.result.AddressBookDoCoMoResult;
-import com.google.zxing.client.result.BookmarkDoCoMoResult;
-import com.google.zxing.client.result.EmailAddressResult;
-import com.google.zxing.client.result.EmailDoCoMoResult;
-import com.google.zxing.client.result.ParsedReaderResult;
-import com.google.zxing.client.result.ParsedReaderResultType;
-import com.google.zxing.client.result.UPCParsedResult;
-import com.google.zxing.client.result.URIParsedResult;
-import com.google.zxing.client.result.URLTOResult;
-
-import java.net.URISyntaxException;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import com.google.zxing.client.result.*;
/**
* Handles the result of barcode decoding in the context of the Android platform,
- * by dispatching the proper intents and so on.
+ * by dispatching the proper intents to open other activities like GMail, Maps, etc.
*
* @author srowen@google.com (Sean Owen)
* @author dswitkin@google.com (Daniel Switkin)
*/
-final class ResultHandler extends Handler {
+final class ResultHandler implements Button.OnClickListener {
+
+ private static final String TAG = "ResultHandler";
- private final ParsedReaderResult result;
+ private final Intent intent;
private final BarcodeReaderCaptureActivity captureActivity;
ResultHandler(BarcodeReaderCaptureActivity captureActivity, ParsedReaderResult result) {
this.captureActivity = captureActivity;
- this.result = result;
+ this.intent = resultToIntent(result);
}
- @Override
- public void handleMessage(Message message) {
- if (message.what == R.string.button_yes) {
- Intent intent = null;
- ParsedReaderResultType type = result.getType();
- if (type.equals(ParsedReaderResultType.ADDRESSBOOK)) {
- AddressBookDoCoMoResult addressResult = (AddressBookDoCoMoResult) result;
- intent = new Intent(Contacts.Intents.Insert.ACTION, Contacts.People.CONTENT_URI);
- putExtra(intent, Contacts.Intents.Insert.NAME, addressResult.getName());
- putExtra(intent, Contacts.Intents.Insert.PHONE, addressResult.getPhoneNumbers());
- putExtra(intent, Contacts.Intents.Insert.EMAIL, addressResult.getEmail());
- putExtra(intent, Contacts.Intents.Insert.NOTES, addressResult.getNote());
- putExtra(intent, Contacts.Intents.Insert.POSTAL, addressResult.getAddress());
- } else if (type.equals(ParsedReaderResultType.ADDRESSBOOK_AU)) {
- AddressBookAUResult addressResult = (AddressBookAUResult) result;
- intent = new Intent(Contacts.Intents.Insert.ACTION, Contacts.People.CONTENT_URI);
- putExtra(intent, Contacts.Intents.Insert.NAME, addressResult.getNames());
- putExtra(intent, Contacts.Intents.Insert.PHONE, addressResult.getPhoneNumbers());
- putExtra(intent, Contacts.Intents.Insert.EMAIL, addressResult.getEmails());
- putExtra(intent, Contacts.Intents.Insert.NOTES, addressResult.getNote());
- putExtra(intent, Contacts.Intents.Insert.POSTAL, addressResult.getAddress());
- } else if (type.equals(ParsedReaderResultType.BOOKMARK)) {
- // For now, we can only open the browser, and not actually add a bookmark
- try {
- intent = new Intent(Intent.VIEW_ACTION,
- new ContentURI(((BookmarkDoCoMoResult) result).getURI()));
- } catch (URISyntaxException e) {
- return;
- }
- } else if (type.equals(ParsedReaderResultType.URLTO)) {
- try {
- intent = new Intent(Intent.VIEW_ACTION,
- new ContentURI(((URLTOResult) result).getURI()));
- } catch (URISyntaxException e) {
- return;
- }
- } else if (type.equals(ParsedReaderResultType.EMAIL)) {
- EmailDoCoMoResult emailResult = (EmailDoCoMoResult) result;
- try {
- intent = new Intent(Intent.SENDTO_ACTION, new ContentURI(emailResult.getTo()));
- } catch (URISyntaxException e) {
- return;
- }
- putExtra(intent, "subject", emailResult.getSubject());
- putExtra(intent, "body", emailResult.getBody());
- } else if (type.equals(ParsedReaderResultType.EMAIL_ADDRESS)) {
- EmailAddressResult emailResult = (EmailAddressResult) result;
- try {
- intent = new Intent(Intent.SENDTO_ACTION, new ContentURI(emailResult.getEmailAddress()));
- } catch (URISyntaxException e) {
- return;
- }
- } else if (type.equals(ParsedReaderResultType.UPC)) {
- UPCParsedResult upcResult = (UPCParsedResult) result;
- try {
- ContentURI uri = new ContentURI("http://www.upcdatabase.com/item.asp?upc=" +
- upcResult.getUPC());
- intent = new Intent(Intent.VIEW_ACTION, uri);
- } catch (URISyntaxException e) {
- return;
- }
- } else if (type.equals(ParsedReaderResultType.URI)) {
- URIParsedResult uriResult = (URIParsedResult) result;
- try {
- intent = new Intent(Intent.VIEW_ACTION, new ContentURI(uriResult.getURI()));
- } catch (URISyntaxException e) {
- return;
- }
- }
- if (intent != null) {
- captureActivity.startActivity(intent);
- }
- } else {
- captureActivity.restartPreview();
+ private static Intent resultToIntent(ParsedReaderResult result) {
+ Intent intent = null;
+ ParsedReaderResultType type = result.getType();
+ if (type.equals(ParsedReaderResultType.ADDRESSBOOK)) {
+ AddressBookDoCoMoParsedResult addressResult = (AddressBookDoCoMoParsedResult) result;
+ intent = new Intent(Contacts.Intents.Insert.ACTION, Contacts.People.CONTENT_URI);
+ putExtra(intent, Contacts.Intents.Insert.NAME, addressResult.getName());
+ putExtra(intent, Contacts.Intents.Insert.PHONE, addressResult.getPhoneNumbers());
+ putExtra(intent, Contacts.Intents.Insert.EMAIL, addressResult.getEmail());
+ putExtra(intent, Contacts.Intents.Insert.NOTES, addressResult.getNote());
+ putExtra(intent, Contacts.Intents.Insert.POSTAL, addressResult.getAddress());
+ } else if (type.equals(ParsedReaderResultType.ADDRESSBOOK_AU)) {
+ AddressBookAUParsedResult addressResult = (AddressBookAUParsedResult) result;
+ intent = new Intent(Contacts.Intents.Insert.ACTION, Contacts.People.CONTENT_URI);
+ putExtra(intent, Contacts.Intents.Insert.NAME, addressResult.getNames());
+ putExtra(intent, Contacts.Intents.Insert.PHONE, addressResult.getPhoneNumbers());
+ putExtra(intent, Contacts.Intents.Insert.EMAIL, addressResult.getEmails());
+ putExtra(intent, Contacts.Intents.Insert.NOTES, addressResult.getNote());
+ putExtra(intent, Contacts.Intents.Insert.POSTAL, addressResult.getAddress());
+ } else if (type.equals(ParsedReaderResultType.BOOKMARK)) {
+ // For now, we can only open the browser, and not actually add a bookmark
+ intent = new Intent(Intent.VIEW_ACTION, Uri.parse(((BookmarkDoCoMoParsedResult) result).getURI()));
+ } else if (type.equals(ParsedReaderResultType.URLTO)) {
+ intent = new Intent(Intent.VIEW_ACTION, Uri.parse(((URLTOParsedResult) result).getURI()));
+ } else if (type.equals(ParsedReaderResultType.EMAIL)) {
+ EmailDoCoMoParsedResult emailResult = (EmailDoCoMoParsedResult) result;
+ intent = new Intent(Intent.SENDTO_ACTION, Uri.parse(emailResult.getTo()));
+ putExtra(intent, "subject", emailResult.getSubject());
+ putExtra(intent, "body", emailResult.getBody());
+ } else if (type.equals(ParsedReaderResultType.EMAIL_ADDRESS)) {
+ EmailAddressParsedResult emailResult = (EmailAddressParsedResult) result;
+ intent = new Intent(Intent.SENDTO_ACTION, Uri.parse("mailto:" + emailResult.getEmailAddress()));
+ } else if (type.equals(ParsedReaderResultType.TEL)) {
+ TelParsedResult telResult = (TelParsedResult) result;
+ intent = new Intent(Intent.DIAL_ACTION, Uri.parse("tel:" + telResult.getNumber()));
+ } else if (type.equals(ParsedReaderResultType.GEO)) {
+ GeoParsedResult geoResult = (GeoParsedResult) result;
+ intent = new Intent(Intent.VIEW_ACTION, Uri.parse(geoResult.getGeoURI()));
+ } else if (type.equals(ParsedReaderResultType.UPC)) {
+ UPCParsedResult upcResult = (UPCParsedResult) result;
+ Uri uri = Uri.parse("http://www.upcdatabase.com/item.asp?upc=" + upcResult.getUPC());
+ intent = new Intent(Intent.VIEW_ACTION, uri);
+ } else if (type.equals(ParsedReaderResultType.URI)) {
+ URIParsedResult uriResult = (URIParsedResult) result;
+ intent = new Intent(Intent.VIEW_ACTION, Uri.parse(uriResult.getURI()));
+ } else if (type.equals(ParsedReaderResultType.ANDROID_INTENT)) {
+ intent = ((AndroidIntentParsedResult) result).getIntent();
}
+ return intent;
+ }
+
+ public void onClick(View view) {
+ if (intent != null) {
+ captureActivity.startActivity(intent);
+ }
+ }
+
+ Intent getIntent() {
+ return intent;
}
private static void putExtra(Intent intent, String key, String value) {