FP2-674: The search result is wrong when search for "%" in Messaging

Change-Id: I51df82d50872bd51615af35a47a9d78abaafa524
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index 680bd08..205cce1 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -337,6 +337,8 @@
 
     private boolean mUseStrictPhoneNumberComparation;
 
+    private static boolean mIsEscape = false;
+
     @Override
     public boolean onCreate() {
         setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
@@ -347,6 +349,18 @@
         return true;
     }
 
+    public static String sqliteEscape(String keyWord) {
+        String specialStr[] = {"/", "'", "[", "]", "%", "&", "_", "(", ")"};
+        for(int i = 0; i < specialStr.length; i++) {
+            if(keyWord.contains(specialStr[i])) {
+                mIsEscape = true;
+                keyWord = keyWord.replace(specialStr[i], "/" + specialStr[i]);
+            }
+        }
+        return keyWord;
+    }
+
+
     @Override
     public Cursor query(Uri uri, String[] projection,
             String selection, String[] selectionArgs, String sortOrder) {
@@ -475,10 +489,30 @@
                             "with this query");
                 }
 
-                String searchString = "%" + uri.getQueryParameter("pattern") + "%";
-
+                String searchString = "%" + sqliteEscape(uri.getQueryParameter("pattern")) + "%";
+                String ESCAPE = "";
+                if(mIsEscape) {
+                    ESCAPE = "ESCAPE '/'";
+                } else {
+                    ESCAPE = "";
+                }
+                mIsEscape = false;
+                String smsMmsQuery = "SELECT sms._id AS _id,thread_id,address,body,date,date_sent,index_text,words._id " +
+                                "FROM sms,words WHERE (index_text LIKE ? " + ESCAPE +
+                                "AND sms._id=words.source_id AND words.table_to_use=1)" +
+                                " UNION " +
+                                "SELECT pdu._id,thread_id,addr.address,part.text " +
+                                "AS body,pdu.date,pdu.date_sent,index_text,words._id " +
+                                "FROM pdu,part,addr,words WHERE ((part.mid=pdu._id) AND " +
+                                "(addr.msg_id=pdu._id) AND " +
+                                "(addr.type=" + PduHeaders.TO + ") AND " +
+                                "(part.ct='text/plain') AND " +
+                                "(index_text LIKE ? " + ESCAPE +") AND " +
+                                "(part._id = words.source_id) AND " +
+                                "(words.table_to_use=2))" +
+                                " GROUP BY thread_id ORDER BY thread_id ASC, date DESC";
                 try {
-                    cursor = db.rawQuery(SMS_MMS_QUERY, new String[] { searchString, searchString });
+                    cursor = db.rawQuery(smsMmsQuery, new String[] { searchString, searchString });
                 } catch (Exception ex) {
                     Log.e(LOG_TAG, "got exception: " + ex.toString());
                 }