提交 43eaf7f6 编写于 作者: A AMIT SHEKHAR 提交者: GitHub

Merge pull request #1 from MindorksOpenSource/common_code_refactor

Refactor the common code
......@@ -27,6 +27,7 @@ import com.mindorks.framework.mvvm.di.ActivityContext;
import com.mindorks.framework.mvvm.di.PerActivity;
import com.mindorks.framework.mvvm.ui.about.AboutViewModel;
import com.mindorks.framework.mvvm.ui.feed.FeedPagerAdapter;
import com.mindorks.framework.mvvm.ui.feed.FeedViewModel;
import com.mindorks.framework.mvvm.ui.feed.blogs.BlogAdapter;
import com.mindorks.framework.mvvm.ui.feed.blogs.BlogViewModel;
import com.mindorks.framework.mvvm.ui.feed.opensource.OpenSourceAdapter;
......@@ -141,12 +142,19 @@ public class ActivityModule {
@Provides
OpenSourceAdapter provideOpenSourceAdapter() {
return new OpenSourceAdapter(new ArrayList<OpenSourceResponse.Repo>());
return new OpenSourceAdapter();
}
@Provides
LinearLayoutManager provideLinearLayoutManager(AppCompatActivity activity) {
return new LinearLayoutManager(activity);
}
@Provides
@PerActivity
FeedViewModel provideFeedViewModel(DataManager dataManager,
SchedulerProvider schedulerProvider,
CompositeDisposable compositeDisposable) {
return new FeedViewModel(dataManager, schedulerProvider, compositeDisposable);
}
}
......@@ -16,13 +16,10 @@
package com.mindorks.framework.mvvm.ui.about;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mindorks.framework.mvvm.BR;
import com.mindorks.framework.mvvm.R;
import com.mindorks.framework.mvvm.databinding.FragmentAboutBinding;
import com.mindorks.framework.mvvm.di.component.ActivityComponent;
......@@ -34,7 +31,7 @@ import javax.inject.Inject;
* Created by amitshekhar on 09/07/17.
*/
public class AboutFragment extends BaseFragment implements AboutNavigator {
public class AboutFragment extends BaseFragment<FragmentAboutBinding, AboutViewModel> implements AboutNavigator {
public static final String TAG = "AboutFragment";
......@@ -48,26 +45,26 @@ public class AboutFragment extends BaseFragment implements AboutNavigator {
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
FragmentAboutBinding binding = DataBindingUtil.inflate(
inflater, R.layout.fragment_about, container, false);
View view = binding.getRoot();
ActivityComponent component = getActivityComponent();
if (component != null) {
component.inject(this);
}
binding.setViewModel(mAboutViewModel);
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
performDependencyInjection();
mAboutViewModel.setNavigator(this);
}
return view;
@Override
public AboutViewModel getViewModel() {
return mAboutViewModel;
}
@Override
public int getBindingVariable() {
return BR.viewModel;
}
@Override
public int getLayoutId() {
return R.layout.fragment_about;
}
@Override
......@@ -80,5 +77,11 @@ public class AboutFragment extends BaseFragment implements AboutNavigator {
mAboutViewModel.onDestroy();
super.onDestroyView();
}
private void performDependencyInjection(){
ActivityComponent component = getActivityComponent();
if (getActivityComponent() != null) {
component.inject(this);
}
}
}
......@@ -20,8 +20,12 @@ import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.pm.PackageManager;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
......@@ -41,21 +45,40 @@ import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
* Created by amitshekhar on 07/07/17.
*/
public abstract class BaseActivity extends AppCompatActivity implements BaseFragment.Callback {
public abstract class BaseActivity<T extends ViewDataBinding, V extends BaseViewModel> extends AppCompatActivity implements BaseFragment.Callback {
private ActivityComponent mActivityComponent;
// TODO
// this can probably depend on isLoading variable of BaseViewModel,
// since its going to be common for all the activities
private ProgressDialog mProgressDialog;
private T mViewDataBinding;
private V mViewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initializeActivityComponent();
performDependencyInjection();
performDataBinding();
}
private void initializeActivityComponent() {
mActivityComponent = DaggerActivityComponent.builder()
.activityModule(new ActivityModule(this))
.applicationComponent(((MvvmApp) getApplication()).getComponent())
.build();
}
private void performDataBinding() {
mViewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
this.mViewModel = mViewModel == null ? getViewModel() : mViewModel;
mViewDataBinding.setVariable(getBindingVariable(), mViewModel);
mViewDataBinding.executePendingBindings();
}
public ActivityComponent getActivityComponent() {
return mActivityComponent;
}
......@@ -122,5 +145,35 @@ public abstract class BaseActivity extends AppCompatActivity implements BaseFrag
}
}
public T getViewDataBinding() {
return mViewDataBinding;
}
/**
* Override for set view model
*
* @return view model instance
*/
public abstract V getViewModel();
/**
* Override for set binding variable
*
* @return variable id
*/
public abstract
@IdRes
int getBindingVariable();
/**
* @return layout resource id
*/
public abstract
@LayoutRes
int getLayoutId();
public abstract void performDependencyInjection();
}
......@@ -17,10 +17,16 @@
package com.mindorks.framework.mvvm.ui.base;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mindorks.framework.mvvm.di.component.ActivityComponent;
......@@ -28,19 +34,31 @@ import com.mindorks.framework.mvvm.di.component.ActivityComponent;
* Created by amitshekhar on 09/07/17.
*/
public abstract class BaseFragment extends Fragment {
public abstract class BaseFragment<T extends ViewDataBinding, V extends BaseViewModel> extends Fragment {
private BaseActivity mActivity;
private T mViewDataBinding;
private V mViewModel;
private View mRootView;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mViewDataBinding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
mRootView = mViewDataBinding.getRoot();
return mRootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mViewModel = getViewModel();
mViewDataBinding.setVariable(getBindingVariable(), mViewModel);
mViewDataBinding.executePendingBindings();
}
@Override
......@@ -70,23 +88,15 @@ public abstract class BaseFragment extends Fragment {
return mActivity;
}
public T getViewDataBinding(){
return mViewDataBinding;
}
@Override
public void onDestroy() {
super.onDestroy();
}
public void showLoading() {
if (mActivity != null) {
mActivity.showLoading();
}
}
public void hideLoading() {
if (mActivity != null) {
mActivity.hideLoading();
}
}
public boolean isNetworkConnected() {
return mActivity != null && mActivity.isNetworkConnected();
}
......@@ -109,4 +119,24 @@ public abstract class BaseFragment extends Fragment {
void onFragmentDetached(String tag);
}
/**
* Override for set view model
* @return view model instance
*/
public abstract V getViewModel();
/**
* Override for set binding variable
* @return variable id
*/
public abstract
@IdRes
int getBindingVariable();
/**
* @return layout resource id
*/
public abstract
@LayoutRes
int getLayoutId();
}
......@@ -16,6 +16,8 @@
package com.mindorks.framework.mvvm.ui.base;
import android.databinding.ObservableBoolean;
import com.mindorks.framework.mvvm.data.DataManager;
import com.mindorks.framework.mvvm.utils.rx.SchedulerProvider;
......@@ -28,10 +30,10 @@ import io.reactivex.disposables.CompositeDisposable;
public abstract class BaseViewModel<N> {
private N mNavigator;
private final DataManager mDataManager;
private final SchedulerProvider mSchedulerProvider;
private final CompositeDisposable mCompositeDisposable;
private final ObservableBoolean mIsLoading = new ObservableBoolean(false);
public BaseViewModel(DataManager dataManager,
SchedulerProvider schedulerProvider,
......@@ -65,4 +67,12 @@ public abstract class BaseViewModel<N> {
return mCompositeDisposable;
}
public ObservableBoolean getIsLoading() {
return mIsLoading;
}
public void setIsLoading(boolean isLoading) {
mIsLoading.set(isLoading);
}
}
......@@ -18,13 +18,12 @@ package com.mindorks.framework.mvvm.ui.feed;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.NavUtils;
import android.support.v4.app.TaskStackBuilder;
import android.view.MenuItem;
import com.mindorks.framework.mvvm.BR;
import com.mindorks.framework.mvvm.R;
import com.mindorks.framework.mvvm.databinding.ActivityFeedBinding;
import com.mindorks.framework.mvvm.ui.base.BaseActivity;
......@@ -35,12 +34,15 @@ import javax.inject.Inject;
* Created by amitshekhar on 10/07/17.
*/
public class FeedActivity extends BaseActivity {
public class FeedActivity extends BaseActivity<ActivityFeedBinding, FeedViewModel> {
@Inject
FeedPagerAdapter mPagerAdapter;
@Inject
FeedViewModel mFeedViewModel;
ActivityFeedBinding mActivityFeedBinding;
private ActivityFeedBinding mBinding;
public static Intent getStartIntent(Context context) {
Intent intent = new Intent(context, FeedActivity.class);
......@@ -50,17 +52,13 @@ public class FeedActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_feed);
getActivityComponent().inject(this);
mActivityFeedBinding = getViewDataBinding();
setUp();
}
private void setUp() {
setSupportActionBar(mBinding.toolbar);
setSupportActionBar(mActivityFeedBinding.toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
......@@ -69,19 +67,19 @@ public class FeedActivity extends BaseActivity {
mPagerAdapter.setCount(2);
mBinding.feedViewPager.setAdapter(mPagerAdapter);
mActivityFeedBinding.feedViewPager.setAdapter(mPagerAdapter);
mBinding.tabLayout.addTab(mBinding.tabLayout.newTab().setText(getString(R.string.blog)));
mBinding.tabLayout.addTab(mBinding.tabLayout.newTab().setText(getString(R.string.open_source)));
mActivityFeedBinding.tabLayout.addTab(mActivityFeedBinding.tabLayout.newTab().setText(getString(R.string.blog)));
mActivityFeedBinding.tabLayout.addTab(mActivityFeedBinding.tabLayout.newTab().setText(getString(R.string.open_source)));
mBinding.feedViewPager.setOffscreenPageLimit(mBinding.tabLayout.getTabCount());
mActivityFeedBinding.feedViewPager.setOffscreenPageLimit(mActivityFeedBinding.tabLayout.getTabCount());
mBinding.feedViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mBinding.tabLayout));
mActivityFeedBinding.feedViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mActivityFeedBinding.tabLayout));
mBinding.tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
mActivityFeedBinding.tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
mBinding.feedViewPager.setCurrentItem(tab.getPosition());
mActivityFeedBinding.feedViewPager.setCurrentItem(tab.getPosition());
}
@Override
......@@ -125,4 +123,27 @@ public class FeedActivity extends BaseActivity {
protected void onDestroy() {
super.onDestroy();
}
@Override
public FeedViewModel getViewModel() {
return mFeedViewModel;
}
@Override
public int getBindingVariable() {
return BR.viewModel;
}
@Override
public int getLayoutId() {
return R.layout.activity_feed;
}
@Override
public void performDependencyInjection() {
getActivityComponent().inject(this);
}
}
package com.mindorks.framework.mvvm.ui.feed;
import com.mindorks.framework.mvvm.data.DataManager;
import com.mindorks.framework.mvvm.ui.base.BaseViewModel;
import com.mindorks.framework.mvvm.utils.rx.SchedulerProvider;
import io.reactivex.disposables.CompositeDisposable;
/**
* Created by Jyoti on 29/07/17.
*/
public class FeedViewModel extends BaseViewModel {
public FeedViewModel(DataManager dataManager, SchedulerProvider schedulerProvider, CompositeDisposable compositeDisposable) {
super(dataManager, schedulerProvider, compositeDisposable);
}
}
......@@ -16,15 +16,12 @@
package com.mindorks.framework.mvvm.ui.feed.blogs;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mindorks.framework.mvvm.BR;
import com.mindorks.framework.mvvm.R;
import com.mindorks.framework.mvvm.data.model.api.BlogResponse;
import com.mindorks.framework.mvvm.databinding.FragmentBlogBinding;
......@@ -39,7 +36,7 @@ import javax.inject.Inject;
* Created by amitshekhar on 10/07/17.
*/
public class BlogFragment extends BaseFragment implements BlogNavigator, BlogAdapter.BlogAdapterListener {
public class BlogFragment extends BaseFragment<FragmentBlogBinding, BlogViewModel> implements BlogNavigator, BlogAdapter.BlogAdapterListener {
@Inject
BlogViewModel mBlogViewModel;
......@@ -49,8 +46,7 @@ public class BlogFragment extends BaseFragment implements BlogNavigator, BlogAda
@Inject
LinearLayoutManager mLayoutManager;
private FragmentBlogBinding mBinding;
FragmentBlogBinding mFragmentBlogBinding;
public static BlogFragment newInstance() {
Bundle args = new Bundle();
......@@ -59,42 +55,44 @@ public class BlogFragment extends BaseFragment implements BlogNavigator, BlogAda
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
mBinding = DataBindingUtil.inflate(
inflater, R.layout.fragment_blog, container, false);
View view = mBinding.getRoot();
ActivityComponent component = getActivityComponent();
if (component != null) {
component.inject(this);
}
mBinding.setViewModel(mBlogViewModel);
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
performDependencyInjection();
mBlogViewModel.setNavigator(this);
mBlogAdapter.setListener(this);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mFragmentBlogBinding = getViewDataBinding();
setUp();
}
@Override
public BlogViewModel getViewModel() {
return mBlogViewModel;
}
@Override
public int getBindingVariable() {
return BR.viewModel;
}
@Override
public int getLayoutId() {
return R.layout.fragment_blog;
}
private void setUp() {
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mBinding.blogRecyclerView.setLayoutManager(mLayoutManager);
mBinding.blogRecyclerView.setItemAnimator(new DefaultItemAnimator());
mBinding.blogRecyclerView.setAdapter(mBlogAdapter);
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();
}
......@@ -118,4 +116,11 @@ public class BlogFragment extends BaseFragment implements BlogNavigator, BlogAda
public void onRetryClick() {
mBlogViewModel.fetchBlogs();
}
private void performDependencyInjection() {
ActivityComponent component = getActivityComponent();
if (getActivityComponent() != null) {
component.inject(this);
}
}
}
......@@ -30,8 +30,4 @@ public interface BlogNavigator {
void handleError(Throwable throwable);
void showLoading();
void hideLoading();
}
......@@ -38,7 +38,7 @@ public class BlogViewModel extends BaseViewModel<BlogNavigator> {
}
public void fetchBlogs() {
getNavigator().showLoading();
setIsLoading(true);
getCompositeDisposable().add(getDataManager()
.getBlogApiCall()
.subscribeOn(getSchedulerProvider().io())
......@@ -50,13 +50,13 @@ public class BlogViewModel extends BaseViewModel<BlogNavigator> {
if (blogResponse != null && blogResponse.getData() != null) {
getNavigator().updateBlog(blogResponse.getData());
}
getNavigator().hideLoading();
setIsLoading(false);
}
}, new Consumer<Throwable>() {
@Override
public void accept(@NonNull Throwable throwable)
throws Exception {
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().handleError(throwable);
}
}));
......
......@@ -20,6 +20,7 @@ import android.content.Intent;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mindorks.framework.mvvm.data.model.api.OpenSourceResponse;
......@@ -28,6 +29,7 @@ import com.mindorks.framework.mvvm.databinding.ItemOpenSourceViewBinding;
import com.mindorks.framework.mvvm.ui.base.BaseViewHolder;
import com.mindorks.framework.mvvm.utils.AppLogger;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -39,11 +41,11 @@ public class OpenSourceAdapter extends RecyclerView.Adapter<BaseViewHolder> {
public static final int VIEW_TYPE_EMPTY = 0;
public static final int VIEW_TYPE_NORMAL = 1;
private List<OpenSourceResponse.Repo> mOpenSourceResponseList;
private List<OpenSourceItemViewModel> mOpenSourceResponseList;
private OpenSourceAdapterListener mListener;
public OpenSourceAdapter(List<OpenSourceResponse.Repo> openSourceResponseList) {
this.mOpenSourceResponseList = openSourceResponseList;
public OpenSourceAdapter() {
this.mOpenSourceResponseList = new ArrayList<>();
}
public void setListener(OpenSourceAdapterListener listener) {
......@@ -89,16 +91,15 @@ public class OpenSourceAdapter extends RecyclerView.Adapter<BaseViewHolder> {
}
}
public void addItems(List<OpenSourceResponse.Repo> repoList) {
public void addItems(List<OpenSourceItemViewModel> repoList) {
mOpenSourceResponseList.addAll(repoList);
notifyDataSetChanged();
}
public class OpenSourceViewHolder extends BaseViewHolder implements OpenSourceItemViewModel.OpenSourceItemViewModelListener {
public class OpenSourceViewHolder extends BaseViewHolder implements View.OnClickListener {
private ItemOpenSourceViewBinding mBinding;
private OpenSourceItemViewModel mOpenSourceItemViewModel;
public OpenSourceViewHolder(ItemOpenSourceViewBinding binding) {
super(binding.getRoot());
......@@ -107,10 +108,7 @@ public class OpenSourceAdapter extends RecyclerView.Adapter<BaseViewHolder> {
@Override
public void onBind(int position) {
final OpenSourceResponse.Repo repo = mOpenSourceResponseList.get(position);
mOpenSourceItemViewModel = new OpenSourceItemViewModel(repo, this);
final OpenSourceItemViewModel mOpenSourceItemViewModel = mOpenSourceResponseList.get(position);
mBinding.setViewModel(mOpenSourceItemViewModel);
// Immediate Binding
......@@ -120,14 +118,15 @@ public class OpenSourceAdapter extends RecyclerView.Adapter<BaseViewHolder> {
mBinding.executePendingBindings();
}
@Override
public void onItemClick(String projectUrl) {
if (projectUrl != null) {
public void onClick(View view) {
if (mOpenSourceResponseList.get(0).projectUrl.get() != null) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(projectUrl));
intent.setData(Uri.parse(mOpenSourceResponseList.get(0).projectUrl.get()));
itemView.getContext().startActivity(intent);
} catch (Exception e) {
AppLogger.d("url error");
......
......@@ -16,15 +16,14 @@
package com.mindorks.framework.mvvm.ui.feed.opensource;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mindorks.framework.mvvm.BR;
import com.mindorks.framework.mvvm.R;
import com.mindorks.framework.mvvm.data.model.api.OpenSourceResponse;
import com.mindorks.framework.mvvm.databinding.FragmentOpenSourceBinding;
......@@ -39,7 +38,7 @@ import javax.inject.Inject;
* Created by amitshekhar on 10/07/17.
*/
public class OpenSourceFragment extends BaseFragment implements OpenSourceNavigator, OpenSourceAdapter.OpenSourceAdapterListener {
public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding, OpenSourceViewModel> implements OpenSourceNavigator, OpenSourceAdapter.OpenSourceAdapterListener {
@Inject
OpenSourceViewModel mOpenSourceViewModel;
......@@ -49,8 +48,7 @@ public class OpenSourceFragment extends BaseFragment implements OpenSourceNaviga
@Inject
LinearLayoutManager mLayoutManager;
private FragmentOpenSourceBinding mBinding;
FragmentOpenSourceBinding mFragmentOpenSourceBinding;
public static OpenSourceFragment newInstance() {
Bundle args = new Bundle();
......@@ -59,41 +57,42 @@ public class OpenSourceFragment extends BaseFragment implements OpenSourceNaviga
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
mBinding = DataBindingUtil.inflate(
inflater, R.layout.fragment_open_source, container, false);
View view = mBinding.getRoot();
ActivityComponent component = getActivityComponent();
if (component != null) {
component.inject(this);
}
mBinding.setViewModel(mOpenSourceViewModel);
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
performDependencyInjection();
mOpenSourceViewModel.setNavigator(this);
mOpenSourceAdapter.setListener(this);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mFragmentOpenSourceBinding = getViewDataBinding();
setUp();
}
@Override
public OpenSourceViewModel getViewModel() {
return mOpenSourceViewModel;
}
@Override
public int getBindingVariable() {
return BR.viewModel;
}
@Override
public int getLayoutId() {
return R.layout.fragment_open_source;
}
private void setUp() {
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mBinding.openSourceRecyclerView.setLayoutManager(mLayoutManager);
mBinding.openSourceRecyclerView.setItemAnimator(new DefaultItemAnimator());
mBinding.openSourceRecyclerView.setAdapter(mOpenSourceAdapter);
mFragmentOpenSourceBinding.openSourceRecyclerView.setLayoutManager(mLayoutManager);
mFragmentOpenSourceBinding.openSourceRecyclerView.setItemAnimator(new DefaultItemAnimator());
mFragmentOpenSourceBinding.openSourceRecyclerView.setAdapter(mOpenSourceAdapter);
mOpenSourceViewModel.fetchRepos();
}
......@@ -106,7 +105,8 @@ public class OpenSourceFragment extends BaseFragment implements OpenSourceNaviga
@Override
public void updateRepo(List<OpenSourceResponse.Repo> repoList) {
mOpenSourceAdapter.addItems(repoList);
mOpenSourceViewModel.populateViewModel(repoList);
mOpenSourceAdapter.addItems(mOpenSourceViewModel.openSourceItemViewModels);
}
@Override
......@@ -118,4 +118,11 @@ public class OpenSourceFragment extends BaseFragment implements OpenSourceNaviga
public void onRetryClick() {
mOpenSourceViewModel.fetchRepos();
}
private void performDependencyInjection() {
ActivityComponent component = getActivityComponent();
if (getActivityComponent() != null) {
component.inject(this);
}
}
}
......@@ -20,33 +20,26 @@ import android.databinding.ObservableField;
import com.mindorks.framework.mvvm.data.model.api.OpenSourceResponse;
import io.reactivex.Single;
/**
* Created by amitshekhar on 10/07/17.
*/
public class OpenSourceItemViewModel {
private OpenSourceResponse.Repo mRepo;
public ObservableField<String> imageUrl;
public ObservableField<String> title;
public ObservableField<String> content;
public ObservableField<String> projectUrl;
public OpenSourceItemViewModelListener mListener;
public OpenSourceItemViewModel(OpenSourceResponse.Repo repo, OpenSourceItemViewModelListener listener) {
this.mRepo = repo;
this.mListener = listener;
imageUrl = new ObservableField<>(repo.getCoverImgUrl());
title = new ObservableField<>(mRepo.getTitle());
content = new ObservableField<>(mRepo.getDescription());
}
public void onItemClick() {
mListener.onItemClick(mRepo.getProjectUrl());
public OpenSourceItemViewModel(String imageUrl, String title, String content, String projectUrl) {
this.imageUrl.set(imageUrl);
this.title.set(title);
this.content.set(content);
this.projectUrl.set(projectUrl);
}
public interface OpenSourceItemViewModelListener {
void onItemClick(String projectUrl);
}
}
......@@ -30,8 +30,5 @@ public interface OpenSourceNavigator {
void handleError(Throwable throwable);
void showLoading();
void hideLoading();
}
......@@ -16,11 +16,18 @@
package com.mindorks.framework.mvvm.ui.feed.opensource;
import android.databinding.ObservableArrayList;
import com.mindorks.framework.mvvm.data.DataManager;
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 java.util.concurrent.Callable;
import io.reactivex.Single;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Consumer;
......@@ -30,6 +37,8 @@ import io.reactivex.functions.Consumer;
*/
public class OpenSourceViewModel extends BaseViewModel<OpenSourceNavigator> {
public ObservableArrayList<OpenSourceItemViewModel> openSourceItemViewModels = new ObservableArrayList<>();
public OpenSourceViewModel(DataManager dataManager,
SchedulerProvider schedulerProvider,
......@@ -38,7 +47,7 @@ public class OpenSourceViewModel extends BaseViewModel<OpenSourceNavigator> {
}
public void fetchRepos() {
getNavigator().showLoading();
setIsLoading(true);
getCompositeDisposable().add(getDataManager()
.getOpenSourceApiCall()
.subscribeOn(getSchedulerProvider().io())
......@@ -50,15 +59,23 @@ public class OpenSourceViewModel extends BaseViewModel<OpenSourceNavigator> {
if (openSourceResponse != null && openSourceResponse.getData() != null) {
getNavigator().updateRepo(openSourceResponse.getData());
}
getNavigator().hideLoading();
setIsLoading(false);
}
}, new Consumer<Throwable>() {
@Override
public void accept(@NonNull Throwable throwable)
throws Exception {
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().handleError(throwable);
}
}));
}
public void populateViewModel(List<OpenSourceResponse.Repo> repoList){
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()));
}
}
}
......@@ -18,10 +18,10 @@ package com.mindorks.framework.mvvm.ui.login;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.widget.Toast;
import com.mindorks.framework.mvvm.BR;
import com.mindorks.framework.mvvm.R;
import com.mindorks.framework.mvvm.databinding.ActivityLoginBinding;
import com.mindorks.framework.mvvm.ui.base.BaseActivity;
......@@ -33,12 +33,11 @@ import javax.inject.Inject;
* Created by amitshekhar on 08/07/17.
*/
public class LoginActivity extends BaseActivity implements LoginNavigator {
public class LoginActivity extends BaseActivity<ActivityLoginBinding, LoginViewModel> implements LoginNavigator {
@Inject
LoginViewModel mLoginViewModel;
private ActivityLoginBinding mBinding;
ActivityLoginBinding mActivityLoginBinding;
public static Intent getStartIntent(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
......@@ -48,13 +47,7 @@ public class LoginActivity extends BaseActivity implements LoginNavigator {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_login);
getActivityComponent().inject(this);
mBinding.setViewModel(mLoginViewModel);
mActivityLoginBinding = getViewDataBinding();
mLoginViewModel.setNavigator(this);
}
......@@ -79,8 +72,8 @@ public class LoginActivity extends BaseActivity implements LoginNavigator {
@Override
public void login() {
String email = mBinding.etEmail.getText().toString();
String password = mBinding.etPassword.getText().toString();
String email = mActivityLoginBinding.etEmail.getText().toString();
String password = mActivityLoginBinding.etPassword.getText().toString();
if (mLoginViewModel.isEmailAndPasswordValid(email, password)) {
hideKeyboard();
mLoginViewModel.login(email, password);
......@@ -88,4 +81,25 @@ public class LoginActivity extends BaseActivity implements LoginNavigator {
Toast.makeText(this, getString(R.string.invalid_email_password), Toast.LENGTH_SHORT).show();
}
}
@Override
public LoginViewModel getViewModel() {
return mLoginViewModel;
}
@Override
public int getBindingVariable() {
return BR.viewModel;
}
@Override
public int getLayoutId() {
return R.layout.activity_login;
}
@Override
public void performDependencyInjection() {
getActivityComponent().inject(this);
}
}
......@@ -24,10 +24,6 @@ public interface LoginNavigator {
void openMainActivity();
void showLoading();
void hideLoading();
void handleError(Throwable throwable);
void login();
......
......@@ -43,7 +43,7 @@ public class LoginViewModel extends BaseViewModel<LoginNavigator> {
}
public void onGoogleLoginClick() {
getNavigator().showLoading();
setIsLoading(true);
getCompositeDisposable().add(getDataManager()
.doGoogleLoginApiCall(new LoginRequest.GoogleLoginRequest("test1", "test1"))
.subscribeOn(getSchedulerProvider().io())
......@@ -58,20 +58,20 @@ public class LoginViewModel extends BaseViewModel<LoginNavigator> {
response.getUserName(),
response.getUserEmail(),
response.getGoogleProfilePicUrl());
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().openMainActivity();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().handleError(throwable);
}
}));
}
public void onFbLoginClick() {
getNavigator().showLoading();
setIsLoading(true);
getCompositeDisposable().add(getDataManager()
.doFacebookLoginApiCall(new LoginRequest.FacebookLoginRequest("test3", "test4"))
.subscribeOn(getSchedulerProvider().io())
......@@ -86,20 +86,20 @@ public class LoginViewModel extends BaseViewModel<LoginNavigator> {
response.getUserName(),
response.getUserEmail(),
response.getGoogleProfilePicUrl());
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().openMainActivity();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().handleError(throwable);
}
}));
}
public void login(String email, String password) {
getNavigator().showLoading();
setIsLoading(true);
getCompositeDisposable().add(getDataManager()
.doServerLoginApiCall(new LoginRequest.ServerLoginRequest(email, password))
.subscribeOn(getSchedulerProvider().io())
......@@ -114,13 +114,13 @@ public class LoginViewModel extends BaseViewModel<LoginNavigator> {
response.getUserName(),
response.getUserEmail(),
response.getGoogleProfilePicUrl());
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().openMainActivity();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().handleError(throwable);
}
}));
......
......@@ -37,6 +37,7 @@ import android.view.View;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import com.mindorks.framework.mvvm.BR;
import com.mindorks.framework.mvvm.BuildConfig;
import com.mindorks.framework.mvvm.R;
import com.mindorks.framework.mvvm.data.model.others.QuestionCardData;
......@@ -56,12 +57,11 @@ import java.util.List;
import javax.inject.Inject;
public class MainActivity extends BaseActivity implements MainNavigator {
public class MainActivity extends BaseActivity<ActivityMainBinding,MainViewModel> implements MainNavigator {
@Inject
MainViewModel mMainViewModel;
private ActivityMainBinding mBinding;
private DrawerLayout mDrawer;
......@@ -70,6 +70,8 @@ public class MainActivity extends BaseActivity implements MainNavigator {
private NavigationView mNavigationView;
private SwipePlaceHolderView mCardsContainerView;
ActivityMainBinding mActivityMainBinding;
public static Intent getStartIntent(Context context) {
Intent intent = new Intent(context, MainActivity.class);
......@@ -79,15 +81,8 @@ public class MainActivity extends BaseActivity implements MainNavigator {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
getActivityComponent().inject(this);
mBinding.setViewModel(mMainViewModel);
mActivityMainBinding = getViewDataBinding();
mMainViewModel.setNavigator(this);
setUp();
}
......@@ -144,10 +139,10 @@ public class MainActivity extends BaseActivity implements MainNavigator {
private void setUp() {
mDrawer = mBinding.drawerView;
mToolbar = mBinding.toolbar;
mNavigationView = mBinding.navigationView;
mCardsContainerView = mBinding.cardsContainer;
mDrawer = mActivityMainBinding.drawerView;
mToolbar = mActivityMainBinding.toolbar;
mNavigationView = mActivityMainBinding.navigationView;
mCardsContainerView = mActivityMainBinding.cardsContainer;
setSupportActionBar(mToolbar);
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
......@@ -210,12 +205,9 @@ public class MainActivity extends BaseActivity implements MainNavigator {
}
private void setupNavMenu() {
NavHeaderMainBinding navHeaderMainBinding = DataBindingUtil.inflate(getLayoutInflater(),
R.layout.nav_header_main, mBinding.navigationView, false);
mBinding.navigationView.addHeaderView(navHeaderMainBinding.getRoot());
R.layout.nav_header_main, mActivityMainBinding.navigationView, false);
mActivityMainBinding.navigationView.addHeaderView(navHeaderMainBinding.getRoot());
navHeaderMainBinding.setViewModel(mMainViewModel);
mNavigationView.setNavigationItemSelectedListener(
......@@ -312,4 +304,26 @@ public class MainActivity extends BaseActivity implements MainNavigator {
public void handleError(Throwable throwable) {
// handle error
}
@Override
public MainViewModel getViewModel() {
return mMainViewModel;
}
@Override
public int getBindingVariable() {
return BR.viewModel;
}
@Override
public int getLayoutId() {
return R.layout.activity_main;
}
@Override
public void performDependencyInjection() {
getActivityComponent().inject(this);
}
}
......@@ -32,10 +32,6 @@ public interface MainNavigator {
void openLoginActivity();
void showLoading();
void hideLoading();
void handleError(Throwable throwable);
}
......@@ -99,7 +99,7 @@ public class MainViewModel extends BaseViewModel<MainNavigator> {
}
public void logout() {
getNavigator().showLoading();
setIsLoading(true);
getCompositeDisposable().add(getDataManager().doLogoutApiCall()
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
......@@ -107,13 +107,13 @@ public class MainViewModel extends BaseViewModel<MainNavigator> {
@Override
public void accept(LogoutResponse response) throws Exception {
getDataManager().setUserAsLoggedOut();
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().openLoginActivity();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
getNavigator().hideLoading();
setIsLoading(false);
getNavigator().handleError(throwable);
}
}));
......
......@@ -18,9 +18,8 @@ package com.mindorks.framework.mvvm.ui.splash;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import com.mindorks.framework.mvvm.BR;
import com.mindorks.framework.mvvm.R;
import com.mindorks.framework.mvvm.databinding.ActivitySplashBinding;
import com.mindorks.framework.mvvm.ui.base.BaseActivity;
......@@ -33,11 +32,12 @@ import javax.inject.Inject;
* Created by amitshekhar on 08/07/17.
*/
public class SplashActivity extends BaseActivity implements SplashNavigator {
public class SplashActivity extends BaseActivity<ActivitySplashBinding, SplashViewModel> implements SplashNavigator {
@Inject
SplashViewModel mSplashViewModel;
public static Intent getStartIntent(Context context) {
Intent intent = new Intent(context, SplashActivity.class);
return intent;
......@@ -46,15 +46,7 @@ public class SplashActivity extends BaseActivity implements SplashNavigator {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivitySplashBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_splash);
getActivityComponent().inject(this);
binding.setViewModel(mSplashViewModel);
mSplashViewModel.setNavigator(this);
mSplashViewModel.startSeeding();
}
......@@ -77,5 +69,26 @@ public class SplashActivity extends BaseActivity implements SplashNavigator {
startActivity(intent);
finish();
}
@Override
public SplashViewModel getViewModel() {
return mSplashViewModel;
}
@Override
public int getBindingVariable() {
return BR.viewModel;
}
@Override
public int getLayoutId() {
return R.layout.activity_splash;
}
@Override
public void performDependencyInjection() {
getActivityComponent().inject(this);
}
}
......@@ -18,7 +18,12 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.mindorks.framework.mvvm.ui.feed.FeedActivity">
<data>
<variable
name="viewModel"
type="com.mindorks.framework.mvvm.ui.feed.FeedViewModel"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
......
......@@ -21,139 +21,155 @@
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="com.mindorks.framework.mvvm.ui.login.LoginViewModel" />
</data>
<RelativeLayout
android:id="@+id/activityMain"
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_design">
android:layout_height="match_parent">
<RelativeLayout
<android.support.v7.widget.CardView
android:id="@+id/activityMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="80dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="80dp"
app:cardCornerRadius="7dp"
app:cardElevation="22dp">
<TextView
style="@style/TextStyle.Heading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
android:layout_marginTop="60dp"
android:text="@string/login_dummy"
android:textAllCaps="true"
android:textSize="20sp" />
<LinearLayout
android:background="@drawable/bg_design">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="20dp"
android:orientation="vertical">
android:layout_height="match_parent"
android:layout_marginBottom="80dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="80dp"
app:cardCornerRadius="7dp"
app:cardElevation="22dp">
<TextView
style="@style/TextStyle.Heading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
android:layout_marginTop="60dp"
android:text="@string/login_dummy"
android:textAllCaps="true"
android:textSize="20sp" />
<android.support.design.widget.TextInputLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="@color/gray"
app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout">
android:layout_gravity="center"
android:layout_margin="20dp"
android:orientation="vertical">
<android.support.design.widget.TextInputEditText
android:id="@+id/etEmail"
style="@style/TextStyle"
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/input_border_bottom"
android:cursorVisible="true"
android:gravity="center|left|bottom"
android:hint="@string/email"
android:inputType="textEmailAddress"
android:maxLength="50"
android:paddingBottom="10dp"
android:textColor="@color/black_effective"
android:textSize="18sp" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/password"
android:textColorHint="@color/gray"
app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"
app:passwordToggleEnabled="true">
<android.support.design.widget.TextInputEditText
android:id="@+id/etPassword"
style="@style/TextStyle"
android:textColorHint="@color/gray"
app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout">
<android.support.design.widget.TextInputEditText
android:id="@+id/etEmail"
style="@style/TextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/input_border_bottom"
android:cursorVisible="true"
android:gravity="center|left|bottom"
android:hint="@string/email"
android:inputType="textEmailAddress"
android:maxLength="50"
android:paddingBottom="10dp"
android:textColor="@color/black_effective"
android:textSize="18sp" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="30dp"
android:background="@drawable/input_border_bottom"
android:cursorVisible="true"
android:gravity="center|left|bottom"
android:inputType="textPassword"
android:maxLength="50"
android:paddingBottom="10dp"
android:textColor="@color/black_effective"
android:textSize="18sp" />
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/btnServerLogin"
style="@style/Button.Primary"
android:layout_width="match_parent"
android:hint="@string/password"
android:textColorHint="@color/gray"
app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"
app:passwordToggleEnabled="true">
<android.support.design.widget.TextInputEditText
android:id="@+id/etPassword"
style="@style/TextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="30dp"
android:background="@drawable/input_border_bottom"
android:cursorVisible="true"
android:gravity="center|left|bottom"
android:inputType="textPassword"
android:maxLength="50"
android:paddingBottom="10dp"
android:textColor="@color/black_effective"
android:textSize="18sp" />
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/btnServerLogin"
style="@style/Button.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="15dp"
android:onClick="@{() -> viewModel.onServerLoginClick()}"
android:padding="10dp"
android:text="@string/login"
android:textSize="18dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="15dp"
android:padding="10dp"
android:onClick="@{() -> viewModel.onServerLoginClick()}"
android:text="@string/login"
android:textSize="18dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:layout_marginBottom="40dp"
android:orientation="horizontal">
<ImageButton
android:id="@+id/ibGoogleLogin"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@color/transparent"
android:scaleType="centerCrop"
android:onClick="@{() -> viewModel.onGoogleLoginClick()}"
app:srcCompat="@drawable/ic_google_plus" />
<ImageButton
android:id="@+id/ibFbLogin"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="24dp"
android:background="@color/transparent"
android:scaleType="centerCrop"
android:onClick="@{() -> viewModel.onFbLoginClick()}"
app:srcCompat="@drawable/ic_facebook" />
</LinearLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
android:layout_gravity="bottom|center"
android:layout_marginBottom="40dp"
android:orientation="horizontal">
<ImageButton
android:id="@+id/ibGoogleLogin"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@color/transparent"
android:onClick="@{() -> viewModel.onGoogleLoginClick()}"
android:scaleType="centerCrop"
app:srcCompat="@drawable/ic_google_plus" />
<ImageButton
android:id="@+id/ibFbLogin"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="24dp"
android:background="@color/transparent"
android:onClick="@{() -> viewModel.onFbLoginClick()}"
android:scaleType="centerCrop"
app:srcCompat="@drawable/ic_facebook" />
</LinearLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
<android.support.v4.widget.ContentLoadingProgressBar
android:id="@+id/address_looking_up"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}" />
</FrameLayout>
</layout>
\ No newline at end of file
......@@ -20,6 +20,8 @@
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="com.mindorks.framework.mvvm.ui.main.MainViewModel" />
......@@ -27,74 +29,89 @@
</data>
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawerView"
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/clRootView"
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false">
android:fitsSystemWindows="true">
<LinearLayout
android:id="@+id/activityMain"
<android.support.design.widget.CoordinatorLayout
android:id="@+id/clRootView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:clipChildren="false">
<android.support.design.widget.AppBarLayout
<LinearLayout
android:id="@+id/activityMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="5dp">
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
style="@style/Toolbar"
app:subtitleTextColor="@color/white"
app:title="@string/app_name"
app:titleTextAppearance="@style/Toolbar.TitleText"
app:titleTextColor="@color/white" />
<View
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="5dp">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
style="@style/Toolbar"
app:subtitleTextColor="@color/white"
app:title="@string/app_name"
app:titleTextAppearance="@style/Toolbar.TitleText"
app:titleTextColor="@color/white" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/light_gray" />
</android.support.design.widget.AppBarLayout>
<com.mindorks.placeholderview.SwipePlaceHolderView
android:id="@+id/cardsContainer"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/light_gray" />
android:layout_height="match_parent" />
</android.support.design.widget.AppBarLayout>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
<com.mindorks.placeholderview.SwipePlaceHolderView
android:id="@+id/cardsContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/navigationView"
style="@style/Widget.Design.NavigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/white"
app:itemBackground="@color/white"
app:itemIconTint="@color/black_effective"
app:itemTextColor="@color/black_effective"
app:menu="@menu/drawer">
<TextView
android:id="@+id/tvAppVersion"
style="@style/TextStyle.Title.Sub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:padding="5dp"
android:text="@{viewModel.appVersion}" />
</android.support.design.widget.NavigationView>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.DrawerLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigationView"
style="@style/Widget.Design.NavigationView"
<android.support.v4.widget.ContentLoadingProgressBar
android:id="@+id/address_looking_up"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/white"
app:itemBackground="@color/white"
app:itemIconTint="@color/black_effective"
app:itemTextColor="@color/black_effective"
app:menu="@menu/drawer">
<TextView
android:id="@+id/tvAppVersion"
style="@style/TextStyle.Title.Sub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:text="@{viewModel.appVersion}"
android:padding="5dp" />
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}"/>
</FrameLayout>
</layout>
\ No newline at end of file
......@@ -18,24 +18,39 @@
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="com.mindorks.framework.mvvm.ui.feed.blogs.BlogViewModel" />
</data>
<LinearLayout
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/blogRecyclerView"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_blog_view" />
android:gravity="center"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/blogRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_blog_view" />
</LinearLayout>
</LinearLayout>
<android.support.v4.widget.ContentLoadingProgressBar
android:id="@+id/address_looking_up"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}"/>
</FrameLayout>
</layout>
\ No newline at end of file
......@@ -18,24 +18,39 @@
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="com.mindorks.framework.mvvm.ui.feed.opensource.OpenSourceViewModel" />
</data>
<LinearLayout
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/openSourceRecyclerView"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_blog_view" />
android:gravity="center"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/openSourceRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_blog_view" />
</LinearLayout>
</LinearLayout>
<android.support.v4.widget.ContentLoadingProgressBar
android:id="@+id/address_looking_up"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}"/>
</FrameLayout>
</layout>
\ No newline at end of file
......@@ -35,7 +35,6 @@
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="@color/white"
android:onClick="@{() -> viewModel.onItemClick()}"
android:orientation="vertical"
app:cardCornerRadius="7dp"
app:cardElevation="4dp">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册