未验证 提交 6f3e2f68 编写于 作者: A AMIT SHEKHAR 提交者: GitHub

Merge pull request #8 from Vignesh150493/master

Simple usage of Live Data
......@@ -30,7 +30,7 @@ import com.mindorks.framework.mvvm.data.model.db.User;
* Created by amitshekhar on 07/07/17.
*/
@Database(entities = {User.class, Question.class, Option.class}, version = 1)
@Database(entities = {User.class, Question.class, Option.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
......
......@@ -89,7 +89,7 @@ public class AppModule {
@Provides
@Singleton
AppDatabase provideAppDatabase(@DatabaseInfo String dbName, Context context) {
return Room.databaseBuilder(context, AppDatabase.class, dbName)
return Room.databaseBuilder(context, AppDatabase.class, dbName).fallbackToDestructiveMigration()
.build();
}
......
......@@ -56,7 +56,6 @@ public abstract class BaseActivity<T extends ViewDataBinding, V extends BaseView
super.onCreate(savedInstanceState);
performDependencyInjection();
performDataBinding();
mViewModel.onViewCreated();
}
private void performDataBinding() {
......@@ -84,12 +83,6 @@ public abstract class BaseActivity<T extends ViewDataBinding, V extends BaseView
checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
}
@Override
protected void onDestroy() {
mViewModel.onDestroyView();
super.onDestroy();
}
@Override
public void onFragmentAttached() {
......
......@@ -44,6 +44,7 @@ public abstract class BaseFragment<T extends ViewDataBinding, V extends BaseView
public void onCreate(@Nullable Bundle savedInstanceState) {
performDependencyInjection();
super.onCreate(savedInstanceState);
mViewModel = getViewModel();
setHasOptionsMenu(false);
}
......@@ -58,10 +59,8 @@ public abstract class BaseFragment<T extends ViewDataBinding, V extends BaseView
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mViewModel = getViewModel();
mViewDataBinding.setVariable(getBindingVariable(), mViewModel);
mViewDataBinding.executePendingBindings();
mViewModel.onViewCreated();
}
@Override
......@@ -88,13 +87,6 @@ public abstract class BaseFragment<T extends ViewDataBinding, V extends BaseView
return mViewDataBinding;
}
@Override
public void onDestroyView() {
mViewModel.onDestroyView();
super.onDestroyView();
}
public boolean isNetworkConnected() {
return mActivity != null && mActivity.isNetworkConnected();
}
......
......@@ -41,22 +41,13 @@ public abstract class BaseViewModel<N> extends ViewModel {
SchedulerProvider schedulerProvider) {
this.mDataManager = dataManager;
this.mSchedulerProvider = schedulerProvider;
this.mCompositeDisposable = new CompositeDisposable();
}
public void setNavigator(N navigator) {
this.mNavigator = navigator;
}
public void onViewCreated() {
this.mCompositeDisposable = new CompositeDisposable();
}
public void onDestroyView() {
mCompositeDisposable.dispose();
}
public N getNavigator() {
return mNavigator;
}
......@@ -81,4 +72,9 @@ public abstract class BaseViewModel<N> extends ViewModel {
mIsLoading.set(isLoading);
}
@Override
protected void onCleared() {
mCompositeDisposable.dispose();
super.onCleared();
}
}
......@@ -95,6 +95,10 @@ public class BlogAdapter extends RecyclerView.Adapter<BaseViewHolder> {
notifyDataSetChanged();
}
public void clearItems() {
mBlogResponseList.clear();
}
public class BlogViewHolder extends BaseViewHolder implements BlogItemViewModel.BlogItemViewModelListener {
private ItemBlogViewBinding mBinding;
......
......@@ -16,10 +16,15 @@
package com.mindorks.framework.mvvm.ui.feed.blogs;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelProviders;
import android.databinding.BindingAdapter;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.mindorks.framework.mvvm.BR;
......@@ -28,6 +33,7 @@ import com.mindorks.framework.mvvm.data.model.api.BlogResponse;
import com.mindorks.framework.mvvm.databinding.FragmentBlogBinding;
import com.mindorks.framework.mvvm.ui.base.BaseFragment;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
......@@ -39,7 +45,7 @@ import javax.inject.Inject;
public class BlogFragment extends BaseFragment<FragmentBlogBinding, BlogViewModel> implements BlogNavigator, BlogAdapter.BlogAdapterListener {
@Inject
BlogViewModel mBlogViewModel;
ViewModelProvider.Factory mViewModelFactory;
@Inject
BlogAdapter mBlogAdapter;
......@@ -48,6 +54,7 @@ public class BlogFragment extends BaseFragment<FragmentBlogBinding, BlogViewMode
LinearLayoutManager mLayoutManager;
FragmentBlogBinding mFragmentBlogBinding;
private BlogViewModel mBlogViewModel;
public static BlogFragment newInstance() {
Bundle args = new Bundle();
......@@ -63,20 +70,20 @@ public class BlogFragment extends BaseFragment<FragmentBlogBinding, BlogViewMode
mBlogAdapter.setListener(this);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mFragmentBlogBinding = getViewDataBinding();
setUp();
subscribeToLiveData();
}
@Override
public BlogViewModel getViewModel() {
mBlogViewModel = ViewModelProviders.of(this, mViewModelFactory).get(BlogViewModel.class);
return mBlogViewModel;
}
@Override
public int getBindingVariable() {
return BR.viewModel;
......@@ -92,10 +99,16 @@ public class BlogFragment extends BaseFragment<FragmentBlogBinding, BlogViewMode
mFragmentBlogBinding.blogRecyclerView.setLayoutManager(mLayoutManager);
mFragmentBlogBinding.blogRecyclerView.setItemAnimator(new DefaultItemAnimator());
mFragmentBlogBinding.blogRecyclerView.setAdapter(mBlogAdapter);
//One method one responsibility.May be we can move fetchBlogs() outside this function.
mBlogViewModel.fetchBlogs();
}
private void subscribeToLiveData() {
mBlogViewModel.getBlogListLiveData().observe(this, new Observer<List<BlogResponse.Blog>>() {
@Override
public void onChanged(@Nullable List<BlogResponse.Blog> blogs) {
mBlogViewModel.addBlogItemsToList(blogs);
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
......
......@@ -16,8 +16,10 @@
package com.mindorks.framework.mvvm.ui.feed.blogs;
import android.arch.lifecycle.ViewModelProvider;
import android.support.v7.widget.LinearLayoutManager;
import com.mindorks.framework.mvvm.ViewModelProviderFactory;
import com.mindorks.framework.mvvm.data.DataManager;
import com.mindorks.framework.mvvm.data.model.api.BlogResponse;
import com.mindorks.framework.mvvm.utils.rx.SchedulerProvider;
......@@ -34,7 +36,7 @@ import dagger.Provides;
public class BlogFragmentModule {
@Provides
BlogViewModel provideBlogViewModel(DataManager dataManager,
BlogViewModel blogViewModel(DataManager dataManager,
SchedulerProvider schedulerProvider) {
return new BlogViewModel(dataManager, schedulerProvider);
}
......@@ -49,4 +51,9 @@ public class BlogFragmentModule {
return new LinearLayoutManager(fragment.getActivity());
}
@Provides
ViewModelProvider.Factory provideBlogViewModel(BlogViewModel blogViewModel) {
return new ViewModelProviderFactory<>(blogViewModel);
}
}
......@@ -16,11 +16,16 @@
package com.mindorks.framework.mvvm.ui.feed.blogs;
import android.arch.lifecycle.MutableLiveData;
import android.databinding.ObservableArrayList;
import com.mindorks.framework.mvvm.data.DataManager;
import com.mindorks.framework.mvvm.data.model.api.BlogResponse;
import com.mindorks.framework.mvvm.ui.base.BaseViewModel;
import com.mindorks.framework.mvvm.utils.rx.SchedulerProvider;
import java.util.List;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;
......@@ -30,9 +35,14 @@ import io.reactivex.functions.Consumer;
public class BlogViewModel extends BaseViewModel<BlogNavigator> {
private final ObservableArrayList<BlogResponse.Blog> blogObservableArrayList = new ObservableArrayList<>();
private final MutableLiveData<List<BlogResponse.Blog>> blogListLiveData;
public BlogViewModel(DataManager dataManager,
SchedulerProvider schedulerProvider) {
super(dataManager, schedulerProvider);
blogListLiveData = new MutableLiveData<>();
fetchBlogs();
}
public void fetchBlogs() {
......@@ -46,7 +56,7 @@ public class BlogViewModel extends BaseViewModel<BlogNavigator> {
public void accept(@NonNull BlogResponse blogResponse)
throws Exception {
if (blogResponse != null && blogResponse.getData() != null) {
getNavigator().updateBlog(blogResponse.getData());
blogListLiveData.setValue(blogResponse.getData());
}
setIsLoading(false);
}
......@@ -60,4 +70,16 @@ public class BlogViewModel extends BaseViewModel<BlogNavigator> {
}));
}
public MutableLiveData<List<BlogResponse.Blog>> getBlogListLiveData() {
return blogListLiveData;
}
public void addBlogItemsToList(List<BlogResponse.Blog> blogs) {
blogObservableArrayList.clear();
blogObservableArrayList.addAll(blogs);
}
public ObservableArrayList<BlogResponse.Blog> getBlogObservableArrayList() {
return blogObservableArrayList;
}
}
......@@ -96,6 +96,10 @@ public class OpenSourceAdapter extends RecyclerView.Adapter<BaseViewHolder> {
notifyDataSetChanged();
}
public void clearItems() {
mOpenSourceResponseList.clear();
}
public class OpenSourceViewHolder extends BaseViewHolder implements View.OnClickListener {
private ItemOpenSourceViewBinding mBinding;
......
......@@ -17,10 +17,15 @@
package com.mindorks.framework.mvvm.ui.feed.opensource;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelProviders;
import android.databinding.BindingAdapter;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.mindorks.framework.mvvm.BR;
......@@ -29,6 +34,7 @@ import com.mindorks.framework.mvvm.data.model.api.OpenSourceResponse;
import com.mindorks.framework.mvvm.databinding.FragmentOpenSourceBinding;
import com.mindorks.framework.mvvm.ui.base.BaseFragment;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
......@@ -42,7 +48,7 @@ import dagger.android.support.AndroidSupportInjection;
public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding, OpenSourceViewModel> implements OpenSourceNavigator, OpenSourceAdapter.OpenSourceAdapterListener {
@Inject
OpenSourceViewModel mOpenSourceViewModel;
ViewModelProvider.Factory mViewModelFactory;
@Inject
OpenSourceAdapter mOpenSourceAdapter;
......@@ -50,6 +56,7 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
@Inject
LinearLayoutManager mLayoutManager;
private OpenSourceViewModel mOpenSourceViewModel;
FragmentOpenSourceBinding mFragmentOpenSourceBinding;
public static OpenSourceFragment newInstance() {
......@@ -72,10 +79,21 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
super.onViewCreated(view, savedInstanceState);
mFragmentOpenSourceBinding = getViewDataBinding();
setUp();
subscribeToLiveData();
}
private void subscribeToLiveData() {
mOpenSourceViewModel.getOpenSourceRepos().observe(this, new Observer<List<OpenSourceItemViewModel>>() {
@Override
public void onChanged(@Nullable List<OpenSourceItemViewModel> openSourceItemViewModels) {
mOpenSourceViewModel.addOpenSourceItemsToList(openSourceItemViewModels);
}
});
}
@Override
public OpenSourceViewModel getViewModel() {
mOpenSourceViewModel = ViewModelProviders.of(this, mViewModelFactory).get(OpenSourceViewModel.class);
return mOpenSourceViewModel;
}
......@@ -94,8 +112,6 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
mFragmentOpenSourceBinding.openSourceRecyclerView.setLayoutManager(mLayoutManager);
mFragmentOpenSourceBinding.openSourceRecyclerView.setItemAnimator(new DefaultItemAnimator());
mFragmentOpenSourceBinding.openSourceRecyclerView.setAdapter(mOpenSourceAdapter);
mOpenSourceViewModel.fetchRepos();
}
@Override
......@@ -103,12 +119,6 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
super.onDestroyView();
}
@Override
public void updateRepo(List<OpenSourceResponse.Repo> repoList) {
mOpenSourceViewModel.populateViewModel(repoList);
mOpenSourceAdapter.addItems(mOpenSourceViewModel.openSourceItemViewModels);
}
@Override
public void handleError(Throwable throwable) {
// handle error
......@@ -118,5 +128,4 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
public void onRetryClick() {
mOpenSourceViewModel.fetchRepos();
}
}
......@@ -16,8 +16,10 @@
package com.mindorks.framework.mvvm.ui.feed.opensource;
import android.arch.lifecycle.ViewModelProvider;
import android.support.v7.widget.LinearLayoutManager;
import com.mindorks.framework.mvvm.ViewModelProviderFactory;
import com.mindorks.framework.mvvm.data.DataManager;
import com.mindorks.framework.mvvm.utils.rx.SchedulerProvider;
......@@ -31,7 +33,7 @@ import dagger.Provides;
public class OpenSourceFragmentModule {
@Provides
OpenSourceViewModel provideOpenSourceViewModel(DataManager dataManager,
OpenSourceViewModel openSourceViewModel(DataManager dataManager,
SchedulerProvider schedulerProvider) {
return new OpenSourceViewModel(dataManager, schedulerProvider);
}
......@@ -46,4 +48,8 @@ public class OpenSourceFragmentModule {
return new LinearLayoutManager(fragment.getActivity());
}
@Provides
ViewModelProvider.Factory provideOpenSourceViewModel(OpenSourceViewModel openSourceViewModel) {
return new ViewModelProviderFactory<>(openSourceViewModel);
}
}
......@@ -26,9 +26,5 @@ import java.util.List;
public interface OpenSourceNavigator {
void updateRepo(List<OpenSourceResponse.Repo> repoList);
void handleError(Throwable throwable);
}
......@@ -16,6 +16,7 @@
package com.mindorks.framework.mvvm.ui.feed.opensource;
import android.arch.lifecycle.MutableLiveData;
import android.databinding.ObservableArrayList;
import com.mindorks.framework.mvvm.data.DataManager;
......@@ -23,6 +24,7 @@ import com.mindorks.framework.mvvm.data.model.api.OpenSourceResponse;
import com.mindorks.framework.mvvm.ui.base.BaseViewModel;
import com.mindorks.framework.mvvm.utils.rx.SchedulerProvider;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.annotations.NonNull;
......@@ -34,11 +36,15 @@ import io.reactivex.functions.Consumer;
public class OpenSourceViewModel extends BaseViewModel<OpenSourceNavigator> {
public ObservableArrayList<OpenSourceItemViewModel> openSourceItemViewModels = new ObservableArrayList<>();
private final ObservableArrayList<OpenSourceItemViewModel> openSourceItemViewModels = new ObservableArrayList<>();
private final MutableLiveData<List<OpenSourceItemViewModel>> openSourceItemsLiveData;
public OpenSourceViewModel(DataManager dataManager,
SchedulerProvider schedulerProvider) {
super(dataManager, schedulerProvider);
openSourceItemsLiveData = new MutableLiveData<>();
fetchRepos();
}
public void fetchRepos() {
......@@ -52,7 +58,7 @@ public class OpenSourceViewModel extends BaseViewModel<OpenSourceNavigator> {
public void accept(@NonNull OpenSourceResponse openSourceResponse)
throws Exception {
if (openSourceResponse != null && openSourceResponse.getData() != null) {
getNavigator().updateRepo(openSourceResponse.getData());
openSourceItemsLiveData.setValue(getViewModelList(openSourceResponse.getData()));
}
setIsLoading(false);
}
......@@ -67,12 +73,26 @@ public class OpenSourceViewModel extends BaseViewModel<OpenSourceNavigator> {
}
public void populateViewModel(List<OpenSourceResponse.Repo> repoList) {
public List<OpenSourceItemViewModel> getViewModelList(List<OpenSourceResponse.Repo> repoList) {
ArrayList<OpenSourceItemViewModel> openSourceItemViewModels = new ArrayList<>();
for (int i = 0; i < repoList.size(); i++) {
openSourceItemViewModels.add(new OpenSourceItemViewModel(
repoList.get(i).getCoverImgUrl(), repoList.get(i).getTitle(),
repoList.get(i).getDescription(), repoList.get(i).getProjectUrl()));
}
return openSourceItemViewModels;
}
public MutableLiveData<List<OpenSourceItemViewModel>> getOpenSourceRepos() {
return openSourceItemsLiveData;
}
public void addOpenSourceItemsToList(List<OpenSourceItemViewModel> openSourceItems) {
openSourceItemViewModels.clear();
openSourceItemViewModels.addAll(openSourceItems);
}
public ObservableArrayList<OpenSourceItemViewModel> getOpenSourceItemViewModels() {
return openSourceItemViewModels;
}
}
......@@ -16,6 +16,7 @@
package com.mindorks.framework.mvvm.ui.main;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelProviders;
import android.content.Context;
......@@ -27,6 +28,7 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
......@@ -56,6 +58,7 @@ import com.mindorks.placeholderview.SwipePlaceHolderView;
import com.mindorks.placeholderview.listeners.ItemRemovedListener;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
......@@ -74,11 +77,8 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
private MainViewModel mMainViewModel;
private DrawerLayout mDrawer;
private Toolbar mToolbar;
private NavigationView mNavigationView;
private SwipePlaceHolderView mCardsContainerView;
ActivityMainBinding mActivityMainBinding;
......@@ -96,22 +96,6 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
setUp();
}
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(AboutFragment.TAG);
if (fragment == null) {
super.onBackPressed();
} else {
onFragmentDetached(AboutFragment.TAG);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
......@@ -146,6 +130,31 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
}
}
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(AboutFragment.TAG);
if (fragment == null) {
super.onBackPressed();
} else {
onFragmentDetached(AboutFragment.TAG);
}
}
public void onFragmentDetached(String tag) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null) {
fragmentManager
.beginTransaction()
.disallowAddToBackStack()
.setCustomAnimations(R.anim.slide_left, R.anim.slide_right)
.remove(fragment)
.commitNow();
unlockDrawer();
}
}
private void setUp() {
mDrawer = mActivityMainBinding.drawerView;
......@@ -178,7 +187,16 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
mMainViewModel.updateAppVersion(version);
mMainViewModel.onNavMenuCreated();
setupCardContainerView();
mMainViewModel.onViewInitialized();
subscribeToLiveData();
}
private void subscribeToLiveData() {
mMainViewModel.getQuestionCardData().observe(this, new Observer<List<QuestionCardData>>() {
@Override
public void onChanged(@Nullable List<QuestionCardData> questionCardDatas) {
mMainViewModel.setQuestionDataList(questionCardDatas);
}
});
}
private void setupCardContainerView() {
......@@ -205,7 +223,8 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
new Handler(getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
mMainViewModel.onCardExhausted();
//Reload once all the cards are removed
mMainViewModel.loadQuestionCards();
}
}, 800);
} else {
......@@ -246,62 +265,26 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
});
}
@BindingAdapter({"adapter", "action"})
public static void setAdapter(SwipePlaceHolderView mCardsContainerView,
ArrayList<QuestionCardData> mQuestionList,
int mAction) {
if (mAction == MainViewModel.ACTION_ADD_ALL) {
if (mQuestionList != null) {
mCardsContainerView.removeAllViews();
for (QuestionCardData question : mQuestionList) {
if (question != null
&& question.options != null
&& question.options.size() == 3) {
mCardsContainerView.addView(new QuestionCard(question));
}
}
ViewAnimationUtils.scaleAnimateView(mCardsContainerView);
}
}
}
public void onFragmentDetached(String tag) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null) {
fragmentManager
.beginTransaction()
.disallowAddToBackStack()
.setCustomAnimations(R.anim.slide_left, R.anim.slide_right)
.remove(fragment)
.commitNow();
unlockDrawer();
}
private void showAboutFragment() {
lockDrawer();
getSupportFragmentManager()
.beginTransaction()
.disallowAddToBackStack()
.setCustomAnimations(R.anim.slide_left, R.anim.slide_right)
.add(R.id.clRootView, AboutFragment.newInstance(), AboutFragment.TAG)
.commit();
}
public void lockDrawer() {
private void lockDrawer() {
if (mDrawer != null)
mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
public void unlockDrawer() {
private void unlockDrawer() {
if (mDrawer != null)
mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
public void showAboutFragment() {
lockDrawer();
getSupportFragmentManager()
.beginTransaction()
.disallowAddToBackStack()
.setCustomAnimations(R.anim.slide_left, R.anim.slide_right)
.add(R.id.clRootView, AboutFragment.newInstance(), AboutFragment.TAG)
.commit();
}
@Override
public void openLoginActivity() {
......@@ -334,5 +317,4 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
public AndroidInjector<Fragment> supportFragmentInjector() {
return fragmentDispatchingAndroidInjector;
}
}
......@@ -16,6 +16,7 @@
package com.mindorks.framework.mvvm.ui.main;
import android.arch.lifecycle.MutableLiveData;
import android.databinding.ObservableArrayList;
import android.databinding.ObservableField;
......@@ -25,7 +26,6 @@ import com.mindorks.framework.mvvm.data.model.others.QuestionCardData;
import com.mindorks.framework.mvvm.ui.base.BaseViewModel;
import com.mindorks.framework.mvvm.utils.rx.SchedulerProvider;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.functions.Consumer;
......@@ -36,18 +36,23 @@ import io.reactivex.functions.Consumer;
public class MainViewModel extends BaseViewModel<MainNavigator> {
public final ObservableField<String> appVersion = new ObservableField<>();
public final ObservableField<String> userName = new ObservableField<>();
public final ObservableField<String> userEmail = new ObservableField<>();
public final ObservableField<String> userProfilePicUrl = new ObservableField<>();
public ObservableArrayList<QuestionCardData> questionDataList = new ObservableArrayList<>();
public int mAction = NO_ACTION;
public static final int NO_ACTION = -1, ACTION_ADD_ALL = 0, ACTION_DELETE_SINGLE = 1;
private final ObservableField<String> appVersion = new ObservableField<>();
private final ObservableField<String> userName = new ObservableField<>();
private final ObservableField<String> userEmail = new ObservableField<>();
private final ObservableField<String> userProfilePicUrl = new ObservableField<>();
private final ObservableArrayList<QuestionCardData> questionDataList = new ObservableArrayList<>();
private final MutableLiveData<List<QuestionCardData>> questionCardData;
private int action = NO_ACTION;
public MainViewModel(DataManager dataManager,
SchedulerProvider schedulerProvider) {
super(dataManager, schedulerProvider);
questionCardData = new MutableLiveData<>();
loadQuestionCards();
}
public void updateAppVersion(String version) {
......@@ -72,30 +77,7 @@ public class MainViewModel extends BaseViewModel<MainNavigator> {
}
}
public void onViewInitialized() {
if (mAction == NO_ACTION) {
getCompositeDisposable().add(getDataManager()
.getQuestionCardData()
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(new Consumer<List<QuestionCardData>>() {
@Override
public void accept(List<QuestionCardData> questionList) throws Exception {
if (questionList != null) {
mAction = ACTION_ADD_ALL;
questionDataList.addAll(questionList);
}
}
}));
} else {
ArrayList<QuestionCardData> arrayList = (ArrayList<QuestionCardData>) questionDataList.clone();
questionDataList.clear();
mAction = ACTION_ADD_ALL;
questionDataList.addAll(arrayList);
}
}
public void onCardExhausted() {
public void loadQuestionCards() {
getCompositeDisposable().add(getDataManager()
.getQuestionCardData()
.subscribeOn(getSchedulerProvider().io())
......@@ -104,14 +86,14 @@ public class MainViewModel extends BaseViewModel<MainNavigator> {
@Override
public void accept(List<QuestionCardData> questionList) throws Exception {
if (questionList != null) {
mAction = ACTION_ADD_ALL;
questionDataList.clear();
questionDataList.addAll(questionList);
action = ACTION_ADD_ALL;
questionCardData.setValue(questionList);
}
}
}));
}
public void logout() {
setIsLoading(true);
getCompositeDisposable().add(getDataManager().doLogoutApiCall()
......@@ -134,7 +116,42 @@ public class MainViewModel extends BaseViewModel<MainNavigator> {
}
public void removeQuestionCard() {
mAction = ACTION_DELETE_SINGLE;
action = ACTION_DELETE_SINGLE;
questionDataList.remove(0);
questionCardData.getValue().remove(0);
}
public void setQuestionDataList(List<QuestionCardData> questionCardDatas) {
action = ACTION_ADD_ALL;
questionDataList.clear();
questionDataList.addAll(questionCardDatas);
}
public MutableLiveData<List<QuestionCardData>> getQuestionCardData() {
return questionCardData;
}
public ObservableField<String> getAppVersion() {
return appVersion;
}
public ObservableField<String> getUserName() {
return userName;
}
public ObservableField<String> getUserEmail() {
return userEmail;
}
public ObservableField<String> getUserProfilePicUrl() {
return userProfilePicUrl;
}
public ObservableArrayList<QuestionCardData> getQuestionDataList() {
return questionDataList;
}
public int getAction() {
return action;
}
}
......@@ -18,9 +18,20 @@ package com.mindorks.framework.mvvm.utils;
import android.content.Context;
import android.databinding.BindingAdapter;
import android.support.v7.widget.RecyclerView;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.mindorks.framework.mvvm.data.model.api.BlogResponse;
import com.mindorks.framework.mvvm.data.model.others.QuestionCardData;
import com.mindorks.framework.mvvm.ui.feed.blogs.BlogAdapter;
import com.mindorks.framework.mvvm.ui.feed.opensource.OpenSourceAdapter;
import com.mindorks.framework.mvvm.ui.feed.opensource.OpenSourceItemViewModel;
import com.mindorks.framework.mvvm.ui.main.MainViewModel;
import com.mindorks.framework.mvvm.ui.main.QuestionCard;
import com.mindorks.placeholderview.SwipePlaceHolderView;
import java.util.ArrayList;
/**
* Created by amitshekhar on 11/07/17.
......@@ -37,4 +48,43 @@ public final class BindingUtils {
Context context = imageView.getContext();
Glide.with(context).load(url).into(imageView);
}
@BindingAdapter({"adapter"})
public static void addOpenSourceItems(RecyclerView recyclerView,
ArrayList<OpenSourceItemViewModel> openSourceItems) {
OpenSourceAdapter adapter = (OpenSourceAdapter) recyclerView.getAdapter();
if(adapter != null) {
adapter.clearItems();
adapter.addItems(openSourceItems);
}
}
@BindingAdapter({"adapter"})
public static void addBlogItems(RecyclerView recyclerView,
ArrayList<BlogResponse.Blog> blogs) {
BlogAdapter adapter = (BlogAdapter) recyclerView.getAdapter();
if(adapter != null) {
adapter.clearItems();
adapter.addItems(blogs);
}
}
@BindingAdapter({"adapter", "action"})
public static void addQuestionItems(SwipePlaceHolderView mCardsContainerView,
ArrayList<QuestionCardData> mQuestionList,
int mAction) {
if (mAction == MainViewModel.ACTION_ADD_ALL) {
if (mQuestionList != null) {
mCardsContainerView.removeAllViews();
for (QuestionCardData question : mQuestionList) {
if (question != null
&& question.options != null
&& question.options.size() == 3) {
mCardsContainerView.addView(new QuestionCard(question));
}
}
ViewAnimationUtils.scaleAnimateView(mCardsContainerView);
}
}
}
}
......@@ -77,7 +77,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
app:adapter="@{viewModel.questionDataList}"
app:action="@{viewModel.mAction}"/>
app:action="@{viewModel.action}"/>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
......
......@@ -14,7 +14,8 @@
~ limitations under the License
-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
......@@ -40,7 +41,8 @@
android:id="@+id/blogRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_blog_view" />
tools:listitem="@layout/item_blog_view"
app:adapter="@{viewModel.blogObservableArrayList}"/>
</LinearLayout>
......
......@@ -14,7 +14,8 @@
~ limitations under the License
-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
......@@ -40,7 +41,8 @@
android:id="@+id/openSourceRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_blog_view" />
tools:listitem="@layout/item_blog_view"
app:adapter="@{viewModel.openSourceItemViewModels}"/>
</LinearLayout>
......
......@@ -45,14 +45,14 @@ ext {
minSdkVersion = 16
targetSdkVersion = 26
compileSdkVersion = 26
buildToolsVersion = '26.0.0'
buildToolsVersion = '26.0.1'
// App dependencies
supportLibraryVersion = '25.4.0'
supportLibraryVersion = '26.1.0'
gsonVersion = '2.8.0'
calligraphyVersion = '2.2.0'
glideVersion = '3.7.0'
roomDatabase = '1.0.0-alpha3'
roomDatabase = '1.0.0-beta2'
rx2FastAndroidNetworking = '1.0.0'
dagger2Version = '2.11'
......@@ -61,7 +61,7 @@ ext {
placeholderviewVersion = '0.6.1'
debugDBVersion = '1.0.0'
timberVersion = '4.5.1'
lifecycle = '1.0.0-alpha3'
lifecycle = '1.0.0-beta2'
//Test dependencies
junitVersion = '4.12'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册