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