QC Share and Add to Homescreen menuitem impl

Implementation taken from the ContactLoaderFragment

Change-Id: I24fd1d2b1178f4ed29e2d34409383022d1252ba2
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 1e703a0..9d3846c 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -21,11 +21,11 @@
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ActivityNotFoundException;
 import android.content.ContentUris;
 import android.content.Intent;
 import android.content.Loader;
 import android.content.pm.PackageManager;
-import android.content.res.ColorStateList;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.graphics.drawable.BitmapDrawable;
@@ -37,11 +37,13 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Trace;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.QuickContact;
 import android.provider.ContactsContract.RawContacts;
 import android.support.v7.graphics.Palette;
@@ -63,6 +65,8 @@
 import com.android.contacts.R;
 import com.android.contacts.common.editor.SelectAccountDialogFragment;
 import com.android.contacts.common.lettertiles.LetterTileDrawable;
+import com.android.contacts.common.list.ShortcutIntentBuilder;
+import com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.Contact;
 import com.android.contacts.common.model.ContactLoader;
@@ -79,7 +83,6 @@
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.ContactInteraction;
 import com.android.contacts.interactions.SmsInteractionsLoader;
-import com.android.contacts.quickcontact.Action;
 import com.android.contacts.quickcontact.ExpandingEntryCardView.Entry;
 import com.android.contacts.util.ImageViewDrawableSetter;
 import com.android.contacts.util.SchedulingUtils;
@@ -120,6 +123,9 @@
     private static final float SYSTEM_BAR_BRIGHTNESS_FACTOR = 0.7f;
     private static final int SHIM_COLOR = Color.argb(0x7F, 0, 0, 0);
 
+    /** This is the Intent action to install a shortcut in the launcher. */
+    private static final String ACTION_INSTALL_SHORTCUT =
+            "com.android.launcher.action.INSTALL_SHORTCUT";
 
     @SuppressWarnings("deprecation")
     private static final String LEGACY_AUTHORITY = android.provider.Contacts.AUTHORITY;
@@ -960,6 +966,74 @@
         }
     }
 
+    /**
+     * Calls into the contacts provider to get a pre-authorized version of the given URI.
+     */
+    private Uri getPreAuthorizedUri(Uri uri) {
+        final Bundle uriBundle = new Bundle();
+        uriBundle.putParcelable(ContactsContract.Authorization.KEY_URI_TO_AUTHORIZE, uri);
+        final Bundle authResponse = getContentResolver().call(
+                ContactsContract.AUTHORITY_URI,
+                ContactsContract.Authorization.AUTHORIZATION_METHOD,
+                null,
+                uriBundle);
+        if (authResponse != null) {
+            return (Uri) authResponse.getParcelable(
+                    ContactsContract.Authorization.KEY_AUTHORIZED_URI);
+        } else {
+            return uri;
+        }
+    }
+    private void shareContact() {
+        final String lookupKey = mContactData.getLookupKey();
+        Uri shareUri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookupKey);
+        if (mContactData.isUserProfile()) {
+            // User is sharing the profile.  We don't want to force the receiver to have
+            // the highly-privileged READ_PROFILE permission, so we need to request a
+            // pre-authorized URI from the provider.
+            shareUri = getPreAuthorizedUri(shareUri);
+        }
+
+        final Intent intent = new Intent(Intent.ACTION_SEND);
+        intent.setType(Contacts.CONTENT_VCARD_TYPE);
+        intent.putExtra(Intent.EXTRA_STREAM, shareUri);
+
+        // Launch chooser to share contact via
+        final CharSequence chooseTitle = getText(R.string.share_via);
+        final Intent chooseIntent = Intent.createChooser(intent, chooseTitle);
+
+        try {
+            this.startActivity(chooseIntent);
+        } catch (ActivityNotFoundException ex) {
+            Toast.makeText(this, R.string.share_error, Toast.LENGTH_SHORT).show();
+        }
+    }
+
+    /**
+     * Creates a launcher shortcut with the current contact.
+     */
+    private void createLauncherShortcutWithContact() {
+        final ShortcutIntentBuilder builder = new ShortcutIntentBuilder(this,
+                new OnShortcutIntentCreatedListener() {
+
+                    @Override
+                    public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
+                        // Broadcast the shortcutIntent to the launcher to create a
+                        // shortcut to this contact
+                        shortcutIntent.setAction(ACTION_INSTALL_SHORTCUT);
+                        QuickContactActivity.this.sendBroadcast(shortcutIntent);
+
+                        // Send a toast to give feedback to the user that a shortcut to this
+                        // contact was added to the launcher.
+                        Toast.makeText(QuickContactActivity.this,
+                                R.string.createContactShortcutSuccessful,
+                                Toast.LENGTH_SHORT).show();
+                    }
+
+                });
+        builder.createContactShortcutIntent(mLookupUri);
+    }
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         MenuInflater inflater = getMenuInflater();
@@ -1005,6 +1079,12 @@
                     editContact();
                 }
                 return true;
+            case R.id.menu_share:
+                shareContact();
+                return true;
+            case R.id.menu_create_contact_shortcut:
+                createLauncherShortcutWithContact();
+                return true;
             default:
                 return super.onOptionsItemSelected(item);
         }