package edu.mit.mitmobile2.people; import java.util.Arrays; import java.util.Collections; import java.util.List; import android.app.AlertDialog; import android.content.ContentUris; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds; import android.provider.ContactsContract.Intents.Insert; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.TextView; import edu.mit.mitmobile2.CommonActions; import edu.mit.mitmobile2.LockingScrollView; import edu.mit.mitmobile2.NewModule; import edu.mit.mitmobile2.R; import edu.mit.mitmobile2.SliderInterface; import edu.mit.mitmobile2.SliderListNewModuleActivity; import edu.mit.mitmobile2.objs.PersonItem; import edu.mit.mitmobile2.objs.PersonItem.PersonDetailItem; import edu.mit.mitmobile2.objs.PersonItem.PersonDetailViewMode; public class PeopleDetailActivity extends SliderListNewModuleActivity { public static final String UID_KEY = "uid"; public static final String SEARCH_TERM_KEY = "search_term"; public static final String RECENTLY_VIEWED_FLAG = "show_recents"; private List<PersonItem> mPeople = Collections.emptyList(); private PersonItem mPersonToAddToContacts = null; private final static int EDIT_CONTACT = 0; private final static int EDIT_CONTACT_REQUEST = 1; private final static String EDIT_CONTACT_TEXT = "Add to existing"; private final static int NEW_CONTACT = 1; private final static String NEW_CONTACT_TEXT = "Create new contact"; private Context mContext; static void launchActivity(Context context, PersonItem item, int viewMode, String extras) { // load the activity that shows all the detail search results Intent intent = new Intent(context, PeopleDetailActivity.class); if(viewMode == PersonDetailViewMode.SEARCH) { intent.putExtra(PeopleDetailActivity.SEARCH_TERM_KEY, extras); } else { intent.putExtra(PeopleDetailActivity.RECENTLY_VIEWED_FLAG, true); } intent.putExtra(PeopleDetailActivity.UID_KEY, item.uid); PeopleModel.markAsRecentlyViewed(item, context); context.startActivity(intent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; Bundle extras = getIntent().getExtras(); if(extras != null) { List<PersonItem> people = null; if(extras.containsKey(SEARCH_TERM_KEY)) { String searchTerm = extras.getString(SEARCH_TERM_KEY); people = PeopleModel.executeLocalSearch(searchTerm); } else if(extras.containsKey(RECENTLY_VIEWED_FLAG)) { people = PeopleModel.getRecentlyViewed(this); } // check if results flushed from memory if (people == null) { finish(); return; } final String uid = extras.getString(UID_KEY); setPeople(people, uid); } } private void setPeople(List<PersonItem> people, String uid) { mPeople = people; int totalPersons = mPeople.size(); for(int index = 0; index < totalPersons; ++index) { PersonItem person = mPeople.get(index); String headerTitle = Integer.toString(index+1) + " of " + Integer.toString(totalPersons); addScreen(new PersonSliderInterface(person), headerTitle); } int position = PeopleModel.getPosition(mPeople, uid); setPosition(position); } private void populateAddContactIntent(Intent intent, PersonItem person, boolean editOrInsert) { // the data that the add contact screen accepts does not quite match // the structure of our data, so we do a reasonably good fit between the two // puts the full name in the firstname field (this is a limitation of android see link below) // http://groups.google.com/group/android-developers/browse_thread/thread/39615ba0bbcfc62b if(!editOrInsert) { intent.putExtra(Insert.NAME, person.getName()); } addFields(intent, person.phone, new String[] {Insert.PHONE, Insert.SECONDARY_PHONE, Insert.TERTIARY_PHONE}, new String[] {Insert.PHONE_TYPE, Insert.SECONDARY_PHONE_TYPE, Insert.TERTIARY_PHONE_TYPE}, CommonDataKinds.Phone.TYPE_WORK); addFields(intent, person.email, new String[] {Insert.EMAIL, Insert.SECONDARY_EMAIL, Insert.TERTIARY_EMAIL}, new String[] {Insert.EMAIL_TYPE, Insert.SECONDARY_EMAIL_TYPE, Insert.TERTIARY_EMAIL_TYPE}, CommonDataKinds.Email.TYPE_WORK); addField(intent, Insert.COMPANY, person.dept); addField(intent, Insert.JOB_TITLE, person.title); addField(intent, Insert.POSTAL, person.office); if(!person.office.isEmpty()) { intent.putExtra(Insert.POSTAL_TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode != 0) { Cursor result = getContentResolver().query(data.getData(), new String[] {ContactsContract.Contacts._ID}, null, null, null); result.moveToFirst(); int index = result.getColumnIndex(ContactsContract.Contacts._ID); long id = result.getLong(index); result.close(); Uri myPerson = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id); Intent intent = new Intent(Intent.ACTION_EDIT, myPerson); populateAddContactIntent(intent, mPersonToAddToContacts, true); startActivity(intent); } } private void addField(Intent intent, String extraField, List<String> values) { if(!values.isEmpty()) { intent.putExtra(extraField, values.get(0)); } } private void addFields(Intent intent, List<String> values, String[] fields, String[] fieldTypes, int fieldType) { for(int i = 0; i < 3; i++) { if(values.size() > i) { intent.putExtra(fields[i], values.get(0)); intent.putExtra(fieldTypes[i], fieldType); } } } private void addToContact() { final PersonItem person = mPeople.get(getPosition()); // create a dialog asking to create or add contact AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Add Contact"); builder.setItems(new String[] {EDIT_CONTACT_TEXT, NEW_CONTACT_TEXT}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if(which == EDIT_CONTACT) { Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); mPersonToAddToContacts = person; PeopleDetailActivity.this.startActivityForResult(intent, EDIT_CONTACT_REQUEST); } else if(which == NEW_CONTACT) { Intent intent = new Intent(Insert.ACTION, ContactsContract.Contacts.CONTENT_URI); populateAddContactIntent(intent, person, false); PeopleDetailActivity.this.startActivity(intent); } } } ); builder.setNegativeButton("Cancel", null); builder.create().show(); } private class PersonSliderInterface implements SliderInterface { private PersonItem mPerson; private View mMainLayout; private ViewGroup mListItemsLayout; PersonSliderInterface(PersonItem person) { mPerson = person; } @Override public void onSelected() { PeopleModel.markAsRecentlyViewed(mPerson, mContext); } @Override public View getView() { LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); mMainLayout = inflator.inflate(R.layout.people_detail, null); TextView nameView = (TextView) mMainLayout.findViewById(R.id.personName); nameView.setText(mPerson.getName()); View addContactBtn = mMainLayout.findViewById(R.id.personAddButton); addContactBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub addToContact(); } }); TextView titleView = (TextView) mMainLayout.findViewById(R.id.personTitle); if(mPerson.getTitle() != null) { titleView.setText(mPerson.getTitle()); } else { titleView.setVisibility(View.GONE); } mListItemsLayout = (ViewGroup) mMainLayout.findViewById(R.id.peopleDetailListItemsWrapper); List<PersonDetailItem> detailItems = mPerson.getPersonDetails(); for (final PersonDetailItem item : detailItems) { PeopleDetailItemLayout itemLayout = new PeopleDetailItemLayout(PeopleDetailActivity.this); itemLayout.setContentType(item.getType()); itemLayout.setContentValue(item.getValue()); String type = item.getType(); if (hasAction(type)) { itemLayout.setActionIconResource(getActionIconResourceId(item.getType())); itemLayout.setOnItemClickListener(new OnClickListener() { @Override public void onClick(View view) { performAction(item); } }); } else { itemLayout.hideActionIcon(); } mListItemsLayout.addView(itemLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); } return mMainLayout; } @Override public void updateView() { // all the populating of view is done in the constructor } @Override public LockingScrollView getVerticalScrollView() { return null; } @Override public void onDestroy() { // TODO Auto-generated method stub } } @Override public boolean isModuleHomeActivity() { return false; } @Override protected NewModule getNewModule() { // TODO Auto-generated method stub return new PeopleModule(); } @Override protected void onOptionSelected(String optionId) { // TODO Auto-generated method stub } private boolean hasAction(String type) { List<String> typesWithActions = Arrays.asList("email", "phone", "office"); return typesWithActions.contains(type); } private void performAction(PersonDetailItem item) { if(item.getType().equals("email")) { CommonActions.composeEmail(mContext, item.getValue()); } else if(item.getType().equals("phone")) { CommonActions.callPhone(mContext, item.getValue()); } else if(item.getType().equals("office")) { CommonActions.searchMap(mContext, item.getValue()); } } private int getActionIconResourceId(String type) { if (type.equals("email")) { return R.drawable.action_email; } else if(type.equals("phone")) { return R.drawable.action_phone; } else if(type.equals("office")) { return R.drawable.action_map; } return -1; } }