Commit f923ce19 authored by Albert Vaca's avatar Albert Vaca

Merge branch 'albertvaka/sms-lock-fix'

parents cbbec32b a9508a7f
......@@ -163,18 +163,15 @@ public class SMSPlugin extends Plugin {
private final Lock mostRecentTimestampLock = new ReentrantLock();
private class MessageContentObserver extends ContentObserver {
final SMSPlugin mPlugin;
* Create a ContentObserver to watch the Messages database. onChange is called for
* every subscribed change
* @param parent Plugin which owns this observer
* @param handler Handler object used to make the callback
MessageContentObserver(SMSPlugin parent, Handler handler) {
MessageContentObserver(Handler handler) {
mPlugin = parent;
......@@ -185,29 +182,28 @@ public class SMSPlugin extends Plugin {
public void onChange(boolean selfChange) {
if (mPlugin.mostRecentTimestamp == 0) {
// Lock so no one uses the mostRecentTimestamp between the moment we read it and the
// moment we update it. This is because reading the Messages DB can take long.
if (mostRecentTimestamp == 0) {
// Since the timestamp has not been initialized, we know that nobody else
// has requested a message. That being the case, there is most likely
// nobody listening for message updates, so just drop them
// Grab the mostRecentTimestamp into the local stack because reading the Messages
// database could potentially be a long operation
long mostRecentTimestamp = mPlugin.mostRecentTimestamp;
SMSHelper.Message message = SMSHelper.getNewestMessage(mPlugin.context);
SMSHelper.Message message = SMSHelper.getNewestMessage(context);
if ( <= mostRecentTimestamp) {
// Our onChange often gets called many times for a single message. Don't make unnecessary
// noise
if (message == null || <= mostRecentTimestamp) {
// onChange can trigger many times for a single message. Don't make unnecessary noise
// Update the most recent counter
mPlugin.mostRecentTimestamp =;
mostRecentTimestamp =;
// Send the alert about the update
......@@ -281,7 +277,7 @@ public class SMSPlugin extends Plugin {
context.registerReceiver(receiver, filter);
Looper helperLooper = SMSHelper.MessageLooper.getLooper();
ContentObserver messageObserver = new MessageContentObserver(this, new Handler(helperLooper));
ContentObserver messageObserver = new MessageContentObserver(new Handler(helperLooper));
SMSHelper.registerObserver(messageObserver, context);
return true;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment