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());
}