Welcome to mirror list, hosted at ThFree Co, Russian Federation.

LiveDataHelper.java « util « db « adapters « sync « persistence « deck « nextcloud « niedermann « it « java « main « src « app - github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
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();
    }
}