blob: dfed2736741ab20c28767aa24fd9b13d9838bc2d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
package it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MediatorLiveData;
import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.Observer;
import android.support.annotation.Nullable;
public class LiveDataHelper {
public interface DataChangePocessor<T>{
void onDataChanged(T data);
}
public interface DataTransformator<I, O>{
O transform(I data);
}
public interface LiveDataWrapper<T>{
T getData();
default void postResult(MutableLiveData<T> liveData){
liveData.postValue(getData());
}
}
public static <T> MediatorLiveData<T> interceptLiveData(LiveData<T> data, DataChangePocessor<T> onDataChange) {
MediatorLiveData<T> ret = new MediatorLiveData<>();
ret.addSource(data, changedData ->
doAsync(() -> {
onDataChange.onDataChanged(changedData);
ret.postValue(changedData);
})
);
return onlyIfChanged(ret);
}
public static <I, O> MediatorLiveData<O> postCustomValue(LiveData<I> data, DataTransformator<I, O> transformator) {
MediatorLiveData<O> ret = new MediatorLiveData<>();
ret.addSource(data, changedData -> doAsync(() ->ret.postValue(transformator.transform(changedData))));
return onlyIfChanged(ret);
}
public static <T> MediatorLiveData<T> onlyIfChanged(LiveData<T> data) {
MediatorLiveData<T> ret = new MediatorLiveData<>();
ret.addSource(data, new Observer<T>() {
T lastObject = null;
@Override
public void onChanged(@Nullable T newData) {
boolean hasValueChanged =
(lastObject != null && newData == null) ||
(lastObject == null && newData != null) ||
(lastObject != null && !lastObject.equals(newData)) ||
(newData != null && !newData.equals(lastObject)) ;
lastObject = newData;
if (hasValueChanged){
ret.postValue(newData);
}
}
});
return ret;
}
public static <T> LiveData<T> wrapInLiveData(final LiveDataWrapper<T> liveDataWrapper) {
final MutableLiveData<T> liveData = new MutableLiveData();
doAsync(() -> liveDataWrapper.postResult(liveData));
return liveData;
}
private static void doAsync(Runnable r) {
new Thread(r).start();
}
}
|