Merge "Add send message option to dialpad"
diff --git a/res/menu/dialpad_options.xml b/res/menu/dialpad_options.xml
index c6b5dda..6f0b5dd 100644
--- a/res/menu/dialpad_options.xml
+++ b/res/menu/dialpad_options.xml
@@ -17,16 +17,16 @@
     <item
         android:id="@+id/menu_add_contact"
         android:title="@string/add_contact"
-        android:showAsAction="withText"
-        android:orderInCategory="1" />
+        android:showAsAction="withText" />
     <item
         android:id="@+id/menu_2s_pause"
         android:title="@string/add_2sec_pause"
-        android:showAsAction="withText"
-        android:orderInCategory="1" />
+        android:showAsAction="withText" />
     <item
         android:id="@+id/menu_add_wait"
         android:title="@string/add_wait"
-        android:showAsAction="withText"
-        android:orderInCategory="1" />
+        android:showAsAction="withText" />
+    <item android:id="@+id/menu_send_message"
+        android:title="@string/menu_sendTextMessage"
+        android:showAsAction="withText" />
 </menu>
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index 418d54a..1adfeb8 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -21,6 +21,7 @@
 import android.app.Dialog;
 import android.app.DialogFragment;
 import android.app.Fragment;
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -260,6 +261,8 @@
     private boolean mFirstLaunch = false;
     private boolean mAnimate = false;
 
+    private ComponentName mSmsPackageComponentName;
+
     private static final String PREF_DIGITS_FILLED_BY_INTENT = "pref_digits_filled_by_intent";
 
     /**
@@ -392,8 +395,6 @@
 
         mOverflowMenuButton = mDialpadView.getOverflowMenuButton();
         mOverflowMenuButton.setOnClickListener(this);
-        final PopupMenu overflowMenu = buildOptionsMenu(mOverflowMenuButton);
-        mOverflowMenuButton.setOnTouchListener(overflowMenu.getDragToOpenListener());
 
         return fragmentView;
     }
@@ -654,6 +655,11 @@
         stopWatch.lap("bes");
 
         stopWatch.stopAndLog(TAG, 50);
+
+        mSmsPackageComponentName = DialerUtils.getSmsComponent(activity);
+
+        final PopupMenu overflowMenu = buildOptionsMenu(mOverflowMenuButton);
+        mOverflowMenuButton.setOnTouchListener(overflowMenu.getDragToOpenListener());
     }
 
     @Override
@@ -845,9 +851,12 @@
      *
      * @param invoker the View that invoked the options menu, to act as an anchor location.
      */
-    public PopupMenu buildOptionsMenu(View invoker) {
+    private PopupMenu buildOptionsMenu(View invoker) {
         final PopupMenu popupMenu = new PopupMenu(getActivity(), invoker);
         popupMenu.inflate(R.menu.dialpad_options);
+        final Menu menu = popupMenu.getMenu();
+        final MenuItem sendMessage = menu.findItem(R.id.menu_send_message);
+        sendMessage.setVisible(mSmsPackageComponentName != null);
         popupMenu.setOnMenuItemClickListener(this);
         return popupMenu;
     }
@@ -1407,17 +1416,25 @@
     @Override
     public boolean onMenuItemClick(MenuItem item) {
         switch (item.getItemId()) {
-            case R.id.menu_add_contact:
+            case R.id.menu_add_contact: {
                 final CharSequence digits = mDigits.getText();
                 DialerUtils.startActivityWithErrorToast(getActivity(),
                         DialtactsActivity.getAddNumberToContactIntent(digits));
                 return true;
+            }
             case R.id.menu_2s_pause:
                 updateDialString(PAUSE);
                 return true;
             case R.id.menu_add_wait:
                 updateDialString(WAIT);
                 return true;
+            case R.id.menu_send_message: {
+                final CharSequence digits = mDigits.getText();
+                final Intent smsIntent = new Intent(Intent.ACTION_SENDTO,
+                        Uri.fromParts(CallUtil.SCHEME_SMSTO, digits.toString(), null));
+                smsIntent.setComponent(mSmsPackageComponentName);
+                DialerUtils.startActivityWithErrorToast(getActivity(), smsIntent);
+            }
             default:
                 return false;
         }
diff --git a/src/com/android/dialer/util/DialerUtils.java b/src/com/android/dialer/util/DialerUtils.java
index 8b0c4c6..584caa9 100644
--- a/src/com/android/dialer/util/DialerUtils.java
+++ b/src/com/android/dialer/util/DialerUtils.java
@@ -16,12 +16,20 @@
 package com.android.dialer.util;
 
 import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.provider.Telephony;
 import android.widget.Toast;
 
+import com.android.contacts.common.CallUtil;
 import com.android.dialer.R;
 
+import java.util.List;
+
 /**
  * General purpose utility methods for the Dialer.
  */
@@ -54,4 +62,24 @@
             Toast.makeText(context, msgId, Toast.LENGTH_SHORT).show();
         }
     }
+
+    /**
+     * Returns the component name to use in order to send an SMS using the default SMS application,
+     * or null if none exists.
+     */
+    public static ComponentName getSmsComponent(Context context) {
+        String smsPackage = Telephony.Sms.getDefaultSmsPackage(context);
+        if (smsPackage != null) {
+            final PackageManager packageManager = context.getPackageManager();
+            final Intent intent = new Intent(Intent.ACTION_SENDTO,
+                    Uri.fromParts(CallUtil.SCHEME_SMSTO, "", null));
+            final List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0);
+            for (ResolveInfo resolveInfo : resolveInfos) {
+                if (smsPackage.equals(resolveInfo.activityInfo.packageName)) {
+                    return new ComponentName(smsPackage, resolveInfo.activityInfo.name);
+                }
+            }
+        }
+        return null;
+    }
 }