package awais.instagrabber.viewmodels; import android.util.Log; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import java.util.ArrayList; import java.util.List; import awais.instagrabber.customviews.helpers.PostFetcher; import awais.instagrabber.fragments.settings.PreferenceKeys; import awais.instagrabber.interfaces.FetchListener; import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.KeywordsFilterUtilsKt; import static awais.instagrabber.utils.Utils.settingsHelper; public class MediaViewModel extends ViewModel { private static final String TAG = MediaViewModel.class.getSimpleName(); private boolean refresh = true; private final PostFetcher postFetcher; private final MutableLiveData> list = new MutableLiveData<>(); public MediaViewModel(@NonNull final PostFetcher.PostFetchService postFetchService) { final FetchListener> fetchListener = new FetchListener>() { @Override public void onResult(final List result) { if (refresh) { list.postValue(filterResult(result, true)); refresh = false; return; } list.postValue(filterResult(result, false)); } @Override public void onFailure(final Throwable t) { Log.e(TAG, "onFailure: ", t); } }; postFetcher = new PostFetcher(postFetchService, fetchListener); } @NonNull private List filterResult(final List result, final boolean isRefresh) { final List models = list.getValue(); final List modelsCopy = models == null || isRefresh ? new ArrayList<>() : new ArrayList<>(models); if (settingsHelper.getBoolean(PreferenceKeys.TOGGLE_KEYWORD_FILTER)) { final List keywords = new ArrayList<>(settingsHelper.getStringSet(PreferenceKeys.KEYWORD_FILTERS)); final List filter = KeywordsFilterUtilsKt.filter(keywords, result); if (filter != null) { modelsCopy.addAll(filter); } return modelsCopy; } modelsCopy.addAll(result); return modelsCopy; } public LiveData> getList() { return list; } public boolean hasMore() { return postFetcher.hasMore(); } public void fetch() { postFetcher.fetch(); } public void reset() { postFetcher.reset(); } public boolean isFetching() { return postFetcher.isFetching(); } public void refresh() { refresh = true; reset(); fetch(); } public static class ViewModelFactory implements ViewModelProvider.Factory { @NonNull private final PostFetcher.PostFetchService postFetchService; public ViewModelFactory(@NonNull final PostFetcher.PostFetchService postFetchService) { this.postFetchService = postFetchService; } @NonNull @Override public T create(@NonNull final Class modelClass) { //noinspection unchecked return (T) new MediaViewModel(postFetchService); } } }