If contacts observer is running, return early.

Change-Id: I084a251b0f72288243c73b6166d992b427449635
diff --git a/java/src/com/android/inputmethod/latin/ContactsContentObserver.java b/java/src/com/android/inputmethod/latin/ContactsContentObserver.java
index b23226d..777bfe6 100644
--- a/java/src/com/android/inputmethod/latin/ContactsContentObserver.java
+++ b/java/src/com/android/inputmethod/latin/ContactsContentObserver.java
@@ -27,6 +27,7 @@
 import com.android.inputmethod.latin.utils.ExecutorUtils;
 
 import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * A content observer that listens to updates to content provider {@link Contacts#CONTENT_URI}.
@@ -35,13 +36,14 @@
 public class ContactsContentObserver implements Runnable {
     private static final String TAG = ContactsContentObserver.class.getSimpleName();
     private static final boolean DEBUG = false;
-
-    private ContentObserver mContentObserver;
-    private ContactsChangedListener mContactsChangedListener;
+    private static AtomicBoolean sRunning = new AtomicBoolean(false);
 
     private final Context mContext;
     private final ContactsManager mManager;
 
+    private ContentObserver mContentObserver;
+    private ContactsChangedListener mContactsChangedListener;
+
     public ContactsContentObserver(final ContactsManager manager, final Context context) {
         mManager = manager;
         mContext = context;
@@ -55,7 +57,6 @@
         mContentObserver = new ContentObserver(null /* handler */) {
             @Override
             public void onChange(boolean self) {
-                // TODO(zivkovic): Limit the queue to 1 instance of ContactsContentObserver.
                 ExecutorUtils.getExecutorForDynamicLanguageModelUpdate()
                         .execute(ContactsContentObserver.this);
             }
@@ -66,12 +67,19 @@
 
     @Override
     public void run() {
+        if (!sRunning.compareAndSet(false /* expect */, true /* update */)) {
+            if (DEBUG) {
+                Log.d(TAG, "run() : Already running. Don't waste time checking again.");
+            }
+            return;
+        }
         if (haveContentsChanged()) {
             if (DEBUG) {
-                Log.d(TAG, "Contacts have changed; notifying listeners");
+                Log.d(TAG, "run() : Contacts have changed. Notifying listeners.");
             }
             mContactsChangedListener.onContactsChange();
         }
+        sRunning.set(false);
     }
 
     private boolean haveContentsChanged() {