From b475e26e5049847f8d558c5c6c088c16d6c94002 Mon Sep 17 00:00:00 2001 From: Cyrus Bakhtiari-Haftlang Date: Fri, 24 Apr 2020 15:13:20 +0200 Subject: [PATCH] DistinctMutableLiveData --- .../lives/DistinctMutableLiveData.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 lives/src/main/java/se/ingenuity/lives/DistinctMutableLiveData.java diff --git a/lives/src/main/java/se/ingenuity/lives/DistinctMutableLiveData.java b/lives/src/main/java/se/ingenuity/lives/DistinctMutableLiveData.java new file mode 100644 index 0000000..383ea12 --- /dev/null +++ b/lives/src/main/java/se/ingenuity/lives/DistinctMutableLiveData.java @@ -0,0 +1,47 @@ +package se.ingenuity.lives; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LiveData; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class DistinctMutableLiveData extends LiveData { + @NonNull + private final Object dataLock = new Object(); + + @NonNull + private final AtomicBoolean firstTime; + + public DistinctMutableLiveData() { + super(); + firstTime = new AtomicBoolean(true); + } + + public DistinctMutableLiveData(T value) { + super(value); + firstTime = new AtomicBoolean(false); + } + + @Override + public void setValue(T value) { + if (canUpdate(value)) { + super.setValue(value); + } + } + + @Override + public void postValue(T value) { + synchronized (dataLock) { + if (canUpdate(value)) { + super.postValue(value); + } + } + } + + private boolean canUpdate(T currentValue) { + T previousValue = getValue(); + return (firstTime.compareAndSet(true, false) + || (previousValue == null && currentValue != null) + || (previousValue != null && !previousValue.equals(currentValue))); + } +} \ No newline at end of file