From a4a53ad1951aae7247d626e942447c83f5c8ba40 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 30 Apr 2012 15:40:14 -0700 Subject: [PATCH] Fixed bugs when fielding missed calls on real phones --- .../calls/PhoneStateChangedReceiver.java | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/calls/PhoneStateChangedReceiver.java b/astrid/plugin-src/com/todoroo/astrid/calls/PhoneStateChangedReceiver.java index 226be8259..9d686bb13 100644 --- a/astrid/plugin-src/com/todoroo/astrid/calls/PhoneStateChangedReceiver.java +++ b/astrid/plugin-src/com/todoroo/astrid/calls/PhoneStateChangedReceiver.java @@ -29,8 +29,7 @@ public class PhoneStateChangedReceiver extends BroadcastReceiver { String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) { - String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); - System.err.println("Ringing: " + number); + String number = digitsOnly(intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)); if (TextUtils.isEmpty(number)) return; @@ -44,14 +43,31 @@ public class PhoneStateChangedReceiver extends BroadcastReceiver { Cursor calls = context.getContentResolver().query( Calls.CONTENT_URI, null, - Calls.TYPE + " = ? AND " + Calls.NEW + " = ? AND " + Calls.NUMBER + " = ?" , - new String[] { Integer.toString(Calls.MISSED_TYPE), "1", lastNumber }, + Calls.TYPE + " = ? AND " + Calls.NEW + " = ?", + new String[] { Integer.toString(Calls.MISSED_TYPE), "1" }, Calls.DATE + " DESC" ); try { if (calls.getCount() > 0) { calls.moveToFirst(); + + int numberIndex = calls.getColumnIndex(Calls.NUMBER); + String number = calls.getString(numberIndex); + + // Check for phone number match + if (!lastNumber.equals(digitsOnly(number))) + return; + + // If a lot of time has passed since the most recent missed call, ignore + // It could be the same person calling you back before you call them back, + // but if you answer this time, the missed call will still be in the database + // and will be processed again. + int dateIndex = calls.getColumnIndex(Calls.DATE); + long date = calls.getLong(dateIndex); + if (DateUtilities.now() - date > 2 * DateUtilities.ONE_MINUTE) + return; + int nameIndex = calls.getColumnIndex(Calls.CACHED_NAME); String name = calls.getString(nameIndex); @@ -59,8 +75,9 @@ public class PhoneStateChangedReceiver extends BroadcastReceiver { long time = calls.getLong(timeIndex); String timeString = DateUtilities.getTimeString(context, new Date(time)); + Intent missedCallIntent = new Intent(context, MissedCallActivity.class); - missedCallIntent.putExtra(MissedCallActivity.EXTRA_NUMBER, lastNumber); + missedCallIntent.putExtra(MissedCallActivity.EXTRA_NUMBER, number); missedCallIntent.putExtra(MissedCallActivity.EXTRA_NAME, name); missedCallIntent.putExtra(MissedCallActivity.EXTRA_TIME, timeString); missedCallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); @@ -70,8 +87,18 @@ public class PhoneStateChangedReceiver extends BroadcastReceiver { calls.close(); } } else { - System.err.println("Other state: " + state); + System.err.println("ASTRID Other state: " + state); + } + } + + private String digitsOnly(String number) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < number.length(); i++) { + char c = number.charAt(i); + if (Character.isDigit(c)) + builder.append(c); } + return builder.toString(); } }