fr.unix_experience.owncloud_sms.engine.SmsFetcher.java Source code

Java tutorial

Introduction

Here is the source code for fr.unix_experience.owncloud_sms.engine.SmsFetcher.java

Source

package fr.unix_experience.owncloud_sms.engine;

/*
 *  Copyright (c) 2014-2015, Loic Blot <loic.blot@unix-experience.fr>
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as
 *  published by the Free Software Foundation, either version 3 of the
 *  License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *  
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import fr.unix_experience.owncloud_sms.enums.MailboxID;
import fr.unix_experience.owncloud_sms.providers.SmsDataProvider;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;

public class SmsFetcher {
    public SmsFetcher(Context ct) {
        _lastMsgDate = (long) 0;
        _context = ct;

        _existingInboxMessages = null;
        _existingSentMessages = null;
        _existingDraftsMessages = null;
    }

    public JSONArray fetchAllMessages() {
        _jsonDataDump = new JSONArray();
        bufferizeMailboxMessages(MailboxID.INBOX);
        bufferizeMailboxMessages(MailboxID.SENT);
        bufferizeMailboxMessages(MailboxID.DRAFTS);
        return _jsonDataDump;
    }

    private void bufferizeMailboxMessages(MailboxID mbID) {
        String mbURI = mapMailboxIDToURI(mbID);

        if (_context == null || mbURI == null) {
            return;
        }

        if (mbID != MailboxID.INBOX && mbID != MailboxID.SENT && mbID != MailboxID.DRAFTS) {
            Log.e(TAG, "Unhandled MailboxID " + mbID.ordinal());
            return;
        }

        // We generate a ID list for this message box
        String existingIDs = buildExistingMessagesString(mbID);

        Cursor c = null;
        if (existingIDs.length() > 0) {
            c = (new SmsDataProvider(_context)).query(mbURI, "_id NOT IN (" + existingIDs + ")");
        } else {
            c = (new SmsDataProvider(_context)).query(mbURI);
        }

        // Reading mailbox
        if (c != null && c.getCount() > 0) {
            c.moveToFirst();
            do {
                JSONObject entry = new JSONObject();

                try {
                    for (int idx = 0; idx < c.getColumnCount(); idx++) {
                        String colName = c.getColumnName(idx);

                        // Id column is must be an integer
                        if (colName.equals(new String("_id")) || colName.equals(new String("type"))) {
                            entry.put(colName, c.getInt(idx));

                            // bufferize Id for future use
                            if (colName.equals(new String("_id"))) {
                            }
                        }
                        // Seen and read must be pseudo boolean
                        else if (colName.equals(new String("read")) || colName.equals(new String("seen"))) {
                            entry.put(colName, c.getInt(idx) > 0 ? "true" : "false");
                        } else {
                            // Special case for date, we need to record last without searching
                            if (colName.equals(new String("date"))) {
                                final Long tmpDate = c.getLong(idx);
                                if (tmpDate > _lastMsgDate) {
                                    _lastMsgDate = tmpDate;
                                }
                            }
                            entry.put(colName, c.getString(idx));
                        }
                    }

                    // Mailbox ID is required by server
                    entry.put("mbox", mbID.ordinal());

                    _jsonDataDump.put(entry);

                } catch (JSONException e) {
                    Log.e(TAG, "JSON Exception when reading SMS Mailbox", e);
                    c.close();
                }
            } while (c.moveToNext());

            Log.d(TAG, c.getCount() + " messages read from " + mbURI);

            c.close();
        }
    }

    // Used by Content Observer
    public JSONArray getLastMessage(MailboxID mbID) {
        String mbURI = mapMailboxIDToURI(mbID);

        if (_context == null || mbURI == null) {
            return null;
        }

        // Fetch Sent SMS Message from Built-in Content Provider
        Cursor c = (new SmsDataProvider(_context)).query(mbURI);

        c.moveToNext();

        // We create a list of strings to store results
        JSONArray results = new JSONArray();

        JSONObject entry = new JSONObject();

        try {
            for (int idx = 0; idx < c.getColumnCount(); idx++) {
                String colName = c.getColumnName(idx);

                // Id column is must be an integer
                if (colName.equals(new String("_id")) || colName.equals(new String("type"))) {
                    entry.put(colName, c.getInt(idx));

                    // bufferize Id for future use
                    if (colName.equals(new String("_id"))) {
                    }
                }
                // Seen and read must be pseudo boolean
                else if (colName.equals(new String("read")) || colName.equals(new String("seen"))) {
                    entry.put(colName, c.getInt(idx) > 0 ? "true" : "false");
                } else {
                    entry.put(colName, c.getString(idx));
                }
            }

            // Mailbox ID is required by server
            entry.put("mbox", mbID.ordinal());

            results.put(entry);
        } catch (JSONException e) {
            Log.e(TAG, "JSON Exception when reading SMS Mailbox", e);
            c.close();
        }

        c.close();

        return results;
    }

    // Used by ConnectivityChanged Event
    public JSONArray bufferizeMessagesSinceDate(Long sinceDate) {
        _jsonDataDump = new JSONArray();
        bufferizeMessagesSinceDate(MailboxID.INBOX, sinceDate);
        bufferizeMessagesSinceDate(MailboxID.SENT, sinceDate);
        bufferizeMessagesSinceDate(MailboxID.DRAFTS, sinceDate);
        return _jsonDataDump;
    }

    // Used by ConnectivityChanged Event
    public void bufferizeMessagesSinceDate(MailboxID mbID, Long sinceDate) {
        String mbURI = mapMailboxIDToURI(mbID);

        if (_context == null || mbURI == null) {
            return;
        }

        Cursor c = new SmsDataProvider(_context).query(mbURI, "date > ?", new String[] { sinceDate.toString() });

        // Reading mailbox
        if (c != null && c.getCount() > 0) {
            c.moveToFirst();
            do {
                JSONObject entry = new JSONObject();

                try {
                    for (int idx = 0; idx < c.getColumnCount(); idx++) {
                        String colName = c.getColumnName(idx);

                        // Id column is must be an integer
                        if (colName.equals(new String("_id")) || colName.equals(new String("type"))) {
                            entry.put(colName, c.getInt(idx));

                            // bufferize Id for future use
                            if (colName.equals(new String("_id"))) {
                            }
                        }
                        // Seen and read must be pseudo boolean
                        else if (colName.equals(new String("read")) || colName.equals(new String("seen"))) {
                            entry.put(colName, c.getInt(idx) > 0 ? "true" : "false");
                        } else {
                            // Special case for date, we need to record last without searching
                            if (colName.equals(new String("date"))) {
                                final Long tmpDate = c.getLong(idx);
                                if (tmpDate > _lastMsgDate) {
                                    _lastMsgDate = tmpDate;
                                }
                            }
                            entry.put(colName, c.getString(idx));
                        }
                    }

                    // Mailbox ID is required by server
                    entry.put("mbox", mbID.ordinal());

                    _jsonDataDump.put(entry);

                } catch (JSONException e) {
                    Log.e(TAG, "JSON Exception when reading SMS Mailbox", e);
                    c.close();
                }
            } while (c.moveToNext());

            Log.d(TAG, c.getCount() + " messages read from " + mbURI);

            c.close();
        }
    }

    private String mapMailboxIDToURI(MailboxID mbID) {
        if (mbID == MailboxID.INBOX) {
            return "content://sms/inbox";
        } else if (mbID == MailboxID.DRAFTS) {
            return "content://sms/drafts";
        } else if (mbID == MailboxID.SENT) {
            return "content://sms/sent";
        } else if (mbID == MailboxID.ALL) {
            return "content://sms";
        }

        return null;
    }

    private String buildExistingMessagesString(MailboxID _mbID) {
        JSONArray existingMessages = null;
        if (_mbID == MailboxID.INBOX) {
            existingMessages = _existingInboxMessages;
        } else if (_mbID == MailboxID.DRAFTS) {
            existingMessages = _existingDraftsMessages;
        } else if (_mbID == MailboxID.SENT) {
            existingMessages = _existingSentMessages;
        }
        // Note: The default case isn't possible, we check the mailbox before

        StringBuilder sb = new StringBuilder();
        if (existingMessages != null) {
            int len = existingMessages.length();
            for (int i = 0; i < len; i++) {
                try {
                    if (sb.length() > 0) {
                        sb.append(",");
                    }
                    sb.append(existingMessages.getInt(i));
                } catch (JSONException e) {

                }
            }
        }

        return sb.toString();
    }

    public void setExistingInboxMessages(JSONArray inboxMessages) {
        _existingInboxMessages = inboxMessages;
    }

    public void setExistingSentMessages(JSONArray sentMessages) {
        _existingSentMessages = sentMessages;
    }

    public void setExistingDraftsMessages(JSONArray draftMessages) {
        _existingDraftsMessages = draftMessages;
    }

    public Long getLastMessageDate() {
        return _lastMsgDate;
    }

    private Context _context;
    private JSONArray _jsonDataDump;
    private JSONArray _existingInboxMessages;
    private JSONArray _existingSentMessages;
    private JSONArray _existingDraftsMessages;

    private Long _lastMsgDate;

    private static final String TAG = SmsFetcher.class.getSimpleName();
}