]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/utils/ObservableList.java
wrap Log.d calls, skipping them on non-debug builds
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / utils / ObservableList.java
index eac023767186d668583be3c7bcd9328547d4a9e4..363a8a1a053f00ae1b18fe611091e867f01e2aef 100644 (file)
@@ -18,7 +18,8 @@
 package net.ktnx.mobileledger.utils;
 
 import android.os.Build;
-import android.util.Log;
+
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Collection;
 import java.util.Comparator;
@@ -37,17 +38,26 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 
+import static net.ktnx.mobileledger.utils.Logger.debug;
+
 public class ObservableList<T> extends Observable implements List<T> {
     private List<T> list;
     private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+    private int notificationBlocks = 0;
+    private boolean notificationWasBlocked = false;
     public ObservableList(List<T> list) {
         this.list = list;
     }
     private void forceNotify() {
+        if (notificationBlocked()) return;
         setChanged();
         notifyObservers();
     }
+    private boolean notificationBlocked() {
+        return notificationWasBlocked = (notificationBlocks > 0);
+    }
     private void forceNotify(int index) {
+        if (notificationBlocked()) return;
         setChanged();
         notifyObservers(index);
     }
@@ -203,21 +213,25 @@ public class ObservableList<T> extends Observable implements List<T> {
             return list.lastIndexOf(o);
         }
     }
+    @NotNull
     public ListIterator<T> listIterator() {
         if (!lock.isWriteLockedByCurrentThread()) throw new RuntimeException(
                 "Iterators break encapsulation and ignore locking. Write-lock first");
         return list.listIterator();
     }
+    @NotNull
     public ListIterator<T> listIterator(int index) {
         if (!lock.isWriteLockedByCurrentThread()) throw new RuntimeException(
                 "Iterators break encapsulation and ignore locking. Write-lock first");
         return list.listIterator(index);
     }
+    @NotNull
     public List<T> subList(int fromIndex, int toIndex) {
         try (LockHolder lh = lockForReading()) {
             return list.subList(fromIndex, toIndex);
         }
     }
+    @NotNull
     @RequiresApi(api = Build.VERSION_CODES.N)
     public Spliterator<T> spliterator() {
         if (!lock.isWriteLockedByCurrentThread()) throw new RuntimeException(
@@ -267,10 +281,10 @@ public class ObservableList<T> extends Observable implements List<T> {
         try (LockHolder lh = lockForReading()) {
             int index = list.indexOf(item);
             if (index == -1) {
-                Log.d("ObList", "??? not sending notifications for item not found in the list");
+                debug("ObList", "??? not sending notifications for item not found in the list");
                 return;
             }
-            Log.d("ObList", "Notifying item change observers");
+            debug("ObList", "Notifying item change observers");
             triggerItemChangedNotification(index);
         }
     }
@@ -291,4 +305,11 @@ public class ObservableList<T> extends Observable implements List<T> {
         rLock.lock();
         return new LockHolder(rLock);
     }
+    public void blockNotifications() {
+        notificationBlocks++;
+    }
+    public void unblockNotifications() {
+        notificationBlocks--;
+        if ((notificationBlocks == 0) && notificationWasBlocked) notifyObservers();
+    }
 }
\ No newline at end of file