diff --git a/core/java/com/android/internal/widget/EditStyledText.java b/core/java/com/android/internal/widget/EditStyledText.java
index b7af4e4..1eba5c2 100644
--- a/core/java/com/android/internal/widget/EditStyledText.java
+++ b/core/java/com/android/internal/widget/EditStyledText.java
@@ -16,6 +16,8 @@
 
 package com.android.internal.widget;
 
+import java.util.ArrayList;
+
 import android.app.AlertDialog.Builder;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -323,7 +325,7 @@
     }
 
     /**
-     * Check editing is started.
+     * Check whether editing is started or not.
      * 
      * @return Whether editing is started or not.
      */
@@ -331,6 +333,11 @@
         return mManager.isEditting();
     }
 
+    /**
+     * Check whether SoftKey is Blocked or not.
+     * 
+     * @return whether SoftKey is Blocked or not.
+     */
     public boolean isSoftKeyBlocked() {
         return mManager.isSoftKeyBlocked();
     }
@@ -353,6 +360,15 @@
         return mManager.getSelectState();
     }
 
+    @Override
+    public Bundle getInputExtras(boolean create) {
+        Bundle bundle = super.getInputExtras(create);
+        if (bundle != null) {
+            bundle.putBoolean("allowEmoji", true);
+        }
+        return bundle;
+    }
+
     /**
      * Get the state of the selection.
      * 
@@ -363,6 +379,18 @@
     }
 
     /**
+     * Get the state of the selection.
+     * 
+     * @param uris
+     *            The array of used uris.
+     * @return The state of the selection.
+     */
+    public String getHtml(ArrayList<Uri> uris) {
+        mConverter.getUriArray(uris, this.getText());
+        return mConverter.getConvertedBody();
+    }
+
+    /**
      * Initialize members.
      */
     private void init() {
@@ -423,15 +451,6 @@
         }
     }
 
-    @Override
-    public Bundle getInputExtras(boolean create) {
-        Bundle bundle = super.getInputExtras(create);
-        if (bundle != null) {
-            bundle.putBoolean("allowEmoji", true);
-        }
-        return bundle;
-    }
-
     /**
      * EditorManager manages the flow and status of editing actions.
      */
@@ -1011,6 +1030,27 @@
             }
             return htmlBody;
         }
+
+        public void getUriArray(ArrayList<Uri> uris, Editable text) {
+            uris.clear();
+            if (DBG) {
+                Log.d(LOG_TAG, "--- getUriArray:");
+            }
+            int len = text.length();
+            int next;
+            for (int i = 0; i < text.length(); i = next) {
+                next = text.nextSpanTransition(i, len, ImageSpan.class);
+                ImageSpan[] images = text.getSpans(i, next, ImageSpan.class);
+                for (int j = 0; j < images.length; j++) {
+                    if (DBG) {
+                        Log.d(LOG_TAG, "--- getUriArray: foundArray" +
+                                ((ImageSpan) images[j]).getSource());
+                    }
+                    uris.add(Uri.parse(
+                            ((ImageSpan) images[j]).toString()));
+                }
+            }
+        }
     }
 
     private class StyledTextToast {
