13239889e9a417617b755d4cde22070843e5c070bTom Taylor/* 23239889e9a417617b755d4cde22070843e5c070bTom Taylor * Copyright (C) 2009 The Android Open Source Project 33239889e9a417617b755d4cde22070843e5c070bTom Taylor * 43239889e9a417617b755d4cde22070843e5c070bTom Taylor * Licensed under the Apache License, Version 2.0 (the "License"); 53239889e9a417617b755d4cde22070843e5c070bTom Taylor * you may not use this file except in compliance with the License. 63239889e9a417617b755d4cde22070843e5c070bTom Taylor * You may obtain a copy of the License at 73239889e9a417617b755d4cde22070843e5c070bTom Taylor * 83239889e9a417617b755d4cde22070843e5c070bTom Taylor * http://www.apache.org/licenses/LICENSE-2.0 93239889e9a417617b755d4cde22070843e5c070bTom Taylor * 103239889e9a417617b755d4cde22070843e5c070bTom Taylor * Unless required by applicable law or agreed to in writing, software 113239889e9a417617b755d4cde22070843e5c070bTom Taylor * distributed under the License is distributed on an "AS IS" BASIS, 123239889e9a417617b755d4cde22070843e5c070bTom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133239889e9a417617b755d4cde22070843e5c070bTom Taylor * See the License for the specific language governing permissions and 143239889e9a417617b755d4cde22070843e5c070bTom Taylor * limitations under the License. 153239889e9a417617b755d4cde22070843e5c070bTom Taylor */ 163239889e9a417617b755d4cde22070843e5c070bTom Taylor 173239889e9a417617b755d4cde22070843e5c070bTom Taylorpackage com.android.mms.util; 183239889e9a417617b755d4cde22070843e5c070bTom Taylor 193239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.content.ContentResolver; 203239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.content.ContentUris; 213239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.content.Context; 223239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.content.SharedPreferences; 233239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.database.Cursor; 24d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.database.sqlite.SqliteWrapper; 253239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.net.Uri; 263239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.preference.PreferenceManager; 273239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.provider.BaseColumns; 28f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony; 29f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms; 30f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms; 31f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms.Conversations; 323239889e9a417617b755d4cde22070843e5c070bTom Taylorimport android.util.Log; 333239889e9a417617b755d4cde22070843e5c070bTom Taylor 34d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.MmsConfig; 35d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.ui.MessageUtils; 36d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.ui.MessagingPreferenceActivity; 37d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen 383239889e9a417617b755d4cde22070843e5c070bTom Taylor/** 393239889e9a417617b755d4cde22070843e5c070bTom Taylor * The recycler is responsible for deleting old messages. 403239889e9a417617b755d4cde22070843e5c070bTom Taylor */ 413239889e9a417617b755d4cde22070843e5c070bTom Taylorpublic abstract class Recycler { 423239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final boolean LOCAL_DEBUG = false; 433239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final String TAG = "Recycler"; 443239889e9a417617b755d4cde22070843e5c070bTom Taylor 453239889e9a417617b755d4cde22070843e5c070bTom Taylor // Default preference values 463239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final boolean DEFAULT_AUTO_DELETE = false; 473239889e9a417617b755d4cde22070843e5c070bTom Taylor 48512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor private static SmsRecycler sSmsRecycler; 49512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor private static MmsRecycler sMmsRecycler; 5053a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 51512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor public static SmsRecycler getSmsRecycler() { 523239889e9a417617b755d4cde22070843e5c070bTom Taylor if (sSmsRecycler == null) { 533239889e9a417617b755d4cde22070843e5c070bTom Taylor sSmsRecycler = new SmsRecycler(); 543239889e9a417617b755d4cde22070843e5c070bTom Taylor } 553239889e9a417617b755d4cde22070843e5c070bTom Taylor return sSmsRecycler; 563239889e9a417617b755d4cde22070843e5c070bTom Taylor } 573239889e9a417617b755d4cde22070843e5c070bTom Taylor 58512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor public static MmsRecycler getMmsRecycler() { 593239889e9a417617b755d4cde22070843e5c070bTom Taylor if (sMmsRecycler == null) { 603239889e9a417617b755d4cde22070843e5c070bTom Taylor sMmsRecycler = new MmsRecycler(); 613239889e9a417617b755d4cde22070843e5c070bTom Taylor } 623239889e9a417617b755d4cde22070843e5c070bTom Taylor return sMmsRecycler; 633239889e9a417617b755d4cde22070843e5c070bTom Taylor } 6453a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 65f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor public static boolean checkForThreadsOverLimit(Context context) { 66f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor Recycler smsRecycler = getSmsRecycler(); 67f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor Recycler mmsRecycler = getMmsRecycler(); 68f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor 69f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor return smsRecycler.anyThreadOverLimit(context) || mmsRecycler.anyThreadOverLimit(context); 70f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 71f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor 723239889e9a417617b755d4cde22070843e5c070bTom Taylor public void deleteOldMessages(Context context) { 733239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 743239889e9a417617b755d4cde22070843e5c070bTom Taylor Log.v(TAG, "Recycler.deleteOldMessages this: " + this); 753239889e9a417617b755d4cde22070843e5c070bTom Taylor } 763239889e9a417617b755d4cde22070843e5c070bTom Taylor if (!isAutoDeleteEnabled(context)) { 773239889e9a417617b755d4cde22070843e5c070bTom Taylor return; 783239889e9a417617b755d4cde22070843e5c070bTom Taylor } 793239889e9a417617b755d4cde22070843e5c070bTom Taylor 803239889e9a417617b755d4cde22070843e5c070bTom Taylor Cursor cursor = getAllThreads(context); 813239889e9a417617b755d4cde22070843e5c070bTom Taylor try { 8207d483e5da80176484bff536d118cc061f28e586Tom Taylor int limit = getMessageLimit(context); 833239889e9a417617b755d4cde22070843e5c070bTom Taylor while (cursor.moveToNext()) { 843239889e9a417617b755d4cde22070843e5c070bTom Taylor long threadId = getThreadId(cursor); 853239889e9a417617b755d4cde22070843e5c070bTom Taylor deleteMessagesForThread(context, threadId, limit); 863239889e9a417617b755d4cde22070843e5c070bTom Taylor } 873239889e9a417617b755d4cde22070843e5c070bTom Taylor } finally { 883239889e9a417617b755d4cde22070843e5c070bTom Taylor cursor.close(); 893239889e9a417617b755d4cde22070843e5c070bTom Taylor } 903239889e9a417617b755d4cde22070843e5c070bTom Taylor } 9153a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 923239889e9a417617b755d4cde22070843e5c070bTom Taylor public void deleteOldMessagesByThreadId(Context context, long threadId) { 933239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 943239889e9a417617b755d4cde22070843e5c070bTom Taylor Log.v(TAG, "Recycler.deleteOldMessagesByThreadId this: " + this + 953239889e9a417617b755d4cde22070843e5c070bTom Taylor " threadId: " + threadId); 963239889e9a417617b755d4cde22070843e5c070bTom Taylor } 973239889e9a417617b755d4cde22070843e5c070bTom Taylor if (!isAutoDeleteEnabled(context)) { 983239889e9a417617b755d4cde22070843e5c070bTom Taylor return; 993239889e9a417617b755d4cde22070843e5c070bTom Taylor } 10053a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 1013239889e9a417617b755d4cde22070843e5c070bTom Taylor deleteMessagesForThread(context, threadId, getMessageLimit(context)); 1023239889e9a417617b755d4cde22070843e5c070bTom Taylor } 1033239889e9a417617b755d4cde22070843e5c070bTom Taylor 104f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor public static boolean isAutoDeleteEnabled(Context context) { 1053239889e9a417617b755d4cde22070843e5c070bTom Taylor SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 1063239889e9a417617b755d4cde22070843e5c070bTom Taylor return prefs.getBoolean(MessagingPreferenceActivity.AUTO_DELETE, 1073239889e9a417617b755d4cde22070843e5c070bTom Taylor DEFAULT_AUTO_DELETE); 1083239889e9a417617b755d4cde22070843e5c070bTom Taylor } 1093239889e9a417617b755d4cde22070843e5c070bTom Taylor 1103239889e9a417617b755d4cde22070843e5c070bTom Taylor abstract public int getMessageLimit(Context context); 1113239889e9a417617b755d4cde22070843e5c070bTom Taylor 11253a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor abstract public void setMessageLimit(Context context, int limit); 11353a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 11453a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor public int getMessageMinLimit() { 11553a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor return MmsConfig.getMinMessageCountPerThread(); 11653a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor } 11753a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 11853a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor public int getMessageMaxLimit() { 11953a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor return MmsConfig.getMaxMessageCountPerThread(); 12053a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor } 12153a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 1223239889e9a417617b755d4cde22070843e5c070bTom Taylor abstract protected long getThreadId(Cursor cursor); 1233239889e9a417617b755d4cde22070843e5c070bTom Taylor 1243239889e9a417617b755d4cde22070843e5c070bTom Taylor abstract protected Cursor getAllThreads(Context context); 12553a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 1263239889e9a417617b755d4cde22070843e5c070bTom Taylor abstract protected void deleteMessagesForThread(Context context, long threadId, int keep); 12753a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 1283239889e9a417617b755d4cde22070843e5c070bTom Taylor abstract protected void dumpMessage(Cursor cursor, Context context); 1293239889e9a417617b755d4cde22070843e5c070bTom Taylor 130f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor abstract protected boolean anyThreadOverLimit(Context context); 131f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor 132512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor public static class SmsRecycler extends Recycler { 1333239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final String[] ALL_SMS_THREADS_PROJECTION = { 134f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylor Telephony.Sms.Conversations.THREAD_ID, 135f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylor Telephony.Sms.Conversations.MESSAGE_COUNT 1363239889e9a417617b755d4cde22070843e5c070bTom Taylor }; 1373239889e9a417617b755d4cde22070843e5c070bTom Taylor 1383239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final int ID = 0; 1393239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final int MESSAGE_COUNT = 1; 1403239889e9a417617b755d4cde22070843e5c070bTom Taylor 1413239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final String[] SMS_MESSAGE_PROJECTION = new String[] { 1423239889e9a417617b755d4cde22070843e5c070bTom Taylor BaseColumns._ID, 1433239889e9a417617b755d4cde22070843e5c070bTom Taylor Conversations.THREAD_ID, 1443239889e9a417617b755d4cde22070843e5c070bTom Taylor Sms.ADDRESS, 1453239889e9a417617b755d4cde22070843e5c070bTom Taylor Sms.BODY, 1463239889e9a417617b755d4cde22070843e5c070bTom Taylor Sms.DATE, 1473239889e9a417617b755d4cde22070843e5c070bTom Taylor Sms.READ, 1483239889e9a417617b755d4cde22070843e5c070bTom Taylor Sms.TYPE, 1493239889e9a417617b755d4cde22070843e5c070bTom Taylor Sms.STATUS, 1503239889e9a417617b755d4cde22070843e5c070bTom Taylor }; 1513239889e9a417617b755d4cde22070843e5c070bTom Taylor 1523239889e9a417617b755d4cde22070843e5c070bTom Taylor // The indexes of the default columns which must be consistent 1533239889e9a417617b755d4cde22070843e5c070bTom Taylor // with above PROJECTION. 1543239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_ID = 0; 1553239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_THREAD_ID = 1; 1563239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_SMS_ADDRESS = 2; 1573239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_SMS_BODY = 3; 1583239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_SMS_DATE = 4; 1593239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_SMS_READ = 5; 1603239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_SMS_TYPE = 6; 1613239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_SMS_STATUS = 7; 1623239889e9a417617b755d4cde22070843e5c070bTom Taylor 1633239889e9a417617b755d4cde22070843e5c070bTom Taylor private final String MAX_SMS_MESSAGES_PER_THREAD = "MaxSmsMessagesPerThread"; 1643239889e9a417617b755d4cde22070843e5c070bTom Taylor 1653239889e9a417617b755d4cde22070843e5c070bTom Taylor public int getMessageLimit(Context context) { 1663239889e9a417617b755d4cde22070843e5c070bTom Taylor SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 16753a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor return prefs.getInt(MAX_SMS_MESSAGES_PER_THREAD, 16853a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor MmsConfig.getDefaultSMSMessagesPerThread()); 16953a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor } 17053a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 17153a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor public void setMessageLimit(Context context, int limit) { 17253a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor SharedPreferences.Editor editPrefs = 17353a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor PreferenceManager.getDefaultSharedPreferences(context).edit(); 17453a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor editPrefs.putInt(MAX_SMS_MESSAGES_PER_THREAD, limit); 175d4ab73b7483ba8a92a96235474070fbf5c10244cBrad Fitzpatrick editPrefs.apply(); 1763239889e9a417617b755d4cde22070843e5c070bTom Taylor } 1773239889e9a417617b755d4cde22070843e5c070bTom Taylor 1783239889e9a417617b755d4cde22070843e5c070bTom Taylor protected long getThreadId(Cursor cursor) { 1793239889e9a417617b755d4cde22070843e5c070bTom Taylor return cursor.getLong(ID); 1803239889e9a417617b755d4cde22070843e5c070bTom Taylor } 18153a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 1823239889e9a417617b755d4cde22070843e5c070bTom Taylor protected Cursor getAllThreads(Context context) { 1833239889e9a417617b755d4cde22070843e5c070bTom Taylor ContentResolver resolver = context.getContentResolver(); 1843239889e9a417617b755d4cde22070843e5c070bTom Taylor Cursor cursor = SqliteWrapper.query(context, resolver, 185f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylor Telephony.Sms.Conversations.CONTENT_URI, 1863239889e9a417617b755d4cde22070843e5c070bTom Taylor ALL_SMS_THREADS_PROJECTION, null, null, Conversations.DEFAULT_SORT_ORDER); 1873239889e9a417617b755d4cde22070843e5c070bTom Taylor 1883239889e9a417617b755d4cde22070843e5c070bTom Taylor return cursor; 1893239889e9a417617b755d4cde22070843e5c070bTom Taylor } 1903239889e9a417617b755d4cde22070843e5c070bTom Taylor 1913239889e9a417617b755d4cde22070843e5c070bTom Taylor protected void deleteMessagesForThread(Context context, long threadId, int keep) { 1923239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 1933239889e9a417617b755d4cde22070843e5c070bTom Taylor Log.v(TAG, "SMS: deleteMessagesForThread"); 1943239889e9a417617b755d4cde22070843e5c070bTom Taylor } 1953239889e9a417617b755d4cde22070843e5c070bTom Taylor ContentResolver resolver = context.getContentResolver(); 19607d483e5da80176484bff536d118cc061f28e586Tom Taylor Cursor cursor = null; 1973239889e9a417617b755d4cde22070843e5c070bTom Taylor try { 19807d483e5da80176484bff536d118cc061f28e586Tom Taylor cursor = SqliteWrapper.query(context, resolver, 19907d483e5da80176484bff536d118cc061f28e586Tom Taylor ContentUris.withAppendedId(Sms.Conversations.CONTENT_URI, threadId), 20007d483e5da80176484bff536d118cc061f28e586Tom Taylor SMS_MESSAGE_PROJECTION, 20107d483e5da80176484bff536d118cc061f28e586Tom Taylor "locked=0", 20207d483e5da80176484bff536d118cc061f28e586Tom Taylor null, "date DESC"); // get in newest to oldest order 20307d483e5da80176484bff536d118cc061f28e586Tom Taylor if (cursor == null) { 20407d483e5da80176484bff536d118cc061f28e586Tom Taylor Log.e(TAG, "SMS: deleteMessagesForThread got back null cursor"); 20507d483e5da80176484bff536d118cc061f28e586Tom Taylor return; 20607d483e5da80176484bff536d118cc061f28e586Tom Taylor } 20707d483e5da80176484bff536d118cc061f28e586Tom Taylor int count = cursor.getCount(); 20807d483e5da80176484bff536d118cc061f28e586Tom Taylor int numberToDelete = count - keep; 20907d483e5da80176484bff536d118cc061f28e586Tom Taylor if (LOCAL_DEBUG) { 21007d483e5da80176484bff536d118cc061f28e586Tom Taylor Log.v(TAG, "SMS: deleteMessagesForThread keep: " + keep + 21107d483e5da80176484bff536d118cc061f28e586Tom Taylor " count: " + count + 21207d483e5da80176484bff536d118cc061f28e586Tom Taylor " numberToDelete: " + numberToDelete); 21307d483e5da80176484bff536d118cc061f28e586Tom Taylor } 21407d483e5da80176484bff536d118cc061f28e586Tom Taylor if (numberToDelete <= 0) { 21507d483e5da80176484bff536d118cc061f28e586Tom Taylor return; 21607d483e5da80176484bff536d118cc061f28e586Tom Taylor } 21707d483e5da80176484bff536d118cc061f28e586Tom Taylor // Move to the keep limit and then delete everything older than that one. 2183239889e9a417617b755d4cde22070843e5c070bTom Taylor cursor.move(keep); 2193239889e9a417617b755d4cde22070843e5c070bTom Taylor long latestDate = cursor.getLong(COLUMN_SMS_DATE); 2203239889e9a417617b755d4cde22070843e5c070bTom Taylor 22153a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor long cntDeleted = SqliteWrapper.delete(context, resolver, 2223239889e9a417617b755d4cde22070843e5c070bTom Taylor ContentUris.withAppendedId(Sms.Conversations.CONTENT_URI, threadId), 22330523f5908dc28f7686bbc1363b20ea77ee29ab9Tom Taylor "locked=0 AND date<" + latestDate, 2243239889e9a417617b755d4cde22070843e5c070bTom Taylor null); 2253239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 2263239889e9a417617b755d4cde22070843e5c070bTom Taylor Log.v(TAG, "SMS: deleteMessagesForThread cntDeleted: " + cntDeleted); 2273239889e9a417617b755d4cde22070843e5c070bTom Taylor } 2283239889e9a417617b755d4cde22070843e5c070bTom Taylor } finally { 22907d483e5da80176484bff536d118cc061f28e586Tom Taylor if (cursor != null) { 23007d483e5da80176484bff536d118cc061f28e586Tom Taylor cursor.close(); 23107d483e5da80176484bff536d118cc061f28e586Tom Taylor } 2323239889e9a417617b755d4cde22070843e5c070bTom Taylor } 2333239889e9a417617b755d4cde22070843e5c070bTom Taylor } 2343239889e9a417617b755d4cde22070843e5c070bTom Taylor 2353239889e9a417617b755d4cde22070843e5c070bTom Taylor protected void dumpMessage(Cursor cursor, Context context) { 2363239889e9a417617b755d4cde22070843e5c070bTom Taylor long date = cursor.getLong(COLUMN_SMS_DATE); 2373239889e9a417617b755d4cde22070843e5c070bTom Taylor String dateStr = MessageUtils.formatTimeStampString(context, date, true); 2383239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 2393239889e9a417617b755d4cde22070843e5c070bTom Taylor Log.v(TAG, "Recycler message " + 2403239889e9a417617b755d4cde22070843e5c070bTom Taylor "\n address: " + cursor.getString(COLUMN_SMS_ADDRESS) + 2413239889e9a417617b755d4cde22070843e5c070bTom Taylor "\n body: " + cursor.getString(COLUMN_SMS_BODY) + 2423239889e9a417617b755d4cde22070843e5c070bTom Taylor "\n date: " + dateStr + 2433239889e9a417617b755d4cde22070843e5c070bTom Taylor "\n date: " + date + 2443239889e9a417617b755d4cde22070843e5c070bTom Taylor "\n read: " + cursor.getInt(COLUMN_SMS_READ)); 2453239889e9a417617b755d4cde22070843e5c070bTom Taylor } 2463239889e9a417617b755d4cde22070843e5c070bTom Taylor } 247f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor 248f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor @Override 249f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor protected boolean anyThreadOverLimit(Context context) { 250f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor Cursor cursor = getAllThreads(context); 251cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor if (cursor == null) { 252cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor return false; 253cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor } 254f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor int limit = getMessageLimit(context); 255f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor try { 256f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor while (cursor.moveToNext()) { 257f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor long threadId = getThreadId(cursor); 258f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor ContentResolver resolver = context.getContentResolver(); 259f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor Cursor msgs = SqliteWrapper.query(context, resolver, 260f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor ContentUris.withAppendedId(Sms.Conversations.CONTENT_URI, threadId), 261f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor SMS_MESSAGE_PROJECTION, 26230523f5908dc28f7686bbc1363b20ea77ee29ab9Tom Taylor "locked=0", 263f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor null, "date DESC"); // get in newest to oldest order 264cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor if (msgs == null) { 265cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor return false; 266cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor } 267cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor try { 268cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor if (msgs.getCount() >= limit) { 269cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor return true; 270cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor } 271cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor } finally { 272cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor msgs.close(); 273f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 274f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 275f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } finally { 276f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor cursor.close(); 277f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 278f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor return false; 279f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 2803239889e9a417617b755d4cde22070843e5c070bTom Taylor } 2813239889e9a417617b755d4cde22070843e5c070bTom Taylor 282512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor public static class MmsRecycler extends Recycler { 2833239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final String[] ALL_MMS_THREADS_PROJECTION = { 2843239889e9a417617b755d4cde22070843e5c070bTom Taylor "thread_id", "count(*) as msg_count" 2853239889e9a417617b755d4cde22070843e5c070bTom Taylor }; 2863239889e9a417617b755d4cde22070843e5c070bTom Taylor 2873239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final int ID = 0; 2883239889e9a417617b755d4cde22070843e5c070bTom Taylor private static final int MESSAGE_COUNT = 1; 2893239889e9a417617b755d4cde22070843e5c070bTom Taylor 2903239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final String[] MMS_MESSAGE_PROJECTION = new String[] { 2913239889e9a417617b755d4cde22070843e5c070bTom Taylor BaseColumns._ID, 2923239889e9a417617b755d4cde22070843e5c070bTom Taylor Conversations.THREAD_ID, 2933239889e9a417617b755d4cde22070843e5c070bTom Taylor Mms.DATE, 2943239889e9a417617b755d4cde22070843e5c070bTom Taylor }; 2953239889e9a417617b755d4cde22070843e5c070bTom Taylor 2963239889e9a417617b755d4cde22070843e5c070bTom Taylor // The indexes of the default columns which must be consistent 2973239889e9a417617b755d4cde22070843e5c070bTom Taylor // with above PROJECTION. 2983239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_ID = 0; 2993239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_THREAD_ID = 1; 3003239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_MMS_DATE = 2; 3013239889e9a417617b755d4cde22070843e5c070bTom Taylor static private final int COLUMN_MMS_READ = 3; 3023239889e9a417617b755d4cde22070843e5c070bTom Taylor 3033239889e9a417617b755d4cde22070843e5c070bTom Taylor private final String MAX_MMS_MESSAGES_PER_THREAD = "MaxMmsMessagesPerThread"; 3043239889e9a417617b755d4cde22070843e5c070bTom Taylor 3053239889e9a417617b755d4cde22070843e5c070bTom Taylor public int getMessageLimit(Context context) { 3063239889e9a417617b755d4cde22070843e5c070bTom Taylor SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 30753a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor return prefs.getInt(MAX_MMS_MESSAGES_PER_THREAD, 30853a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor MmsConfig.getDefaultMMSMessagesPerThread()); 30953a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor } 31053a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 31153a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor public void setMessageLimit(Context context, int limit) { 31253a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor SharedPreferences.Editor editPrefs = 31353a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor PreferenceManager.getDefaultSharedPreferences(context).edit(); 31453a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor editPrefs.putInt(MAX_MMS_MESSAGES_PER_THREAD, limit); 315d4ab73b7483ba8a92a96235474070fbf5c10244cBrad Fitzpatrick editPrefs.apply(); 3163239889e9a417617b755d4cde22070843e5c070bTom Taylor } 3173239889e9a417617b755d4cde22070843e5c070bTom Taylor 3183239889e9a417617b755d4cde22070843e5c070bTom Taylor protected long getThreadId(Cursor cursor) { 3193239889e9a417617b755d4cde22070843e5c070bTom Taylor return cursor.getLong(ID); 3203239889e9a417617b755d4cde22070843e5c070bTom Taylor } 32153a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 3223239889e9a417617b755d4cde22070843e5c070bTom Taylor protected Cursor getAllThreads(Context context) { 3233239889e9a417617b755d4cde22070843e5c070bTom Taylor ContentResolver resolver = context.getContentResolver(); 3243239889e9a417617b755d4cde22070843e5c070bTom Taylor Cursor cursor = SqliteWrapper.query(context, resolver, 325f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylor Uri.withAppendedPath(Telephony.Mms.CONTENT_URI, "threads"), 3263239889e9a417617b755d4cde22070843e5c070bTom Taylor ALL_MMS_THREADS_PROJECTION, null, null, Conversations.DEFAULT_SORT_ORDER); 3273239889e9a417617b755d4cde22070843e5c070bTom Taylor 3283239889e9a417617b755d4cde22070843e5c070bTom Taylor return cursor; 3293239889e9a417617b755d4cde22070843e5c070bTom Taylor } 3303239889e9a417617b755d4cde22070843e5c070bTom Taylor 331512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor public void deleteOldMessagesInSameThreadAsMessage(Context context, Uri uri) { 3323239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 333512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor Log.v(TAG, "MMS: deleteOldMessagesByUri"); 3343239889e9a417617b755d4cde22070843e5c070bTom Taylor } 3353e1da0e1638c77be0c47997f17633596a38f055bTom Taylor if (!isAutoDeleteEnabled(context)) { 3363e1da0e1638c77be0c47997f17633596a38f055bTom Taylor return; 3373e1da0e1638c77be0c47997f17633596a38f055bTom Taylor } 338512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor Cursor cursor = null; 339512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor long latestDate = 0; 340512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor long threadId = 0; 341512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor try { 342512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor String msgId = uri.getLastPathSegment(); 343512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor ContentResolver resolver = context.getContentResolver(); 344512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor cursor = SqliteWrapper.query(context, resolver, 345f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylor Telephony.Mms.CONTENT_URI, 346512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor MMS_MESSAGE_PROJECTION, 347512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor "thread_id in (select thread_id from pdu where _id=" + msgId + 348512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor ") AND locked=0", 349512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor null, "date DESC"); // get in newest to oldest order 35007d483e5da80176484bff536d118cc061f28e586Tom Taylor if (cursor == null) { 35107d483e5da80176484bff536d118cc061f28e586Tom Taylor Log.e(TAG, "MMS: deleteOldMessagesInSameThreadAsMessage got back null cursor"); 35207d483e5da80176484bff536d118cc061f28e586Tom Taylor return; 35307d483e5da80176484bff536d118cc061f28e586Tom Taylor } 354512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor 355512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor int count = cursor.getCount(); 356512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor int keep = getMessageLimit(context); 357512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor int numberToDelete = count - keep; 358512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor if (LOCAL_DEBUG) { 359512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor Log.v(TAG, "MMS: deleteOldMessagesByUri keep: " + keep + 360512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor " count: " + count + 361512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor " numberToDelete: " + numberToDelete); 362512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 363512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor if (numberToDelete <= 0) { 364512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor return; 365512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 366512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor // Move to the keep limit and then delete everything older than that one. 367512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor cursor.move(keep); 368512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor latestDate = cursor.getLong(COLUMN_MMS_DATE); 369512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor threadId = cursor.getLong(COLUMN_THREAD_ID); 370512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } finally { 371512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor if (cursor != null) { 372512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor cursor.close(); 373512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 374512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 375512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor if (threadId != 0) { 376512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor deleteMessagesOlderThanDate(context, threadId, latestDate); 377512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 378512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 3793239889e9a417617b755d4cde22070843e5c070bTom Taylor 380512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor protected void deleteMessagesForThread(Context context, long threadId, int keep) { 3813239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 382512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor Log.v(TAG, "MMS: deleteMessagesForThread"); 3833239889e9a417617b755d4cde22070843e5c070bTom Taylor } 384512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor if (threadId == 0) { 3853239889e9a417617b755d4cde22070843e5c070bTom Taylor return; 3863239889e9a417617b755d4cde22070843e5c070bTom Taylor } 387512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor Cursor cursor = null; 388512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor long latestDate = 0; 3893239889e9a417617b755d4cde22070843e5c070bTom Taylor try { 390512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor ContentResolver resolver = context.getContentResolver(); 391512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor cursor = SqliteWrapper.query(context, resolver, 392f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylor Telephony.Mms.CONTENT_URI, 393512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor MMS_MESSAGE_PROJECTION, 394512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor "thread_id=" + threadId + " AND locked=0", 395512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor null, "date DESC"); // get in newest to oldest order 39607d483e5da80176484bff536d118cc061f28e586Tom Taylor if (cursor == null) { 39707d483e5da80176484bff536d118cc061f28e586Tom Taylor Log.e(TAG, "MMS: deleteMessagesForThread got back null cursor"); 39807d483e5da80176484bff536d118cc061f28e586Tom Taylor return; 39907d483e5da80176484bff536d118cc061f28e586Tom Taylor } 400512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor 401512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor int count = cursor.getCount(); 402512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor int numberToDelete = count - keep; 4033239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 404512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor Log.v(TAG, "MMS: deleteMessagesForThread keep: " + keep + 405512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor " count: " + count + 406512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor " numberToDelete: " + numberToDelete); 4073239889e9a417617b755d4cde22070843e5c070bTom Taylor } 408512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor if (numberToDelete <= 0) { 409512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor return; 410512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 411512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor // Move to the keep limit and then delete everything older than that one. 412512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor cursor.move(keep); 413512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor latestDate = cursor.getLong(COLUMN_MMS_DATE); 4143239889e9a417617b755d4cde22070843e5c070bTom Taylor } finally { 415512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor if (cursor != null) { 416512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor cursor.close(); 417512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 418512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 419512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor deleteMessagesOlderThanDate(context, threadId, latestDate); 420512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor } 421512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor 422512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor private void deleteMessagesOlderThanDate(Context context, long threadId, 423512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor long latestDate) { 424512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor long cntDeleted = SqliteWrapper.delete(context, context.getContentResolver(), 425f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylor Telephony.Mms.CONTENT_URI, 426512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor "thread_id=" + threadId + " AND locked=0 AND date<" + latestDate, 427512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor null); 428512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor if (LOCAL_DEBUG) { 429512681a5702e1ba6df0b7298c7737598a4e9aa8eTom Taylor Log.v(TAG, "MMS: deleteMessagesOlderThanDate cntDeleted: " + cntDeleted); 4303239889e9a417617b755d4cde22070843e5c070bTom Taylor } 4313239889e9a417617b755d4cde22070843e5c070bTom Taylor } 43253a1dc1c4fed88c20a3ce4c2d37c909dc1e469e2Tom Taylor 4333239889e9a417617b755d4cde22070843e5c070bTom Taylor protected void dumpMessage(Cursor cursor, Context context) { 4343239889e9a417617b755d4cde22070843e5c070bTom Taylor long id = cursor.getLong(COLUMN_ID); 4353239889e9a417617b755d4cde22070843e5c070bTom Taylor if (LOCAL_DEBUG) { 4363239889e9a417617b755d4cde22070843e5c070bTom Taylor Log.v(TAG, "Recycler message " + 4373239889e9a417617b755d4cde22070843e5c070bTom Taylor "\n id: " + id 4383239889e9a417617b755d4cde22070843e5c070bTom Taylor ); 4393239889e9a417617b755d4cde22070843e5c070bTom Taylor } 4403239889e9a417617b755d4cde22070843e5c070bTom Taylor } 441f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor 442f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor @Override 443f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor protected boolean anyThreadOverLimit(Context context) { 444f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor Cursor cursor = getAllThreads(context); 445cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor if (cursor == null) { 446cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor return false; 447cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor } 448f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor int limit = getMessageLimit(context); 449f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor try { 450f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor while (cursor.moveToNext()) { 451f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor long threadId = getThreadId(cursor); 452f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor ContentResolver resolver = context.getContentResolver(); 453f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor Cursor msgs = SqliteWrapper.query(context, resolver, 454f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylor Telephony.Mms.CONTENT_URI, 455f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor MMS_MESSAGE_PROJECTION, 45630523f5908dc28f7686bbc1363b20ea77ee29ab9Tom Taylor "thread_id=" + threadId + " AND locked=0", 457f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor null, "date DESC"); // get in newest to oldest order 458f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor 459cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor if (msgs == null) { 460cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor return false; 461cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor } 462cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor try { 463cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor if (msgs.getCount() >= limit) { 464cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor return true; 465cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor } 466cd3e6c33df50eafedb9a8b765770ffe49b138fe1Tom Taylor } finally { 4678fedfa146fe3704cafcade6f050bf30ee42699cbTom Taylor msgs.close(); 468f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 469f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 470f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } finally { 471f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor cursor.close(); 472f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 473f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor return false; 474f766f33b774cfb6dd4100a6522ffa23c0a0dae35Tom Taylor } 4753239889e9a417617b755d4cde22070843e5c070bTom Taylor } 4763239889e9a417617b755d4cde22070843e5c070bTom Taylor 4773239889e9a417617b755d4cde22070843e5c070bTom Taylor} 478