package com.aberdyne.droidnavi.client;
import java.util.Date;
import java.util.TimerTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.provider.CallLog;
/**
* A TimerTask for checking for unread new missed calls.
* This will dispatch an event every time until the calls are checked
* and no longer considered "new."
* @author Kei
*
*/
public class UnreadMissedCallTimer extends TimerTask {
private static final Logger logger = LoggerFactory.getLogger(UnreadMissedCallTimer.class);
private static Context m_context = null;
private static PhoneStateListener m_stateListener = null;
public UnreadMissedCallTimer(Context context, PhoneStateListener phoneStateListener) {
logger.info("ENTRY UnreadMissedCallTimer constructor.");
if(context == null) {
throw new NullPointerException("Context cannot be null.");
}
if(phoneStateListener == null) {
throw new NullPointerException("PhoneStateListener cannot be null.");
}
m_context = context;
m_stateListener = phoneStateListener;
logger.info("EXIT UnreadMissedCallTimer constructor.");
}
@Override
public void run() {
logger.info("ENTRY UnreadMissedCallTimer.run");
ContentResolver resolver = m_context.getContentResolver();
String[] projection = { CallLog.Calls.CACHED_NAME,
CallLog.Calls.CACHED_NUMBER_LABEL,
CallLog.Calls.TYPE,
CallLog.Calls.NUMBER,
CallLog.Calls.DATE };
String where = CallLog.Calls.TYPE + "=" + CallLog.Calls.MISSED_TYPE + " AND " + CallLog.Calls.NEW + "=1";
Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, projection, where, null, null);
// Only continue if we have missed calls
if(cursor.moveToFirst()) {
int numberIdx = cursor.getColumnIndex(CallLog.Calls.NUMBER);
int cache_numberIdx = cursor.getColumnIndex(CallLog.Calls.CACHED_NUMBER_LABEL);
int dateIdx = cursor.getColumnIndex(CallLog.Calls.DATE);
do {
String number = cursor.getString(numberIdx);
String cache_number = cursor.getString(cache_numberIdx);
Date date = new Date(cursor.getLong(dateIdx));
// Determine which kind of number we have, or fail with "UNKNOWN"
if(number.equals(cache_number)) {
m_stateListener.onUnreadMissedCall(number, date, m_context);
}
else if(number != null && number.length() > 0) {
m_stateListener.onUnreadMissedCall(number, date, m_context);
} // Cached number, name will be "UNKNOWN"
else if(cache_number != null && cache_number.length() > 0) {
m_stateListener.onUnreadMissedCall(cache_number, date, m_context);
}
else {
m_stateListener.onUnreadMissedCall("UNKNOWN", date, m_context);
}
} while(cursor.moveToNext());
cursor.close();
}
cursor.close();
logger.info("EXIT UnreadMissedCallTimer.run");
}
}