auto import from //branches/cupcake/...@130745
diff --git a/src/com/android/contacts/ContactsGroupSyncSelector.java b/src/com/android/contacts/ContactsGroupSyncSelector.java
index 6081c79..80b5166 100644
--- a/src/com/android/contacts/ContactsGroupSyncSelector.java
+++ b/src/com/android/contacts/ContactsGroupSyncSelector.java
@@ -112,6 +112,12 @@
             }
             
             case R.id.ok: {
+                // The list isn't setup yet, so just return without doing anything.
+                if (mChecked == null) {
+                    finish();
+                    return;
+                }
+
                 final ContentResolver resolver = getContentResolver();
                 if (mSyncAllGroups) {
                     // For now we only support a single account and the UI doesn't know what
diff --git a/src/com/android/contacts/DialtactsActivity.java b/src/com/android/contacts/DialtactsActivity.java
index 1933c4c..d3f8981 100644
--- a/src/com/android/contacts/DialtactsActivity.java
+++ b/src/com/android/contacts/DialtactsActivity.java
@@ -176,6 +176,14 @@
             finish();
             return;
         }
+        
+        // Dismiss menu provided by any children activites
+        Activity activity = getLocalActivityManager().
+                getActivity(mTabHost.getCurrentTabTag());
+        if (activity != null) {
+            activity.closeOptionsMenu();
+        }
+
         intent.putExtra(EXTRA_IGNORE_STATE, true);
         if (intent.getComponent().getClassName().equals(getClass().getName())) {
             if (recentCallsRequest) {
diff --git a/src/com/android/contacts/EditContactActivity.java b/src/com/android/contacts/EditContactActivity.java
index fb8dd70..d34713d 100644
--- a/src/com/android/contacts/EditContactActivity.java
+++ b/src/com/android/contacts/EditContactActivity.java
@@ -170,7 +170,6 @@
     
     private EditText mNameView;
     private ImageView mPhotoImageView;
-    private View mPhotoButton;
     private CheckBox mSendToVoicemailCheckBox;
     private LinearLayout mLayout;
     private LayoutInflater mInflater;
@@ -198,7 +197,6 @@
 
     public void onClick(View v) {
         switch (v.getId()) {
-            case R.id.photoButton:
             case R.id.photoImage: {
                 doPickPhotoAction();
                 break;
@@ -252,9 +250,17 @@
     }
 
     private void setPhotoPresent(boolean present) {
-        mPhotoImageView.setVisibility(present ? View.VISIBLE : View.GONE);
-        mPhotoButton.setVisibility(present ? View.GONE : View.VISIBLE);
         mPhotoPresent = present;
+        
+        // Correctly scale the contact photo if present, otherwise just center
+        // the photo placeholder icon.
+        if (mPhotoPresent) {
+            mPhotoImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+        } else {
+            mPhotoImageView.setImageResource(R.drawable.ic_menu_add_picture);
+            mPhotoImageView.setScaleType(ImageView.ScaleType.CENTER);
+        }
+        
         if (mPhotoMenuItem != null) {
             if (present) {
                 mPhotoMenuItem.setTitle(R.string.removePicture);
@@ -312,9 +318,6 @@
         mNameView = (EditText) findViewById(R.id.name);
         mPhotoImageView = (ImageView) findViewById(R.id.photoImage);
         mPhotoImageView.setOnClickListener(this);
-        mPhotoImageView.setVisibility(View.GONE);
-        mPhotoButton = findViewById(R.id.photoButton);
-        mPhotoButton.setOnClickListener(this);
         mSendToVoicemailCheckBox = (CheckBox) findViewById(R.id.send_to_voicemail);
         mPhoneticNameView = (EditText) findViewById(R.id.phonetic_name);
 
@@ -340,6 +343,7 @@
                     buildEntriesForEdit(getIntent().getExtras());
                     buildViews();
                 }
+                setTitle(R.string.editContact_title_edit);
                 mState = STATE_EDIT;
             } else if (action.equals(Intent.ACTION_INSERT)) {
                 if (icicle == null) {
@@ -347,6 +351,7 @@
                     buildEntriesForInsert(getIntent().getExtras());
                     buildViews();
                 }
+                setTitle(R.string.editContact_title_insert);
                 mState = STATE_INSERT;
                 mInsert = true;
             }
@@ -459,7 +464,7 @@
         }
         return super.onKeyDown(keyCode, event);
     }
-
+    
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
@@ -549,7 +554,6 @@
     private void doRemovePhotoAction() {
         mPhoto = null;
         mPhotoChanged = true;
-        mPhotoImageView.setImageResource(R.drawable.ic_contact_picture);
         setPhotoPresent(false);
     }
     
@@ -593,8 +597,9 @@
     }
 
     private void updateRingtoneView(EditEntry entry) {
+        String ringtoneName;
         if (entry.data == null) {
-            updateDataView(entry, getString(R.string.default_ringtone));
+            ringtoneName = getString(R.string.default_ringtone);
         } else {
             Uri ringtoneUri = Uri.parse(entry.data);
             Ringtone ringtone = RingtoneManager.getRingtone(this, ringtoneUri);
@@ -602,8 +607,12 @@
                 Log.w(TAG, "ringtone's URI doesn't resolve to a Ringtone");
                 return;
             }
-            updateDataView(entry, ringtone.getTitle(this));
+            ringtoneName = ringtone.getTitle(this);
         }
+        
+        // Build actual "Ringtone: Default" string that is assigned to spinner.
+        String text = getString(R.string.ringtone_spinner, ringtoneName);
+        updateDataView(entry, text);
     }
     
     private void updateDataView(EditEntry entry, String text) {
@@ -1456,11 +1465,11 @@
         final LinearLayout layout = mLayout;
         layout.removeAllViews();
 
-        buildViewsForSection(layout, mPhoneEntries, R.string.listSeparatorCallNumber);
-        buildViewsForSection(layout, mEmailEntries, R.string.listSeparatorSendEmail);
-        buildViewsForSection(layout, mImEntries, R.string.listSeparatorSendIm);
-        buildViewsForSection(layout, mPostalEntries, R.string.listSeparatorMapAddress);
-        buildViewsForSection(layout, mOtherEntries, R.string.listSeparatorOtherInformation);
+        buildViewsForSection(layout, mPhoneEntries, R.string.listSeparatorCallNumber_edit);
+        buildViewsForSection(layout, mEmailEntries, R.string.listSeparatorSendEmail_edit);
+        buildViewsForSection(layout, mImEntries, R.string.listSeparatorSendIm_edit);
+        buildViewsForSection(layout, mPostalEntries, R.string.listSeparatorMapAddress_edit);
+        buildViewsForSection(layout, mOtherEntries, R.string.listSeparatorOtherInformation_edit);
     }
 
 
@@ -1530,7 +1539,7 @@
         // Bind data
         TextView data = (TextView) view.findViewById(R.id.data);
         TextView data2 = (TextView) view.findViewById(R.id.data2);
-
+        
         if (data instanceof Button) {
             data.setOnClickListener(this);
         }
diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java
index 4690b12..3a177b2 100644
--- a/src/com/android/contacts/ViewContactActivity.java
+++ b/src/com/android/contacts/ViewContactActivity.java
@@ -576,7 +576,16 @@
         separator.data = getString(R.string.listSeparatorOtherInformation);
         mOtherEntries.add(separator);
     }
-    
+
+    private Uri constructImToUrl(String host, String data) {
+	    // don't encode the url, because the Activity Manager can't find using the encoded url
+        StringBuilder buf = new StringBuilder("imto://");
+        buf.append(host);
+        buf.append('/');
+        buf.append(data);
+        return Uri.parse(buf.toString());
+    }
+
     /**
      * Build up the entries to display on the screen.
      * 
@@ -701,12 +710,11 @@
                     case Contacts.KIND_IM: {
                         Object protocolObj = ContactMethods.decodeImProtocol(
                                 methodsCursor.getString(METHODS_AUX_DATA_COLUMN));
-                        String providerCategory;
+                        String host;
                         if (protocolObj instanceof Number) {
                             int protocol = ((Number) protocolObj).intValue();
                             entry.label = protocolStrings[protocol];
-                            providerCategory = ContactMethods.lookupProviderCategoryFromId(
-                                    protocol);
+                            host = ContactMethods.lookupProviderNameFromId(protocol).toLowerCase();
                             if (protocol == ContactMethods.PROTOCOL_GOOGLE_TALK
                                     || protocol == ContactMethods.PROTOCOL_MSN) {
                                 entry.maxLabelLines = 2;
@@ -714,14 +722,12 @@
                         } else {
                             String providerName = (String) protocolObj;
                             entry.label = providerName;
-                            providerCategory = Im.Provider.getProviderCategoryFromName(
-                                    providerName);
+                            host = providerName.toLowerCase();
                         }
 
-                        // Only add the intent if there is a valid provider name
-                        if (!TextUtils.isEmpty(providerCategory)) {
-                            entry.intent = new Intent(Intent.ACTION_SENDTO,
-                                    Uri.fromParts("im", data, null)).addCategory(providerCategory);
+                        // Only add the intent if there is a valid host
+                        if (!TextUtils.isEmpty(host)) {
+                            entry.intent = new Intent(Intent.ACTION_SENDTO, constructImToUrl(host, data));
                         }
                         entry.data = data;
                         if (!methodsCursor.isNull(METHODS_STATUS_COLUMN)) {
@@ -755,26 +761,25 @@
                     String label;
                     Object protocolObj = ContactMethods.decodeImProtocol(
                             presenceCursor.getString(1));
-                    String providerCategory;
+                    String host;
                     if (protocolObj instanceof Number) {
                         int protocol = ((Number) protocolObj).intValue();
                         label = getResources().getStringArray(
                                 android.R.array.imProtocols)[protocol];
-                        providerCategory = ContactMethods.lookupProviderCategoryFromId(
-                                protocol);
+                        host = ContactMethods.lookupProviderNameFromId(protocol).toLowerCase();
                     } else {
                         String providerName = (String) protocolObj;
                         label = providerName;
-                        providerCategory = Im.Provider.getProviderCategoryFromName(providerName);
+                        host = providerName.toLowerCase();
                     }
 
-                    if (TextUtils.isEmpty(providerCategory)) {
+                    if (TextUtils.isEmpty(host)) {
                         // A valid provider name is required
                         continue;
                     }
 
-                    Intent intent = new Intent(Intent.ACTION_SENDTO,
-                            Uri.fromParts("im", data, null)).addCategory(providerCategory);
+
+                    Intent intent = new Intent(Intent.ACTION_SENDTO, constructImToUrl(host, data));
 
                     // Check to see if there is already an entry for this IM account
                     boolean addEntry = true;