package com.android.mms.ui;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.android.mms.R;
import android.app.ListActivity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.pim.vcard.VCardConfig;
import android.pim.vcard.VCardEntry;
import android.pim.vcard.VCardEntryConstructor;
import android.pim.vcard.VCardEntryHandler;
import android.pim.vcard.VCardInterpreter;
import android.pim.vcard.VCardParser;
import android.pim.vcard.VCardParser_V21;
import android.pim.vcard.VCardParser_V30;
import android.pim.vcard.VCardSourceDetector;
import android.pim.vcard.VCardEntry.EmailData;
import android.pim.vcard.VCardEntry.OrganizationData;
import android.pim.vcard.VCardEntry.PhoneData;
import android.pim.vcard.VCardEntry.PostalData;
import android.pim.vcard.exception.VCardException;
import android.pim.vcard.exception.VCardNotSupportedException;
import android.pim.vcard.exception.VCardVersionException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.provider.ContactsContract.RawContacts;
import android.telephony.SmsMessage;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class NewContactDataReceivedActivity extends ListActivity {
private static final String TAG = "NewContactDataReceivedActivity";
// Contact
private static final Pattern patternVCard = Pattern.compile("(?ms)^BEGIN:VCARD$.+?^END:VCARD$");
// full name
private static final Pattern patternFullName = Pattern.compile("(?m)^FN:([^;\\r\\n]+)*.*$");
// name
private static final Pattern patternName = Pattern
.compile("(?m)^N:([^;\\r\\n]*)(?:;([^;\\r\\n]+))*.*$");
// home phone
private static final Pattern patternHomePhone = Pattern
.compile("(?m)^TEL;(TYPE=)?HOME.*:([\\(\\)\\d-_\\+]{1,20})$");
// cell
private static final Pattern patternCell = Pattern
.compile("(?m)^TEL;(TYPE=)?(CELL|PREF).*:([\\(\\)\\d-_\\+]{1,20})$");
// office phone
private static final Pattern patternOfficePhone = Pattern
.compile("(?m)^TEL;(TYPE=)?WORK.*:([\\(\\)\\d-_\\+]{1,20})$");
// other phone
private static final Pattern patternOtherPhone = Pattern
.compile("(?m)^TEL;(TYPE=)?VOICE.*:([\\(\\)\\d-_\\+]{1,20})$");
// fax
private static final Pattern patternFax = Pattern
.compile("(?m)^TEL;(TYPE=)?FAX.*:([\\(\\)\\d-_\\+]{1,20})$");
// email
private static final Pattern patternEmail = Pattern.compile("(?m)^EMAIL;(HOME)?:(.{1,100})$");
// birthday
private static final Pattern patternBirthday = Pattern
.compile("(?m)^BDAY:(\\d{4})-?(\\d{2})-?(\\d{2})$");
// address
private static final Pattern patternAddress = Pattern.compile("(?m)^ADR([^:]+):;*(.+)$"); // backup:
// "(?m)^ADR([^:]+):(.+)$"
// Organization
private static final Pattern patternOrganization = Pattern
.compile("(?m)^ORG:([^;\\r\\n]+)*.*$");
// Job title
private static final Pattern patternJobTitle = Pattern.compile("(?m)^TITLE:([^;\\r\\n]+)*.*$");
Matcher matcher;
boolean bl;
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.v(TAG, "oncreate()");
setContentView(R.layout.received_contact_list);
Intent intent = this.getIntent();
String content;
/*
* if(intent.getExtras().getString("mode").equalsIgnoreCase("test")){
* content = intent.getExtras().getString("contents"); }else { content =
* receivedMessage(intent); }
*/
content = receivedMessage(intent);
Log.v(TAG, "content is " + content);
readVCardContent(content);
// addView();
Button saveButton = (Button) this.findViewById(R.id.save_a_new_contact);
Button cancelButton = (Button) this.findViewById(R.id.cancel_new_contact);
saveButton.setOnClickListener(listener);
cancelButton.setOnClickListener(listener);
}
private VCardParser mVCardParser;
private boolean parseVcardFile(String content, String charset,
VCardInterpreter builder, VCardSourceDetector detector) {
InputStream is;
try {
//is = mResolver.openInputStream(uri);
is = new ByteArrayInputStream(content.getBytes());
// mVCardParser = new VCardParser_V21(detector);
mVCardParser = new VCardParser_V21();
try {
// mVCardParser.parse(is, charset, builder, false);
mVCardParser.parse(is, builder);
} catch (VCardVersionException e1) {
try {
is.close();
} catch (IOException e) {
}
if (builder instanceof VCardEntryConstructor) {
// Let the object clean up internal temporal objects,
((VCardEntryConstructor)builder).clear();
}
//is = mResolver.openInputStream(uri);
is = new ByteArrayInputStream("".getBytes());
try {
mVCardParser = new VCardParser_V30();
// mVCardParser.parse(is, charset, builder, false);
mVCardParser.parse(is, builder);
} catch (VCardVersionException e2) {
throw new VCardException("vCard with unspported version.");
}
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
} catch (IOException e) {
Log.e(TAG, "parse vcard io exception!");
return false;
} catch (VCardNotSupportedException e) {
Log.e(TAG, "unsupported vcard file!");
return false;
} catch (VCardException e) {
Log.e(TAG, "Vcard parse failed!");
return false;
}
return true;
}
private int vcardType = -1;
private void readVCardContent(String content) {
vcardType = VCardConfig.getVCardTypeFromString("default");
// String charset = VCardConfig.DEFAULT_CHARSET;
// VCardEntryConstructor builder = new VCardEntryConstructor(charset, charset, false, vcardType, null);
String charset = VCardConfig.DEFAULT_INTERMEDIATE_CHARSET;
VCardEntryConstructor builder = new VCardEntryConstructor(vcardType, null,charset ,false);
EntryCreateDoneHandler entryCreateDoneHandler = new EntryCreateDoneHandler();
builder.addEntryHandler(entryCreateDoneHandler);
VCardSourceDetector detector = new VCardSourceDetector();
// do parsing work
parseVcardFile(content, charset, builder, detector);
}
class EntryCreateDoneHandler implements VCardEntryHandler {
public EntryCreateDoneHandler() {
}
public void onStart() {
}
public void onEntryCreated(VCardEntry contactStruct) {
NewContactDataReceivedActivity.this.contactStruct = contactStruct;
if(contactStruct != null){
setFields(contactStruct);
}else{
Log.e(TAG, "onEntryCreated: Entry is null");
}
// if (!contactStruct.isIgnorable()) {
// Log.d(TAG, "entryName:"+contactStruct.getDisplayName());
// Log.d(TAG, "entry:"+contactStruct);
// }
}
public void onEnd() {
}
}
private VCardEntry contactStruct = null;
OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
Button button = (Button) v;
switch (button.getId()) {
case R.id.save_a_new_contact:
Log.v(TAG, "save message Contact");
if(contactStruct != null){
contactStruct.pushIntoContentResolver(NewContactDataReceivedActivity.this.getContentResolver());//store the contact
}else{
Log.e(TAG, "save message Contact: Contact is null");
}
NewContactDataReceivedActivity.this.finish();
break;
case R.id.cancel_new_contact:
NewContactDataReceivedActivity.this.finish();
break;
default:
break;
}
}
};
private void setFields(VCardEntry entry) {
ListView listView = getListView();
List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map;
if (contactStruct != null) {
//name
String displayname = entry.getDisplayName();
if (!TextUtils.isEmpty(displayname)) {
map = new HashMap<String, String>();
map.put("field", "Dislayname:");
map.put("content", displayname);
list.add(map);
} else {
Log.d(TAG, "can't pattern Dislayname");
}
//number
List<PhoneData> phonelist = entry.getPhoneList();
if(phonelist != null && phonelist.size() > 0){
for(int x = 0; x < phonelist.size(); x++){
PhoneData phonedata = phonelist.get(x);
String lable = ContactsContract.CommonDataKinds.Phone.getTypeLabel(this.getResources(), phonedata.type, phonedata.label).toString();
map = new HashMap<String, String>();
map.put("field", lable+":");
map.put("content", phonedata.data);
list.add(map);
}
}else{
Log.d(TAG, "can't pattern Phone number");
}
//Email
List<EmailData> emaillist = entry.getEmailList();
if(emaillist != null && emaillist.size() > 0){
for(int x = 0; x < emaillist.size(); x++){
EmailData emaildata = emaillist.get(x);
String lable = ContactsContract.CommonDataKinds.Email.getTypeLabel(this.getResources(), emaildata.type, emaildata.label).toString();
map = new HashMap<String, String>();
map.put("field", lable+":");
map.put("content", emaildata.data);
list.add(map);
}
}else{
Log.d(TAG, "can't pattern Email");
}
//address
List<PostalData> postallist = entry.getPostalList();
if(postallist != null && postallist.size() > 0){
for(int x = 0; x < postallist.size(); x++){
PostalData postaldata = postallist.get(x);
String lable = ContactsContract.CommonDataKinds.StructuredPostal.getTypeLabel(this.getResources(), postaldata.type, postaldata.label).toString();
map = new HashMap<String, String>();
map.put("field", lable+":");
map.put("content", postaldata.getFormattedAddress(vcardType));
list.add(map);
}
}else{
Log.d(TAG, "can't pattern PostalData");
}
//birthday
String birthday = entry.getBirthday();
if(!TextUtils.isEmpty(birthday)){
// map = new HashMap<String, String>();
// map.put("field", "Birthday:");
// map.put("content", birthday);
// list.add(map);
}else{
Log.d(TAG, "can't pattern birthday");
}
// organization
List<OrganizationData> orglist = entry.getOrganizationList();
if(orglist != null && orglist.size() > 0){
for(int x = 0; x < orglist.size(); x++){
OrganizationData orgdata = orglist.get(x);
String lable = ContactsContract.CommonDataKinds.Organization.getTypeLabel(this.getResources(), orgdata.type, "").toString();
map = new HashMap<String, String>();
map.put("field", lable+":");
map.put("content", orgdata.getFormattedString());
list.add(map);
}
}else{
Log.v(TAG, "can't pattern Organization");
}
// title
// matcher = patternJobTitle.matcher(strOneContact);
// if (matcher.find()) {
// String job_title = matcher.group(1);
// map = new HashMap<String, String>();
// map.put("field", "Job title:");
// map.put("content", job_title);
// list.add(map);
// } else {
// Log.v(TAG, "can't pattern Job title");
// }
}else{
Log.e(TAG, "setFields: contactStruct is null!!");
}
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.received_contact_item,
new String[] {
"field", "content"
}, new int[] {
R.id.field, R.id.content
});
listView.setAdapter(adapter);
}
private String receivedMessage(Intent intent) {
Bundle bundle = intent.getExtras();
Log.v(TAG, "bundle:" + bundle.toString());
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
StringBuilder sb = new StringBuilder();
String content = null;
for (SmsMessage tmp : messages) {
/*
* String content = tmp.getDisplayMessageBody();
* Log.v(TAG,"1:"+content); Log.v(TAG,"2:"+tmp.getMessageBody());
* Log.v(TAG,"3:"+tmp.getMessageClass());
*/
Log.v(TAG, "4:" + tmp.getOriginatingAddress());
/*
* Log.v(TAG,"5:"+tmp.getPseudoSubject());
* Log.v(TAG,"6:"+tmp.getStatus());
* Log.v(TAG,"7:"+tmp.ENCODING_8BIT);
*/
content = new String(tmp.getUserData());
sb.append(content);
}
return sb.toString();
// Log.v(TAG,"content:"+sb.toString());
}
}