package com.android.mms.ui;
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.Activity;
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.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.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 NewContactReceivedActivity extends ListActivity{
private static final String TAG = "NewContactReceivedActivity";
//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);
//addView();
setFields(content);
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);
}
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");
ContentValues values = new ContentValues();
//������RawContacts.CONTENT_URIִ��һ����ֵ���룬Ŀ���ǻ�ȡϵͳ���ص�rawContactId
Uri rawContactUri = NewContactReceivedActivity.this.getContentResolver().insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
//��data������������
if(NewContactReceivedActivity.this.fullname != null){
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.DISPLAY_NAME, NewContactReceivedActivity.this.fullname);
NewContactReceivedActivity.this.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
}
//������ �� ��
if(NewContactReceivedActivity.this.firstname != null && NewContactReceivedActivity.this.lastname != null){
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.DISPLAY_NAME, NewContactReceivedActivity.this.firstname + " " + NewContactReceivedActivity.this.lastname );
NewContactReceivedActivity.this.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
}
//��data���� cell
if(NewContactReceivedActivity.this.cell != null){
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, NewContactReceivedActivity.this.cell);
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
NewContactReceivedActivity.this.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
}
//��data���� home phone
if(NewContactReceivedActivity.this.homephone != null){
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, NewContactReceivedActivity.this.homephone);
values.put(Phone.TYPE, Phone.TYPE_HOME);
NewContactReceivedActivity.this.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
}
//��data���� fax
if(NewContactReceivedActivity.this.fax != null){
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, NewContactReceivedActivity.this.fax);
values.put(Phone.TYPE, Phone.TYPE_FAX_WORK);
NewContactReceivedActivity.this.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
}
//��data���� office phone
if(NewContactReceivedActivity.this.officephone != null){
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, NewContactReceivedActivity.this.officephone);
values.put(Phone.TYPE, Phone.TYPE_WORK_MOBILE);
NewContactReceivedActivity.this.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
}
//��data����Email����
if(NewContactReceivedActivity.this.email != null){
values.clear();
values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
values.put(Email.DATA, NewContactReceivedActivity.this.email);
values.put(Email.TYPE, Email.TYPE_WORK);
NewContactReceivedActivity.this.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
}
NewContactReceivedActivity.this.finish();
break;
case R.id.cancel_new_contact:
NewContactReceivedActivity.this.finish();
break;
default:
break;
}
}
};
private String fullname = null, firstname= null, lastname= null, homephone = null,
address = null, cell = null, email = null, fax = null, officephone = null, otherphonenumber = null;
private void setFields(String content){
ListView listView = getListView();
Matcher matcherVCard = patternVCard.matcher(content);
Matcher matcher ;
List<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();
HashMap<String, String> map ;
while(matcherVCard.find()){
String strOneContact = matcherVCard.group(0);
System.out.println("strOneContact:"+strOneContact);
//pattern full name
matcher = patternFullName.matcher(strOneContact);
if(matcher.find()){
fullname = matcher.group(1);
map = new HashMap<String, String>();
map.put("field", "Fullname:");
map.put("content", fullname);
list.add(map);
}else{
Log.v(TAG, "can't pattern FullName");
}
//pattern name
matcher = patternName.matcher(strOneContact);
if(matcher.find()){
firstname = matcher.group(1);
lastname = matcher.group(2);
if (lastname == null) {
lastname = "";
}
map = new HashMap<String, String>();
map.put("field", "Firstname:");
map.put("content", firstname);
list.add(map);
map = new HashMap<String, String>();
map.put("field", "Lastname:");
map.put("content", lastname);
list.add(map);
}else{
Log.v(TAG, "can't pattern Name");
}
//cell phone number
matcher = patternCell.matcher(strOneContact);
if(matcher.find()){
Log.v(TAG, "patternCell's result is " + matcher.group());
cell = matcher.group(3);
map = new HashMap<String, String>();
map.put("field", "Cell:");
map.put("content", cell);
list.add(map);
}else{
Log.v(TAG, "can't PhoneCell number");
}
//home phone number
matcher = patternHomePhone.matcher(strOneContact);
if(matcher.find()){
homephone = matcher.group(2);
map = new HashMap<String, String>();
map.put("field", "Home phone:");
map.put("content", homephone);
list.add(map);
}else{
Log.v(TAG, "can't pattern HomePhone number");
}
//office phone number
matcher = patternOfficePhone.matcher(strOneContact);
if(matcher.find()){
officephone = matcher.group(2);
map = new HashMap<String, String>();
map.put("field", "Office phone:");
map.put("content", officephone);
list.add(map);
}else {
Log.v(TAG, "can't pattern HomePhone number");
}
//other number
matcher = patternOtherPhone.matcher(strOneContact);
if(matcher.find()){
otherphonenumber = matcher.group(2);
map = new HashMap<String, String>();
map.put("field", "Other phone number:");
map.put("content", otherphonenumber);
list.add(map);
}else {
Log.v(TAG, "can't pattern Other Phone number");
}
//email
matcher = patternEmail.matcher(strOneContact);
if(matcher.find()){
email = matcher.group(2);
map = new HashMap<String, String>();
map.put("field", "Email:");
map.put("content", email);
list.add(map);
}else{
Log.v(TAG, "can't pattern Email");
}
//fax
matcher = patternFax.matcher(strOneContact);
if(matcher.find()){
fax = matcher.group(2);
map = new HashMap<String, String>();
map.put("field", "Fax:");
map.put("content", fax);
list.add(map);
}else {
Log.v(TAG, "can't pattern Fax");
}
//address
matcher = patternAddress.matcher(strOneContact);
if(matcher.find()){
address = matcher.group(2);
map = new HashMap<String, String>();
map.put("field", "Address:");
map.put("content", address);
list.add(map);
}else{
Log.v(TAG, "can't pattern Address");
}
//birthday
matcher = patternBirthday.matcher(strOneContact);
if(matcher.find()){
String year = matcher.group(1);
String month = matcher.group(2);
String day = matcher.group(3);
map = new HashMap<String, String>();
map.put("field", "Birthday:");
map.put("content", year + "-" + month + "-" + day);
list.add(map);
}else{
Log.v(TAG, "can't pattern Birthday");
}
//organization
matcher = patternOrganization.matcher(strOneContact);
if(matcher.find()){
String organization = matcher.group(1);
map = new HashMap<String, String>();
map.put("field", "Organization:");
map.put("content", organization);
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");
}
}
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());
}
}