mirror of
https://github.com/nerzhul/ownCloud-SMS-App.git
synced 2025-06-19 05:46:16 +00:00
326 lines
8.8 KiB
Java
326 lines
8.8 KiB
Java
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));
|
|
}
|
|
// 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 {
|
|
Integer mboxId = -1;
|
|
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"))) {
|
|
entry.put(colName, c.getInt(idx));
|
|
}
|
|
// 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 if (colName.equals(new String("type"))) {
|
|
mboxId = c.getInt(idx);
|
|
entry.put(colName, c.getInt(idx));
|
|
}
|
|
else {
|
|
entry.put(colName, c.getString(idx));
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Mailbox ID is required by server
|
|
* mboxId is greater than server mboxId by 1 because types
|
|
* aren't indexed in the same mean
|
|
*/
|
|
entry.put("mbox", (mboxId - 1));
|
|
|
|
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();
|
|
}
|