AdvertisementViewModel.java 2.8 KB
package com.polysoft.nafmii.viewmodel;

import android.text.TextUtils;

import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;

import com.polysoft.nafmii.constants.ServerApi;
import com.polysoft.nafmii.database.ObjectBox;
import com.polysoft.nafmii.database.entity.DataEntity;
import com.polysoft.nafmii.enums.StateEnum;
import com.polysoft.nafmii.net.RequestBack;
import com.polysoft.nafmii.utils.TimerUtils;
import com.whaty.nafmii.BuildConfig;

public class AdvertisementViewModel extends ViewModel {

    private final MutableLiveData<LiveData> dataModel = new MutableLiveData<>();
    private final LifecycleOwner owner;
    private final String DB_KEY = "advertisement";
    private boolean isSetModelValue = false;

    public static AdvertisementViewModel newInstance(FragmentActivity owner) {
        ViewModelProvider.Factory factory = new ViewModelProvider.Factory() {
            @NonNull
            @Override
            public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
                return (T) new AdvertisementViewModel(owner);
            }
        };

        return new ViewModelProvider(owner, factory).get(AdvertisementViewModel.class);
    }

    AdvertisementViewModel(LifecycleOwner owner) {
        this.owner = owner;
        this.fetchData();
    }

    public void observe(Observer<LiveData> observer) {
        this.dataModel.observe(this.owner, observer);
    }

    private void fetchData() {
        TimerUtils.setTimeout(() -> {
            DataEntity entity = ObjectBox.findByName(DB_KEY);
            this.postModelValue(null == entity ? null : entity.getValue());
        }, 2000);

        ServerApi.postAdvertisement(new RequestBack<String>() {
            @Override
            protected void onResponse(StateEnum state, String data, String message) {
                if (state.state == StateEnum.OK.state) {
                    postModelValue(data);
                    ObjectBox.put(new DataEntity(DB_KEY, data));
                } else {
                    postModelValue(null);
                }
            }
        });
    }

    private synchronized void postModelValue(String value) {
        if (!this.isSetModelValue) {
            this.isSetModelValue = true;
            this.dataModel.postValue(new LiveData(value));
        }
    }

    public static class LiveData {
        public final String data;

        LiveData(String data) {
            this.data = data;
        }

        public boolean empty() {
            if (BuildConfig.DEBUG) {
                return false;
            }
            return TextUtils.isEmpty(data);
        }
    }

}