From b275a15377a4641871bef29081b91f054a4b192d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 26 Apr 2015 11:43:34 +0200 Subject: [PATCH 001/300] Moved onCreateView in fragments --- README.md | 4 +-- .../it/cosenonjaviste/Dagger2CnjFragment.java | 28 ------------------- .../author/AuthorListFragment.java | 15 ++++++---- .../category/CategoryListFragment.java | 15 ++++++---- .../it/cosenonjaviste/page/PageFragment.java | 27 ++++++++++-------- .../cosenonjaviste/post/PostListFragment.java | 15 ++++++---- .../twitter/TweetListFragment.java | 15 ++++++---- 7 files changed, 53 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index 3774915..ab8fefc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # CoseNonJavisteAndroidApp Android app of blog cosenonjaviste.it -[![Build Status](https://travis-ci.org/fabioCollini/CoseNonJavisteAndroidApp.svg?branch=master)](https://travis-ci.org/fabioCollini/CoseNonJavisteAndroidApp) -[![Coverage Status](https://coveralls.io/repos/fabioCollini/CoseNonJavisteAndroidApp/badge.svg?branch=master)](https://coveralls.io/r/fabioCollini/CoseNonJavisteAndroidApp?branch=master) +[![Build Status](https://travis-ci.org/commit-non-javisti/CoseNonJavisteAndroidApp.svg?branch=master)](https://travis-ci.org/fabioCollini/CoseNonJavisteAndroidApp) +[![Coverage Status](https://coveralls.io/repos/commit-non-javisti/CoseNonJavisteAndroidApp/badge.svg?branch=master)](https://coveralls.io/r/fabioCollini/CoseNonJavisteAndroidApp?branch=master) diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java index ee48677..af7cf9d 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java @@ -1,18 +1,10 @@ package it.cosenonjaviste; -import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; import org.parceler.Parcels; -import butterknife.ButterKnife; import it.cosenonjaviste.lib.mvp.Dagger2MvpFragment; import it.cosenonjaviste.lib.mvp.MvpPresenter; import it.cosenonjaviste.lib.mvp.MvpView; @@ -37,29 +29,9 @@ protected ApplicationComponent getComponent() { protected abstract MvpPresenter injectAndCreatePresenter(); - @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(getLayoutId(), container, false); - initView(view); - return view; - } - - protected void initView(View view) { - ButterKnife.inject(this, view); - } - - protected abstract int getLayoutId(); - @Override public void open(Class> viewClass, MM model) { Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); intent.putExtra(MODEL, Parcels.wrap(model)); getActivity().startActivity(intent); } - - public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { - Fragment fragment = Fragment.instantiate(context, viewClass.getName()); - Bundle bundle = new Bundle(); - bundle.putParcelable(MODEL, Parcels.wrap(model)); - fragment.setArguments(bundle); - return (T) fragment; - } } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 19f8c20..1c76d80 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -1,12 +1,17 @@ package it.cosenonjaviste.author; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import com.quentindommerc.superlistview.SuperGridview; import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; @@ -31,16 +36,14 @@ public class AuthorListFragment extends Dagger2CnjFragment { return presenter; } - @Override protected int getLayoutId() { - return R.layout.super_grid; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_grid, container, false); + ButterKnife.inject(this, view); adapter = new AuthorAdapter(getActivity()); grid.getList().setNumColumns(2); grid.setAdapter(adapter); grid.setOnItemClickListener((parent, v, position, id) -> presenter.goToAuthorDetail(position)); + return view; } @OnClick(R.id.error_retry) void retry() { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index dc43bef..626f57b 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -1,12 +1,17 @@ package it.cosenonjaviste.category; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import com.quentindommerc.superlistview.SuperGridview; import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; @@ -31,17 +36,15 @@ public class CategoryListFragment extends Dagger2CnjFragment return presenter; } - @Override protected int getLayoutId() { - return R.layout.super_grid; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_grid, container, false); + ButterKnife.inject(this, view); adapter = new CategoryAdapter(getActivity()); grid.setAdapter(adapter); grid.getList().setNumColumns(2); grid.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); grid.setOnItemClickListener((parent, v, position, id) -> presenter.goToPosts(position)); + return view; } @OnClick(R.id.error_retry) void retry() { diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 4336f43..aa0e2ea 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -1,7 +1,11 @@ package it.cosenonjaviste.page; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; @@ -12,6 +16,7 @@ import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; @@ -35,8 +40,9 @@ public class PageFragment extends Dagger2CnjFragment { return presenter; } - @SuppressLint("SetJavaScriptEnabled") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.post_detail, container, false); + ButterKnife.inject(this, view); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); @@ -50,12 +56,12 @@ public class PageFragment extends Dagger2CnjFragment { webView.setWebViewClient(new WebViewClient() { @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - view.loadUrl(url); + public boolean shouldOverrideUrlLoading(WebView view11, String url) { + view11.loadUrl(url); return true; } - @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { + @Override public WebResourceResponse shouldInterceptRequest(WebView view11, String url) { if (url.equalsIgnoreCase("http://www.cosenonjaviste.it/wp-content/themes/flexform/style.css")) { return getCssWebResourceResponseFromAsset(); } @@ -70,7 +76,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { ) { return null; } - return super.shouldInterceptRequest(view, url); + return super.shouldInterceptRequest(view11, url); } private WebResourceResponse getCssWebResourceResponseFromAsset() { @@ -82,16 +88,13 @@ private WebResourceResponse getCssWebResourceResponseFromAsset() { } @Override - public void onPageFinished(WebView view, String url) { - super.onPageFinished(view, url); + public void onPageFinished(WebView view11, String url) { + super.onPageFinished(view11, url); webView.setVisibility(View.VISIBLE); progressBar.setVisibility(View.INVISIBLE); } }); - } - - @Override protected int getLayoutId() { - return R.layout.post_detail; + return view; } @Override public void update(PageModel model) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 06d9a5a..4ab1895 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -1,12 +1,17 @@ package it.cosenonjaviste.post; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import com.quentindommerc.superlistview.SuperListview; import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; @@ -31,18 +36,16 @@ public class PostListFragment extends Dagger2CnjFragment { return presenter; } - @Override protected int getLayoutId() { - return R.layout.super_list; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_list, container, false); + ButterKnife.inject(this, view); adapter = new PostAdapter(getActivity()); list.setAdapter(adapter); list.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); list.setRefreshListener(presenter::reloadData); list.setOnItemClickListener((parent, v, position, id) -> presenter.goToDetail(adapter.getItem(position))); list.setupMoreListener((numberOfItems, numberBeforeMore, currentItemPos) -> presenter.loadNextPage(), 1); + return view; } @OnClick(R.id.error_retry) void retry() { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 4469bbe..e19c1bf 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -1,12 +1,17 @@ package it.cosenonjaviste.twitter; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import com.quentindommerc.superlistview.SuperListview; import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; @@ -32,17 +37,15 @@ public class TweetListFragment extends Dagger2CnjFragment { return presenter; } - @Override protected int getLayoutId() { - return R.layout.super_list; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_list, container, false); + ButterKnife.inject(this, view); adapter = new TweetAdapter(getActivity()); list.setAdapter(adapter); list.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); list.setRefreshListener(presenter::reloadData); list.setupMoreListener((numberOfItems, numberBeforeMore, currentItemPos) -> presenter.loadNextPage(), 1); + return view; } @OnClick(R.id.error_retry) void retry() { From 0f8ba29f6ac006ca290c1c4600bc40175434724e Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 26 Apr 2015 11:49:00 +0200 Subject: [PATCH 002/300] Moved getComponent in Application --- .../androidtest/base/DaggerRule.java | 17 ----------------- .../it/cosenonjaviste/CoseNonJavisteApp.java | 5 +++++ .../it/cosenonjaviste/Dagger2CnjFragment.java | 4 ---- .../author/AuthorListFragment.java | 3 ++- .../category/CategoryListFragment.java | 3 ++- .../it/cosenonjaviste/page/PageFragment.java | 3 ++- .../cosenonjaviste/post/PostListFragment.java | 3 ++- .../twitter/TweetListFragment.java | 3 ++- 8 files changed, 15 insertions(+), 26 deletions(-) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java index 5419664..34bda16 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java @@ -37,15 +37,6 @@ public DaggerRule(Action1 afterInjectAction) { } CoseNonJavisteApp.component = component; -// ObjectGraphHolder.forceObjectGraphCreator(app -> { -// Object[] modules = mergeArrays(app.getModules(), new Object[]{testModule}); -// ObjectGraph objectGraph = ObjectGraph.create(modules); -// if (afterInjectAction != null) { -// afterInjectAction.call(objectGraph); -// } -// return objectGraph; -// }); - registerIdlingResources(espressoExecutor); SchedulerManager.setIo(Schedulers.from(espressoExecutor)); @@ -68,12 +59,4 @@ private void setupDexmaker() { // final String dexCache = getInstrumentation().getTargetContext().getCacheDir().getPath(); // System.setProperty("dexmaker.dexcache", dexCache); } - - private Object[] mergeArrays(Object[] appModules, Object[] testModules) { - Object[] modules = new Object[testModules.length + appModules.length]; - System.arraycopy(appModules, 0, modules, 0, appModules.length); - System.arraycopy(testModules, 0, modules, appModules.length, testModules.length); - return modules; - } - } diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java index 237b07d..a6ff631 100644 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java @@ -1,6 +1,7 @@ package it.cosenonjaviste; import android.app.Application; +import android.content.Context; public class CoseNonJavisteApp extends Application { @@ -16,4 +17,8 @@ public class CoseNonJavisteApp extends Application { public ApplicationComponent getComponent() { return component; } + + public static ApplicationComponent getComponent(Context context) { + return ((CoseNonJavisteApp) context.getApplicationContext()).getComponent(); + } } diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java index af7cf9d..0697c4f 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java @@ -18,10 +18,6 @@ public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { return presenter; } - protected ApplicationComponent getComponent() { - return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); - } - @Override public void onCreate(Bundle state) { presenter = injectAndCreatePresenter(); super.onCreate(state); diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 1c76d80..1817b16 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -14,6 +14,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -31,7 +32,7 @@ public class AuthorListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), AuthorListFragment.class.getName(), - () -> DaggerAuthorListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 626f57b..1b4ad56 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -14,6 +14,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -31,7 +32,7 @@ public class CategoryListFragment extends Dagger2CnjFragment ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), CategoryListFragment.class.getName(), - () -> DaggerCategoryListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index aa0e2ea..e876107 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -18,6 +18,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -35,7 +36,7 @@ public class PageFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), PageFragment.class.getName(), - () -> DaggerPageComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 4ab1895..73aaf29 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -14,6 +14,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -31,7 +32,7 @@ public class PostListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), PostListFragment.class.getName(), - () -> DaggerPostListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index e19c1bf..27207fa 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -14,6 +14,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -32,7 +33,7 @@ public class TweetListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), TweetListFragment.class.getName(), - () -> DaggerTweetListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } From 3c25e1005c10c80aad973a46bb30ef3b64995fb4 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 21:31:51 +0200 Subject: [PATCH 003/300] New class RxHolder --- .../cosenonjaviste/lib/mvp/MvpFragment.java | 8 +- .../cosenonjaviste/lib/mvp/MvpPresenter.java | 14 --- .../lib/mvp/ObservableWithFactory.java | 16 +++ .../lib/mvp/RxMvpPresenter.java | 78 ++------------ .../lib/mvp/utils/PresenterSaverFragment.java | 19 ++-- .../lib/mvp/utils/RxHolder.java | 101 ++++++++++++++++++ 6 files changed, 132 insertions(+), 104 deletions(-) create mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java create mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java index 4d6dd01..c0b03de 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java @@ -9,7 +9,6 @@ public abstract class MvpFragment

, M> extends Fragment implements MvpView { - private static final String PRESENTER_ID = "presenterId"; public static final String MODEL = "model"; protected P presenter; @@ -17,29 +16,26 @@ public abstract class MvpFragment

, M> extends Fragment @Override public void onCreate(Bundle state) { super.onCreate(state); - long presenterId = 0; M restoredModel = null; if (state != null) { - presenterId = state.getLong(PRESENTER_ID, 0); restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); } if (restoredModel == null && getArguments() != null) { restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); } - presenter = PresenterSaverFragment.

load(getFragmentManager(), presenterId); + presenter = PresenterSaverFragment.

load(getChildFragmentManager()); if (presenter == null) { presenter = createPresenter(); } presenter.init(restoredModel); - PresenterSaverFragment.save(getFragmentManager(), presenter); + PresenterSaverFragment.save(getChildFragmentManager(), presenter); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(MODEL, Parcels.wrap(presenter.getModel())); - outState.putLong(PRESENTER_ID, presenter.getId()); } @Override public void onStart() { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java index a73f3ea..bca9159 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java @@ -1,20 +1,10 @@ package it.cosenonjaviste.lib.mvp; -import java.util.concurrent.atomic.AtomicLong; - public abstract class MvpPresenter { protected M model; protected MvpView view; - private long id; - - private static AtomicLong sequence = new AtomicLong(1); - - protected MvpPresenter() { - id = sequence.getAndIncrement(); - } - public void init(M model) { this.model = model; } @@ -24,10 +14,6 @@ public void initAndSubscribe(M model, MvpView view) { subscribe(view); } - public long getId() { - return id; - } - public M getModel() { return model; } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java new file mode 100644 index 0000000..001ac56 --- /dev/null +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java @@ -0,0 +1,16 @@ +package it.cosenonjaviste.lib.mvp; + +import rx.Observable; +import rx.Subscriber; +import rx.functions.Func0; + +public class ObservableWithFactory { + public final Observable observable; + + public final Func0> subscriberFactory; + + public ObservableWithFactory(Observable observable, Func0> subscriberFactory) { + this.observable = observable; + this.subscriberFactory = subscriberFactory; + } +} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 79e69e1..30336a7 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -1,99 +1,35 @@ package it.cosenonjaviste.lib.mvp; -import java.util.ArrayList; -import java.util.List; - +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.Observable; -import rx.Subscriber; import rx.functions.Action0; import rx.functions.Action1; -import rx.functions.Actions; -import rx.functions.Func0; -import rx.observables.ConnectableObservable; -import rx.subscriptions.CompositeSubscription; public abstract class RxMvpPresenter extends MvpPresenter { - private SchedulerManager schedulerManager; - - private final CompositeSubscription connectableSubscriptions = new CompositeSubscription(); - - private CompositeSubscription subscriptions = new CompositeSubscription(); - - private final List observables = new ArrayList<>(); + private final RxHolder rxHolder; public RxMvpPresenter(SchedulerManager schedulerManager) { - this.schedulerManager = schedulerManager; + rxHolder = new RxHolder(schedulerManager); } public void pause() { super.pause(); - subscriptions.unsubscribe(); - subscriptions = new CompositeSubscription(); + rxHolder.pause(); } @Override public void subscribe(MvpView view) { super.subscribe(view); - for (ObservableWithFactory observableWithFactory : observables) { - subscribe(observableWithFactory); - } + rxHolder.resubscribePendingObservable(); } public void destroy() { - connectableSubscriptions.unsubscribe(); + rxHolder.destroy(); } protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { - ConnectableObservable replay = schedulerManager.bindObservable(observable).replay(); - connectableSubscriptions.add(replay.connect()); - Func0> factory = () -> new Subscriber() { - @Override public void onStart() { - if (onAttach != null) { - onAttach.call(); - } - } - - @Override public void onCompleted() { - - } - - @Override public void onError(Throwable e) { - if (onError != null) { - onError.call(e); - } - } - - @Override public void onNext(T t) { - if (onNext != null) { - onNext.call(t); - } - } - }; - ObservableWithFactory observableWithFactory = new ObservableWithFactory<>(replay, factory); - observables.add(observableWithFactory); - subscribe(observableWithFactory); - } - - private void subscribe(ObservableWithFactory observableWithFactory) { - Observable observable = observableWithFactory.observable; - Subscriber subscriber = observableWithFactory.subscriberFactory.call(); - subscriptions.add(observable.subscribe( - Actions.empty(), - t -> observables.remove(observableWithFactory), - () -> observables.remove(observableWithFactory))); - subscriptions.add(observable.subscribe(subscriber)); - } - - public static class ObservableWithFactory { - public final Observable observable; - - public final Func0> subscriberFactory; - - ObservableWithFactory(Observable observable, Func0> subscriberFactory) { - this.observable = observable; - this.subscriberFactory = subscriberFactory; - } + rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); } } \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java index 54ab192..90e3107 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java @@ -3,16 +3,13 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import java.util.HashMap; -import java.util.Map; - import it.cosenonjaviste.lib.mvp.MvpPresenter; public class PresenterSaverFragment extends Fragment { private static final String TAG = PresenterSaverFragment.class.getName(); - private Map> presenters = new HashMap<>(); + private MvpPresenter presenter; public PresenterSaverFragment() { setRetainInstance(true); @@ -20,7 +17,7 @@ public PresenterSaverFragment() { public static void save(FragmentManager fragmentManager, MvpPresenter presenter) { PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - fragment.presenters.put(presenter.getId(), presenter); + fragment.presenter = presenter; } private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager fragmentManager) { @@ -32,18 +29,14 @@ private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager return fragment; } - public static

> P load(FragmentManager fragmentManager, long id) { - if (id != 0) { - PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - return (P) fragment.presenters.get(id); - } else { - return null; - } + public static

> P load(FragmentManager fragmentManager) { + PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); + return (P) fragment.presenter; } @Override public void onDestroy() { super.onDestroy(); - for (MvpPresenter presenter : presenters.values()) { + if (presenter != null) { presenter.destroy(); } } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java new file mode 100644 index 0000000..981ee4e --- /dev/null +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java @@ -0,0 +1,101 @@ +package it.cosenonjaviste.lib.mvp.utils; + +import java.util.ArrayList; +import java.util.List; + +import it.cosenonjaviste.lib.mvp.ObservableWithFactory; +import rx.Observable; +import rx.Subscriber; +import rx.functions.Action0; +import rx.functions.Action1; +import rx.functions.Actions; +import rx.functions.Func0; +import rx.observables.ConnectableObservable; +import rx.subscriptions.CompositeSubscription; + +public class RxHolder { + private SchedulerManager schedulerManager; + + private final CompositeSubscription connectableSubscriptions = new CompositeSubscription(); + + private CompositeSubscription subscriptions = new CompositeSubscription(); + + protected final List observables = new ArrayList<>(); + + public RxHolder(SchedulerManager schedulerManager) { + this.schedulerManager = schedulerManager; + } + + public void subscribePausable(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError, Action0 onCompleted) { + ConnectableObservable replay = schedulerManager.bindObservable(observable).replay(); + connectableSubscriptions.add(replay.connect()); + Func0> factory = () -> new Subscriber() { + @Override public void onStart() { + if (onAttach != null) { + onAttach.call(); + } + } + + @Override public void onCompleted() { + if (onCompleted != null) { + onCompleted.call(); + } + } + + @Override public void onError(Throwable e) { + if (onError != null) { + onError.call(e); + } + } + + @Override public void onNext(T t) { + if (onNext != null) { + onNext.call(t); + } + } + }; + ObservableWithFactory observableWithFactory = new ObservableWithFactory<>(replay, factory); + observables.add(observableWithFactory); + subscribe(observableWithFactory); + } + + + private void subscribe(ObservableWithFactory observableWithFactory) { + Observable observable = observableWithFactory.observable; + Subscriber subscriber = observableWithFactory.subscriberFactory.call(); + subscriptions.add(observable.subscribe( + Actions.empty(), + t -> removeObservableFactory(observableWithFactory), + () -> removeObservableFactory(observableWithFactory))); + subscriptions.add(observable.subscribe(subscriber)); + } + + + private boolean removeObservableFactory(ObservableWithFactory observableWithFactory) { + return observables.remove(observableWithFactory); + } + + public void resubscribePendingObservable() { + ArrayList observableCopy = new ArrayList<>(observables); + for (ObservableWithFactory observableWithFactory : observableCopy) { + subscribe(observableWithFactory); + } + } + + public void pause() { + subscriptions.unsubscribe(); + subscriptions = new CompositeSubscription(); + } + + public void destroy() { + connectableSubscriptions.unsubscribe(); + } + + public CompositeSubscription getSubscriptions() { + return subscriptions; + } + + public boolean isTaskRunning() { + return !observables.isEmpty(); + } +} \ No newline at end of file From cd4370dfa7a721f0c05325c026053d36a073729c Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 21:38:22 +0200 Subject: [PATCH 004/300] Deleted class MvpPresenter --- .../lib/mvp/Dagger2MvpFragment.java | 2 +- .../cosenonjaviste/lib/mvp/MvpFragment.java | 2 +- .../cosenonjaviste/lib/mvp/MvpPresenter.java | 36 ------------------- .../lib/mvp/RxMvpPresenter.java | 28 ++++++++++++--- .../lib/mvp/utils/PresenterSaverFragment.java | 9 ++--- .../java/it/cosenonjaviste/CnjFragment.java | 4 +-- .../it/cosenonjaviste/Dagger2CnjFragment.java | 8 ++--- .../it/cosenonjaviste/page/PageFragment.java | 4 +-- .../it/cosenonjaviste/page/PagePresenter.java | 8 +++-- .../twitter/TweetListFragment.java | 4 +-- 10 files changed, 46 insertions(+), 59 deletions(-) delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java index 6b7870c..145db41 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java @@ -23,7 +23,7 @@ public abstract class Dagger2MvpFragment extends Fragment implements MvpView< getPresenter().init(restoredModel); } - public abstract MvpPresenter getPresenter(); + public abstract RxMvpPresenter getPresenter(); @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java index c0b03de..06aaa93 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java @@ -7,7 +7,7 @@ import it.cosenonjaviste.lib.mvp.utils.PresenterSaverFragment; -public abstract class MvpFragment

, M> extends Fragment implements MvpView { +public abstract class MvpFragment

, M> extends Fragment implements MvpView { public static final String MODEL = "model"; diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java deleted file mode 100644 index bca9159..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java +++ /dev/null @@ -1,36 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -public abstract class MvpPresenter { - protected M model; - - protected MvpView view; - - public void init(M model) { - this.model = model; - } - - public void initAndSubscribe(M model, MvpView view) { - init(model); - subscribe(view); - } - - public M getModel() { - return model; - } - - public void destroy() { - } - - public void subscribe(MvpView view) { - this.view = view; - view.update(model); - } - - public void pause() { - view = null; - } - - public MvpView getView() { - return view; - } -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 30336a7..b912352 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -7,21 +7,24 @@ import rx.functions.Action0; import rx.functions.Action1; -public abstract class RxMvpPresenter extends MvpPresenter { +public abstract class RxMvpPresenter { private final RxHolder rxHolder; + protected M model; + protected MvpView view; public RxMvpPresenter(SchedulerManager schedulerManager) { rxHolder = new RxHolder(schedulerManager); } public void pause() { - super.pause(); + view = null; rxHolder.pause(); } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + public void subscribe(MvpView view) { + this.view = view; + view.update(model); rxHolder.resubscribePendingObservable(); } @@ -32,4 +35,21 @@ public void destroy() { protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); } + + public void init(M model) { + this.model = model; + } + + public void initAndSubscribe(M model, MvpView view) { + init(model); + subscribe(view); + } + + public M getModel() { + return model; + } + + public MvpView getView() { + return view; + } } \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java index 90e3107..75db5d8 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java @@ -3,19 +3,20 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; + public class PresenterSaverFragment extends Fragment { private static final String TAG = PresenterSaverFragment.class.getName(); - private MvpPresenter presenter; + private RxMvpPresenter presenter; public PresenterSaverFragment() { setRetainInstance(true); } - public static void save(FragmentManager fragmentManager, MvpPresenter presenter) { + public static void save(FragmentManager fragmentManager, RxMvpPresenter presenter) { PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); fragment.presenter = presenter; } @@ -29,7 +30,7 @@ private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager return fragment; } - public static

> P load(FragmentManager fragmentManager) { + public static

> P load(FragmentManager fragmentManager) { PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); return (P) fragment.presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/CnjFragment.java b/app/src/main/java/it/cosenonjaviste/CnjFragment.java index edfd515..520f2d7 100644 --- a/app/src/main/java/it/cosenonjaviste/CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/CnjFragment.java @@ -14,11 +14,11 @@ import butterknife.ButterKnife; import it.cosenonjaviste.lib.mvp.MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpPresenter; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; -public abstract class CnjFragment

, M> extends MvpFragment { +public abstract class CnjFragment

, M> extends MvpFragment { protected ApplicationComponent getComponent() { return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java index 0697c4f..a3cf861 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java @@ -6,15 +6,15 @@ import org.parceler.Parcels; import it.cosenonjaviste.lib.mvp.Dagger2MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpPresenter; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { - private MvpPresenter presenter; + private RxMvpPresenter presenter; - @Override public final MvpPresenter getPresenter() { + @Override public final RxMvpPresenter getPresenter() { return presenter; } @@ -23,7 +23,7 @@ public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { super.onCreate(state); } - protected abstract MvpPresenter injectAndCreatePresenter(); + protected abstract RxMvpPresenter injectAndCreatePresenter(); @Override public void open(Class> viewClass, MM model) { Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index e876107..f60f697 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -22,7 +22,7 @@ import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; public class PageFragment extends Dagger2CnjFragment { @@ -32,7 +32,7 @@ public class PageFragment extends Dagger2CnjFragment { @Inject PagePresenter presenter; - @Override protected MvpPresenter injectAndCreatePresenter() { + @Override protected RxMvpPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), PageFragment.class.getName(), diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index e883836..dab75f2 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,15 +2,17 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.utils.PresenterScope; @PresenterScope -public class PagePresenter extends MvpPresenter { +public class PagePresenter extends RxMvpPresenter { private PageUrlManager pageUrlManager; - @Inject public PagePresenter(PageUrlManager pageUrlManager) { + @Inject public PagePresenter(SchedulerManager schedulerManager, PageUrlManager pageUrlManager) { + super(schedulerManager); this.pageUrlManager = pageUrlManager; } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 27207fa..0a2ac40 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -18,7 +18,7 @@ import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import rx.functions.Actions; public class TweetListFragment extends Dagger2CnjFragment { @@ -29,7 +29,7 @@ public class TweetListFragment extends Dagger2CnjFragment { @Inject TweetListPresenter presenter; - @Override protected MvpPresenter injectAndCreatePresenter() { + @Override protected RxMvpPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), TweetListFragment.class.getName(), From f4c1efc620b3b1c7e5bca0d17bab8a5ef6877586 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 21:45:52 +0200 Subject: [PATCH 005/300] Deleted unused classes --- .../cosenonjaviste/lib/mvp/MvpFragment.java | 52 ------------------- .../lib/mvp/utils/PresenterSaverFragment.java | 44 ---------------- .../androidtest/base/FragmentRule.java | 4 +- .../java/it/cosenonjaviste/CnjFragment.java | 52 ------------------- .../java/it/cosenonjaviste/MainActivity.java | 23 ++++++-- 5 files changed, 20 insertions(+), 155 deletions(-) delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java delete mode 100644 app/src/main/java/it/cosenonjaviste/CnjFragment.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java deleted file mode 100644 index 06aaa93..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java +++ /dev/null @@ -1,52 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -import android.os.Bundle; -import android.support.v4.app.Fragment; - -import org.parceler.Parcels; - -import it.cosenonjaviste.lib.mvp.utils.PresenterSaverFragment; - -public abstract class MvpFragment

, M> extends Fragment implements MvpView { - - public static final String MODEL = "model"; - - protected P presenter; - - @Override public void onCreate(Bundle state) { - super.onCreate(state); - - M restoredModel = null; - if (state != null) { - restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); - } - if (restoredModel == null && getArguments() != null) { - restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); - } - - presenter = PresenterSaverFragment.

load(getChildFragmentManager()); - if (presenter == null) { - presenter = createPresenter(); - } - presenter.init(restoredModel); - - PresenterSaverFragment.save(getChildFragmentManager(), presenter); - } - - @Override public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putParcelable(MODEL, Parcels.wrap(presenter.getModel())); - } - - @Override public void onStart() { - super.onStart(); - presenter.subscribe(this); - } - - @Override public void onStop() { - presenter.pause(); - super.onStop(); - } - - protected abstract P createPresenter(); -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java deleted file mode 100644 index 75db5d8..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java +++ /dev/null @@ -1,44 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; - -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; - - -public class PresenterSaverFragment extends Fragment { - - private static final String TAG = PresenterSaverFragment.class.getName(); - - private RxMvpPresenter presenter; - - public PresenterSaverFragment() { - setRetainInstance(true); - } - - public static void save(FragmentManager fragmentManager, RxMvpPresenter presenter) { - PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - fragment.presenter = presenter; - } - - private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager fragmentManager) { - PresenterSaverFragment fragment = (PresenterSaverFragment) fragmentManager.findFragmentByTag(TAG); - if (fragment == null) { - fragment = new PresenterSaverFragment(); - fragmentManager.beginTransaction().add(fragment, TAG).commit(); - } - return fragment; - } - - public static

> P load(FragmentManager fragmentManager) { - PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - return (P) fragment.presenter; - } - - @Override public void onDestroy() { - super.onDestroy(); - if (presenter != null) { - presenter.destroy(); - } - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index 8ff73ad..b6667ad 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,7 +4,7 @@ import org.parceler.Parcels; -import it.cosenonjaviste.lib.mvp.MvpFragment; +import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.utils.SingleFragmentActivity; @@ -26,7 +26,7 @@ private FragmentRule(Class> viewClass, Object model) { @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(MvpFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(Dagger2CnjFragment.MODEL, Parcels.wrap(model)); return intent; } } diff --git a/app/src/main/java/it/cosenonjaviste/CnjFragment.java b/app/src/main/java/it/cosenonjaviste/CnjFragment.java deleted file mode 100644 index 520f2d7..0000000 --- a/app/src/main/java/it/cosenonjaviste/CnjFragment.java +++ /dev/null @@ -1,52 +0,0 @@ -package it.cosenonjaviste; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.parceler.Parcels; - -import butterknife.ButterKnife; -import it.cosenonjaviste.lib.mvp.MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.utils.SingleFragmentActivity; - -public abstract class CnjFragment

, M> extends MvpFragment { - - protected ApplicationComponent getComponent() { - return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); - } - - @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(getLayoutId(), container, false); - initView(view); - return view; - } - - protected void initView(View view) { - ButterKnife.inject(this, view); - } - - protected abstract int getLayoutId(); - - @Override public void open(Class> viewClass, MM model) { - Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); - intent.putExtra(MODEL, Parcels.wrap(model)); - getActivity().startActivity(intent); - } - - public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { - Fragment fragment = Fragment.instantiate(context, viewClass.getName()); - Bundle bundle = new Bundle(); - bundle.putParcelable(MODEL, Parcels.wrap(model)); - fragment.setArguments(bundle); - return (T) fragment; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index e85f3b0..6688b64 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -1,7 +1,9 @@ package it.cosenonjaviste; +import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; @@ -12,12 +14,15 @@ import android.widget.ArrayAdapter; import android.widget.ListView; +import org.parceler.Parcels; + import butterknife.ButterKnife; import butterknife.InjectView; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -84,18 +89,26 @@ private Fragment createFragment(int position) { //TODO activity title switch (position) { case 1: - return CnjFragment.createView(this, CategoryListFragment.class, new CategoryListModel()); + return createView(this, CategoryListFragment.class, new CategoryListModel()); case 2: - return CnjFragment.createView(this, AuthorListFragment.class, new AuthorListModel()); + return createView(this, AuthorListFragment.class, new AuthorListModel()); case 3: - return CnjFragment.createView(this, TweetListFragment.class, new TweetListModel()); + return createView(this, TweetListFragment.class, new TweetListModel()); case 4: - return CnjFragment.createView(this, PageFragment.class, new PageModel("http://www.cosenonjaviste.it/contatti/")); + return createView(this, PageFragment.class, new PageModel("http://www.cosenonjaviste.it/contatti/")); default: - return CnjFragment.createView(this, PostListFragment.class, new PostListModel()); + return createView(this, PostListFragment.class, new PostListModel()); } } + public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { + Fragment fragment = Fragment.instantiate(context, viewClass.getName()); + Bundle bundle = new Bundle(); + bundle.putParcelable(Dagger2CnjFragment.MODEL, Parcels.wrap(model)); + fragment.setArguments(bundle); + return (T) fragment; + } + @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); From 1fae6728fe568a0476fc80704ecf8f36dd61d76c Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 21:48:35 +0200 Subject: [PATCH 006/300] Classes rename --- .../lib/mvp/{Dagger2MvpFragment.java => RxMvpFragment.java} | 2 +- .../java/it/cosenonjaviste/androidtest/base/FragmentRule.java | 4 ++-- .../{Dagger2CnjFragment.java => CnjRxFragment.java} | 4 ++-- app/src/main/java/it/cosenonjaviste/MainActivity.java | 2 +- .../java/it/cosenonjaviste/author/AuthorListFragment.java | 4 ++-- .../java/it/cosenonjaviste/category/CategoryListFragment.java | 4 ++-- app/src/main/java/it/cosenonjaviste/page/PageFragment.java | 4 ++-- .../main/java/it/cosenonjaviste/post/PostListFragment.java | 4 ++-- .../java/it/cosenonjaviste/twitter/TweetListFragment.java | 4 ++-- 9 files changed, 16 insertions(+), 16 deletions(-) rename androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/{Dagger2MvpFragment.java => RxMvpFragment.java} (92%) rename app/src/main/java/it/cosenonjaviste/{Dagger2CnjFragment.java => CnjRxFragment.java} (87%) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java similarity index 92% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java rename to androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 145db41..8b5dee2 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -5,7 +5,7 @@ import org.parceler.Parcels; -public abstract class Dagger2MvpFragment extends Fragment implements MvpView { +public abstract class RxMvpFragment extends Fragment implements MvpView { public static final String MODEL = "model"; diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index b6667ad..a80474a 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,7 +4,7 @@ import org.parceler.Parcels; -import it.cosenonjaviste.Dagger2CnjFragment; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.utils.SingleFragmentActivity; @@ -26,7 +26,7 @@ private FragmentRule(Class> viewClass, Object model) { @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(Dagger2CnjFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(CnjRxFragment.MODEL, Parcels.wrap(model)); return intent; } } diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java similarity index 87% rename from app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java rename to app/src/main/java/it/cosenonjaviste/CnjRxFragment.java index a3cf861..51f0a18 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java @@ -5,12 +5,12 @@ import org.parceler.Parcels; -import it.cosenonjaviste.lib.mvp.Dagger2MvpFragment; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; -public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { +public abstract class CnjRxFragment extends RxMvpFragment { private RxMvpPresenter presenter; diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index 6688b64..f77cee7 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -104,7 +104,7 @@ private Fragment createFragment(int position) { public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { Fragment fragment = Fragment.instantiate(context, viewClass.getName()); Bundle bundle = new Bundle(); - bundle.putParcelable(Dagger2CnjFragment.MODEL, Parcels.wrap(model)); + bundle.putParcelable(CnjRxFragment.MODEL, Parcels.wrap(model)); fragment.setArguments(bundle); return (T) fragment; } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 1817b16..cdfdfa5 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -14,13 +14,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class AuthorListFragment extends Dagger2CnjFragment { +public class AuthorListFragment extends CnjRxFragment { @InjectView(R.id.grid) SuperGridview grid; diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 1b4ad56..1aae3da 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -14,13 +14,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class CategoryListFragment extends Dagger2CnjFragment { +public class CategoryListFragment extends CnjRxFragment { @InjectView(R.id.grid) SuperGridview grid; diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index f60f697..77438f4 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -18,13 +18,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -public class PageFragment extends Dagger2CnjFragment { +public class PageFragment extends CnjRxFragment { @InjectView(R.id.web_view) WebView webView; diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 73aaf29..8e86c06 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -14,13 +14,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class PostListFragment extends Dagger2CnjFragment { +public class PostListFragment extends CnjRxFragment { @InjectView(R.id.list) SuperListview list; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 0a2ac40..5b44fd5 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -14,14 +14,14 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import rx.functions.Actions; -public class TweetListFragment extends Dagger2CnjFragment { +public class TweetListFragment extends CnjRxFragment { @InjectView(R.id.list) SuperListview list; From 0791c5d96034111dcbd6459300216812124891ab Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 22:07:26 +0200 Subject: [PATCH 007/300] Deleted CnjRxFragment --- .../it/cosenonjaviste/lib/mvp/MvpView.java | 2 -- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 8 +++++ .../androidtest/base/FragmentRule.java | 4 +-- .../java/it/cosenonjaviste/CnjRxFragment.java | 33 ------------------- .../java/it/cosenonjaviste/MainActivity.java | 3 +- .../ObjectsMapRetainedFragment.java | 27 ++++++--------- .../author/AuthorListFragment.java | 17 +++++++--- .../category/CategoryListFragment.java | 17 +++++++--- .../it/cosenonjaviste/page/PageFragment.java | 12 ++++--- .../cosenonjaviste/post/PostListFragment.java | 17 +++++++--- .../twitter/TweetListFragment.java | 12 ++++--- .../utils/SingleFragmentActivity.java | 10 ++++++ 12 files changed, 85 insertions(+), 77 deletions(-) delete mode 100644 app/src/main/java/it/cosenonjaviste/CnjRxFragment.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java index 48f24d3..c9d6589 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java @@ -2,6 +2,4 @@ public interface MvpView { void update(M model); - - void open(Class> viewClass, MM model); } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 8b5dee2..e5e2f18 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -30,6 +30,14 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { outState.putParcelable(MODEL, Parcels.wrap(getPresenter().getModel())); } + @Override public void onResume() { + super.onResume(); + } + + @Override public void onPause() { + super.onPause(); + } + @Override public void onStart() { super.onStart(); getPresenter().subscribe(this); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index a80474a..9b3c5c9 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,8 +4,8 @@ import org.parceler.Parcels; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; public class FragmentRule extends ActivityRule { @@ -26,7 +26,7 @@ private FragmentRule(Class> viewClass, Object model) { @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(CnjRxFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); return intent; } } diff --git a/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java b/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java deleted file mode 100644 index 51f0a18..0000000 --- a/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java +++ /dev/null @@ -1,33 +0,0 @@ -package it.cosenonjaviste; - -import android.content.Intent; -import android.os.Bundle; - -import org.parceler.Parcels; - -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.RxMvpFragment; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.utils.SingleFragmentActivity; - -public abstract class CnjRxFragment extends RxMvpFragment { - - private RxMvpPresenter presenter; - - @Override public final RxMvpPresenter getPresenter() { - return presenter; - } - - @Override public void onCreate(Bundle state) { - presenter = injectAndCreatePresenter(); - super.onCreate(state); - } - - protected abstract RxMvpPresenter injectAndCreatePresenter(); - - @Override public void open(Class> viewClass, MM model) { - Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); - intent.putExtra(MODEL, Parcels.wrap(model)); - getActivity().startActivity(intent); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index f77cee7..a104b00 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -23,6 +23,7 @@ import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -104,7 +105,7 @@ private Fragment createFragment(int position) { public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { Fragment fragment = Fragment.instantiate(context, viewClass.getName()); Bundle bundle = new Bundle(); - bundle.putParcelable(CnjRxFragment.MODEL, Parcels.wrap(model)); + bundle.putParcelable(RxMvpFragment.MODEL, Parcels.wrap(model)); fragment.setArguments(bundle); return (T) fragment; } diff --git a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java b/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java index a9d11e2..459d686 100644 --- a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java +++ b/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java @@ -3,24 +3,21 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import java.util.HashMap; -import java.util.Map; - import rx.functions.Func0; public class ObjectsMapRetainedFragment extends Fragment { private static final String TAG = ObjectsMapRetainedFragment.class.getName(); - private Map map = new HashMap<>(); + private Object object; public ObjectsMapRetainedFragment() { setRetainInstance(true); } - public static void save(FragmentManager fragmentManager, String key, Object obj) { + public static void save(FragmentManager fragmentManager, Object obj) { ObjectsMapRetainedFragment fragment = getSaverFragment(fragmentManager); - fragment.map.put(key, obj); + fragment.object = obj; } private static ObjectsMapRetainedFragment getSaverFragment(FragmentManager fragmentManager) { @@ -32,27 +29,23 @@ private static ObjectsMapRetainedFragment getSaverFragment(FragmentManager fragm return fragment; } - public static

P load(FragmentManager fragmentManager, String key) { - if (key != null) { - ObjectsMapRetainedFragment fragment = getSaverFragment(fragmentManager); - return (P) fragment.map.get(key); - } else { - return null; - } + public static

P load(FragmentManager fragmentManager) { + ObjectsMapRetainedFragment fragment = getSaverFragment(fragmentManager); + return (P) fragment.object; } - public static C getOrCreate(FragmentManager fragmentManager, String key, Func0 componentFactory) { - C component = ObjectsMapRetainedFragment.load(fragmentManager, key); + public static C getOrCreate(FragmentManager fragmentManager, Func0 componentFactory) { + C component = ObjectsMapRetainedFragment.load(fragmentManager); if (component == null) { component = componentFactory.call(); - ObjectsMapRetainedFragment.save(fragmentManager, key, component); + ObjectsMapRetainedFragment.save(fragmentManager, component); } return component; } @Override public void onDestroy() { super.onDestroy(); -// for (MvpPresenter presenter : map.values()) { +// for (MvpPresenter presenter : object.values()) { // presenter.destroy(); // } } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index cdfdfa5..ae4282f 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -14,13 +14,15 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; +import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class AuthorListFragment extends CnjRxFragment { +public class AuthorListFragment extends RxMvpFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -28,12 +30,15 @@ public class AuthorListFragment extends CnjRxFragment { private AuthorAdapter adapter; - @Override protected AuthorListPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - AuthorListFragment.class.getName(), () -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public AuthorListPresenter getPresenter() { return presenter; } @@ -61,4 +66,8 @@ public class AuthorListFragment extends CnjRxFragment { public void startLoading() { grid.showProgress(); } + + public void open(Class> viewClass, MM model) { + SingleFragmentActivity.open(getActivity(), viewClass, model); + } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 1aae3da..da3c9ef 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -14,13 +14,15 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; +import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class CategoryListFragment extends CnjRxFragment { +public class CategoryListFragment extends RxMvpFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -28,12 +30,15 @@ public class CategoryListFragment extends CnjRxFragment { @Inject CategoryListPresenter presenter; - @Override protected CategoryListPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - CategoryListFragment.class.getName(), () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public CategoryListPresenter getPresenter() { return presenter; } @@ -69,4 +74,8 @@ public class CategoryListFragment extends CnjRxFragment { public void startLoading() { grid.showProgress(); } + + public void open(Class> viewClass, MM model) { + SingleFragmentActivity.open(getActivity(), viewClass, model); + } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 77438f4..7e1eed6 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -18,13 +18,12 @@ import butterknife.ButterKnife; import butterknife.InjectView; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; -public class PageFragment extends CnjRxFragment { +public class PageFragment extends RxMvpFragment { @InjectView(R.id.web_view) WebView webView; @@ -32,12 +31,15 @@ public class PageFragment extends CnjRxFragment { @Inject PagePresenter presenter; - @Override protected RxMvpPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - PageFragment.class.getName(), () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public PagePresenter getPresenter() { return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 8e86c06..0a73903 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -14,13 +14,15 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; +import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class PostListFragment extends CnjRxFragment { +public class PostListFragment extends RxMvpFragment { @InjectView(R.id.list) SuperListview list; @@ -28,12 +30,15 @@ public class PostListFragment extends CnjRxFragment { private PostAdapter adapter; - @Override protected PostListPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - PostListFragment.class.getName(), () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public PostListPresenter getPresenter() { return presenter; } @@ -78,4 +83,8 @@ public void startLoading(boolean showMainLoading) { public void startMoreItemsLoading() { list.showMoreProgress(); } + + public void open(Class> viewClass, MM model) { + SingleFragmentActivity.open(getActivity(), viewClass, model); + } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 5b44fd5..0d5edef 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -14,14 +14,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; import rx.functions.Actions; -public class TweetListFragment extends CnjRxFragment { +public class TweetListFragment extends RxMvpFragment { @InjectView(R.id.list) SuperListview list; @@ -29,12 +28,15 @@ public class TweetListFragment extends CnjRxFragment { @Inject TweetListPresenter presenter; - @Override protected RxMvpPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - TweetListFragment.class.getName(), () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public TweetListPresenter getPresenter() { return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java index 3c5f80b..9d3b699 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java +++ b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java @@ -4,12 +4,16 @@ import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import org.parceler.Parcels; + import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; public class SingleFragmentActivity extends ActionBarActivity { @@ -32,6 +36,12 @@ public static Intent createIntent(Class> viewClass) { return intent; } + public static void open(FragmentActivity activity, Class> viewClass, MM model) { + Intent intent = createIntent(activity, viewClass); + intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); + activity.startActivity(intent); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); From 1992490bfc6b73679e945d22ba5719ed0fb6f063 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 22:12:19 +0200 Subject: [PATCH 008/300] Moved view assignment in init method --- .../java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java | 4 ++-- .../it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 11 +++++------ .../it/cosenonjaviste/author/AuthorListPresenter.java | 5 ++--- .../category/CategoryListPresenter.java | 5 ++--- .../it/cosenonjaviste/post/PostListPresenter.java | 5 ++--- .../it/cosenonjaviste/twitter/TweetListPresenter.java | 5 ++--- 6 files changed, 15 insertions(+), 20 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index e5e2f18..6791e24 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -20,7 +20,7 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); } - getPresenter().init(restoredModel); + getPresenter().init(restoredModel, this); } public abstract RxMvpPresenter getPresenter(); @@ -40,7 +40,7 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { @Override public void onStart() { super.onStart(); - getPresenter().subscribe(this); + getPresenter().subscribe(); } @Override public void onStop() { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index b912352..ad5797f 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -18,12 +18,10 @@ public RxMvpPresenter(SchedulerManager schedulerManager) { } public void pause() { - view = null; rxHolder.pause(); } - public void subscribe(MvpView view) { - this.view = view; + public void subscribe() { view.update(model); rxHolder.resubscribePendingObservable(); } @@ -36,13 +34,14 @@ protected void subscribe(Observable observable, Action0 onAttach, Action1 rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); } - public void init(M model) { + public void init(M model, MvpView view) { this.model = model; + this.view = view; } public void initAndSubscribe(M model, MvpView view) { - init(model); - subscribe(view); + init(model, view); + subscribe(); } public M getModel() { diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 1dab7a1..1d55f6d 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,7 +5,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; @@ -48,8 +47,8 @@ public void loadAuthors() { }); } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + @Override public void subscribe() { + super.subscribe(); if (model.isEmpty() && !loadStarted) { loadAuthors(); } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 41ba648..c2b86ac 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,7 +4,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Category; @@ -27,8 +26,8 @@ public class CategoryListPresenter extends RxMvpPresenter { this.wordPressService = wordPressService; } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + @Override public void subscribe() { + super.subscribe(); if (model.isEmpty() && !loadStarted) { loadData(); } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 90d6619..944b930 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,7 +5,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; @@ -30,8 +29,8 @@ public class PostListPresenter extends RxMvpPresenter { this.wordPressService = wordPressService; } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + @Override public void subscribe() { + super.subscribe(); if (model.getItems().isEmpty() && !loadStarted) { reloadData(); } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 015e5cc..855c2db 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,7 +4,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Tweet; @@ -42,8 +41,8 @@ public void reloadData() { }); } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + @Override public void subscribe() { + super.subscribe(); if (model.isEmpty() && !loadStarted) { reloadData(); } From f2a097914fbd9fd71cf0d7b25f1ae6477036e4c8 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 22:37:28 +0200 Subject: [PATCH 009/300] Introduced LifeCycle class --- .../it/cosenonjaviste/lib/mvp/LifeCycle.java | 41 +++++++++++++++++++ .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 21 ++++------ .../lib/mvp/RxMvpPresenter.java | 22 ++++------ .../lib/mvp/utils/RxHolder.java | 5 ++- .../mvp/author/AuthorListPresenterTest.java | 5 ++- .../category/CategoryListPresenterTest.java | 5 ++- .../mvp/page/PagePresenterTest.java | 3 +- .../mvp/twitter/TweetListPresenterTest.java | 5 ++- 8 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java new file mode 100644 index 0000000..e3ef7e5 --- /dev/null +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java @@ -0,0 +1,41 @@ +package it.cosenonjaviste.lib.mvp; + +import rx.Observable; +import rx.Subscription; +import rx.functions.Action0; +import rx.functions.Action1; +import rx.functions.Func0; +import rx.subjects.PublishSubject; + +public class LifeCycle { + + private Func0 saveObjectFunc; + + public enum EventType { + RESUME, PAUSE, DESTROY_VIEW, DESTROY_ALL; + } + + private PublishSubject subject = PublishSubject.create(); + + public void emit(EventType eventType) { + subject.onNext(eventType); + } + + public Observable asObservable() { + return subject.asObservable(); + } + + public Subscription subscribe(EventType eventType, Action0 callback) { + return subject.asObservable().filter(t -> t == eventType).subscribe(t -> callback.call()); + } + + public void subscribeOnSaveInstanceState(Func0 saveObjectFunc) { + this.saveObjectFunc = saveObjectFunc; + } + + public void saveInstanceState(Action1 saver) { + if (saveObjectFunc != null) { + saver.call(saveObjectFunc.call()); + } + } +} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 6791e24..d4605b4 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -8,6 +8,7 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { public static final String MODEL = "model"; + private LifeCycle lifeCycle; @Override public void onCreate(Bundle state) { super.onCreate(state); @@ -21,31 +22,27 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { } getPresenter().init(restoredModel, this); + lifeCycle = getPresenter().getLifeCycle(); } public abstract RxMvpPresenter getPresenter(); @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putParcelable(MODEL, Parcels.wrap(getPresenter().getModel())); + lifeCycle.saveInstanceState(obj -> { + if (obj != null) { + outState.putParcelable(MODEL, Parcels.wrap(obj)); + } + }); } @Override public void onResume() { super.onResume(); + lifeCycle.emit(LifeCycle.EventType.RESUME); } @Override public void onPause() { super.onPause(); + lifeCycle.emit(LifeCycle.EventType.PAUSE); } - - @Override public void onStart() { - super.onStart(); - getPresenter().subscribe(); - } - - @Override public void onStop() { - getPresenter().pause(); - super.onStop(); - } - } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index ad5797f..c29db23 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -12,13 +12,13 @@ public abstract class RxMvpPresenter { private final RxHolder rxHolder; protected M model; protected MvpView view; + private LifeCycle lifeCycle = new LifeCycle(); public RxMvpPresenter(SchedulerManager schedulerManager) { - rxHolder = new RxHolder(schedulerManager); - } - - public void pause() { - rxHolder.pause(); + rxHolder = new RxHolder(schedulerManager, lifeCycle); + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::subscribe); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + lifeCycle.subscribeOnSaveInstanceState(() -> model); } public void subscribe() { @@ -26,10 +26,6 @@ public void subscribe() { rxHolder.resubscribePendingObservable(); } - public void destroy() { - rxHolder.destroy(); - } - protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); } @@ -44,11 +40,11 @@ public void initAndSubscribe(M model, MvpView view) { subscribe(); } - public M getModel() { - return model; - } - public MvpView getView() { return view; } + + public LifeCycle getLifeCycle() { + return lifeCycle; + } } \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java index 981ee4e..bafe1bb 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.ObservableWithFactory; import rx.Observable; import rx.Subscriber; @@ -22,8 +23,10 @@ public class RxHolder { protected final List observables = new ArrayList<>(); - public RxHolder(SchedulerManager schedulerManager) { + public RxHolder(SchedulerManager schedulerManager, LifeCycle lifeCycle) { this.schedulerManager = schedulerManager; + lifeCycle.subscribe(LifeCycle.EventType.PAUSE, this::pause); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_ALL, this::destroy); } public void subscribePausable(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError, Action0 onCompleted) { diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index 93dc8dc..ebb4c07 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -69,12 +69,13 @@ public void testGoToDetail() { when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); - presenter.initAndSubscribe(new AuthorListModel(), view); + AuthorListModel authorListModel = new AuthorListModel(); + presenter.initAndSubscribe(authorListModel, view); presenter.goToAuthorDetail(1); verify(view).open(any(), modelCaptor.capture()); PostListModel model = modelCaptor.getValue(); - assertThat(model.getAuthor()).isEqualTo(presenter.getModel().get(1)); + assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); } } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 112b357..0835c08 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -74,11 +74,12 @@ public void testGoToPosts() { when(wordPressService.listCategories()) .thenReturn(categoryResponse(3)); - presenter.initAndSubscribe(new CategoryListModel(), view); + CategoryListModel categoryListModel = new CategoryListModel(); + presenter.initAndSubscribe(categoryListModel, view); presenter.goToPosts(1); verify(view).open(any(), modelCaptor.capture()); - assertThat(modelCaptor.getValue().getCategory()).isEqualTo(presenter.getModel().get(1)); + assertThat(modelCaptor.getValue().getCategory()).isEqualTo(categoryListModel.get(1)); } } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 2d791f0..e8cec62 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -8,6 +8,7 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.page.PagePresenter; @@ -27,7 +28,7 @@ public class PagePresenterTest { @Before public void setup() { - presenter = new PagePresenter(new PageUrlManager()); + presenter = new PagePresenter(new TestSchedulerManager(), new PageUrlManager()); presenter.initAndSubscribe(new PageModel("url"), view); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 253142f..d357afb 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -63,10 +63,11 @@ public void setup() { when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); - presenter.initAndSubscribe(new TweetListModel(), view); + TweetListModel tweetListModel = new TweetListModel(); + presenter.initAndSubscribe(tweetListModel, view); presenter.loadNextPage(); - assertThat(presenter.getModel().size()).isEqualTo(20); + assertThat(tweetListModel.size()).isEqualTo(20); } } From 3ed8c8ed7480ddd802761526385cfa805487bbeb Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 22:39:08 +0200 Subject: [PATCH 010/300] Method rename --- .../main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 2 +- .../main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index c29db23..a8a37cb 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -27,7 +27,7 @@ public void subscribe() { } protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { - rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); + rxHolder.subscribe(observable, onAttach, onNext, onError); } public void init(M model, MvpView view) { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java index bafe1bb..6407a4c 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java @@ -29,7 +29,11 @@ public RxHolder(SchedulerManager schedulerManager, LifeCycle lifeCycle) { lifeCycle.subscribe(LifeCycle.EventType.DESTROY_ALL, this::destroy); } - public void subscribePausable(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError, Action0 onCompleted) { + public void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { + subscribe(observable, onAttach, onNext, onError, null); + } + + public void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError, Action0 onCompleted) { ConnectableObservable replay = schedulerManager.bindObservable(observable).replay(); connectableSubscriptions.add(replay.connect()); Func0> factory = () -> new Subscriber() { From 41b756c587c3f7c2f014d909270c82abed1f9621 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Tue, 28 Apr 2015 09:13:16 +0200 Subject: [PATCH 011/300] LifeCycle injected using Dagger --- androidMvp/build.gradle | 2 ++ .../it/cosenonjaviste/lib/mvp/LifeCycle.java | 11 ++++++- .../lib/mvp}/PresenterScope.java | 2 +- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 33 ++++++++++--------- .../lib/mvp/RxMvpPresenter.java | 11 ++++--- .../utils}/ObjectsMapRetainedFragment.java | 2 +- .../lib/mvp/utils/RxHolder.java | 6 +++- app/build.gradle | 2 -- .../author/AuthorListComponent.java | 4 +-- .../author/AuthorListFragment.java | 27 ++++++++------- .../author/AuthorListPresenter.java | 7 ++-- .../category/CategoryListComponent.java | 2 +- .../category/CategoryListFragment.java | 10 ++---- .../category/CategoryListPresenter.java | 4 +-- .../it/cosenonjaviste/page/PageComponent.java | 2 +- .../it/cosenonjaviste/page/PageFragment.java | 10 ++---- .../it/cosenonjaviste/page/PagePresenter.java | 3 +- .../post/PostListComponent.java | 2 +- .../cosenonjaviste/post/PostListFragment.java | 10 ++---- .../post/PostListPresenter.java | 4 +-- .../twitter/TweetListComponent.java | 2 +- .../twitter/TweetListFragment.java | 11 ++----- .../twitter/TweetListPresenter.java | 4 +-- 23 files changed, 88 insertions(+), 83 deletions(-) rename {app/src/main/java/it/cosenonjaviste/utils => androidMvp/src/main/java/it/cosenonjaviste/lib/mvp}/PresenterScope.java (84%) rename {app/src/main/java/it/cosenonjaviste => androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils}/ObjectsMapRetainedFragment.java (97%) diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle index 5254892..a5fbe54 100644 --- a/androidMvp/build.gradle +++ b/androidMvp/build.gradle @@ -33,4 +33,6 @@ dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:support-annotations:20.0.0' compile 'org.parceler:parceler-api:0.2.14' + compile 'com.google.dagger:dagger:2.0' + compile 'org.glassfish:javax.annotation:10.0-b28' } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java index e3ef7e5..f140388 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java @@ -1,5 +1,7 @@ package it.cosenonjaviste.lib.mvp; +import javax.inject.Inject; + import rx.Observable; import rx.Subscription; import rx.functions.Action0; @@ -7,6 +9,7 @@ import rx.functions.Func0; import rx.subjects.PublishSubject; +@PresenterScope public class LifeCycle { private Func0 saveObjectFunc; @@ -17,6 +20,9 @@ public enum EventType { private PublishSubject subject = PublishSubject.create(); + @Inject public LifeCycle() { + } + public void emit(EventType eventType) { subject.onNext(eventType); } @@ -35,7 +41,10 @@ public void subscribeOnSaveInstanceState(Func0 saveObjectFunc) { public void saveInstanceState(Action1 saver) { if (saveObjectFunc != null) { - saver.call(saveObjectFunc.call()); + Object obj = saveObjectFunc.call(); + if (obj != null) { + saver.call(obj); + } } } } diff --git a/app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java similarity index 84% rename from app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java rename to androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java index 67e7aac..1f9aa54 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.utils; +package it.cosenonjaviste.lib.mvp; import java.lang.annotation.Retention; diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index d4605b4..954398d 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -5,35 +5,31 @@ import org.parceler.Parcels; +import javax.inject.Inject; + +import it.cosenonjaviste.lib.mvp.utils.ObjectsMapRetainedFragment; +import rx.functions.Func0; + public abstract class RxMvpFragment extends Fragment implements MvpView { public static final String MODEL = "model"; - private LifeCycle lifeCycle; - @Override public void onCreate(Bundle state) { - super.onCreate(state); + @Inject LifeCycle lifeCycle; + protected static M getRestoredModel(Bundle state, Bundle arguments) { M restoredModel = null; if (state != null) { restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); } - if (restoredModel == null && getArguments() != null) { - restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); + if (restoredModel == null && arguments != null) { + restoredModel = Parcels.unwrap(arguments.getParcelable(MODEL)); } - - getPresenter().init(restoredModel, this); - lifeCycle = getPresenter().getLifeCycle(); + return restoredModel; } - public abstract RxMvpPresenter getPresenter(); - @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - lifeCycle.saveInstanceState(obj -> { - if (obj != null) { - outState.putParcelable(MODEL, Parcels.wrap(obj)); - } - }); + lifeCycle.saveInstanceState(obj -> outState.putParcelable(MODEL, Parcels.wrap(obj))); } @Override public void onResume() { @@ -45,4 +41,11 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { super.onPause(); lifeCycle.emit(LifeCycle.EventType.PAUSE); } + + protected T createComponent(Func0 componentFactory) { + return ObjectsMapRetainedFragment.getOrCreate( + getChildFragmentManager(), + componentFactory + ); + } } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index a8a37cb..9083121 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -1,21 +1,22 @@ package it.cosenonjaviste.lib.mvp; +import javax.inject.Inject; + import it.cosenonjaviste.lib.mvp.utils.RxHolder; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.Observable; import rx.functions.Action0; import rx.functions.Action1; public abstract class RxMvpPresenter { - private final RxHolder rxHolder; + @Inject RxHolder rxHolder; protected M model; protected MvpView view; - private LifeCycle lifeCycle = new LifeCycle(); + private LifeCycle lifeCycle; - public RxMvpPresenter(SchedulerManager schedulerManager) { - rxHolder = new RxHolder(schedulerManager, lifeCycle); + @Inject void initLifeCycle(LifeCycle lifeCycle) { + this.lifeCycle = lifeCycle; lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::subscribe); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); lifeCycle.subscribeOnSaveInstanceState(() -> model); diff --git a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java similarity index 97% rename from app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java rename to androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java index 459d686..4b0047a 100644 --- a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste; +package it.cosenonjaviste.lib.mvp.utils; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java index 6407a4c..22729ae 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java @@ -3,8 +3,11 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.ObservableWithFactory; +import it.cosenonjaviste.lib.mvp.PresenterScope; import rx.Observable; import rx.Subscriber; import rx.functions.Action0; @@ -14,6 +17,7 @@ import rx.observables.ConnectableObservable; import rx.subscriptions.CompositeSubscription; +@PresenterScope public class RxHolder { private SchedulerManager schedulerManager; @@ -23,7 +27,7 @@ public class RxHolder { protected final List observables = new ArrayList<>(); - public RxHolder(SchedulerManager schedulerManager, LifeCycle lifeCycle) { + @Inject public RxHolder(SchedulerManager schedulerManager, LifeCycle lifeCycle) { this.schedulerManager = schedulerManager; lifeCycle.subscribe(LifeCycle.EventType.PAUSE, this::pause); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_ALL, this::destroy); diff --git a/app/build.gradle b/app/build.gradle index 0c9255a..2b94bcc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,13 +84,11 @@ dependencies { compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' compile 'com.squareup.retrofit:retrofit:1.9.0' - compile 'com.google.dagger:dagger:2.0' compile 'org.twitter4j:twitter4j-core:4.0.2' compile 'com.android.support:cardview-v7:21.0.3' compile 'io.reactivex:rxandroid-framework:0.24.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' - compile 'org.glassfish:javax.annotation:10.0-b28' apt 'com.google.dagger:dagger-compiler:2.0' apt 'org.parceler:parceler:0.2.14' diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java index 0746dcb..df87386 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java @@ -2,10 +2,10 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) public interface AuthorListComponent { - void inject(AuthorListFragment fragment); + void inject(AuthorListFragment authorListFragment); } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index ae4282f..88fdf96 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -13,13 +13,15 @@ import butterknife.ButterKnife; import butterknife.InjectView; -import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; +import rx.Observable; +import rx.android.view.ViewObservable; +import rx.android.widget.OnItemClickEvent; +import rx.android.widget.WidgetObservable; import rx.functions.Actions; public class AuthorListFragment extends RxMvpFragment { @@ -31,15 +33,12 @@ public class AuthorListFragment extends RxMvpFragment { private AuthorAdapter adapter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), - () -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() - ).inject(this); super.onCreate(state); - } - @Override public AuthorListPresenter getPresenter() { - return presenter; + createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) + .inject(this); + + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -48,12 +47,15 @@ public class AuthorListFragment extends RxMvpFragment { adapter = new AuthorAdapter(getActivity()); grid.getList().setNumColumns(2); grid.setAdapter(adapter); - grid.setOnItemClickListener((parent, v, position, id) -> presenter.goToAuthorDetail(position)); return view; } - @OnClick(R.id.error_retry) void retry() { - presenter.loadAuthors(); + public Observable onItemClick() { + return WidgetObservable.itemClicks(grid.getList()).map(OnItemClickEvent::position); + } + + public Observable retry() { + return ViewObservable.clicks(getView().findViewById(R.id.error_retry)).map(e -> null); } @Override public void update(AuthorListModel model) { @@ -70,4 +72,5 @@ public void startLoading() { public void open(Class> viewClass, MM model) { SingleFragmentActivity.open(getActivity(), viewClass, model); } + } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 1d55f6d..fef759b 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,6 +5,7 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; @@ -12,7 +13,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; @PresenterScope @@ -23,7 +23,7 @@ public class AuthorListPresenter extends RxMvpPresenter { private boolean loadStarted; @Inject public AuthorListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(schedulerManager); + super(); this.wordPressService = wordPressService; } @@ -49,6 +49,9 @@ public void loadAuthors() { @Override public void subscribe() { super.subscribe(); + //TODO unsubscribe + getView().retry().subscribe(t -> loadAuthors()); + getView().onItemClick().subscribe(this::goToAuthorDetail); if (model.isEmpty() && !loadStarted) { loadAuthors(); } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java index 390dbdb..c20d2cd 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java @@ -2,7 +2,7 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index da3c9ef..b30f472 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -15,7 +15,6 @@ import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; @@ -31,15 +30,12 @@ public class CategoryListFragment extends RxMvpFragment { @Inject CategoryListPresenter presenter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), + super.onCreate(state); + createComponent( () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - super.onCreate(state); - } - @Override public CategoryListPresenter getPresenter() { - return presenter; + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index c2b86ac..b9349b7 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,6 +4,7 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Category; @@ -11,7 +12,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; @PresenterScope @@ -22,7 +22,7 @@ public class CategoryListPresenter extends RxMvpPresenter { private boolean loadStarted; @Inject public CategoryListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(schedulerManager); + super(); this.wordPressService = wordPressService; } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageComponent.java b/app/src/main/java/it/cosenonjaviste/page/PageComponent.java index 0a4a0f5..f661647 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageComponent.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageComponent.java @@ -2,7 +2,7 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 7e1eed6..7600778 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -19,7 +19,6 @@ import butterknife.ButterKnife; import butterknife.InjectView; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; @@ -32,15 +31,12 @@ public class PageFragment extends RxMvpFragment { @Inject PagePresenter presenter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), + super.onCreate(state); + createComponent( () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - super.onCreate(state); - } - @Override public PagePresenter getPresenter() { - return presenter; + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index dab75f2..729c5d3 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,9 +2,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.utils.PresenterScope; @PresenterScope public class PagePresenter extends RxMvpPresenter { @@ -12,7 +12,6 @@ public class PagePresenter extends RxMvpPresenter { private PageUrlManager pageUrlManager; @Inject public PagePresenter(SchedulerManager schedulerManager, PageUrlManager pageUrlManager) { - super(schedulerManager); this.pageUrlManager = pageUrlManager; } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java b/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java index 5cce721..6386d38 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java @@ -2,7 +2,7 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 0a73903..978ce49 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -15,7 +15,6 @@ import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; @@ -31,15 +30,12 @@ public class PostListFragment extends RxMvpFragment { private PostAdapter adapter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), + super.onCreate(state); + createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - super.onCreate(state); - } - @Override public PostListPresenter getPresenter() { - return presenter; + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 944b930..137615a 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,6 +5,7 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; @@ -14,7 +15,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; -import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; @PresenterScope @@ -25,7 +25,7 @@ public class PostListPresenter extends RxMvpPresenter { private boolean loadStarted; @Inject public PostListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(schedulerManager); + super(); this.wordPressService = wordPressService; } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java index 38e6e53..f9f8077 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java @@ -2,7 +2,7 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 0d5edef..a76f5a0 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -15,7 +15,6 @@ import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import rx.functions.Actions; @@ -29,15 +28,11 @@ public class TweetListFragment extends RxMvpFragment { @Inject TweetListPresenter presenter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), + super.onCreate(state); + createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - super.onCreate(state); - } - - @Override public TweetListPresenter getPresenter() { - return presenter; + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 855c2db..d9673df 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,11 +4,11 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; @PresenterScope @@ -19,7 +19,7 @@ public class TweetListPresenter extends RxMvpPresenter { private boolean loadStarted; @Inject public TweetListPresenter(SchedulerManager schedulerManager, TwitterService twitterService) { - super(schedulerManager); + super(); this.twitterService = twitterService; } From ffb0acf43f43e43822be82e91090f85049b2ea8d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Tue, 28 Apr 2015 09:16:56 +0200 Subject: [PATCH 012/300] Method rename --- .../it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 12 +++--------- .../cosenonjaviste/author/AuthorListPresenter.java | 4 ++-- .../category/CategoryListPresenter.java | 4 ++-- .../it/cosenonjaviste/post/PostListPresenter.java | 4 ++-- .../cosenonjaviste/twitter/TweetListPresenter.java | 4 ++-- 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 9083121..9a568f2 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -13,16 +13,14 @@ public abstract class RxMvpPresenter { @Inject RxHolder rxHolder; protected M model; protected MvpView view; - private LifeCycle lifeCycle; @Inject void initLifeCycle(LifeCycle lifeCycle) { - this.lifeCycle = lifeCycle; - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::subscribe); + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); lifeCycle.subscribeOnSaveInstanceState(() -> model); } - public void subscribe() { + public void resume() { view.update(model); rxHolder.resubscribePendingObservable(); } @@ -38,14 +36,10 @@ public void init(M model, MvpView view) { public void initAndSubscribe(M model, MvpView view) { init(model, view); - subscribe(); + resume(); } public MvpView getView() { return view; } - - public LifeCycle getLifeCycle() { - return lifeCycle; - } } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index fef759b..ada5336 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -47,8 +47,8 @@ public void loadAuthors() { }); } - @Override public void subscribe() { - super.subscribe(); + @Override public void resume() { + super.resume(); //TODO unsubscribe getView().retry().subscribe(t -> loadAuthors()); getView().onItemClick().subscribe(this::goToAuthorDetail); diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index b9349b7..5bf3041 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -26,8 +26,8 @@ public class CategoryListPresenter extends RxMvpPresenter { this.wordPressService = wordPressService; } - @Override public void subscribe() { - super.subscribe(); + @Override public void resume() { + super.resume(); if (model.isEmpty() && !loadStarted) { loadData(); } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 137615a..88564e6 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -29,8 +29,8 @@ public class PostListPresenter extends RxMvpPresenter { this.wordPressService = wordPressService; } - @Override public void subscribe() { - super.subscribe(); + @Override public void resume() { + super.resume(); if (model.getItems().isEmpty() && !loadStarted) { reloadData(); } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index d9673df..f3f4452 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -41,8 +41,8 @@ public void reloadData() { }); } - @Override public void subscribe() { - super.subscribe(); + @Override public void resume() { + super.resume(); if (model.isEmpty() && !loadStarted) { reloadData(); } From 3d5e4144ef8fb3a9fb542aa599ba4540f2f0f5d0 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Wed, 29 Apr 2015 08:31:29 +0200 Subject: [PATCH 013/300] Moved model to subclasses --- SuperListviewLibrary/build.gradle | 4 +-- androidMvp/build.gradle | 4 +-- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 13 +++++++++- .../lib/mvp/RxMvpPresenter.java | 19 ++------------ .../mvp/utils/ObjectsMapRetainedFragment.java | 2 +- app/build.gradle | 6 ++--- .../author/AuthorListFragment.java | 22 +++++++--------- .../author/AuthorListPresenter.java | 21 ++++++++------- .../category/CategoryListFragment.java | 7 ++--- .../category/CategoryListPresenter.java | 18 ++++++++----- .../it/cosenonjaviste/page/PageFragment.java | 7 ++--- .../it/cosenonjaviste/page/PagePresenter.java | 19 +++++++++++--- .../cosenonjaviste/post/PostListFragment.java | 6 +++-- .../post/PostListPresenter.java | 18 ++++++++----- .../twitter/TweetListFragment.java | 6 +++-- .../twitter/TweetListPresenter.java | 18 ++++++++----- .../mvp/author/AuthorListPresenterTest.java | 23 +++++++++------- .../category/CategoryListPresenterTest.java | 23 +++++++++------- .../mvp/page/PagePresenterTest.java | 16 +++++++++--- .../mvp/post/AuthorPostListPresenterTest.java | 17 ++++++------ .../post/CategoryPostListPresenterTest.java | 20 +++++++------- .../mvp/post/PostListPresenterTest.java | 26 +++++++++++-------- .../mvp/twitter/TweetListPresenterTest.java | 23 +++++++++------- 23 files changed, 197 insertions(+), 141 deletions(-) diff --git a/SuperListviewLibrary/build.gradle b/SuperListviewLibrary/build.gradle index b260fd5..1d32765 100644 --- a/SuperListviewLibrary/build.gradle +++ b/SuperListviewLibrary/build.gradle @@ -7,11 +7,11 @@ dependencies { android { compileSdkVersion 21 - buildToolsVersion "21.1.2" + buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 4 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle index a5fbe54..78f1eb9 100644 --- a/androidMvp/build.gradle +++ b/androidMvp/build.gradle @@ -4,11 +4,11 @@ apply plugin: 'me.tatarka.retrolambda' android { compileSdkVersion 21 - buildToolsVersion "21.1.2" + buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 9 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 954398d..fc590d5 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -16,6 +16,15 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { @Inject LifeCycle lifeCycle; + private Object model; + + @Override public final void onCreate(Bundle state) { + super.onCreate(state); + model = init(state); + } + + protected abstract Object init(Bundle state); + protected static M getRestoredModel(Bundle state, Bundle arguments) { M restoredModel = null; if (state != null) { @@ -29,7 +38,9 @@ protected static M getRestoredModel(Bundle state, Bundle arguments) { @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - lifeCycle.saveInstanceState(obj -> outState.putParcelable(MODEL, Parcels.wrap(obj))); + if (model != null) { + outState.putParcelable(MODEL, Parcels.wrap(model)); + } } @Override public void onResume() { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 9a568f2..d81967a 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -10,35 +10,20 @@ public abstract class RxMvpPresenter { - @Inject RxHolder rxHolder; - protected M model; + @Inject protected RxHolder rxHolder; protected MvpView view; @Inject void initLifeCycle(LifeCycle lifeCycle) { lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - lifeCycle.subscribeOnSaveInstanceState(() -> model); } - public void resume() { - view.update(model); - rxHolder.resubscribePendingObservable(); - } + public abstract void resume(); protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { rxHolder.subscribe(observable, onAttach, onNext, onError); } - public void init(M model, MvpView view) { - this.model = model; - this.view = view; - } - - public void initAndSubscribe(M model, MvpView view) { - init(model, view); - resume(); - } - public MvpView getView() { return view; } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java index 4b0047a..e70c34e 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java @@ -35,7 +35,7 @@ public static

P load(FragmentManager fragmentManager) { } public static C getOrCreate(FragmentManager fragmentManager, Func0 componentFactory) { - C component = ObjectsMapRetainedFragment.load(fragmentManager); + C component = load(fragmentManager); if (component == null) { component = componentFactory.call(); ObjectsMapRetainedFragment.save(fragmentManager, component); diff --git a/app/build.gradle b/app/build.gradle index 2b94bcc..b530e5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,13 +44,13 @@ android { version = '0.7.2.201409121644' } - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 22 + buildToolsVersion "22.0.1" defaultConfig { applicationId "it.cosenonjaviste" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 11 versionName "2.0" buildConfigField "String", "CONSUMER_KEY", project.oauth_consumerKey diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 88fdf96..c41f515 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -13,15 +13,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; +import butterknife.OnClick; +import butterknife.OnItemClick; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; -import rx.Observable; -import rx.android.view.ViewObservable; -import rx.android.widget.OnItemClickEvent; -import rx.android.widget.WidgetObservable; import rx.functions.Actions; public class AuthorListFragment extends RxMvpFragment { @@ -32,13 +30,13 @@ public class AuthorListFragment extends RxMvpFragment { private AuthorAdapter adapter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); - + @Override public Object init(Bundle state) { createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) .inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + AuthorListModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -50,12 +48,12 @@ public class AuthorListFragment extends RxMvpFragment { return view; } - public Observable onItemClick() { - return WidgetObservable.itemClicks(grid.getList()).map(OnItemClickEvent::position); + @OnItemClick(R.id.grid) void goToDetails(int position) { + presenter.goToAuthorDetail(position); } - public Observable retry() { - return ViewObservable.clicks(getView().findViewById(R.id.error_retry)).map(e -> null); + @OnClick(R.id.error_retry) void retry() { + presenter.loadAuthors(); } @Override public void update(AuthorListModel model) { diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index ada5336..0b13e41 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,9 +5,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.AuthorResponse; import it.cosenonjaviste.model.WordPressService; @@ -18,13 +18,13 @@ @PresenterScope public class AuthorListPresenter extends RxMvpPresenter { - private WordPressService wordPressService; + protected AuthorListModel model; + + @Inject WordPressService wordPressService; private boolean loadStarted; - @Inject public AuthorListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(); - this.wordPressService = wordPressService; + @Inject public AuthorListPresenter() { } public void loadAuthors() { @@ -48,10 +48,8 @@ public void loadAuthors() { } @Override public void resume() { - super.resume(); - //TODO unsubscribe - getView().retry().subscribe(t -> loadAuthors()); - getView().onItemClick().subscribe(this::goToAuthorDetail); + view.update(model); + rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { loadAuthors(); } @@ -65,4 +63,9 @@ public void goToAuthorDetail(int position) { @Override public AuthorListFragment getView() { return (AuthorListFragment) super.getView(); } + + public void init(it.cosenonjaviste.author.AuthorListModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index b30f472..e5212e5 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -29,13 +29,14 @@ public class CategoryListFragment extends RxMvpFragment { @Inject CategoryListPresenter presenter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); + @Override public Object init(Bundle state) { createComponent( () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + CategoryListModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 5bf3041..68ce817 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,9 +4,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.CategoryResponse; import it.cosenonjaviste.model.WordPressService; @@ -17,17 +17,18 @@ @PresenterScope public class CategoryListPresenter extends RxMvpPresenter { - private WordPressService wordPressService; + private CategoryListModel model; + + @Inject WordPressService wordPressService; private boolean loadStarted; - @Inject public CategoryListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(); - this.wordPressService = wordPressService; + @Inject public CategoryListPresenter() { } @Override public void resume() { - super.resume(); + view.update(model); + rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { loadData(); } @@ -60,4 +61,9 @@ public void goToPosts(int position) { @Override public CategoryListFragment getView() { return (CategoryListFragment) super.getView(); } + + public void init(it.cosenonjaviste.category.CategoryListModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 7600778..60163f5 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -30,13 +30,14 @@ public class PageFragment extends RxMvpFragment { @Inject PagePresenter presenter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); + @Override public Object init(Bundle state) { createComponent( () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + PageModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 729c5d3..04b4862 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,20 +2,31 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; @PresenterScope public class PagePresenter extends RxMvpPresenter { - private PageUrlManager pageUrlManager; + private PageModel model; - @Inject public PagePresenter(SchedulerManager schedulerManager, PageUrlManager pageUrlManager) { - this.pageUrlManager = pageUrlManager; + @Inject PageUrlManager pageUrlManager; + + @Inject public PagePresenter() { } public String getPostUrl() { return pageUrlManager.getUrl(model.getUrl()); } + + @Override public void resume() { + view.update(model); + rxHolder.resubscribePendingObservable(); + } + + public void init(it.cosenonjaviste.page.PageModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 978ce49..3baf9c4 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -29,13 +29,15 @@ public class PostListFragment extends RxMvpFragment { private PostAdapter adapter; - @Override public void onCreate(Bundle state) { + @Override public Object init(Bundle state) { super.onCreate(state); createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + PostListModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 88564e6..5a15277 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,9 +5,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.Post; @@ -20,17 +20,18 @@ @PresenterScope public class PostListPresenter extends RxMvpPresenter { - private WordPressService wordPressService; + private PostListModel model; + + @Inject WordPressService wordPressService; private boolean loadStarted; - @Inject public PostListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(); - this.wordPressService = wordPressService; + @Inject public PostListPresenter() { } @Override public void resume() { - super.resume(); + view.update(model); + rxHolder.resubscribePendingObservable(); if (model.getItems().isEmpty() && !loadStarted) { reloadData(); } @@ -97,4 +98,9 @@ private static int calcNextPage(int size, int pageSize) { @Override public PostListFragment getView() { return (PostListFragment) super.getView(); } + + public void init(it.cosenonjaviste.post.PostListModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index a76f5a0..c7e1490 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -27,12 +27,14 @@ public class TweetListFragment extends RxMvpFragment { @Inject TweetListPresenter presenter; - @Override public void onCreate(Bundle state) { + @Override public Object init(Bundle state) { super.onCreate(state); createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + TweetListModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index f3f4452..02d995d 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,9 +4,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; import rx.Observable; @@ -14,13 +14,13 @@ @PresenterScope public class TweetListPresenter extends RxMvpPresenter { - private TwitterService twitterService; + private TweetListModel model; + + @Inject TwitterService twitterService; private boolean loadStarted; - @Inject public TweetListPresenter(SchedulerManager schedulerManager, TwitterService twitterService) { - super(); - this.twitterService = twitterService; + @Inject public TweetListPresenter() { } public void reloadData() { @@ -42,7 +42,8 @@ public void reloadData() { } @Override public void resume() { - super.resume(); + view.update(model); + rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { reloadData(); } @@ -72,4 +73,9 @@ private static int calcNextPage(int size, int pageSize) { @Override public TweetListFragment getView() { return (TweetListFragment) super.getView(); } + + public void init(it.cosenonjaviste.twitter.TweetListModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index ebb4c07..aba6389 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -1,16 +1,19 @@ package it.cosenonjaviste.mvp.author; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListModel; @@ -27,24 +30,22 @@ public class AuthorListPresenterTest { @Mock AuthorListFragment view; - private AuthorListPresenter presenter; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + + @InjectMocks AuthorListPresenter presenter; @Mock WordPressService wordPressService; @Captor ArgumentCaptor modelCaptor; - @Before - public void setup() { - presenter = new AuthorListPresenter(new TestSchedulerManager(), wordPressService); - } - @Test public void testLoad() { when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); AuthorListModel model = new AuthorListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.size()).isEqualTo(2); } @@ -54,7 +55,8 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); AuthorListModel model = new AuthorListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); @@ -70,7 +72,8 @@ public void testGoToDetail() { .thenReturn(authorResponse(2)); AuthorListModel authorListModel = new AuthorListModel(); - presenter.initAndSubscribe(authorListModel, view); + presenter.init(authorListModel, view); + presenter.resume(); presenter.goToAuthorDetail(1); verify(view).open(any(), modelCaptor.capture()); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 0835c08..70238b2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -1,16 +1,19 @@ package it.cosenonjaviste.mvp.category; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.category.CategoryListPresenter; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; @@ -28,24 +31,22 @@ public class CategoryListPresenterTest { @Mock WordPressService wordPressService; - private CategoryListPresenter presenter; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + + @InjectMocks CategoryListPresenter presenter; @Mock CategoryListFragment view; @Captor ArgumentCaptor modelCaptor; - @Before - public void setup() { - presenter = new CategoryListPresenter(new TestSchedulerManager(), wordPressService); - } - @Test public void testLoad() { when(wordPressService.listCategories()) .thenReturn(categoryResponse(3)); CategoryListModel model = new CategoryListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.size()).isEqualTo(3); Category category = model.get(2); assertThat(category.getId()).isEqualTo(2); @@ -59,7 +60,8 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); CategoryListModel model = new CategoryListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); when(wordPressService.listCategories()) .thenReturn(categoryResponse(3)); @@ -75,7 +77,8 @@ public void testGoToPosts() { .thenReturn(categoryResponse(3)); CategoryListModel categoryListModel = new CategoryListModel(); - presenter.initAndSubscribe(categoryListModel, view); + presenter.init(categoryListModel, view); + presenter.resume(); presenter.goToPosts(1); verify(view).open(any(), modelCaptor.capture()); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index e8cec62..59dda81 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -5,9 +5,13 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -20,16 +24,20 @@ @RunWith(MockitoJUnitRunner.class) public class PagePresenterTest { - private PagePresenter presenter; - @Mock PageFragment view; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + + @Spy PageUrlManager pageUrlManager = new PageUrlManager(); + + @InjectMocks PagePresenter presenter; + @Captor ArgumentCaptor modelCaptor; @Before public void setup() { - presenter = new PagePresenter(new TestSchedulerManager(), new PageUrlManager()); - presenter.initAndSubscribe(new PageModel("url"), view); + presenter.init(new PageModel("url"), view); + presenter.resume(); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index 4a073ae..be1fdb2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -1,12 +1,15 @@ package it.cosenonjaviste.mvp.post; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListFragment; @@ -25,14 +28,11 @@ public class AuthorPostListPresenterTest { @Mock PostListFragment view; - @Mock WordPressService wordPressService; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - private PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Before - public void setup() { - presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); - } + @InjectMocks PostListPresenter presenter; @Test public void testLoad() throws InterruptedException { @@ -41,7 +41,8 @@ public void testLoad() throws InterruptedException { PostListModel model = new PostListModel(TestData.createAuthor(145)); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.getItems().size()).isEqualTo(1); verify(wordPressService).listAuthorPosts(eq(145L), eq(1)); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index 61679f3..e868ca9 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -1,12 +1,15 @@ package it.cosenonjaviste.mvp.post; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; @@ -23,21 +26,19 @@ public class CategoryPostListPresenterTest { @Mock PostListFragment view; - @Mock WordPressService wordPressService; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - private PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Before - public void setup() { - presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); - } + @InjectMocks PostListPresenter presenter; @Test public void testLoad() throws InterruptedException { when(wordPressService.listCategoryPosts(eq(1L), eq(1))) .thenReturn(TestData.postResponse(1)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.getItems().size()).isEqualTo(1); } @@ -49,7 +50,8 @@ public void testLoadMore() { .thenReturn(TestData.postResponse(5)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); presenter.loadNextPage(); assertThat(model.getItems().size()).isEqualTo(15); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index 6629bd3..e4d60ff 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -1,14 +1,17 @@ package it.cosenonjaviste.mvp.post; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.OptionalList; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; @@ -30,14 +33,11 @@ public class PostListPresenterTest { @Mock PostListFragment view; - @Mock WordPressService wordPressService; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - private PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Before - public void setup() { - presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); - } + @InjectMocks PostListPresenter presenter; @Captor ArgumentCaptor modelCaptor; @@ -47,7 +47,8 @@ public void testLoad() throws InterruptedException { .thenReturn(postResponse(1)); PostListModel model = new PostListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.getItems().size()).isEqualTo(1); } @@ -60,7 +61,8 @@ public void testLoadMore() { .thenReturn(postResponse(6)); PostListModel model = new PostListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); presenter.loadNextPage(); OptionalList items = model.getItems(); @@ -73,7 +75,8 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); PostListModel model = new PostListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.getItems().isError()).isTrue(); when(wordPressService.listPosts(eq(1))) @@ -91,7 +94,8 @@ public void testGoToDetails() { .thenReturn(postResponse(1)); PostListModel model = new PostListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); Post firstPost = model.getItems().get(0); presenter.goToDetail(firstPost); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index d357afb..944d56c 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -1,12 +1,15 @@ package it.cosenonjaviste.mvp.twitter; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.twitter.TweetListFragment; @@ -23,21 +26,19 @@ public class TweetListPresenterTest { @Mock TweetListFragment view; - @Mock TwitterService twitterService; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - private TweetListPresenter presenter; + @Mock TwitterService twitterService; - @Before - public void setup() { - presenter = new TweetListPresenter(new TestSchedulerManager(), twitterService); - } + @InjectMocks TweetListPresenter presenter; @Test public void testLoadTweets() { when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); TweetListModel model = new TweetListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.size()).isEqualTo(10); } @@ -46,7 +47,8 @@ public void setup() { .thenReturn(Observable.error(new RuntimeException())); TweetListModel model = new TweetListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.isError()).isTrue(); @@ -64,7 +66,8 @@ public void setup() { .thenReturn(TestData.tweets()); TweetListModel tweetListModel = new TweetListModel(); - presenter.initAndSubscribe(tweetListModel, view); + presenter.init(tweetListModel, view); + presenter.resume(); presenter.loadNextPage(); From 83f793f8dfac23822b61ebf80ccd43c4227bddf2 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Wed, 29 Apr 2015 08:35:13 +0200 Subject: [PATCH 014/300] Removed subscribe method in presenter --- .../lib/mvp/RxMvpPresenter.java | 7 ------ .../author/AuthorListPresenter.java | 2 +- .../category/CategoryListPresenter.java | 2 +- .../post/PostListPresenter.java | 24 ++++++++++--------- .../twitter/TweetListPresenter.java | 24 ++++++++++--------- 5 files changed, 28 insertions(+), 31 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index d81967a..8080e58 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -4,9 +4,6 @@ import javax.inject.Inject; import it.cosenonjaviste.lib.mvp.utils.RxHolder; -import rx.Observable; -import rx.functions.Action0; -import rx.functions.Action1; public abstract class RxMvpPresenter { @@ -20,10 +17,6 @@ public abstract class RxMvpPresenter { public abstract void resume(); - protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { - rxHolder.subscribe(observable, onAttach, onNext, onError); - } - public MvpView getView() { return view; } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 0b13e41..f7822ef 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -33,7 +33,7 @@ public void loadAuthors() { .map(AuthorResponse::getAuthors) .doOnNext(Collections::sort); - subscribe(observable, + rxHolder.subscribe(observable, () -> { loadStarted = true; getView().startLoading(); diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 68ce817..ffdfc2a 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -39,7 +39,7 @@ public void loadData() { .listCategories() .map(CategoryResponse::getCategories); - subscribe(observable, + rxHolder.subscribe(observable, () -> { loadStarted = true; getView().startLoading(); diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 5a15277..046824e 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -16,6 +16,8 @@ import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import rx.Observable; +import rx.functions.Action0; +import rx.functions.Action1; @PresenterScope public class PostListPresenter extends RxMvpPresenter { @@ -40,7 +42,7 @@ public class PostListPresenter extends RxMvpPresenter { public void reloadData() { Observable> observable = getObservable(1); - subscribe(observable, + rxHolder.subscribe(observable, () -> { loadStarted = true; getView().startLoading(model.getItems().isEmpty()); @@ -63,16 +65,16 @@ public void loadNextPage() { int page = calcNextPage(model.getItems().size(), WordPressService.POST_PAGE_SIZE); Observable> observable = getObservable(page); - subscribe(observable, - () -> getView().startMoreItemsLoading(), - posts -> { - model.getItems().append(posts); - model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - view.update(model); - }, throwable -> { - model.getItems().error(throwable); - view.update(model); - }); + Action0 onAttach = () -> getView().startMoreItemsLoading();Action1> onNext = posts -> { + model.getItems().append(posts); + model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); + view.update(model); + }; + Action1 onError = throwable -> { + model.getItems().error(throwable); + view.update(model); + }; + rxHolder.subscribe(observable, onAttach, onNext, onError); } private Observable> getObservable(int page) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 02d995d..572507f 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -10,6 +10,8 @@ import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; import rx.Observable; +import rx.functions.Action0; +import rx.functions.Action1; @PresenterScope public class TweetListPresenter extends RxMvpPresenter { @@ -26,7 +28,7 @@ public class TweetListPresenter extends RxMvpPresenter { public void reloadData() { Observable> observable = twitterService.loadTweets(1); - subscribe(observable, + rxHolder.subscribe(observable, () -> { loadStarted = true; getView().startLoading(model.isEmpty()); @@ -53,16 +55,16 @@ public void loadNextPage() { int page = calcNextPage(model.size(), TwitterService.PAGE_SIZE); Observable> observable = twitterService.loadTweets(page); - subscribe(observable, - () -> getView().startMoreItemsLoading(), - posts -> { - model.append(posts); - model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - view.update(model); - }, throwable -> { - model.error(throwable); - view.update(model); - }); + Action0 onAttach = () -> getView().startMoreItemsLoading();Action1> onNext = posts -> { + model.append(posts); + model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); + view.update(model); + }; + Action1 onError = throwable -> { + model.error(throwable); + view.update(model); + }; + rxHolder.subscribe(observable, onAttach, onNext, onError); } From 4099376d8259d206b320c37a03140edfbbd9cbbd Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Wed, 29 Apr 2015 21:53:38 +0200 Subject: [PATCH 015/300] Deleted MvpView interface --- .../it/cosenonjaviste/lib/mvp/MvpView.java | 5 ---- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 2 +- .../lib/mvp/RxMvpPresenter.java | 10 +------ .../androidtest/base/FragmentRule.java | 7 +++-- .../java/it/cosenonjaviste/MainActivity.java | 3 +-- .../author/AuthorListFragment.java | 11 +++----- .../author/AuthorListPresenter.java | 21 ++++++++++----- .../category/CategoryListFragment.java | 5 ++-- .../category/CategoryListPresenter.java | 20 +++++++++----- .../it/cosenonjaviste/page/PageFragment.java | 2 +- .../it/cosenonjaviste/page/PagePresenter.java | 16 ++++++++--- .../cosenonjaviste/post/PostListFragment.java | 6 ++--- .../post/PostListPresenter.java | 27 ++++++++++++------- .../twitter/TweetListFragment.java | 3 +-- .../twitter/TweetListPresenter.java | 27 ++++++++++++------- .../utils/SingleFragmentActivity.java | 9 +++---- 16 files changed, 93 insertions(+), 81 deletions(-) delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java deleted file mode 100644 index c9d6589..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java +++ /dev/null @@ -1,5 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -public interface MvpView { - void update(M model); -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index fc590d5..05dd893 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -10,7 +10,7 @@ import it.cosenonjaviste.lib.mvp.utils.ObjectsMapRetainedFragment; import rx.functions.Func0; -public abstract class RxMvpFragment extends Fragment implements MvpView { +public abstract class RxMvpFragment extends Fragment { public static final String MODEL = "model"; diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 8080e58..ca6f03a 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -8,16 +8,8 @@ public abstract class RxMvpPresenter { @Inject protected RxHolder rxHolder; - protected MvpView view; - - @Inject void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } public abstract void resume(); - public MvpView getView() { - return view; - } + @Inject public abstract void initLifeCycle(LifeCycle lifeCycle); } \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index 9b3c5c9..fbf68e1 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,21 +4,20 @@ import org.parceler.Parcels; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; public class FragmentRule extends ActivityRule { - private final Class> viewClass; + private final Class viewClass; private Object model; - public static FragmentRule create(Class> viewClass, M model) { + public static FragmentRule create(Class viewClass, M model) { return new FragmentRule(viewClass, model); } - private FragmentRule(Class> viewClass, Object model) { + private FragmentRule(Class viewClass, Object model) { super(SingleFragmentActivity.class); this.viewClass = viewClass; this.model = model; diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index a104b00..263c9ec 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -22,7 +22,6 @@ import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -102,7 +101,7 @@ private Fragment createFragment(int position) { } } - public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { + public static T createView(@NonNull Context context, @NonNull Class viewClass, @NonNull M model) { Fragment fragment = Fragment.instantiate(context, viewClass.getName()); Bundle bundle = new Bundle(); bundle.putParcelable(RxMvpFragment.MODEL, Parcels.wrap(model)); diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index c41f515..f4e1eb3 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -14,10 +14,8 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import butterknife.OnItemClick; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; @@ -43,20 +41,17 @@ public class AuthorListFragment extends RxMvpFragment { View view = inflater.inflate(R.layout.super_grid, container, false); ButterKnife.inject(this, view); adapter = new AuthorAdapter(getActivity()); + grid.getList().setOnItemClickListener((parent, view1, position, id) -> presenter.goToAuthorDetail(position)); grid.getList().setNumColumns(2); grid.setAdapter(adapter); return view; } - @OnItemClick(R.id.grid) void goToDetails(int position) { - presenter.goToAuthorDetail(position); - } - @OnClick(R.id.error_retry) void retry() { presenter.loadAuthors(); } - @Override public void update(AuthorListModel model) { + public void update(AuthorListModel model) { model.call(authors -> { grid.showList(); adapter.reloadData(authors); @@ -67,7 +62,7 @@ public void startLoading() { grid.showProgress(); } - public void open(Class> viewClass, MM model) { + public void open(Class viewClass, MM model) { SingleFragmentActivity.open(getActivity(), viewClass, model); } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index f7822ef..01155bc 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,7 +5,7 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Author; @@ -19,6 +19,7 @@ public class AuthorListPresenter extends RxMvpPresenter { protected AuthorListModel model; + protected AuthorListFragment view; @Inject WordPressService wordPressService; @@ -40,18 +41,19 @@ public void loadAuthors() { }, posts -> { model.done(posts); - view.update(model); + getView().update(model); }, throwable -> { model.error(throwable); - view.update(model); + getView().update(model); }); } @Override public void resume() { - view.update(model); rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { loadAuthors(); + } else { + getView().update(model); } } @@ -60,12 +62,17 @@ public void goToAuthorDetail(int position) { getView().open(PostListFragment.class, new PostListModel(author)); } - @Override public AuthorListFragment getView() { - return (AuthorListFragment) super.getView(); + public AuthorListFragment getView() { + return view; } - public void init(it.cosenonjaviste.author.AuthorListModel model, MvpView view) { + public void init(AuthorListModel model, AuthorListFragment view) { this.model = model; this.view = view; } + + @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index e5212e5..5b8b726 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -16,7 +16,6 @@ import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; @@ -55,7 +54,7 @@ public class CategoryListFragment extends RxMvpFragment { } - @Override public void update(CategoryListModel model) { + public void update(CategoryListModel model) { model.call( categories -> { grid.showList(); @@ -72,7 +71,7 @@ public void startLoading() { grid.showProgress(); } - public void open(Class> viewClass, MM model) { + public void open(Class viewClass, MM model) { SingleFragmentActivity.open(getActivity(), viewClass, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index ffdfc2a..45cc540 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,7 +4,7 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Category; @@ -17,6 +17,7 @@ @PresenterScope public class CategoryListPresenter extends RxMvpPresenter { + private CategoryListFragment view; private CategoryListModel model; @Inject WordPressService wordPressService; @@ -27,7 +28,7 @@ public class CategoryListPresenter extends RxMvpPresenter { } @Override public void resume() { - view.update(model); + getView().update(model); rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { loadData(); @@ -46,10 +47,10 @@ public void loadData() { }, posts -> { model.done(posts); - view.update(model); + getView().update(model); }, throwable -> { model.error(throwable); - view.update(model); + getView().update(model); }); } @@ -58,12 +59,17 @@ public void goToPosts(int position) { getView().open(PostListFragment.class, new PostListModel(category)); } - @Override public CategoryListFragment getView() { - return (CategoryListFragment) super.getView(); + public CategoryListFragment getView() { + return view; } - public void init(it.cosenonjaviste.category.CategoryListModel model, MvpView view) { + public void init(it.cosenonjaviste.category.CategoryListModel model, CategoryListFragment view) { this.model = model; this.view = view; } + + @Override @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 60163f5..ba8d6e8 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -97,7 +97,7 @@ public void onPageFinished(WebView view11, String url) { return view; } - @Override public void update(PageModel model) { + public void update(PageModel model) { webView.loadUrl(presenter.getPostUrl()); } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 04b4862..ae13710 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,13 +2,14 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @PresenterScope public class PagePresenter extends RxMvpPresenter { + protected PageFragment view; private PageModel model; @Inject PageUrlManager pageUrlManager; @@ -21,12 +22,21 @@ public String getPostUrl() { } @Override public void resume() { - view.update(model); + getView().update(model); rxHolder.resubscribePendingObservable(); } - public void init(it.cosenonjaviste.page.PageModel model, MvpView view) { + public void init(PageModel model, PageFragment view) { this.model = model; this.view = view; } + + public PageFragment getView() { + return view; + } + + @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 3baf9c4..78ec84f 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -16,7 +16,6 @@ import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; @@ -30,7 +29,6 @@ public class PostListFragment extends RxMvpFragment { private PostAdapter adapter; @Override public Object init(Bundle state) { - super.onCreate(state); createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); @@ -56,7 +54,7 @@ public class PostListFragment extends RxMvpFragment { presenter.reloadData(); } - @Override public void update(PostListModel model) { + public void update(PostListModel model) { model.getItems().call( posts -> { list.showList(); @@ -82,7 +80,7 @@ public void startMoreItemsLoading() { list.showMoreProgress(); } - public void open(Class> viewClass, MM model) { + public void open(Class viewClass, MM model) { SingleFragmentActivity.open(getActivity(), viewClass, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 046824e..44126d1 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,7 +5,7 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Author; @@ -22,6 +22,7 @@ @PresenterScope public class PostListPresenter extends RxMvpPresenter { + protected PostListFragment view; private PostListModel model; @Inject WordPressService wordPressService; @@ -32,7 +33,7 @@ public class PostListPresenter extends RxMvpPresenter { } @Override public void resume() { - view.update(model); + getView().update(model); rxHolder.resubscribePendingObservable(); if (model.getItems().isEmpty() && !loadStarted) { reloadData(); @@ -50,10 +51,10 @@ public void reloadData() { posts -> { model.getItems().done(new ArrayList<>(posts)); model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - view.update(model); + getView().update(model); }, throwable -> { model.getItems().error(throwable); - view.update(model); + getView().update(model); }); } @@ -65,14 +66,15 @@ public void loadNextPage() { int page = calcNextPage(model.getItems().size(), WordPressService.POST_PAGE_SIZE); Observable> observable = getObservable(page); - Action0 onAttach = () -> getView().startMoreItemsLoading();Action1> onNext = posts -> { + Action0 onAttach = () -> getView().startMoreItemsLoading(); + Action1> onNext = posts -> { model.getItems().append(posts); model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - view.update(model); + getView().update(model); }; Action1 onError = throwable -> { model.getItems().error(throwable); - view.update(model); + getView().update(model); }; rxHolder.subscribe(observable, onAttach, onNext, onError); } @@ -97,12 +99,17 @@ private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - @Override public PostListFragment getView() { - return (PostListFragment) super.getView(); + public PostListFragment getView() { + return view; } - public void init(it.cosenonjaviste.post.PostListModel model, MvpView view) { + public void init(it.cosenonjaviste.post.PostListModel model, PostListFragment view) { this.model = model; this.view = view; } + + @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index c7e1490..a925118 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -28,7 +28,6 @@ public class TweetListFragment extends RxMvpFragment { @Inject TweetListPresenter presenter; @Override public Object init(Bundle state) { - super.onCreate(state); createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); @@ -52,7 +51,7 @@ public class TweetListFragment extends RxMvpFragment { presenter.reloadData(); } - @Override public void update(TweetListModel model) { + public void update(TweetListModel model) { model.call( items -> { list.showList(); diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 572507f..15d705b 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,7 +4,7 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Tweet; @@ -16,6 +16,7 @@ @PresenterScope public class TweetListPresenter extends RxMvpPresenter { + protected TweetListFragment view; private TweetListModel model; @Inject TwitterService twitterService; @@ -36,15 +37,15 @@ public void reloadData() { posts -> { model.done(posts); model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - view.update(model); + getView().update(model); }, throwable -> { model.error(throwable); - view.update(model); + getView().update(model); }); } @Override public void resume() { - view.update(model); + getView().update(model); rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { reloadData(); @@ -55,14 +56,15 @@ public void loadNextPage() { int page = calcNextPage(model.size(), TwitterService.PAGE_SIZE); Observable> observable = twitterService.loadTweets(page); - Action0 onAttach = () -> getView().startMoreItemsLoading();Action1> onNext = posts -> { + Action0 onAttach = () -> getView().startMoreItemsLoading(); + Action1> onNext = posts -> { model.append(posts); model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - view.update(model); + getView().update(model); }; Action1 onError = throwable -> { model.error(throwable); - view.update(model); + getView().update(model); }; rxHolder.subscribe(observable, onAttach, onNext, onError); @@ -72,12 +74,17 @@ private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - @Override public TweetListFragment getView() { - return (TweetListFragment) super.getView(); + public TweetListFragment getView() { + return view; } - public void init(it.cosenonjaviste.twitter.TweetListModel model, MvpView view) { + public void init(TweetListModel model, TweetListFragment view) { this.model = model; this.view = view; } + + @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java index 9d3b699..a05afab 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java +++ b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java @@ -12,31 +12,30 @@ import org.parceler.Parcels; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; public class SingleFragmentActivity extends ActionBarActivity { private static final String VIEW_CLASS = "viewClass"; - public static Intent populateIntent(Intent intent, Class> viewClass) { + public static Intent populateIntent(Intent intent, Class viewClass) { intent.putExtra(VIEW_CLASS, viewClass.getName()); return intent; } - public static Intent createIntent(Context context, Class> viewClass) { + public static Intent createIntent(Context context, Class viewClass) { Intent intent = new Intent(context, SingleFragmentActivity.class); populateIntent(intent, viewClass); return intent; } - public static Intent createIntent(Class> viewClass) { + public static Intent createIntent(Class viewClass) { Intent intent = new Intent(); populateIntent(intent, viewClass); return intent; } - public static void open(FragmentActivity activity, Class> viewClass, MM model) { + public static void open(FragmentActivity activity, Class viewClass, MM model) { Intent intent = createIntent(activity, viewClass); intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); activity.startActivity(intent); From d4d6d96850e183f4f771059e99a753d3c6bfadc3 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Wed, 29 Apr 2015 22:16:18 +0200 Subject: [PATCH 016/300] Removed generic parameter in RxMvpPresenter --- .../src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 2 +- .../main/java/it/cosenonjaviste/author/AuthorListPresenter.java | 2 +- .../java/it/cosenonjaviste/category/CategoryListPresenter.java | 2 +- app/src/main/java/it/cosenonjaviste/page/PagePresenter.java | 2 +- app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java | 2 +- .../main/java/it/cosenonjaviste/twitter/TweetListPresenter.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index ca6f03a..4b042ab 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -5,7 +5,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; -public abstract class RxMvpPresenter { +public abstract class RxMvpPresenter { @Inject protected RxHolder rxHolder; diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 01155bc..6d5117d 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -16,7 +16,7 @@ import rx.Observable; @PresenterScope -public class AuthorListPresenter extends RxMvpPresenter { +public class AuthorListPresenter extends RxMvpPresenter { protected AuthorListModel model; protected AuthorListFragment view; diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 45cc540..eee2088 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -15,7 +15,7 @@ import rx.Observable; @PresenterScope -public class CategoryListPresenter extends RxMvpPresenter { +public class CategoryListPresenter extends RxMvpPresenter { private CategoryListFragment view; private CategoryListModel model; diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index ae13710..a2c0f81 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -7,7 +7,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @PresenterScope -public class PagePresenter extends RxMvpPresenter { +public class PagePresenter extends RxMvpPresenter { protected PageFragment view; private PageModel model; diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 44126d1..86c0ba6 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -20,7 +20,7 @@ import rx.functions.Action1; @PresenterScope -public class PostListPresenter extends RxMvpPresenter { +public class PostListPresenter extends RxMvpPresenter { protected PostListFragment view; private PostListModel model; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 15d705b..d4fb98a 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -14,7 +14,7 @@ import rx.functions.Action1; @PresenterScope -public class TweetListPresenter extends RxMvpPresenter { +public class TweetListPresenter extends RxMvpPresenter { protected TweetListFragment view; private TweetListModel model; From b12c4e57bc03b8910f6ab3569d94f61359d535ab Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 08:35:29 +0200 Subject: [PATCH 017/300] Build tools 1.2.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9c749c6..5791eff 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.3' + classpath 'com.android.tools.build:gradle:1.2.2' classpath 'me.tatarka:gradle-retrolambda:3.0.1' // NOTE: Do not place your application dependencies here; they belong From fbae2be616acb2ad1318042bcf2cfa2f7727419d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 08:39:02 +0200 Subject: [PATCH 018/300] Generics parameters in RxMvpPresenter --- .../src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 2 +- .../main/java/it/cosenonjaviste/author/AuthorListPresenter.java | 2 +- .../java/it/cosenonjaviste/category/CategoryListPresenter.java | 2 +- app/src/main/java/it/cosenonjaviste/page/PagePresenter.java | 2 +- app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java | 2 +- .../main/java/it/cosenonjaviste/twitter/TweetListPresenter.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 4b042ab..5a5bfbc 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -5,7 +5,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; -public abstract class RxMvpPresenter { +public abstract class RxMvpPresenter { @Inject protected RxHolder rxHolder; diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 6d5117d..fd4c26f 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -16,7 +16,7 @@ import rx.Observable; @PresenterScope -public class AuthorListPresenter extends RxMvpPresenter { +public class AuthorListPresenter extends RxMvpPresenter { protected AuthorListModel model; protected AuthorListFragment view; diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index eee2088..b4b0ba6 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -15,7 +15,7 @@ import rx.Observable; @PresenterScope -public class CategoryListPresenter extends RxMvpPresenter { +public class CategoryListPresenter extends RxMvpPresenter { private CategoryListFragment view; private CategoryListModel model; diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index a2c0f81..9d80184 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -7,7 +7,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @PresenterScope -public class PagePresenter extends RxMvpPresenter { +public class PagePresenter extends RxMvpPresenter { protected PageFragment view; private PageModel model; diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 86c0ba6..1b54cda 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -20,7 +20,7 @@ import rx.functions.Action1; @PresenterScope -public class PostListPresenter extends RxMvpPresenter { +public class PostListPresenter extends RxMvpPresenter { protected PostListFragment view; private PostListModel model; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index d4fb98a..64c7a58 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -14,7 +14,7 @@ import rx.functions.Action1; @PresenterScope -public class TweetListPresenter extends RxMvpPresenter { +public class TweetListPresenter extends RxMvpPresenter { protected TweetListFragment view; private TweetListModel model; From 729b1192392c9c6c801a5c475baf5d1527692fde Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 08:43:13 +0200 Subject: [PATCH 019/300] Model and View fields in base class --- .../java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 8 ++++++++ .../it/cosenonjaviste/author/AuthorListPresenter.java | 7 ------- .../it/cosenonjaviste/category/CategoryListPresenter.java | 7 ------- .../main/java/it/cosenonjaviste/page/PagePresenter.java | 7 ------- .../java/it/cosenonjaviste/post/PostListPresenter.java | 7 ------- .../it/cosenonjaviste/twitter/TweetListPresenter.java | 7 ------- 6 files changed, 8 insertions(+), 35 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 5a5bfbc..75f9c70 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -9,7 +9,15 @@ public abstract class RxMvpPresenter { @Inject protected RxHolder rxHolder; + protected M model; + + protected V view; + public abstract void resume(); @Inject public abstract void initLifeCycle(LifeCycle lifeCycle); + + public final V getView() { + return view; + } } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index fd4c26f..f01b831 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -18,9 +18,6 @@ @PresenterScope public class AuthorListPresenter extends RxMvpPresenter { - protected AuthorListModel model; - protected AuthorListFragment view; - @Inject WordPressService wordPressService; private boolean loadStarted; @@ -62,10 +59,6 @@ public void goToAuthorDetail(int position) { getView().open(PostListFragment.class, new PostListModel(author)); } - public AuthorListFragment getView() { - return view; - } - public void init(AuthorListModel model, AuthorListFragment view) { this.model = model; this.view = view; diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index b4b0ba6..4ea8791 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -17,9 +17,6 @@ @PresenterScope public class CategoryListPresenter extends RxMvpPresenter { - private CategoryListFragment view; - private CategoryListModel model; - @Inject WordPressService wordPressService; private boolean loadStarted; @@ -59,10 +56,6 @@ public void goToPosts(int position) { getView().open(PostListFragment.class, new PostListModel(category)); } - public CategoryListFragment getView() { - return view; - } - public void init(it.cosenonjaviste.category.CategoryListModel model, CategoryListFragment view) { this.model = model; this.view = view; diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 9d80184..e49272b 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -9,9 +9,6 @@ @PresenterScope public class PagePresenter extends RxMvpPresenter { - protected PageFragment view; - private PageModel model; - @Inject PageUrlManager pageUrlManager; @Inject public PagePresenter() { @@ -31,10 +28,6 @@ public void init(PageModel model, PageFragment view) { this.view = view; } - public PageFragment getView() { - return view; - } - @Inject public void initLifeCycle(LifeCycle lifeCycle) { lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 1b54cda..ce16a52 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -22,9 +22,6 @@ @PresenterScope public class PostListPresenter extends RxMvpPresenter { - protected PostListFragment view; - private PostListModel model; - @Inject WordPressService wordPressService; private boolean loadStarted; @@ -99,10 +96,6 @@ private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - public PostListFragment getView() { - return view; - } - public void init(it.cosenonjaviste.post.PostListModel model, PostListFragment view) { this.model = model; this.view = view; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 64c7a58..7712c2d 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -16,9 +16,6 @@ @PresenterScope public class TweetListPresenter extends RxMvpPresenter { - protected TweetListFragment view; - private TweetListModel model; - @Inject TwitterService twitterService; private boolean loadStarted; @@ -74,10 +71,6 @@ private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - public TweetListFragment getView() { - return view; - } - public void init(TweetListModel model, TweetListFragment view) { this.model = model; this.view = view; From b15cc608786b5bab36acdec30d5a116c254a5f54 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 08:49:42 +0200 Subject: [PATCH 020/300] Common methods in base class --- .../it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 10 +++++++++- .../it/cosenonjaviste/author/AuthorListPresenter.java | 11 ----------- .../category/CategoryListPresenter.java | 11 ----------- .../java/it/cosenonjaviste/page/PagePresenter.java | 11 ----------- .../it/cosenonjaviste/post/PostListPresenter.java | 11 ----------- .../it/cosenonjaviste/twitter/TweetListPresenter.java | 11 ----------- 6 files changed, 9 insertions(+), 56 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 75f9c70..c4ecf21 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -15,7 +15,15 @@ public abstract class RxMvpPresenter { public abstract void resume(); - @Inject public abstract void initLifeCycle(LifeCycle lifeCycle); + public final void init(M model, V view) { + this.model = model; + this.view = view; + } + + @Inject public final void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } public final V getView() { return view; diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index f01b831..8897d9e 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,7 +5,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Author; @@ -58,14 +57,4 @@ public void goToAuthorDetail(int position) { Author author = model.get(position); getView().open(PostListFragment.class, new PostListModel(author)); } - - public void init(AuthorListModel model, AuthorListFragment view) { - this.model = model; - this.view = view; - } - - @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 4ea8791..3081b5e 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,7 +4,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Category; @@ -55,14 +54,4 @@ public void goToPosts(int position) { Category category = model.get(position); getView().open(PostListFragment.class, new PostListModel(category)); } - - public void init(it.cosenonjaviste.category.CategoryListModel model, CategoryListFragment view) { - this.model = model; - this.view = view; - } - - @Override @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index e49272b..35d195f 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,7 +2,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @@ -22,14 +21,4 @@ public String getPostUrl() { getView().update(model); rxHolder.resubscribePendingObservable(); } - - public void init(PageModel model, PageFragment view) { - this.model = model; - this.view = view; - } - - @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index ce16a52..f37aaf0 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,7 +5,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Author; @@ -95,14 +94,4 @@ private Observable> getObservable(int page) { private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - - public void init(it.cosenonjaviste.post.PostListModel model, PostListFragment view) { - this.model = model; - this.view = view; - } - - @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 7712c2d..38fd0c0 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,7 +4,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Tweet; @@ -70,14 +69,4 @@ public void loadNextPage() { private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - - public void init(TweetListModel model, TweetListFragment view) { - this.model = model; - this.view = view; - } - - @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } From 88760b699e6f88de97d1834b9cc6ea3b9d1474e9 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 09:05:48 +0200 Subject: [PATCH 021/300] More methods in base class --- .../lib/mvp/RxMvpPresenter.java | 25 +++++++-- .../author/AuthorListPresenter.java | 21 ++++---- .../category/CategoryListPresenter.java | 22 ++++---- .../it/cosenonjaviste/page/PagePresenter.java | 6 +-- .../post/PostListPresenter.java | 44 +++++++--------- .../twitter/TweetListPresenter.java | 52 ++++++++----------- 6 files changed, 86 insertions(+), 84 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index c4ecf21..089a5b2 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -4,16 +4,21 @@ import javax.inject.Inject; import it.cosenonjaviste.lib.mvp.utils.RxHolder; +import rx.Observable; +import rx.functions.Action0; +import rx.functions.Action1; public abstract class RxMvpPresenter { - @Inject protected RxHolder rxHolder; + @Inject RxHolder rxHolder; - protected M model; + private M model; - protected V view; + private V view; - public abstract void resume(); + public void resume() { + rxHolder.resubscribePendingObservable(); + } public final void init(M model, V view) { this.model = model; @@ -28,4 +33,16 @@ public final void init(M model, V view) { public final V getView() { return view; } + + public M getModel() { + return model; + } + + public void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { + rxHolder.subscribe(observable, onAttach, onNext, onError); + } + + public boolean isTaskRunning() { + return rxHolder.isTaskRunning(); + } } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 8897d9e..7b4f48c 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -19,8 +19,6 @@ public class AuthorListPresenter extends RxMvpPresenter { - loadStarted = true; getView().startLoading(); }, posts -> { - model.done(posts); - getView().update(model); + getModel().done(posts); + getView().update(getModel()); }, throwable -> { - model.error(throwable); - getView().update(model); + getModel().error(throwable); + getView().update(getModel()); }); } @Override public void resume() { - rxHolder.resubscribePendingObservable(); - if (model.isEmpty() && !loadStarted) { + super.resume(); + if (getModel().isEmpty() && !isTaskRunning()) { loadAuthors(); } else { - getView().update(model); + getView().update(getModel()); } } public void goToAuthorDetail(int position) { - Author author = model.get(position); + Author author = getModel().get(position); getView().open(PostListFragment.class, new PostListModel(author)); } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 3081b5e..74abeb7 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -18,16 +18,15 @@ public class CategoryListPresenter extends RxMvpPresenter { - loadStarted = true; getView().startLoading(); }, posts -> { - model.done(posts); - getView().update(model); + getModel().done(posts); + getView().update(getModel()); }, throwable -> { - model.error(throwable); - getView().update(model); + getModel().error(throwable); + getView().update(getModel()); }); } public void goToPosts(int position) { - Category category = model.get(position); + Category category = getModel().get(position); getView().open(PostListFragment.class, new PostListModel(category)); } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 35d195f..427daad 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -14,11 +14,11 @@ public class PagePresenter extends RxMvpPresenter { } public String getPostUrl() { - return pageUrlManager.getUrl(model.getUrl()); + return pageUrlManager.getUrl(getModel().getUrl()); } @Override public void resume() { - getView().update(model); - rxHolder.resubscribePendingObservable(); + getView().update(getModel()); + super.resume(); } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index f37aaf0..67686ed 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -23,34 +23,30 @@ public class PostListPresenter extends RxMvpPresenter> observable = getObservable(1); - rxHolder.subscribe(observable, - () -> { - loadStarted = true; - getView().startLoading(model.getItems().isEmpty()); - }, + subscribe(observable, + () -> getView().startLoading(getModel().getItems().isEmpty()), posts -> { - model.getItems().done(new ArrayList<>(posts)); - model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - getView().update(model); + getModel().getItems().done(new ArrayList<>(posts)); + getModel().setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); + getView().update(getModel()); }, throwable -> { - model.getItems().error(throwable); - getView().update(model); + getModel().getItems().error(throwable); + getView().update(getModel()); }); } @@ -59,29 +55,29 @@ public void goToDetail(Post item) { } public void loadNextPage() { - int page = calcNextPage(model.getItems().size(), WordPressService.POST_PAGE_SIZE); + int page = calcNextPage(getModel().getItems().size(), WordPressService.POST_PAGE_SIZE); Observable> observable = getObservable(page); Action0 onAttach = () -> getView().startMoreItemsLoading(); Action1> onNext = posts -> { - model.getItems().append(posts); - model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - getView().update(model); + getModel().getItems().append(posts); + getModel().setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); + getView().update(getModel()); }; Action1 onError = throwable -> { - model.getItems().error(throwable); - getView().update(model); + getModel().getItems().error(throwable); + getView().update(getModel()); }; - rxHolder.subscribe(observable, onAttach, onNext, onError); + subscribe(observable, onAttach, onNext, onError); } private Observable> getObservable(int page) { Observable observable; - Category category = model.getCategory(); + Category category = getModel().getCategory(); if (category != null) { observable = wordPressService.listCategoryPosts(category.getId(), page); } else { - Author author = model.getAuthor(); + Author author = getModel().getAuthor(); if (author != null) { observable = wordPressService.listAuthorPosts(author.getId(), page); } else { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 38fd0c0..e43ca96 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -9,60 +9,54 @@ import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; import rx.Observable; -import rx.functions.Action0; -import rx.functions.Action1; @PresenterScope public class TweetListPresenter extends RxMvpPresenter { @Inject TwitterService twitterService; - private boolean loadStarted; - @Inject public TweetListPresenter() { } public void reloadData() { Observable> observable = twitterService.loadTweets(1); - rxHolder.subscribe(observable, - () -> { - loadStarted = true; - getView().startLoading(model.isEmpty()); - }, + subscribe(observable, + () -> getView().startLoading(getModel().isEmpty()), posts -> { - model.done(posts); - model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - getView().update(model); + getModel().done(posts); + getModel().setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); + getView().update(getModel()); }, throwable -> { - model.error(throwable); - getView().update(model); + getModel().error(throwable); + getView().update(getModel()); }); } @Override public void resume() { - getView().update(model); - rxHolder.resubscribePendingObservable(); - if (model.isEmpty() && !loadStarted) { + super.resume(); + if (getModel().isEmpty() && !isTaskRunning()) { reloadData(); + } else { + getView().update(getModel()); } } public void loadNextPage() { - int page = calcNextPage(model.size(), TwitterService.PAGE_SIZE); + int page = calcNextPage(getModel().size(), TwitterService.PAGE_SIZE); Observable> observable = twitterService.loadTweets(page); - Action0 onAttach = () -> getView().startMoreItemsLoading(); - Action1> onNext = posts -> { - model.append(posts); - model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - getView().update(model); - }; - Action1 onError = throwable -> { - model.error(throwable); - getView().update(model); - }; - rxHolder.subscribe(observable, onAttach, onNext, onError); + subscribe(observable, + () -> getView().startMoreItemsLoading(), + posts -> { + getModel().append(posts); + getModel().setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); + getView().update(getModel()); + }, + throwable -> { + getModel().error(throwable); + getView().update(getModel()); + }); } From c6a856c7184f59da8d45ef52434b4404b943cf47 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Fri, 1 May 2015 16:30:22 +0200 Subject: [PATCH 022/300] State management in LifeCycle class --- .../it/cosenonjaviste/lib/mvp/LifeCycle.java | 20 ++++++----- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 35 ++++++++----------- .../lib/mvp/RxMvpPresenter.java | 13 ++++--- .../androidtest/base/FragmentRule.java | 4 +-- .../java/it/cosenonjaviste/MainActivity.java | 4 +-- .../author/AuthorListFragment.java | 8 ++--- .../category/CategoryListFragment.java | 8 ++--- .../it/cosenonjaviste/page/PageFragment.java | 8 ++--- .../cosenonjaviste/post/PostListFragment.java | 8 ++--- .../twitter/TweetListFragment.java | 8 ++--- .../utils/SingleFragmentActivity.java | 4 +-- .../it/cosenonjaviste/mvp/TestLifeCycle.java | 16 +++++++++ .../mvp/author/AuthorListPresenterTest.java | 25 ++++++------- .../category/CategoryListPresenterTest.java | 14 ++++---- .../mvp/page/PagePresenterTest.java | 6 ++-- .../mvp/post/AuthorPostListPresenterTest.java | 6 ++-- .../post/CategoryPostListPresenterTest.java | 9 +++-- .../mvp/post/PostListPresenterTest.java | 15 ++++---- .../mvp/twitter/TweetListPresenterTest.java | 12 +++---- 19 files changed, 110 insertions(+), 113 deletions(-) create mode 100644 app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java index f140388..f161231 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java @@ -6,13 +6,15 @@ import rx.Subscription; import rx.functions.Action0; import rx.functions.Action1; -import rx.functions.Func0; +import rx.functions.Action2; +import rx.functions.Func1; import rx.subjects.PublishSubject; @PresenterScope public class LifeCycle { - private Func0 saveObjectFunc; + private Action1> saveObjectFunc; + private Action1> loadAction; public enum EventType { RESUME, PAUSE, DESTROY_VIEW, DESTROY_ALL; @@ -35,16 +37,18 @@ public Subscription subscribe(EventType eventType, Action0 callback) { return subject.asObservable().filter(t -> t == eventType).subscribe(t -> callback.call()); } - public void subscribeOnSaveInstanceState(Func0 saveObjectFunc) { + public void subscribeState(Action1> saveObjectFunc, Action1> loadAction) { this.saveObjectFunc = saveObjectFunc; + this.loadAction = loadAction; } - public void saveInstanceState(Action1 saver) { + public void saveState(Action2 saver) { if (saveObjectFunc != null) { - Object obj = saveObjectFunc.call(); - if (obj != null) { - saver.call(obj); - } + saveObjectFunc.call(saver); } } + + public void loadState(Func1 loader) { + loadAction.call(loader); + } } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 05dd893..b91c9dc 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -10,37 +10,30 @@ import it.cosenonjaviste.lib.mvp.utils.ObjectsMapRetainedFragment; import rx.functions.Func0; -public abstract class RxMvpFragment extends Fragment { - - public static final String MODEL = "model"; +public abstract class RxMvpFragment extends Fragment { @Inject LifeCycle lifeCycle; - private Object model; - @Override public final void onCreate(Bundle state) { super.onCreate(state); - model = init(state); + init(state); + lifeCycle.loadState(key -> { + Object restoredModel = null; + if (state != null) { + restoredModel = Parcels.unwrap(state.getParcelable(key)); + } + if (restoredModel == null && getArguments() != null) { + restoredModel = Parcels.unwrap(getArguments().getParcelable(key)); + } + return restoredModel; + }); } - protected abstract Object init(Bundle state); - - protected static M getRestoredModel(Bundle state, Bundle arguments) { - M restoredModel = null; - if (state != null) { - restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); - } - if (restoredModel == null && arguments != null) { - restoredModel = Parcels.unwrap(arguments.getParcelable(MODEL)); - } - return restoredModel; - } + protected abstract void init(Bundle state); @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - if (model != null) { - outState.putParcelable(MODEL, Parcels.wrap(model)); - } + lifeCycle.saveState((key, obj) -> outState.putParcelable(key, Parcels.wrap(obj))); } @Override public void onResume() { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 089a5b2..ae8d7ed 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -4,13 +4,16 @@ import javax.inject.Inject; import it.cosenonjaviste.lib.mvp.utils.RxHolder; +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.Observable; import rx.functions.Action0; import rx.functions.Action1; public abstract class RxMvpPresenter { - @Inject RxHolder rxHolder; + public static final String MODEL = "model"; + + private RxHolder rxHolder; private M model; @@ -20,14 +23,16 @@ public void resume() { rxHolder.resubscribePendingObservable(); } - public final void init(M model, V view) { - this.model = model; + public final void init(V view) { this.view = view; } - @Inject public final void initLifeCycle(LifeCycle lifeCycle) { + @Inject public final void initLifeCycle(LifeCycle lifeCycle, SchedulerManager schedulerManager) { lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + lifeCycle.subscribeState(saver -> saver.call(MODEL, getModel()), loader -> model = (M) loader.call(MODEL)); + + rxHolder = new RxHolder(schedulerManager, lifeCycle); } public final V getView() { diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index fbf68e1..b034cb8 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,7 +4,7 @@ import org.parceler.Parcels; -import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; public class FragmentRule extends ActivityRule { @@ -25,7 +25,7 @@ private FragmentRule(Class viewClass, Object model) { @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(RxMvpPresenter.MODEL, Parcels.wrap(model)); return intent; } } diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index 263c9ec..2bad1c7 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -22,7 +22,7 @@ import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; -import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -104,7 +104,7 @@ private Fragment createFragment(int position) { public static T createView(@NonNull Context context, @NonNull Class viewClass, @NonNull M model) { Fragment fragment = Fragment.instantiate(context, viewClass.getName()); Bundle bundle = new Bundle(); - bundle.putParcelable(RxMvpFragment.MODEL, Parcels.wrap(model)); + bundle.putParcelable(RxMvpPresenter.MODEL, Parcels.wrap(model)); fragment.setArguments(bundle); return (T) fragment; } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index f4e1eb3..3da2dcb 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -20,7 +20,7 @@ import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class AuthorListFragment extends RxMvpFragment { +public class AuthorListFragment extends RxMvpFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -28,13 +28,11 @@ public class AuthorListFragment extends RxMvpFragment { private AuthorAdapter adapter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) .inject(this); - AuthorListModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 5b8b726..d95ddbf 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -20,7 +20,7 @@ import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class CategoryListFragment extends RxMvpFragment { +public class CategoryListFragment extends RxMvpFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -28,14 +28,12 @@ public class CategoryListFragment extends RxMvpFragment { @Inject CategoryListPresenter presenter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent( () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - CategoryListModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index ba8d6e8..96091ea 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -22,7 +22,7 @@ import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; -public class PageFragment extends RxMvpFragment { +public class PageFragment extends RxMvpFragment { @InjectView(R.id.web_view) WebView webView; @@ -30,14 +30,12 @@ public class PageFragment extends RxMvpFragment { @Inject PagePresenter presenter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent( () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - PageModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 78ec84f..b671203 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -20,7 +20,7 @@ import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class PostListFragment extends RxMvpFragment { +public class PostListFragment extends RxMvpFragment { @InjectView(R.id.list) SuperListview list; @@ -28,14 +28,12 @@ public class PostListFragment extends RxMvpFragment { private PostAdapter adapter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - PostListModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index a925118..35bbfe3 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -19,7 +19,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpFragment; import rx.functions.Actions; -public class TweetListFragment extends RxMvpFragment { +public class TweetListFragment extends RxMvpFragment { @InjectView(R.id.list) SuperListview list; @@ -27,13 +27,11 @@ public class TweetListFragment extends RxMvpFragment { @Inject TweetListPresenter presenter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - TweetListModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java index a05afab..af094c2 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java +++ b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java @@ -12,7 +12,7 @@ import org.parceler.Parcels; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; public class SingleFragmentActivity extends ActionBarActivity { @@ -37,7 +37,7 @@ public static Intent createIntent(Class viewClass) { public static void open(FragmentActivity activity, Class viewClass, MM model) { Intent intent = createIntent(activity, viewClass); - intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(RxMvpPresenter.MODEL, Parcels.wrap(model)); activity.startActivity(intent); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java b/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java new file mode 100644 index 0000000..112f806 --- /dev/null +++ b/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java @@ -0,0 +1,16 @@ +package it.cosenonjaviste.mvp; + +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; + +public class TestLifeCycle extends LifeCycle { + + private TestSchedulerManager schedulerManager = new TestSchedulerManager(); + + public void initAndResume(M model, RxMvpPresenter presenter, V view) { + presenter.initLifeCycle(this, schedulerManager); + loadState(key -> model); + presenter.init(view); + presenter.resume(); + } +} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index aba6389..2dd6494 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -6,16 +6,13 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.TestSchedulerManager; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @@ -30,22 +27,22 @@ public class AuthorListPresenterTest { @Mock AuthorListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - @InjectMocks AuthorListPresenter presenter; @Mock WordPressService wordPressService; @Captor ArgumentCaptor modelCaptor; + private TestLifeCycle testLifeCycle = new TestLifeCycle(); + @Test public void testLoad() { when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); AuthorListModel model = new AuthorListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); + assertThat(model.size()).isEqualTo(2); } @@ -53,14 +50,12 @@ public void testLoad() { public void testRetryAfterError() { when(wordPressService.listAuthors()) .thenReturn(Observable.error(new RuntimeException())); - - AuthorListModel model = new AuthorListModel(); - presenter.init(model, view); - presenter.resume(); - when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); + AuthorListModel model = new AuthorListModel(); + testLifeCycle.initAndResume(model, presenter, view); + presenter.loadAuthors(); assertThat(model.size()).isEqualTo(2); @@ -72,8 +67,8 @@ public void testGoToDetail() { .thenReturn(authorResponse(2)); AuthorListModel authorListModel = new AuthorListModel(); - presenter.init(authorListModel, view); - presenter.resume(); + testLifeCycle.initAndResume(authorListModel, presenter, view); + presenter.goToAuthorDetail(1); verify(view).open(any(), modelCaptor.capture()); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 70238b2..18450bb 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -16,6 +16,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @@ -31,7 +32,7 @@ public class CategoryListPresenterTest { @Mock WordPressService wordPressService; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @InjectMocks CategoryListPresenter presenter; @@ -45,8 +46,8 @@ public void testLoad() { .thenReturn(categoryResponse(3)); CategoryListModel model = new CategoryListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); + assertThat(model.size()).isEqualTo(3); Category category = model.get(2); assertThat(category.getId()).isEqualTo(2); @@ -60,8 +61,7 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); CategoryListModel model = new CategoryListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); when(wordPressService.listCategories()) .thenReturn(categoryResponse(3)); @@ -77,8 +77,8 @@ public void testGoToPosts() { .thenReturn(categoryResponse(3)); CategoryListModel categoryListModel = new CategoryListModel(); - presenter.init(categoryListModel, view); - presenter.resume(); + testLifeCycle.initAndResume(categoryListModel, presenter, view); + presenter.goToPosts(1); verify(view).open(any(), modelCaptor.capture()); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 59dda81..8489a96 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -12,6 +12,7 @@ import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.RxHolder; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -26,7 +27,7 @@ public class PagePresenterTest { @Mock PageFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Spy PageUrlManager pageUrlManager = new PageUrlManager(); @@ -36,8 +37,7 @@ public class PagePresenterTest { @Before public void setup() { - presenter.init(new PageModel("url"), view); - presenter.resume(); + testLifeCycle.initAndResume(new PageModel("url"), presenter, view); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index be1fdb2..716408f 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -11,6 +11,7 @@ import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; @@ -28,7 +29,7 @@ public class AuthorPostListPresenterTest { @Mock PostListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Mock WordPressService wordPressService; @@ -41,8 +42,7 @@ public void testLoad() throws InterruptedException { PostListModel model = new PostListModel(TestData.createAuthor(145)); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.getItems().size()).isEqualTo(1); verify(wordPressService).listAuthorPosts(eq(145L), eq(1)); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index e868ca9..90cc078 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -12,6 +12,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; @@ -26,7 +27,7 @@ public class CategoryPostListPresenterTest { @Mock PostListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Mock WordPressService wordPressService; @@ -37,8 +38,7 @@ public void testLoad() throws InterruptedException { when(wordPressService.listCategoryPosts(eq(1L), eq(1))) .thenReturn(TestData.postResponse(1)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.getItems().size()).isEqualTo(1); } @@ -50,8 +50,7 @@ public void testLoadMore() { .thenReturn(TestData.postResponse(5)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); presenter.loadNextPage(); assertThat(model.getItems().size()).isEqualTo(15); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index e4d60ff..ccaf06a 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -14,6 +14,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -33,7 +34,7 @@ public class PostListPresenterTest { @Mock PostListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Mock WordPressService wordPressService; @@ -47,8 +48,7 @@ public void testLoad() throws InterruptedException { .thenReturn(postResponse(1)); PostListModel model = new PostListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.getItems().size()).isEqualTo(1); } @@ -61,8 +61,7 @@ public void testLoadMore() { .thenReturn(postResponse(6)); PostListModel model = new PostListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); presenter.loadNextPage(); OptionalList items = model.getItems(); @@ -75,8 +74,7 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); PostListModel model = new PostListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.getItems().isError()).isTrue(); when(wordPressService.listPosts(eq(1))) @@ -94,8 +92,7 @@ public void testGoToDetails() { .thenReturn(postResponse(1)); PostListModel model = new PostListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); Post firstPost = model.getItems().get(0); presenter.goToDetail(firstPost); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 944d56c..601171f 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -11,6 +11,7 @@ import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; @@ -26,7 +27,7 @@ public class TweetListPresenterTest { @Mock TweetListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Mock TwitterService twitterService; @@ -37,8 +38,7 @@ public class TweetListPresenterTest { .thenReturn(TestData.tweets()); TweetListModel model = new TweetListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.size()).isEqualTo(10); } @@ -47,8 +47,7 @@ public class TweetListPresenterTest { .thenReturn(Observable.error(new RuntimeException())); TweetListModel model = new TweetListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.isError()).isTrue(); @@ -66,8 +65,7 @@ public class TweetListPresenterTest { .thenReturn(TestData.tweets()); TweetListModel tweetListModel = new TweetListModel(); - presenter.init(tweetListModel, view); - presenter.resume(); + testLifeCycle.initAndResume(tweetListModel, presenter, view); presenter.loadNextPage(); From 31f76eefc14130a0c1f0190bfb2df9821e4e3ae7 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Fri, 1 May 2015 16:40:51 +0200 Subject: [PATCH 023/300] Removed init method in presenter --- .../it/cosenonjaviste/lib/mvp/LifeCycle.java | 29 +++++++++++++++---- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 4 +-- .../lib/mvp/RxMvpPresenter.java | 11 +++---- .../author/AuthorListFragment.java | 2 -- .../category/CategoryListFragment.java | 2 -- .../it/cosenonjaviste/page/PageFragment.java | 2 -- .../cosenonjaviste/post/PostListFragment.java | 2 -- .../twitter/TweetListFragment.java | 1 - .../it/cosenonjaviste/mvp/TestLifeCycle.java | 3 +- 9 files changed, 33 insertions(+), 23 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java index f161231..2013efb 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java @@ -16,25 +16,44 @@ public class LifeCycle { private Action1> saveObjectFunc; private Action1> loadAction; + public class Event { + private final Object source; + + private final EventType type; + + public Event(Object source, EventType type) { + this.source = source; + this.type = type; + } + + public Object getSource() { + return source; + } + + public EventType getType() { + return type; + } + } + public enum EventType { RESUME, PAUSE, DESTROY_VIEW, DESTROY_ALL; } - private PublishSubject subject = PublishSubject.create(); + private PublishSubject subject = PublishSubject.create(); @Inject public LifeCycle() { } - public void emit(EventType eventType) { - subject.onNext(eventType); + public void emit(Object source, EventType eventType) { + subject.onNext(new Event(source, eventType)); } - public Observable asObservable() { + public Observable asObservable() { return subject.asObservable(); } public Subscription subscribe(EventType eventType, Action0 callback) { - return subject.asObservable().filter(t -> t == eventType).subscribe(t -> callback.call()); + return asObservable().filter(e -> e.getType() == eventType).subscribe(t -> callback.call()); } public void subscribeState(Action1> saveObjectFunc, Action1> loadAction) { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index b91c9dc..ee7cdfc 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -38,12 +38,12 @@ public abstract class RxMvpFragment extends Fragment { @Override public void onResume() { super.onResume(); - lifeCycle.emit(LifeCycle.EventType.RESUME); + lifeCycle.emit(this, LifeCycle.EventType.RESUME); } @Override public void onPause() { super.onPause(); - lifeCycle.emit(LifeCycle.EventType.PAUSE); + lifeCycle.emit(this, LifeCycle.EventType.PAUSE); } protected T createComponent(Func0 componentFactory) { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index ae8d7ed..a36e9fa 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -23,12 +23,13 @@ public void resume() { rxHolder.resubscribePendingObservable(); } - public final void init(V view) { - this.view = view; - } - @Inject public final void initLifeCycle(LifeCycle lifeCycle, SchedulerManager schedulerManager) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.asObservable() + .filter(e -> e.getType() == LifeCycle.EventType.RESUME) + .subscribe(e -> { + view = (V) e.getSource(); + resume(); + }); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); lifeCycle.subscribeState(saver -> saver.call(MODEL, getModel()), loader -> model = (M) loader.call(MODEL)); diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 3da2dcb..8586b39 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -31,8 +31,6 @@ public class AuthorListFragment extends RxMvpFragment { @Override public void init(Bundle state) { createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) .inject(this); - - presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index d95ddbf..e9da20b 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -32,8 +32,6 @@ public class CategoryListFragment extends RxMvpFragment { createComponent( () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - - presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 96091ea..d21c4d0 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -34,8 +34,6 @@ public class PageFragment extends RxMvpFragment { createComponent( () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - - presenter.init(this); } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index b671203..5d580cd 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -32,8 +32,6 @@ public class PostListFragment extends RxMvpFragment { createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - - presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 35bbfe3..d107c3d 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -31,7 +31,6 @@ public class TweetListFragment extends RxMvpFragment { createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java b/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java index 112f806..3901f3f 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java @@ -10,7 +10,6 @@ public class TestLifeCycle extends LifeCycle { public void initAndResume(M model, RxMvpPresenter presenter, V view) { presenter.initLifeCycle(this, schedulerManager); loadState(key -> model); - presenter.init(view); - presenter.resume(); + emit(view, EventType.RESUME); } } From 2639d5dd9af9ed52e923a0bd0423f55691654ebf Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Fri, 1 May 2015 17:03:46 +0200 Subject: [PATCH 024/300] core and coremvp modules --- androidMvp/build.gradle | 4 +--- app/build.gradle | 2 +- core/.gitignore | 1 + core/build.gradle | 7 +++++++ coremvp/.gitignore | 1 + coremvp/build.gradle | 9 +++++++++ .../main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java | 0 .../it/cosenonjaviste/lib/mvp/ObservableWithFactory.java | 0 .../java/it/cosenonjaviste/lib/mvp/PresenterScope.java | 0 .../java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 0 .../java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java | 0 .../cosenonjaviste/lib/mvp/utils/SchedulerManager.java | 0 settings.gradle | 2 +- 13 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 core/.gitignore create mode 100644 core/build.gradle create mode 100644 coremvp/.gitignore create mode 100644 coremvp/build.gradle rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java (100%) diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle index 78f1eb9..52ad28a 100644 --- a/androidMvp/build.gradle +++ b/androidMvp/build.gradle @@ -29,10 +29,8 @@ android { } dependencies { - compile 'io.reactivex:rxandroid:0.24.0' + compile project(':coremvp') compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:support-annotations:20.0.0' compile 'org.parceler:parceler-api:0.2.14' - compile 'com.google.dagger:dagger:2.0' - compile 'org.glassfish:javax.annotation:10.0-b28' } diff --git a/app/build.gradle b/app/build.gradle index b530e5b..0243af5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,13 +80,13 @@ android { } dependencies { + compile project(':core') compile project(':androidMvp') compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'org.twitter4j:twitter4j-core:4.0.2' compile 'com.android.support:cardview-v7:21.0.3' - compile 'io.reactivex:rxandroid-framework:0.24.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' apt 'com.google.dagger:dagger-compiler:2.0' diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/core/.gitignore @@ -0,0 +1 @@ +/build diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..16720f1 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,7 @@ +apply plugin: 'java' + +apply plugin: 'me.tatarka.retrolambda' + +dependencies { + compile project(':coremvp') +} \ No newline at end of file diff --git a/coremvp/.gitignore b/coremvp/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/coremvp/.gitignore @@ -0,0 +1 @@ +/build diff --git a/coremvp/build.gradle b/coremvp/build.gradle new file mode 100644 index 0000000..5f6dcc1 --- /dev/null +++ b/coremvp/build.gradle @@ -0,0 +1,9 @@ +apply plugin: 'java' + +apply plugin: 'me.tatarka.retrolambda' + +dependencies { + compile 'io.reactivex:rxandroid-framework:0.24.0' + compile 'com.google.dagger:dagger:2.0' + compile 'org.glassfish:javax.annotation:10.0-b28' +} \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java diff --git a/settings.gradle b/settings.gradle index 295baa7..5a84099 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':androidMvp', ':SuperListviewLibrary', ':app' +include ':androidMvp', ':SuperListviewLibrary', ':app', ':core', ':coremvp' From 60b1fdcf4e9b2f05b44a7ef4f702cb18e2f64a2e Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Fri, 1 May 2015 17:30:11 +0200 Subject: [PATCH 025/300] Moved model classes in core model and introduces view interfaces --- app/build.gradle | 2 -- app/src/main/java/it/cosenonjaviste/AppModule.java | 2 +- .../java/it/cosenonjaviste/CoseNonJavisteApp.java | 14 ++++++++++++++ .../cosenonjaviste/author/AuthorListFragment.java | 12 +++++++----- .../cosenonjaviste/author/AuthorListPresenter.java | 5 ++--- .../it/cosenonjaviste/author/AuthorListView.java | 11 +++++++++++ .../category/CategoryListFragment.java | 12 +++++++----- .../category/CategoryListPresenter.java | 5 ++--- .../cosenonjaviste/category/CategoryListView.java | 11 +++++++++++ .../java/it/cosenonjaviste/page/PageFragment.java | 4 ++-- .../java/it/cosenonjaviste/page/PagePresenter.java | 4 ++-- .../main/java/it/cosenonjaviste/page/PageView.java | 5 +++++ .../it/cosenonjaviste/post/PostListFragment.java | 14 ++++++++------ .../it/cosenonjaviste/post/PostListPresenter.java | 5 ++--- .../java/it/cosenonjaviste/post/PostListView.java | 13 +++++++++++++ .../cosenonjaviste/twitter/TweetListFragment.java | 8 ++++---- .../cosenonjaviste/twitter/TweetListPresenter.java | 2 +- .../it/cosenonjaviste/twitter/TweetListView.java | 9 +++++++++ .../mvp/author/AuthorListPresenterTest.java | 7 +++---- .../mvp/category/CategoryListPresenterTest.java | 11 +++-------- .../cosenonjaviste/mvp/page/PagePresenterTest.java | 7 ++----- .../mvp/post/AuthorPostListPresenterTest.java | 8 ++------ .../mvp/post/CategoryPostListPresenterTest.java | 8 ++------ .../mvp/post/PostListPresenterTest.java | 11 +++-------- .../mvp/twitter/TweetListPresenterTest.java | 8 ++------ core/build.gradle | 2 ++ .../main/java/it/cosenonjaviste/model/Author.java | 3 --- .../it/cosenonjaviste/model/AuthorResponse.java | 0 .../java/it/cosenonjaviste/model/Category.java | 3 --- .../it/cosenonjaviste/model/CategoryResponse.java | 0 .../main/java/it/cosenonjaviste/model/Post.java | 3 --- .../java/it/cosenonjaviste/model/PostResponse.java | 0 .../main/java/it/cosenonjaviste/model/Tweet.java | 3 --- .../it/cosenonjaviste/model/TwitterService.java | 11 +++++------ .../it/cosenonjaviste/model/WordPressService.java | 0 .../java/it/cosenonjaviste/utils/Md5Utils.java | 0 36 files changed, 125 insertions(+), 98 deletions(-) create mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorListView.java create mode 100644 app/src/main/java/it/cosenonjaviste/category/CategoryListView.java create mode 100644 app/src/main/java/it/cosenonjaviste/page/PageView.java create mode 100644 app/src/main/java/it/cosenonjaviste/post/PostListView.java create mode 100644 app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java rename {app => core}/src/main/java/it/cosenonjaviste/model/Author.java (97%) rename {app => core}/src/main/java/it/cosenonjaviste/model/AuthorResponse.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/model/Category.java (93%) rename {app => core}/src/main/java/it/cosenonjaviste/model/CategoryResponse.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/model/Post.java (95%) rename {app => core}/src/main/java/it/cosenonjaviste/model/PostResponse.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/model/Tweet.java (95%) rename {app => core}/src/main/java/it/cosenonjaviste/model/TwitterService.java (79%) rename {app => core}/src/main/java/it/cosenonjaviste/model/WordPressService.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/utils/Md5Utils.java (100%) diff --git a/app/build.gradle b/app/build.gradle index 0243af5..97f520e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,8 +84,6 @@ dependencies { compile project(':androidMvp') compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' - compile 'com.squareup.retrofit:retrofit:1.9.0' - compile 'org.twitter4j:twitter4j-core:4.0.2' compile 'com.android.support:cardview-v7:21.0.3' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' diff --git a/app/src/main/java/it/cosenonjaviste/AppModule.java b/app/src/main/java/it/cosenonjaviste/AppModule.java index 7c9bdac..695dd15 100644 --- a/app/src/main/java/it/cosenonjaviste/AppModule.java +++ b/app/src/main/java/it/cosenonjaviste/AppModule.java @@ -37,7 +37,7 @@ public AppModule(Application application) { } @Provides TwitterService provideTwitterService() { - return new TwitterService(); + return new TwitterService(BuildConfig.CONSUMER_KEY, BuildConfig.CONSUMER_SECRET, BuildConfig.ACCESS_TOKEN, BuildConfig.ACCESS_TOKEN_SECRET); } @Provides @Singleton SchedulerManager provideSchedulerManager() { diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java index a6ff631..6879b1d 100644 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java @@ -3,6 +3,20 @@ import android.app.Application; import android.content.Context; +import org.parceler.ParcelClass; +import org.parceler.ParcelClasses; + +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.model.Category; +import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.model.Tweet; + +@ParcelClasses({ + @ParcelClass(Post.class), + @ParcelClass(Category.class), + @ParcelClass(Tweet.class), + @ParcelClass(Author.class) +}) public class CoseNonJavisteApp extends Application { public static ApplicationComponent component; diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 8586b39..cf4aeac 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -17,10 +17,12 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.post.PostListFragment; +import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class AuthorListFragment extends RxMvpFragment { +public class AuthorListFragment extends RxMvpFragment implements AuthorListView { @InjectView(R.id.grid) SuperGridview grid; @@ -47,19 +49,19 @@ public class AuthorListFragment extends RxMvpFragment { presenter.loadAuthors(); } - public void update(AuthorListModel model) { + @Override public void update(AuthorListModel model) { model.call(authors -> { grid.showList(); adapter.reloadData(authors); }).whenError(t -> grid.showError()).whenEmpty(Actions.empty()); } - public void startLoading() { + @Override public void startLoading() { grid.showProgress(); } - public void open(Class viewClass, MM model) { - SingleFragmentActivity.open(getActivity(), viewClass, model); + @Override public void openPostList(PostListModel model) { + SingleFragmentActivity.open(getActivity(), PostListFragment.class, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 7b4f48c..41e671b 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -10,12 +10,11 @@ import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.AuthorResponse; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @PresenterScope -public class AuthorListPresenter extends RxMvpPresenter { +public class AuthorListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; @@ -52,6 +51,6 @@ public void loadAuthors() { public void goToAuthorDetail(int position) { Author author = getModel().get(position); - getView().open(PostListFragment.class, new PostListModel(author)); + getView().openPostList(new PostListModel(author)); } } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java new file mode 100644 index 0000000..9e36ac9 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.author; + +import it.cosenonjaviste.post.PostListModel; + +public interface AuthorListView { + void update(AuthorListModel model); + + void startLoading(); + + void openPostList(PostListModel model); +} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index e9da20b..b0b6932 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -17,10 +17,12 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.post.PostListFragment; +import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class CategoryListFragment extends RxMvpFragment { +public class CategoryListFragment extends RxMvpFragment implements CategoryListView { @InjectView(R.id.grid) SuperGridview grid; @@ -50,7 +52,7 @@ public class CategoryListFragment extends RxMvpFragment { } - public void update(CategoryListModel model) { + @Override public void update(CategoryListModel model) { model.call( categories -> { grid.showList(); @@ -63,11 +65,11 @@ public void update(CategoryListModel model) { ); } - public void startLoading() { + @Override public void startLoading() { grid.showProgress(); } - public void open(Class viewClass, MM model) { - SingleFragmentActivity.open(getActivity(), viewClass, model); + @Override public void openPostList(PostListModel model) { + SingleFragmentActivity.open(getActivity(), PostListFragment.class, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 74abeb7..124af49 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -9,12 +9,11 @@ import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.CategoryResponse; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @PresenterScope -public class CategoryListPresenter extends RxMvpPresenter { +public class CategoryListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; @@ -50,6 +49,6 @@ public void loadData() { public void goToPosts(int position) { Category category = getModel().get(position); - getView().open(PostListFragment.class, new PostListModel(category)); + getView().openPostList(new PostListModel(category)); } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java new file mode 100644 index 0000000..e91177d --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.category; + +import it.cosenonjaviste.post.PostListModel; + +public interface CategoryListView { + void update(CategoryListModel model); + + void startLoading(); + + void openPostList(PostListModel model); +} diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index d21c4d0..500c967 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -22,7 +22,7 @@ import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; -public class PageFragment extends RxMvpFragment { +public class PageFragment extends RxMvpFragment implements PageView { @InjectView(R.id.web_view) WebView webView; @@ -93,7 +93,7 @@ public void onPageFinished(WebView view11, String url) { return view; } - public void update(PageModel model) { + @Override public void update(PageModel model) { webView.loadUrl(presenter.getPostUrl()); } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 427daad..45a76ff 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -6,7 +6,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @PresenterScope -public class PagePresenter extends RxMvpPresenter { +public class PagePresenter extends RxMvpPresenter { @Inject PageUrlManager pageUrlManager; @@ -18,7 +18,7 @@ public String getPostUrl() { } @Override public void resume() { - getView().update(getModel()); super.resume(); + getView().update(getModel()); } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageView.java b/app/src/main/java/it/cosenonjaviste/page/PageView.java new file mode 100644 index 0000000..7c2aa29 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/page/PageView.java @@ -0,0 +1,5 @@ +package it.cosenonjaviste.page; + +public interface PageView { + void update(PageModel model); +} diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 5d580cd..f7bfc5d 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -17,10 +17,12 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.page.PageFragment; +import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class PostListFragment extends RxMvpFragment { +public class PostListFragment extends RxMvpFragment implements PostListView { @InjectView(R.id.list) SuperListview list; @@ -50,7 +52,7 @@ public class PostListFragment extends RxMvpFragment { presenter.reloadData(); } - public void update(PostListModel model) { + @Override public void update(PostListModel model) { model.getItems().call( posts -> { list.showList(); @@ -64,7 +66,7 @@ public void update(PostListModel model) { ); } - public void startLoading(boolean showMainLoading) { + @Override public void startLoading(boolean showMainLoading) { if (showMainLoading) { list.showProgress(); } else { @@ -72,11 +74,11 @@ public void startLoading(boolean showMainLoading) { } } - public void startMoreItemsLoading() { + @Override public void startMoreItemsLoading() { list.showMoreProgress(); } - public void open(Class viewClass, MM model) { - SingleFragmentActivity.open(getActivity(), viewClass, model); + @Override public void openDetail(PageModel model) { + SingleFragmentActivity.open(getActivity(), PageFragment.class, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 67686ed..db72374 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -12,14 +12,13 @@ import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.PostResponse; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import rx.Observable; import rx.functions.Action0; import rx.functions.Action1; @PresenterScope -public class PostListPresenter extends RxMvpPresenter { +public class PostListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; @@ -51,7 +50,7 @@ public void reloadData() { } public void goToDetail(Post item) { - getView().open(PageFragment.class, new PageModel(item.getUrl())); + getView().openDetail(new PageModel(item.getUrl())); } public void loadNextPage() { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListView.java b/app/src/main/java/it/cosenonjaviste/post/PostListView.java new file mode 100644 index 0000000..bfd8635 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/post/PostListView.java @@ -0,0 +1,13 @@ +package it.cosenonjaviste.post; + +import it.cosenonjaviste.page.PageModel; + +public interface PostListView { + void update(PostListModel model); + + void startLoading(boolean showMainLoading); + + void startMoreItemsLoading(); + + void openDetail(PageModel model); +} diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index d107c3d..041e553 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -19,7 +19,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpFragment; import rx.functions.Actions; -public class TweetListFragment extends RxMvpFragment { +public class TweetListFragment extends RxMvpFragment implements TweetListView { @InjectView(R.id.list) SuperListview list; @@ -48,7 +48,7 @@ public class TweetListFragment extends RxMvpFragment { presenter.reloadData(); } - public void update(TweetListModel model) { + @Override public void update(TweetListModel model) { model.call( items -> { list.showList(); @@ -62,7 +62,7 @@ public void update(TweetListModel model) { ); } - public void startLoading(boolean showMainLoading) { + @Override public void startLoading(boolean showMainLoading) { if (showMainLoading) { list.showProgress(); } else { @@ -70,7 +70,7 @@ public void startLoading(boolean showMainLoading) { } } - public void startMoreItemsLoading() { + @Override public void startMoreItemsLoading() { list.showMoreProgress(); } } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index e43ca96..3e7e53a 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -11,7 +11,7 @@ import rx.Observable; @PresenterScope -public class TweetListPresenter extends RxMvpPresenter { +public class TweetListPresenter extends RxMvpPresenter { @Inject TwitterService twitterService; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java new file mode 100644 index 0000000..99c85db --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java @@ -0,0 +1,9 @@ +package it.cosenonjaviste.twitter; + +public interface TweetListView { + void update(TweetListModel model); + + void startLoading(boolean showMainLoading); + + void startMoreItemsLoading(); +} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index 2dd6494..b01520c 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -8,9 +8,9 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; +import it.cosenonjaviste.author.AuthorListView; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.post.PostListModel; @@ -18,14 +18,13 @@ import static it.cosenonjaviste.TestData.authorResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class AuthorListPresenterTest { - @Mock AuthorListFragment view; + @Mock AuthorListView view; @InjectMocks AuthorListPresenter presenter; @@ -71,7 +70,7 @@ public void testGoToDetail() { presenter.goToAuthorDetail(1); - verify(view).open(any(), modelCaptor.capture()); + verify(view).openPostList(modelCaptor.capture()); PostListModel model = modelCaptor.getValue(); assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 18450bb..b22c195 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -6,24 +6,19 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.category.CategoryListPresenter; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; +import it.cosenonjaviste.category.CategoryListView; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListModel; import rx.Observable; import static it.cosenonjaviste.TestData.categoryResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -36,7 +31,7 @@ public class CategoryListPresenterTest { @InjectMocks CategoryListPresenter presenter; - @Mock CategoryListFragment view; + @Mock CategoryListView view; @Captor ArgumentCaptor modelCaptor; @@ -81,7 +76,7 @@ public void testGoToPosts() { presenter.goToPosts(1); - verify(view).open(any(), modelCaptor.capture()); + verify(view).openPostList(modelCaptor.capture()); assertThat(modelCaptor.getValue().getCategory()).isEqualTo(categoryListModel.get(1)); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 8489a96..17392a2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -10,14 +10,11 @@ import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; -import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.page.PagePresenter; import it.cosenonjaviste.page.PageUrlManager; +import it.cosenonjaviste.page.PageView; import it.cosenonjaviste.post.PostListModel; import static org.assertj.core.api.Assertions.assertThat; @@ -25,7 +22,7 @@ @RunWith(MockitoJUnitRunner.class) public class PagePresenterTest { - @Mock PageFragment view; + @Mock PageView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index 716408f..d0b35df 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -4,18 +4,14 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; +import it.cosenonjaviste.post.PostListView; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyInt; @@ -27,7 +23,7 @@ @RunWith(MockitoJUnitRunner.class) public class AuthorPostListPresenterTest { - @Mock PostListFragment view; + @Mock PostListView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index 90cc078..316a2d2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -4,19 +4,15 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; +import it.cosenonjaviste.post.PostListView; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.eq; @@ -25,7 +21,7 @@ @RunWith(MockitoJUnitRunner.class) public class CategoryPostListPresenterTest { - @Mock PostListFragment view; + @Mock PostListView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index ccaf06a..cc874ea 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -6,25 +6,20 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageModel; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; +import it.cosenonjaviste.post.PostListView; import rx.Observable; import static it.cosenonjaviste.TestData.postResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -32,7 +27,7 @@ @RunWith(MockitoJUnitRunner.class) public class PostListPresenterTest { - @Mock PostListFragment view; + @Mock PostListView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); @@ -97,7 +92,7 @@ public void testGoToDetails() { presenter.goToDetail(firstPost); - verify(view).open(any(), modelCaptor.capture()); + verify(view).openDetail(modelCaptor.capture()); PageModel detailModel = modelCaptor.getValue(); String url = detailModel.getUrl(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 601171f..7367552 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -4,18 +4,14 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; -import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; import it.cosenonjaviste.twitter.TweetListPresenter; +import it.cosenonjaviste.twitter.TweetListView; import rx.Observable; import static org.assertj.core.api.Assertions.assertThat; @@ -25,7 +21,7 @@ @RunWith(MockitoJUnitRunner.class) public class TweetListPresenterTest { - @Mock TweetListFragment view; + @Mock TweetListView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); diff --git a/core/build.gradle b/core/build.gradle index 16720f1..d60883c 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -4,4 +4,6 @@ apply plugin: 'me.tatarka.retrolambda' dependencies { compile project(':coremvp') + compile 'com.squareup.retrofit:retrofit:1.9.0' + compile 'org.twitter4j:twitter4j-core:4.0.2' } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/model/Author.java b/core/src/main/java/it/cosenonjaviste/model/Author.java similarity index 97% rename from app/src/main/java/it/cosenonjaviste/model/Author.java rename to core/src/main/java/it/cosenonjaviste/model/Author.java index e0e0778..14e1900 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Author.java +++ b/core/src/main/java/it/cosenonjaviste/model/Author.java @@ -2,11 +2,8 @@ import com.google.gson.annotations.SerializedName; -import org.parceler.Parcel; - import it.cosenonjaviste.utils.Md5Utils; -@Parcel public class Author implements Comparable { long id; diff --git a/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java b/core/src/main/java/it/cosenonjaviste/model/AuthorResponse.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java rename to core/src/main/java/it/cosenonjaviste/model/AuthorResponse.java diff --git a/app/src/main/java/it/cosenonjaviste/model/Category.java b/core/src/main/java/it/cosenonjaviste/model/Category.java similarity index 93% rename from app/src/main/java/it/cosenonjaviste/model/Category.java rename to core/src/main/java/it/cosenonjaviste/model/Category.java index 4c59ea4..a06ef8b 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Category.java +++ b/core/src/main/java/it/cosenonjaviste/model/Category.java @@ -2,9 +2,6 @@ import com.google.gson.annotations.SerializedName; -import org.parceler.Parcel; - -@Parcel public class Category { long id; diff --git a/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java b/core/src/main/java/it/cosenonjaviste/model/CategoryResponse.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java rename to core/src/main/java/it/cosenonjaviste/model/CategoryResponse.java diff --git a/app/src/main/java/it/cosenonjaviste/model/Post.java b/core/src/main/java/it/cosenonjaviste/model/Post.java similarity index 95% rename from app/src/main/java/it/cosenonjaviste/model/Post.java rename to core/src/main/java/it/cosenonjaviste/model/Post.java index 1f94e1b..8573ab1 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Post.java +++ b/core/src/main/java/it/cosenonjaviste/model/Post.java @@ -1,10 +1,7 @@ package it.cosenonjaviste.model; -import org.parceler.Parcel; - import java.util.Date; -@Parcel public class Post { long id; Author author; diff --git a/app/src/main/java/it/cosenonjaviste/model/PostResponse.java b/core/src/main/java/it/cosenonjaviste/model/PostResponse.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/model/PostResponse.java rename to core/src/main/java/it/cosenonjaviste/model/PostResponse.java diff --git a/app/src/main/java/it/cosenonjaviste/model/Tweet.java b/core/src/main/java/it/cosenonjaviste/model/Tweet.java similarity index 95% rename from app/src/main/java/it/cosenonjaviste/model/Tweet.java rename to core/src/main/java/it/cosenonjaviste/model/Tweet.java index 11d8191..9c71141 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Tweet.java +++ b/core/src/main/java/it/cosenonjaviste/model/Tweet.java @@ -1,10 +1,7 @@ package it.cosenonjaviste.model; -import org.parceler.Parcel; - import java.util.Date; -@Parcel public class Tweet { long id; String text; diff --git a/app/src/main/java/it/cosenonjaviste/model/TwitterService.java b/core/src/main/java/it/cosenonjaviste/model/TwitterService.java similarity index 79% rename from app/src/main/java/it/cosenonjaviste/model/TwitterService.java rename to core/src/main/java/it/cosenonjaviste/model/TwitterService.java index 3b0564f..d50e2d1 100644 --- a/app/src/main/java/it/cosenonjaviste/model/TwitterService.java +++ b/core/src/main/java/it/cosenonjaviste/model/TwitterService.java @@ -2,7 +2,6 @@ import java.util.List; -import it.cosenonjaviste.BuildConfig; import rx.Observable; import rx.Subscriber; import twitter4j.Paging; @@ -19,13 +18,13 @@ public class TwitterService { private final Twitter twitter; - public TwitterService() { + public TwitterService(String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) { ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true) - .setOAuthConsumerKey(BuildConfig.CONSUMER_KEY) - .setOAuthConsumerSecret(BuildConfig.CONSUMER_SECRET) - .setOAuthAccessToken(BuildConfig.ACCESS_TOKEN) - .setOAuthAccessTokenSecret(BuildConfig.ACCESS_TOKEN_SECRET); + .setOAuthConsumerKey(consumerKey) + .setOAuthConsumerSecret(consumerSecret) + .setOAuthAccessToken(accessToken) + .setOAuthAccessTokenSecret(accessTokenSecret); TwitterFactory tf = new TwitterFactory(cb.build()); twitter = tf.getInstance(); } diff --git a/app/src/main/java/it/cosenonjaviste/model/WordPressService.java b/core/src/main/java/it/cosenonjaviste/model/WordPressService.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/model/WordPressService.java rename to core/src/main/java/it/cosenonjaviste/model/WordPressService.java diff --git a/app/src/main/java/it/cosenonjaviste/utils/Md5Utils.java b/core/src/main/java/it/cosenonjaviste/utils/Md5Utils.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/utils/Md5Utils.java rename to core/src/main/java/it/cosenonjaviste/utils/Md5Utils.java From 27d9832fdf08aa5fa32254e02e5872cddc0bac0d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 12:25:33 +0200 Subject: [PATCH 026/300] Removed OptionalList in TweetListModel --- .../twitter/TweetListFragment.java | 22 ++++++------ .../twitter/TweetListModel.java | 34 +++++++++---------- .../twitter/TweetListPresenter.java | 10 +++--- .../cosenonjaviste/twitter/TweetListView.java | 2 ++ 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 041e553..f6fde0a 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -9,6 +9,8 @@ import com.quentindommerc.superlistview.SuperListview; +import org.parceler.ParcelClass; + import javax.inject.Inject; import butterknife.ButterKnife; @@ -17,8 +19,8 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; -import rx.functions.Actions; +@ParcelClass(TweetListModel.class) public class TweetListFragment extends RxMvpFragment implements TweetListView { @InjectView(R.id.list) SuperListview list; @@ -49,17 +51,13 @@ public class TweetListFragment extends RxMvpFragment implements TweetListView { } @Override public void update(TweetListModel model) { - model.call( - items -> { - list.showList(); - list.hideMoreProgress(model.isMoreDataAvailable()); - adapter.reloadData(items); - } - ).whenError( - t -> list.showError() - ).whenEmpty( - Actions.empty() - ); + list.showList(); + list.hideMoreProgress(model.isMoreDataAvailable()); + adapter.reloadData(model.getItems()); + } + + public void showError() { + list.showError(); } @Override public void startLoading(boolean showMainLoading) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java index 7ddcf70..a58e601 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java @@ -1,17 +1,13 @@ package it.cosenonjaviste.twitter; -import org.parceler.Parcel; - import java.util.List; -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; import it.cosenonjaviste.model.Tweet; -import rx.functions.Action1; -@Parcel public class TweetListModel { - OptionalList list = new OptionalList<>(); + List list; + + boolean errorLoading; boolean moreDataAvailable; @@ -23,20 +19,18 @@ public boolean isMoreDataAvailable() { return moreDataAvailable; } - public OptionalItem> call(Action1> action) { - return list.call(action); - } - public boolean isEmpty() { - return list.isEmpty(); + return list == null || list.isEmpty(); } - public void done(List object) { - list.done(object); + public void done(List list) { + this.list = list; + errorLoading = false; } - public void error(Throwable throwable) { - list.error(throwable); + public void error() { + list = null; + errorLoading = true; } public int size() { @@ -44,10 +38,14 @@ public int size() { } public boolean isError() { - return list.isError(); + return errorLoading; } public void append(List object) { - list.append(object); + list.addAll(object); + } + + public List getItems() { + return list; } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 3e7e53a..f50bc56 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -28,8 +28,8 @@ public void reloadData() { getModel().setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); getView().update(getModel()); }, throwable -> { - getModel().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } @@ -37,6 +37,8 @@ public void reloadData() { super.resume(); if (getModel().isEmpty() && !isTaskRunning()) { reloadData(); + } else if (getModel().isError()) { + getView().showError(); } else { getView().update(getModel()); } @@ -54,8 +56,8 @@ public void loadNextPage() { getView().update(getModel()); }, throwable -> { - getModel().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java index 99c85db..c19ce4f 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java @@ -6,4 +6,6 @@ public interface TweetListView { void startLoading(boolean showMainLoading); void startMoreItemsLoading(); + + void showError(); } From 5a2fa138f1a2ec18e17a7c57342b662774096bda Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 12:31:16 +0200 Subject: [PATCH 027/300] Moved TweetListPresenter in core module --- core/build.gradle | 4 +++ .../java/it/cosenonjaviste/TestData.java | 0 .../twitter/TweetListModel.java | 0 .../twitter/TweetListPresenter.java | 0 .../cosenonjaviste/twitter/TweetListView.java | 0 .../mvp/twitter/TweetListPresenterTest.java | 25 +++++++++---------- .../it/cosenonjaviste/mvp/TestLifeCycle.java | 0 .../mvp/TestSchedulerManager.java | 0 8 files changed, 16 insertions(+), 13 deletions(-) rename {app/src/debug => core/src/main}/java/it/cosenonjaviste/TestData.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/twitter/TweetListView.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java (70%) rename {app/src/test => coremvp/src/main}/java/it/cosenonjaviste/mvp/TestLifeCycle.java (100%) rename {app/src/test => coremvp/src/main}/java/it/cosenonjaviste/mvp/TestSchedulerManager.java (100%) diff --git a/core/build.gradle b/core/build.gradle index d60883c..abed3c8 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -6,4 +6,8 @@ dependencies { compile project(':coremvp') compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'org.twitter4j:twitter4j-core:4.0.2' + + testCompile 'junit:junit:4.12' + testCompile 'org.mockito:mockito-core:1.9.5' + testCompile 'org.assertj:assertj-core:1.7.0' } \ No newline at end of file diff --git a/app/src/debug/java/it/cosenonjaviste/TestData.java b/core/src/main/java/it/cosenonjaviste/TestData.java similarity index 100% rename from app/src/debug/java/it/cosenonjaviste/TestData.java rename to core/src/main/java/it/cosenonjaviste/TestData.java diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java b/core/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java rename to core/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/core/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java rename to core/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java b/core/src/main/java/it/cosenonjaviste/twitter/TweetListView.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java rename to core/src/main/java/it/cosenonjaviste/twitter/TweetListView.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java similarity index 70% rename from app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 7367552..ed61e26 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/core/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -1,9 +1,12 @@ package it.cosenonjaviste.mvp.twitter; +import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; +import org.mockito.Matchers; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; @@ -14,10 +17,6 @@ import it.cosenonjaviste.twitter.TweetListView; import rx.Observable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.when; - @RunWith(MockitoJUnitRunner.class) public class TweetListPresenterTest { @@ -30,34 +29,34 @@ public class TweetListPresenterTest { @InjectMocks TweetListPresenter presenter; @Test public void testLoadTweets() { - when(twitterService.loadTweets(eq(1))) + Mockito.when(twitterService.loadTweets(Matchers.eq(1))) .thenReturn(TestData.tweets()); TweetListModel model = new TweetListModel(); testLifeCycle.initAndResume(model, presenter, view); - assertThat(model.size()).isEqualTo(10); + Assertions.assertThat(model.size()).isEqualTo(10); } @Test public void testRetryAfterError() { - when(twitterService.loadTweets(eq(1))) + Mockito.when(twitterService.loadTweets(Matchers.eq(1))) .thenReturn(Observable.error(new RuntimeException())); TweetListModel model = new TweetListModel(); testLifeCycle.initAndResume(model, presenter, view); - assertThat(model.isError()).isTrue(); + Assertions.assertThat(model.isError()).isTrue(); - when(twitterService.loadTweets(eq(1))) + Mockito.when(twitterService.loadTweets(Matchers.eq(1))) .thenReturn(TestData.tweets()); presenter.reloadData(); - assertThat(model.isError()).isFalse(); - assertThat(model.size()).isEqualTo(10); + Assertions.assertThat(model.isError()).isFalse(); + Assertions.assertThat(model.size()).isEqualTo(10); } @Test public void testLoadMoreTweets() { - when(twitterService.loadTweets(eq(1))) + Mockito.when(twitterService.loadTweets(Matchers.eq(1))) .thenReturn(TestData.tweets()); TweetListModel tweetListModel = new TweetListModel(); @@ -65,6 +64,6 @@ public class TweetListPresenterTest { presenter.loadNextPage(); - assertThat(tweetListModel.size()).isEqualTo(20); + Assertions.assertThat(tweetListModel.size()).isEqualTo(20); } } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java b/coremvp/src/main/java/it/cosenonjaviste/mvp/TestLifeCycle.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java rename to coremvp/src/main/java/it/cosenonjaviste/mvp/TestLifeCycle.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestSchedulerManager.java b/coremvp/src/main/java/it/cosenonjaviste/mvp/TestSchedulerManager.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/TestSchedulerManager.java rename to coremvp/src/main/java/it/cosenonjaviste/mvp/TestSchedulerManager.java From 7aa689170b4823eda97cd9479b06a91d8bc6eec4 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 12:43:27 +0200 Subject: [PATCH 028/300] Removed OptionalList in PostListModel --- .../cosenonjaviste/post/PostListFragment.java | 22 ++++++------ .../it/cosenonjaviste/post/PostListModel.java | 36 ++++++++++++++++--- .../post/PostListPresenter.java | 29 +++++++-------- .../it/cosenonjaviste/post/PostListView.java | 2 ++ .../mvp/post/PostListPresenterTest.java | 9 ++--- 5 files changed, 61 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index f7bfc5d..33c8fb2 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -9,6 +9,8 @@ import com.quentindommerc.superlistview.SuperListview; +import org.parceler.ParcelClass; + import javax.inject.Inject; import butterknife.ButterKnife; @@ -20,8 +22,8 @@ import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.utils.SingleFragmentActivity; -import rx.functions.Actions; +@ParcelClass(PostListModel.class) public class PostListFragment extends RxMvpFragment implements PostListView { @InjectView(R.id.list) SuperListview list; @@ -53,17 +55,13 @@ public class PostListFragment extends RxMvpFragment implements PostListView { } @Override public void update(PostListModel model) { - model.getItems().call( - posts -> { - list.showList(); - list.hideMoreProgress(model.isMoreDataAvailable()); - adapter.reloadData(posts); - } - ).whenError( - t -> list.showError() - ).whenEmpty( - Actions.empty() - ); + list.showList(); + list.hideMoreProgress(model.isMoreDataAvailable()); + adapter.reloadData(model.getItems()); + } + + @Override public void showError() { + list.showError(); } @Override public void startLoading(boolean showMainLoading) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListModel.java b/app/src/main/java/it/cosenonjaviste/post/PostListModel.java index c07a82a..36e9697 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListModel.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListModel.java @@ -1,21 +1,21 @@ package it.cosenonjaviste.post; -import org.parceler.Parcel; +import java.util.List; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.Post; -@Parcel public class PostListModel { - OptionalList items = new OptionalList<>(); + List items; Category category; boolean moreDataAvailable; + boolean errorLoading; + Author author; public PostListModel() { @@ -45,7 +45,33 @@ public Author getAuthor() { return author; } - public OptionalList getItems() { + public List getItems() { return items; } + + public void done(List items) { + this.items = items; + errorLoading = false; + } + + public void error() { + items = null; + errorLoading = true; + } + + public boolean isError() { + return errorLoading; + } + + public void append(List object) { + items.addAll(object); + } + + public int size() { + return items.size(); + } + + public boolean isEmpty() { + return items == null || items.isEmpty(); + } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index db72374..76cd9ca 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -14,8 +14,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageModel; import rx.Observable; -import rx.functions.Action0; -import rx.functions.Action1; @PresenterScope public class PostListPresenter extends RxMvpPresenter { @@ -27,8 +25,10 @@ public class PostListPresenter extends RxMvpPresenter> observable = getObservable(1); subscribe(observable, - () -> getView().startLoading(getModel().getItems().isEmpty()), + () -> getView().startLoading(getModel().isEmpty()), posts -> { - getModel().getItems().done(new ArrayList<>(posts)); + getModel().done(new ArrayList<>(posts)); getModel().setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); getView().update(getModel()); }, throwable -> { - getModel().getItems().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } @@ -57,17 +57,14 @@ public void loadNextPage() { int page = calcNextPage(getModel().getItems().size(), WordPressService.POST_PAGE_SIZE); Observable> observable = getObservable(page); - Action0 onAttach = () -> getView().startMoreItemsLoading(); - Action1> onNext = posts -> { - getModel().getItems().append(posts); + subscribe(observable, () -> getView().startMoreItemsLoading(), posts -> { + getModel().append(posts); getModel().setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); getView().update(getModel()); - }; - Action1 onError = throwable -> { - getModel().getItems().error(throwable); - getView().update(getModel()); - }; - subscribe(observable, onAttach, onNext, onError); + }, throwable -> { + getModel().error(); + getView().showError(); + }); } private Observable> getObservable(int page) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListView.java b/app/src/main/java/it/cosenonjaviste/post/PostListView.java index bfd8635..685b537 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListView.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListView.java @@ -5,6 +5,8 @@ public interface PostListView { void update(PostListModel model); + void showError(); + void startLoading(boolean showMainLoading); void startMoreItemsLoading(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index cc874ea..f2b33be 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -8,7 +8,8 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; +import java.util.List; + import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; @@ -59,7 +60,7 @@ public void testLoadMore() { testLifeCycle.initAndResume(model, presenter, view); presenter.loadNextPage(); - OptionalList items = model.getItems(); + List items = model.getItems(); assertThat(items.size()).isEqualTo(16); } @@ -70,14 +71,14 @@ public void testRetryAfterError() { PostListModel model = new PostListModel(); testLifeCycle.initAndResume(model, presenter, view); - assertThat(model.getItems().isError()).isTrue(); + assertThat(model.isError()).isTrue(); when(wordPressService.listPosts(eq(1))) .thenReturn(postResponse(6)); presenter.reloadData(); - assertThat(model.getItems().isError()).isFalse(); + assertThat(model.isError()).isFalse(); assertThat(model.getItems().size()).isEqualTo(6); } From 7a168abbc23f8e391261aff3745bde67f6d53a6d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 12:49:55 +0200 Subject: [PATCH 029/300] Moved PagePresenter and PostListPresenter in core module --- app/src/main/java/it/cosenonjaviste/page/PageFragment.java | 3 +++ .../src/main/java/it/cosenonjaviste/page/PageModel.java | 3 --- .../src/main/java/it/cosenonjaviste/page/PagePresenter.java | 0 .../src/main/java/it/cosenonjaviste/page/PageUrlManager.java | 0 .../src/main/java/it/cosenonjaviste/page/PageView.java | 0 .../src/main/java/it/cosenonjaviste/post/PostListModel.java | 0 .../main/java/it/cosenonjaviste/post/PostListPresenter.java | 0 .../src/main/java/it/cosenonjaviste/post/PostListView.java | 0 .../java/it/cosenonjaviste/mvp/page/PagePresenterTest.java | 0 .../cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java | 0 .../cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java | 0 .../java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java | 0 12 files changed, 3 insertions(+), 3 deletions(-) rename {app => core}/src/main/java/it/cosenonjaviste/page/PageModel.java (85%) rename {app => core}/src/main/java/it/cosenonjaviste/page/PagePresenter.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/page/PageUrlManager.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/page/PageView.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/post/PostListModel.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/post/PostListPresenter.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/post/PostListView.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java (100%) diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 500c967..c39ddf4 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -11,6 +11,8 @@ import android.webkit.WebView; import android.webkit.WebViewClient; +import org.parceler.ParcelClass; + import java.io.File; import java.io.IOException; @@ -22,6 +24,7 @@ import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +@ParcelClass(PageModel.class) public class PageFragment extends RxMvpFragment implements PageView { @InjectView(R.id.web_view) WebView webView; diff --git a/app/src/main/java/it/cosenonjaviste/page/PageModel.java b/core/src/main/java/it/cosenonjaviste/page/PageModel.java similarity index 85% rename from app/src/main/java/it/cosenonjaviste/page/PageModel.java rename to core/src/main/java/it/cosenonjaviste/page/PageModel.java index 3609121..0bbf964 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageModel.java +++ b/core/src/main/java/it/cosenonjaviste/page/PageModel.java @@ -1,8 +1,5 @@ package it.cosenonjaviste.page; -import org.parceler.Parcel; - -@Parcel public class PageModel { String url; diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/core/src/main/java/it/cosenonjaviste/page/PagePresenter.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/page/PagePresenter.java rename to core/src/main/java/it/cosenonjaviste/page/PagePresenter.java diff --git a/app/src/main/java/it/cosenonjaviste/page/PageUrlManager.java b/core/src/main/java/it/cosenonjaviste/page/PageUrlManager.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/page/PageUrlManager.java rename to core/src/main/java/it/cosenonjaviste/page/PageUrlManager.java diff --git a/app/src/main/java/it/cosenonjaviste/page/PageView.java b/core/src/main/java/it/cosenonjaviste/page/PageView.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/page/PageView.java rename to core/src/main/java/it/cosenonjaviste/page/PageView.java diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListModel.java b/core/src/main/java/it/cosenonjaviste/post/PostListModel.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/post/PostListModel.java rename to core/src/main/java/it/cosenonjaviste/post/PostListModel.java diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/core/src/main/java/it/cosenonjaviste/post/PostListPresenter.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java rename to core/src/main/java/it/cosenonjaviste/post/PostListPresenter.java diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListView.java b/core/src/main/java/it/cosenonjaviste/post/PostListView.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/post/PostListView.java rename to core/src/main/java/it/cosenonjaviste/post/PostListView.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java From 1b9c0e44c57b9f132dc1639c1adcf4da3995963e Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 13:02:03 +0200 Subject: [PATCH 030/300] Moved all presenters in core module --- .../lib/mvp/utils/OptionalItem.java | 106 ------------------ .../lib/mvp/utils/OptionalList.java | 58 ---------- .../author/AuthorListFragment.java | 12 +- .../author/AuthorListModel.java | 39 ------- .../category/CategoryListFragment.java | 20 ++-- .../category/CategoryListModel.java | 39 ------- .../mvp/author/AuthorListPresenterTest.java | 78 ------------- .../author/AuthorListModel.java | 41 +++++++ .../author/AuthorListPresenter.java | 10 +- .../cosenonjaviste/author/AuthorListView.java | 2 + .../category/CategoryListModel.java | 41 +++++++ .../category/CategoryListPresenter.java | 10 +- .../category/CategoryListView.java | 2 + .../it/cosenonjaviste/model/JsonStubs.java | 0 .../model/WordPressServiceTest.java | 0 .../category/CategoryListPresenterTest.java | 0 16 files changed, 113 insertions(+), 345 deletions(-) delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java delete mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java delete mode 100644 app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java delete mode 100644 app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java create mode 100644 core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java rename {app => core}/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java (87%) rename {app => core}/src/main/java/it/cosenonjaviste/author/AuthorListView.java (90%) create mode 100644 core/src/main/java/it/cosenonjaviste/category/CategoryListModel.java rename {app => core}/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java (86%) rename {app => core}/src/main/java/it/cosenonjaviste/category/CategoryListView.java (91%) rename {app => core}/src/test/java/it/cosenonjaviste/model/JsonStubs.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java (100%) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java deleted file mode 100644 index c0c5791..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java +++ /dev/null @@ -1,106 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.os.Parcel; -import android.os.Parcelable; - -import org.parceler.Parcels; -import org.parceler.Transient; - -import rx.functions.Action0; -import rx.functions.Action1; - -public class OptionalItem implements Parcelable { - - @Transient - T object; - - Throwable throwable; - - public OptionalItem() { - } - - public OptionalItem(T object) { - this.object = object; - } - - public OptionalItem(T object, Throwable throwable) { - this.object = object; - this.throwable = throwable; - } - - public T getObject() { - return object; - } - - public void done(T object) { - throwable = null; - this.object = object; - } - - public Throwable getThrowable() { - return throwable; - } - - public void error(Throwable throwable) { - this.throwable = throwable; - } - - public boolean isEmpty() { - return throwable == null && object == null; - } - - public boolean isError() { - return throwable != null; - } - - public boolean isValueAvalaible() { - return !isError() && !isEmpty(); - } - - public OptionalItem call(Action1 action) { - if (!isEmpty() && !isError()) { - action.call(object); - } - return this; - } - - public OptionalItem whenEmpty(Action0 action) { - if (isEmpty()) { - action.call(); - } - return this; - } - - public OptionalItem whenError(Action1 action) { - if (isError()) { - action.call(throwable); - } - return this; - } - - @Override public int describeContents() { - return 0; - } - - @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeParcelable(Parcels.wrap(object), 0); - parcel.writeSerializable(throwable); - } - - protected void readFromParcel(Parcel in) { - object = Parcels.unwrap(in.readParcelable(getClass().getClassLoader())); - throwable = (Throwable) in.readSerializable(); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public OptionalItem createFromParcel(Parcel in) { - OptionalItem person = new OptionalItem<>(); - person.readFromParcel(in); - return person; - } - - public OptionalItem[] newArray(int size) { - return new OptionalItem[size]; - } - }; -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java deleted file mode 100644 index 80b8503..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java +++ /dev/null @@ -1,58 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.os.Parcel; -import android.os.Parcelable; - -import java.util.ArrayList; -import java.util.List; - -public class OptionalList extends OptionalItem> implements Parcelable { - public OptionalList() { - this(new ArrayList<>()); - } - - public OptionalList(List object) { - super(object); - } - - public OptionalList(List object, Throwable throwable) { - super(object, throwable); - } - - @Override public boolean isEmpty() { - return super.isEmpty() || getObject().isEmpty(); - } - - public int size() { - if (isValueAvalaible()) { - return getObject().size(); - } else { - return 0; - } - } - - public T get(int index) { - if (isValueAvalaible()) { - return getObject().get(index); - } else { - return null; - } - } - - public void append(List object) { - throwable = null; - this.object.addAll(object); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public OptionalList createFromParcel(Parcel in) { - OptionalList person = new OptionalList<>(); - person.readFromParcel(in); - return person; - } - - public OptionalList[] newArray(int size) { - return new OptionalList[size]; - } - }; -} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index cf4aeac..d6d94b8 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -9,6 +9,8 @@ import com.quentindommerc.superlistview.SuperGridview; +import org.parceler.ParcelClass; + import javax.inject.Inject; import butterknife.ButterKnife; @@ -20,8 +22,8 @@ import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.utils.SingleFragmentActivity; -import rx.functions.Actions; +@ParcelClass(AuthorListModel.class) public class AuthorListFragment extends RxMvpFragment implements AuthorListView { @InjectView(R.id.grid) SuperGridview grid; @@ -50,10 +52,12 @@ public class AuthorListFragment extends RxMvpFragment implements AuthorListView } @Override public void update(AuthorListModel model) { - model.call(authors -> { grid.showList(); - adapter.reloadData(authors); - }).whenError(t -> grid.showError()).whenEmpty(Actions.empty()); + adapter.reloadData(model.getItems()); + } + + @Override public void showError() { + grid.showError(); } @Override public void startLoading() { diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java deleted file mode 100644 index 660542a..0000000 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java +++ /dev/null @@ -1,39 +0,0 @@ -package it.cosenonjaviste.author; - -import org.parceler.Parcel; - -import java.util.List; - -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.model.Author; -import rx.functions.Action1; - -@Parcel -public class AuthorListModel { - OptionalList items = new OptionalList<>(); - - public boolean isEmpty() { - return items.isEmpty(); - } - - public int size() { - return items.size(); - } - - public Author get(int index) { - return items.get(index); - } - - public void done(List object) { - items.done(object); - } - - public void error(Throwable throwable) { - items.error(throwable); - } - - public OptionalItem> call(Action1> action) { - return items.call(action); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index b0b6932..553e1a2 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -9,6 +9,8 @@ import com.quentindommerc.superlistview.SuperGridview; +import org.parceler.ParcelClass; + import javax.inject.Inject; import butterknife.ButterKnife; @@ -20,8 +22,8 @@ import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.utils.SingleFragmentActivity; -import rx.functions.Actions; +@ParcelClass(CategoryListModel.class) public class CategoryListFragment extends RxMvpFragment implements CategoryListView { @InjectView(R.id.grid) SuperGridview grid; @@ -53,16 +55,12 @@ public class CategoryListFragment extends RxMvpFragment implements CategoryListV @Override public void update(CategoryListModel model) { - model.call( - categories -> { - grid.showList(); - adapter.reloadData(categories); - } - ).whenError( - t -> grid.showError() - ).whenEmpty( - Actions.empty() - ); + grid.showList(); + adapter.reloadData(model.getItems()); + } + + @Override public void showError() { + grid.showError(); } @Override public void startLoading() { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java deleted file mode 100644 index 5d2c5ce..0000000 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java +++ /dev/null @@ -1,39 +0,0 @@ -package it.cosenonjaviste.category; - -import org.parceler.Parcel; - -import java.util.List; - -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.model.Category; -import rx.functions.Action1; - -@Parcel -public class CategoryListModel { - OptionalList items = new OptionalList<>(); - - public boolean isEmpty() { - return items.isEmpty(); - } - - public int size() { - return items.size(); - } - - public Category get(int index) { - return items.get(index); - } - - public void done(List object) { - items.done(object); - } - - public void error(Throwable throwable) { - items.error(throwable); - } - - public OptionalItem> call(Action1> action) { - return items.call(action); - } -} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java deleted file mode 100644 index b01520c..0000000 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package it.cosenonjaviste.mvp.author; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; - -import it.cosenonjaviste.author.AuthorListModel; -import it.cosenonjaviste.author.AuthorListPresenter; -import it.cosenonjaviste.author.AuthorListView; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.post.PostListModel; -import rx.Observable; - -import static it.cosenonjaviste.TestData.authorResponse; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class AuthorListPresenterTest { - - @Mock AuthorListView view; - - @InjectMocks AuthorListPresenter presenter; - - @Mock WordPressService wordPressService; - - @Captor ArgumentCaptor modelCaptor; - - private TestLifeCycle testLifeCycle = new TestLifeCycle(); - - @Test - public void testLoad() { - when(wordPressService.listAuthors()) - .thenReturn(authorResponse(2)); - - AuthorListModel model = new AuthorListModel(); - testLifeCycle.initAndResume(model, presenter, view); - - assertThat(model.size()).isEqualTo(2); - } - - @Test - public void testRetryAfterError() { - when(wordPressService.listAuthors()) - .thenReturn(Observable.error(new RuntimeException())); - when(wordPressService.listAuthors()) - .thenReturn(authorResponse(2)); - - AuthorListModel model = new AuthorListModel(); - testLifeCycle.initAndResume(model, presenter, view); - - presenter.loadAuthors(); - - assertThat(model.size()).isEqualTo(2); - } - - @Test - public void testGoToDetail() { - when(wordPressService.listAuthors()) - .thenReturn(authorResponse(2)); - - AuthorListModel authorListModel = new AuthorListModel(); - testLifeCycle.initAndResume(authorListModel, presenter, view); - - presenter.goToAuthorDetail(1); - - verify(view).openPostList(modelCaptor.capture()); - - PostListModel model = modelCaptor.getValue(); - assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); - } -} \ No newline at end of file diff --git a/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java b/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java new file mode 100644 index 0000000..829ea11 --- /dev/null +++ b/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java @@ -0,0 +1,41 @@ +package it.cosenonjaviste.author; + +import java.util.List; + +import it.cosenonjaviste.model.Author; + +public class AuthorListModel { + List items; + + boolean errorLoading; + + public boolean isEmpty() { + return items.isEmpty(); + } + + public int size() { + return items.size(); + } + + public Author get(int index) { + return items.get(index); + } + + public void done(List items) { + this.items = items; + errorLoading = false; + } + + public void error() { + items = null; + errorLoading = true; + } + + public List getItems() { + return items; + } + + public boolean isError() { + return errorLoading; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/core/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java similarity index 87% rename from app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java rename to core/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 41e671b..947c435 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/core/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -28,15 +28,13 @@ public void loadAuthors() { .doOnNext(Collections::sort); subscribe(observable, - () -> { - getView().startLoading(); - }, + () -> getView().startLoading(), posts -> { getModel().done(posts); getView().update(getModel()); }, throwable -> { - getModel().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } @@ -44,6 +42,8 @@ public void loadAuthors() { super.resume(); if (getModel().isEmpty() && !isTaskRunning()) { loadAuthors(); + } else if (getModel().isError()) { + getView().showError(); } else { getView().update(getModel()); } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java b/core/src/main/java/it/cosenonjaviste/author/AuthorListView.java similarity index 90% rename from app/src/main/java/it/cosenonjaviste/author/AuthorListView.java rename to core/src/main/java/it/cosenonjaviste/author/AuthorListView.java index 9e36ac9..e81c7cc 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java +++ b/core/src/main/java/it/cosenonjaviste/author/AuthorListView.java @@ -5,6 +5,8 @@ public interface AuthorListView { void update(AuthorListModel model); + void showError(); + void startLoading(); void openPostList(PostListModel model); diff --git a/core/src/main/java/it/cosenonjaviste/category/CategoryListModel.java b/core/src/main/java/it/cosenonjaviste/category/CategoryListModel.java new file mode 100644 index 0000000..6a3f432 --- /dev/null +++ b/core/src/main/java/it/cosenonjaviste/category/CategoryListModel.java @@ -0,0 +1,41 @@ +package it.cosenonjaviste.category; + +import java.util.List; + +import it.cosenonjaviste.model.Category; + +public class CategoryListModel { + List items; + + boolean errorLoading; + + public boolean isEmpty() { + return items == null || items.isEmpty(); + } + + public int size() { + return items.size(); + } + + public Category get(int index) { + return items.get(index); + } + + public void done(List items) { + this.items = items; + errorLoading = false; + } + + public void error() { + items = null; + errorLoading = true; + } + + public List getItems() { + return items; + } + + public boolean isError() { + return errorLoading; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/core/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java similarity index 86% rename from app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java rename to core/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 124af49..22c23c5 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/core/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -24,6 +24,8 @@ public class CategoryListPresenter extends RxMvpPresenter { - getView().startLoading(); - }, + () -> getView().startLoading(), posts -> { getModel().done(posts); getView().update(getModel()); }, throwable -> { - getModel().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java b/core/src/main/java/it/cosenonjaviste/category/CategoryListView.java similarity index 91% rename from app/src/main/java/it/cosenonjaviste/category/CategoryListView.java rename to core/src/main/java/it/cosenonjaviste/category/CategoryListView.java index e91177d..8a15bb8 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java +++ b/core/src/main/java/it/cosenonjaviste/category/CategoryListView.java @@ -5,6 +5,8 @@ public interface CategoryListView { void update(CategoryListModel model); + void showError(); + void startLoading(); void openPostList(PostListModel model); diff --git a/app/src/test/java/it/cosenonjaviste/model/JsonStubs.java b/core/src/test/java/it/cosenonjaviste/model/JsonStubs.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/model/JsonStubs.java rename to core/src/test/java/it/cosenonjaviste/model/JsonStubs.java diff --git a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java b/core/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java rename to core/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java From 6bc98c3f42ef5e838e66de175b3561e3cd3b3e18 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 14:07:50 +0200 Subject: [PATCH 031/300] Restored test --- .../mvp/author/AuthorListPresenterTest.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java diff --git a/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java new file mode 100644 index 0000000..b01520c --- /dev/null +++ b/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -0,0 +1,78 @@ +package it.cosenonjaviste.mvp.author; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import it.cosenonjaviste.author.AuthorListModel; +import it.cosenonjaviste.author.AuthorListPresenter; +import it.cosenonjaviste.author.AuthorListView; +import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; +import it.cosenonjaviste.post.PostListModel; +import rx.Observable; + +import static it.cosenonjaviste.TestData.authorResponse; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class AuthorListPresenterTest { + + @Mock AuthorListView view; + + @InjectMocks AuthorListPresenter presenter; + + @Mock WordPressService wordPressService; + + @Captor ArgumentCaptor modelCaptor; + + private TestLifeCycle testLifeCycle = new TestLifeCycle(); + + @Test + public void testLoad() { + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + + AuthorListModel model = new AuthorListModel(); + testLifeCycle.initAndResume(model, presenter, view); + + assertThat(model.size()).isEqualTo(2); + } + + @Test + public void testRetryAfterError() { + when(wordPressService.listAuthors()) + .thenReturn(Observable.error(new RuntimeException())); + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + + AuthorListModel model = new AuthorListModel(); + testLifeCycle.initAndResume(model, presenter, view); + + presenter.loadAuthors(); + + assertThat(model.size()).isEqualTo(2); + } + + @Test + public void testGoToDetail() { + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + + AuthorListModel authorListModel = new AuthorListModel(); + testLifeCycle.initAndResume(authorListModel, presenter, view); + + presenter.goToAuthorDetail(1); + + verify(view).openPostList(modelCaptor.capture()); + + PostListModel model = modelCaptor.getValue(); + assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); + } +} \ No newline at end of file From 0c8e90d893d2f40492849f0bba6899447270f49b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 14:08:33 +0200 Subject: [PATCH 032/300] Fix null pointer --- .../src/main/java/it/cosenonjaviste/author/AuthorListModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java b/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java index 829ea11..c68b6ff 100644 --- a/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java +++ b/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java @@ -10,7 +10,7 @@ public class AuthorListModel { boolean errorLoading; public boolean isEmpty() { - return items.isEmpty(); + return items == null || items.isEmpty(); } public int size() { From ab749ddf023523cf3ef3e9ba310603d2655c9eb7 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 14:41:23 +0200 Subject: [PATCH 033/300] Espresso 2.1 config --- app/build.gradle | 6 ++++-- build.gradle | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 97f520e..3fcd541 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,11 +96,13 @@ dependencies { exclude group: 'org.hamcrest', module: 'hamcrest-core' } androidTestCompile 'com.squareup.spoon:spoon-client:1.0.5' - androidTestCompile('com.android.support.test.espresso:espresso-core:2.0') { + androidTestCompile 'com.android.support.test:runner:0.2' + androidTestCompile 'com.android.support.test:rules:0.2' + androidTestCompile('com.android.support.test.espresso:espresso-core:2.1') { exclude group: 'javax.inject', module: 'javax.inject' exclude group: 'com.squareup', module: 'javawriter' } - androidTestCompile 'com.android.support.test:testing-support-lib:0.1' + androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.1' androidTestCompile 'com.squareup.okhttp:mockwebserver:2.0.0' testCompile 'junit:junit:4.12' diff --git a/build.gradle b/build.gradle index 5791eff..46c2ce5 100644 --- a/build.gradle +++ b/build.gradle @@ -17,4 +17,7 @@ allprojects { repositories { jcenter() } + configurations.all { + resolutionStrategy.force 'com.android.support:support-annotations:22.1.1' + } } From 0e5b890883cbd91567b850c0a79cf7246b3e6783 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 16:16:29 +0200 Subject: [PATCH 034/300] New class EspressoSchedulerManager --- .../androidtest/base/DaggerRule.java | 30 ------------------- .../androidtest/base/EspressoExecutor.java | 5 +++- .../base/EspressoSchedulerManager.java | 17 +++++++++++ .../base/MvpEspressoTestModule.java | 2 +- .../lib/mvp/utils/SchedulerManager.java | 10 +------ 5 files changed, 23 insertions(+), 41 deletions(-) create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoSchedulerManager.java diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java index 34bda16..3481c85 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java @@ -3,14 +3,9 @@ import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; -import org.mockito.MockitoAnnotations; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.functions.Action1; -import rx.schedulers.Schedulers; - -import static android.support.test.espresso.Espresso.registerIdlingResources; public class DaggerRule implements TestRule { @@ -23,40 +18,15 @@ public DaggerRule(Action1 afterInjectAction) { @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { - - setupDexmaker(); - - //TODO - MockitoAnnotations.initMocks(this); - - final EspressoExecutor espressoExecutor = EspressoExecutor.newCachedThreadPool(); - TestComponent component = DaggerUtils.getComponent(); if (afterInjectAction != null) { afterInjectAction.call(component); } CoseNonJavisteApp.component = component; - registerIdlingResources(espressoExecutor); - - SchedulerManager.setIo(Schedulers.from(espressoExecutor)); - base.evaluate(); } }; } - - /** - * Workaround for Mockito and JB-MR2 incompatibility to avoid - * java.lang.IllegalArgumentException: dexcache == null - * - * @see - * https://code.google.com/p/dexmaker/issues/detail?id=2 - */ - private void setupDexmaker() { -// // Explicitly set the Dexmaker cache, so tests that use mockito work -// final String dexCache = getInstrumentation().getTargetContext().getCacheDir().getPath(); -// System.setProperty("dexmaker.dexcache", dexCache); - } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java index 010b11b..f2cf9fb 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java @@ -7,6 +7,8 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import static android.support.test.espresso.Espresso.registerIdlingResources; + public class EspressoExecutor extends ThreadPoolExecutor implements IdlingResource { private int runningTasks; @@ -22,7 +24,8 @@ public static EspressoExecutor newCachedThreadPool() { if (singleton == null) { singleton = new EspressoExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, - new SynchronousQueue()); + new SynchronousQueue<>()); + registerIdlingResources(singleton); } return singleton; } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoSchedulerManager.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoSchedulerManager.java new file mode 100644 index 0000000..8fdaf7e --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoSchedulerManager.java @@ -0,0 +1,17 @@ +package it.cosenonjaviste.androidtest.base; + +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import rx.Observable; +import rx.Scheduler; +import rx.schedulers.Schedulers; + +import static rx.android.schedulers.AndroidSchedulers.mainThread; + +public class EspressoSchedulerManager extends SchedulerManager { + + private Scheduler scheduler = Schedulers.from(EspressoExecutor.newCachedThreadPool()); + + @Override public Observable bindObservable(Observable observable) { + return observable.subscribeOn(scheduler).observeOn(mainThread()); + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java index 74cb1da..fb8bf12 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java @@ -19,7 +19,7 @@ public class MvpEspressoTestModule { } @Provides @Singleton SchedulerManager provideSchedulerManager() { - return new SchedulerManager(); + return new EspressoSchedulerManager(); } @Provides @Singleton PageUrlManager providePostDetailUrlManager(MockWebServerWrapper server) { diff --git a/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java index 66814b0..6c5b7ce 100644 --- a/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java +++ b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java @@ -9,15 +9,7 @@ public class SchedulerManager { public static Scheduler io = Schedulers.io(); - public static Observable background(Observable observable) { - return observable.subscribeOn(io).observeOn(mainThread()); - } - - public static void setIo(Scheduler io) { - SchedulerManager.io = io; - } - public Observable bindObservable(Observable observable) { - return background(observable); + return observable.subscribeOn(io).observeOn(mainThread()); } } From 98739c81881100484bef2a1361f923003b59a622 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 16:28:25 +0200 Subject: [PATCH 035/300] Component not static in Application --- .../androidtest/MainActivityTest.java | 29 +++++++++++++------ .../androidtest/base/DaggerRule.java | 10 +++++-- .../androidtest/base/DaggerUtils.java | 7 ----- .../it/cosenonjaviste/CoseNonJavisteApp.java | 6 +++- 4 files changed, 32 insertions(+), 20 deletions(-) delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index faba389..286adc2 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -1,21 +1,24 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; import org.junit.runner.RunWith; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.MainActivity; import it.cosenonjaviste.R; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.ActivityRule; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; @@ -43,9 +46,14 @@ public class MainActivityTest { @Inject TwitterService twitterService; - private final ActivityRule fragmentRule = new ActivityRule<>(MainActivity.class); + @Rule public ActivityTestRule activityRule = new ActivityTestRule<>(MainActivity.class, false, false); + + @Before + public void setUp() throws Exception { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); when(wordPressService.listPosts(eq(1))) @@ -61,29 +69,32 @@ public class MainActivityTest { .thenReturn(TestData.tweets()); server.initDispatcher("CoseNonJaviste"); - }); - - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + } @Test public void showMainActivity() { + activityRule.launchActivity(null); } @Test public void showCategories() { + activityRule.launchActivity(null); clickOnDrawer(1); onView(withText("cat 0")).check(matches(isDisplayed())); } @Test public void showAuthors() { + activityRule.launchActivity(null); clickOnDrawer(2); onView(withText("name 0")).check(matches(isDisplayed())); } @Test public void showTweets() { + activityRule.launchActivity(null); clickOnDrawer(3); onView(withText("tweet text 1")).check(matches(isDisplayed())); } @Test public void showContactForm() { + activityRule.launchActivity(null); clickOnDrawer(4); } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java index 3481c85..1191aa3 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java @@ -1,5 +1,8 @@ package it.cosenonjaviste.androidtest.base; +import android.content.Context; +import android.support.test.InstrumentationRegistry; + import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -18,14 +21,15 @@ public DaggerRule(Action1 afterInjectAction) { @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { - TestComponent component = DaggerUtils.getComponent(); + + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); if (afterInjectAction != null) { afterInjectAction.call(component); } - CoseNonJavisteApp.component = component; base.evaluate(); - } }; } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java deleted file mode 100644 index 9163503..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -public class DaggerUtils { - public static TestComponent getComponent() { - return DaggerTestComponent.builder().build(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java index 6879b1d..1441f14 100644 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java @@ -19,7 +19,7 @@ }) public class CoseNonJavisteApp extends Application { - public static ApplicationComponent component; + private ApplicationComponent component; @Override public void onCreate() { super.onCreate(); @@ -35,4 +35,8 @@ public ApplicationComponent getComponent() { public static ApplicationComponent getComponent(Context context) { return ((CoseNonJavisteApp) context.getApplicationContext()).getComponent(); } + + public void setComponent(ApplicationComponent component) { + this.component = component; + } } From 6b11ae187aa8b302e2554a8985fe220a11e40f0a Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 17:01:44 +0200 Subject: [PATCH 036/300] Support library ActivityTestRule --- app/build.gradle | 8 +- .../androidtest/AuthorListTest.java | 29 +++-- .../androidtest/CategoryListTest.java | 36 +++-- .../cosenonjaviste/androidtest/PageTest.java | 26 ++-- .../androidtest/PostListTest.java | 30 +++-- .../androidtest/TweetListTest.java | 27 ++-- .../androidtest/base/ActivityRule.java | 123 ------------------ .../androidtest/base/DaggerRule.java | 36 ----- .../androidtest/base/FragmentRule.java | 39 ++++-- 9 files changed, 128 insertions(+), 226 deletions(-) delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java diff --git a/app/build.gradle b/app/build.gradle index 3fcd541..aee4f66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,8 +91,8 @@ dependencies { apt 'org.parceler:parceler:0.2.14' androidTestApt 'com.google.dagger:dagger-compiler:2.0' - androidTestCompile 'com.google.dexmaker:dexmaker:1.0' - androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.0') { + androidTestCompile 'com.google.dexmaker:dexmaker:1.2' + androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.2') { exclude group: 'org.hamcrest', module: 'hamcrest-core' } androidTestCompile 'com.squareup.spoon:spoon-client:1.0.5' @@ -104,10 +104,6 @@ dependencies { } androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.1' androidTestCompile 'com.squareup.okhttp:mockwebserver:2.0.0' - - testCompile 'junit:junit:4.12' - testCompile 'org.mockito:mockito-core:1.9.5' - testCompile 'org.assertj:assertj-core:1.7.0' } // Define coverage source. diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java index cbfbaa6..acab695 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java @@ -1,41 +1,46 @@ package it.cosenonjaviste.androidtest; -import android.support.test.runner.AndroidJUnit4; +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; -import org.junit.runner.RunWith; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.model.WordPressService; import static org.mockito.Mockito.when; -@RunWith(AndroidJUnit4.class) public class AuthorListTest { @Inject WordPressService wordPressService; - private final FragmentRule fragmentRule = FragmentRule.create(AuthorListFragment.class, new AuthorListModel()); + @Rule public FragmentRule fragmentRule = new FragmentRule(AuthorListFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); + when(wordPressService.listAuthors()) .thenReturn(TestData.authorResponse(2)); - }); - - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + } @Test public void testAuthorList() { -// showUi(); + + fragmentRule.launchFragment(new AuthorListModel()); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java index 1eddee7..090012a 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java @@ -1,34 +1,50 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import org.junit.Before; import org.junit.Rule; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; +import org.junit.Test; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.author.AuthorListFragment; -import it.cosenonjaviste.author.AuthorListModel; +import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.category.CategoryListFragment; +import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.model.WordPressService; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.mockito.Mockito.when; public class CategoryListTest { @Inject WordPressService wordPressService; - private final FragmentRule fragmentRule = FragmentRule.create(AuthorListFragment.class, new AuthorListModel()); + @Rule public FragmentRule fragmentRule = new FragmentRule(CategoryListFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); + } + + @Test public void testCategoryList() { when(wordPressService.listCategories()) .thenReturn(TestData.categoryResponse(3)); - }); - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + fragmentRule.launchFragment(new CategoryListModel()); - public void testCategoryList() throws InterruptedException { + onView(withText("cat 1")).check(matches(isDisplayed())); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java index 4b29889..b460354 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java @@ -1,15 +1,19 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; import javax.inject.Inject; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.CoseNonJavisteApp; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -17,16 +21,20 @@ public class PageTest { @Inject MockWebServerWrapper server; - private final FragmentRule fragmentRule = FragmentRule.create(PageFragment.class, new PageModel("url")); + @Rule public FragmentRule fragmentRule = new FragmentRule(PageFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); - server.initDispatcher("CoseNonJaviste"); - }); - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + server.initDispatcher("CoseNonJaviste"); + } @Test public void testDetailFragment() { -// showUi(); + fragmentRule.launchFragment(new PageModel("url")); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index c7458d3..2fbcbb0 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -1,15 +1,19 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; @@ -31,28 +35,38 @@ public class PostListTest { @Inject WordPressService wordPressService; - private final FragmentRule fragmentRule = FragmentRule.create(PostListFragment.class, new PostListModel()); + @Rule public FragmentRule fragmentRule = new FragmentRule(PostListFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); + when(wordPressService.listPosts(eq(1))) .thenReturn(TestData.postResponse(0, 10)); when(wordPressService.listPosts(eq(2))) .thenReturn(TestData.postResponse(10, 10)); - }); - - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + } @Test public void testPostList() throws InterruptedException { + fragmentRule.launchFragment(new PostListModel()); + onView(withText("post title 1")).check(matches(isDisplayed())); } @Test public void testGoToPostDetail() { + fragmentRule.launchFragment(new PostListModel()); + onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) .atPosition(3).perform(click()); } @Test public void testLoadMore() { + fragmentRule.launchFragment(new PostListModel()); + onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) .atPosition(9).check(matches(isDisplayed())); onView(withText("post title 10")).check(matches(isDisplayed())); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java index 740aebf..00140ad 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java @@ -1,18 +1,21 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; import org.junit.runner.RunWith; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; @@ -29,17 +32,23 @@ public class TweetListTest { @Inject TwitterService twitterService; - private final FragmentRule fragmentRule = FragmentRule.create(TweetListFragment.class, new TweetListModel()); + @Rule public FragmentRule fragmentRule = new FragmentRule(TweetListFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); + + component.inject(this); - private final DaggerRule daggerRule = new DaggerRule(objectGraph -> { - objectGraph.inject(this); when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); - }); - - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + } @Test public void testPostList() { + fragmentRule.launchFragment(new TweetListModel()); + onView(withText("tweet text 1")).check(matches(isDisplayed())); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java deleted file mode 100644 index a39fd0a..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2015 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package it.cosenonjaviste.androidtest.base; - -import android.app.Activity; -import android.app.Instrumentation; -import android.content.Intent; -import android.support.test.InstrumentationRegistry; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -/** - * A JUnit {@link Rule @Rule} which launches an activity when your test starts. Stop extending - * gross {@code ActivityInstrumentationBarfCase2}! - *

- * Usage: - *

{@code
- * @Rule
- * public final ActivityRule example =
- *     new ActivityRule<>(ExampleActivity.class);
- * }
- * - * This will automatically launch the activity for each test method. The instance will also be - * created sooner should you need to use it in a {@link Before @Before} method. - *

- * You can also customize the way in which the activity is launched by overriding - * {@link #getLaunchIntent(String, Class)} and customizing or replacing the {@link Intent}. - *

{@code
- * @Rule
- * public final ActivityRule example =
- *     new ActivityRule(ExampleActivity.class) {
- *       @Override
- *       protected Intent getLaunchIntent(String packageName, Class activityClass) {
- *         Intent intent = super.getLaunchIntent(packageName, activityClass);
- *         intent.putExtra("Hello", "World!");
- *         return intent;
- *       }
- *     };
- * }
- */ -public class ActivityRule implements TestRule { - private final Class activityClass; - - private T activity; - private Instrumentation instrumentation; - - public ActivityRule(Class activityClass) { - this.activityClass = activityClass; - } - - protected Intent getLaunchIntent(String targetPackage, Class activityClass) { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setClassName(targetPackage, activityClass.getName()); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - return intent; - } - - /** - * Get the running instance of the specified activity. This will launch it if it is not already - * running. - */ - public final T get() { - launchActivity(); - return activity; - } - - /** Get the {@link Instrumentation} instance for this test. */ - public final Instrumentation instrumentation() { - launchActivity(); - return instrumentation; - } - - @Override public final Statement apply(final Statement base, Description description) { - return new Statement() { - @Override public void evaluate() throws Throwable { - launchActivity(); - - base.evaluate(); - - if (!activity.isFinishing()) { - activity.finish(); - } - activity = null; // Eager reference kill in case someone leaked our reference. - } - }; - } - - private Instrumentation fetchInstrumentation() { - Instrumentation result = instrumentation; - return result != null ? result - : (instrumentation = InstrumentationRegistry.getInstrumentation()); - } - - @SuppressWarnings("unchecked") // Guarded by generics at the constructor. - private void launchActivity() { - if (activity != null) return; - - Instrumentation instrumentation = fetchInstrumentation(); - - String targetPackage = instrumentation.getTargetContext().getPackageName(); - Intent intent = getLaunchIntent(targetPackage, activityClass); - - activity = (T) instrumentation.startActivitySync(intent); - instrumentation.waitForIdleSync(); - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java deleted file mode 100644 index 1191aa3..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ /dev/null @@ -1,36 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; - -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -import it.cosenonjaviste.CoseNonJavisteApp; -import rx.functions.Action1; - -public class DaggerRule implements TestRule { - - private Action1 afterInjectAction; - - public DaggerRule(Action1 afterInjectAction) { - this.afterInjectAction = afterInjectAction; - } - - @Override public Statement apply(Statement base, Description description) { - return new Statement() { - @Override public void evaluate() throws Throwable { - - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - if (afterInjectAction != null) { - afterInjectAction.call(component); - } - - base.evaluate(); - } - }; - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index b034cb8..0b86d0a 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -1,31 +1,44 @@ package it.cosenonjaviste.androidtest.base; +import android.content.Context; import android.content.Intent; +import android.os.Bundle; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; +import android.support.v4.app.Fragment; import org.parceler.Parcels; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; -public class FragmentRule extends ActivityRule { +public class FragmentRule extends ActivityTestRule { + private Class fragmentClass; - private final Class viewClass; + public FragmentRule(Class fragmentClass) { + super(SingleFragmentActivity.class, false, false); + this.fragmentClass = fragmentClass; + } - private Object model; + public SingleFragmentActivity launchFragment() { + return launchFragment(null); + } - public static FragmentRule create(Class viewClass, M model) { - return new FragmentRule(viewClass, model); + public void launchFragment(Object model) { + Bundle bundle = new Bundle(); + bundle.putParcelable(RxMvpPresenter.MODEL, Parcels.wrap(model)); + launchFragment(bundle); } - private FragmentRule(Class viewClass, Object model) { - super(SingleFragmentActivity.class); - this.viewClass = viewClass; - this.model = model; + public SingleFragmentActivity launchFragment(Bundle b) { + Intent intent = SingleFragmentActivity.populateIntent(new Intent(), fragmentClass); + if (b != null) { + intent.putExtras(b); + } + return launchActivity(intent); } - @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { - Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(RxMvpPresenter.MODEL, Parcels.wrap(model)); - return intent; + public T getApplication() { + return (T) InstrumentationRegistry.getTargetContext().getApplicationContext(); } } From 659f01682acfa7d92a4d68778719c1dac3827fcf Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 17:09:42 +0200 Subject: [PATCH 037/300] Dagger test config refactoring --- .../androidtest/AuthorListTest.java | 27 ++++++++----------- .../androidtest/CategoryListTest.java | 16 +++-------- .../androidtest/MainActivityTest.java | 15 +++-------- .../cosenonjaviste/androidtest/PageTest.java | 16 +++-------- .../androidtest/PostListTest.java | 16 +++-------- .../androidtest/TweetListTest.java | 19 ++++--------- .../androidtest/dagger/DaggerUtils.java | 15 +++++++++++ .../MvpEspressoTestModule.java | 4 ++- .../{base => dagger}/TestComponent.java | 2 +- 9 files changed, 47 insertions(+), 83 deletions(-) create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/DaggerUtils.java rename app/src/androidTest/java/it/cosenonjaviste/androidtest/{base => dagger}/MvpEspressoTestModule.java (85%) rename app/src/androidTest/java/it/cosenonjaviste/androidtest/{base => dagger}/TestComponent.java (95%) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java index acab695..ddd196b 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java @@ -1,23 +1,22 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.model.WordPressService; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.mockito.Mockito.when; public class AuthorListTest { @@ -26,21 +25,17 @@ public class AuthorListTest { @Rule public FragmentRule fragmentRule = new FragmentRule(AuthorListFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); - - when(wordPressService.listAuthors()) - .thenReturn(TestData.authorResponse(2)); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); } @Test public void testAuthorList() { + when(wordPressService.listAuthors()) + .thenReturn(TestData.authorResponse(2)); fragmentRule.launchFragment(new AuthorListModel()); + + onView(withText("name 1")).check(matches(isDisplayed())); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java index 090012a..45c1db0 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java @@ -1,19 +1,14 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.model.WordPressService; @@ -30,13 +25,8 @@ public class CategoryListTest { @Rule public FragmentRule fragmentRule = new FragmentRule(CategoryListFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); } @Test public void testCategoryList() { diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index 286adc2..b85e710 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -1,7 +1,5 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; @@ -12,13 +10,11 @@ import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.MainActivity; import it.cosenonjaviste.R; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; @@ -48,13 +44,8 @@ public class MainActivityTest { @Rule public ActivityTestRule activityRule = new ActivityTestRule<>(MainActivity.class, false, false); - @Before - public void setUp() throws Exception { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); when(wordPressService.listPosts(eq(1))) .thenReturn(TestData.postResponse(10)); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java index b460354..fa77920 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java @@ -1,19 +1,14 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -23,13 +18,8 @@ public class PageTest { @Rule public FragmentRule fragmentRule = new FragmentRule(PageFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); server.initDispatcher("CoseNonJaviste"); } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index 2fbcbb0..603165b 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -1,19 +1,14 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; @@ -37,13 +32,8 @@ public class PostListTest { @Rule public FragmentRule fragmentRule = new FragmentRule(PostListFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); when(wordPressService.listPosts(eq(1))) .thenReturn(TestData.postResponse(0, 10)); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java index 00140ad..9311b15 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java @@ -1,7 +1,5 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import org.junit.Before; @@ -11,11 +9,9 @@ import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; @@ -34,19 +30,14 @@ public class TweetListTest { @Rule public FragmentRule fragmentRule = new FragmentRule(TweetListFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); + } + @Test public void testPostList() { when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); - } - @Test public void testPostList() { fragmentRule.launchFragment(new TweetListModel()); onView(withText("tweet text 1")).check(matches(isDisplayed())); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/DaggerUtils.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/DaggerUtils.java new file mode 100644 index 0000000..5e1c902 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/DaggerUtils.java @@ -0,0 +1,15 @@ +package it.cosenonjaviste.androidtest.dagger; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import it.cosenonjaviste.CoseNonJavisteApp; + +public class DaggerUtils { + public static TestComponent createTestComponent() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); + return component; + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/MvpEspressoTestModule.java similarity index 85% rename from app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java rename to app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/MvpEspressoTestModule.java index fb8bf12..b71cfe8 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/MvpEspressoTestModule.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.androidtest.base; +package it.cosenonjaviste.androidtest.dagger; import org.mockito.Mockito; @@ -6,6 +6,8 @@ import dagger.Module; import dagger.Provides; +import it.cosenonjaviste.androidtest.base.EspressoSchedulerManager; +import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/TestComponent.java similarity index 95% rename from app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java rename to app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/TestComponent.java index 7e12514..6b4b953 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/TestComponent.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.androidtest.base; +package it.cosenonjaviste.androidtest.dagger; import javax.inject.Singleton; From 472b8f7aab123b7299a296c2a42c91c6d153b08b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 17:38:59 +0200 Subject: [PATCH 038/300] Fix travis config --- .travis.yml | 4 ++-- circle.yml | 28 ---------------------------- 2 files changed, 2 insertions(+), 30 deletions(-) delete mode 100644 circle.yml diff --git a/.travis.yml b/.travis.yml index b3681d5..3c8a063 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,8 @@ env: android: components: - platform-tools - - build-tools-21.1.2 - - android-21 + - build-tools-22.0.1 + - android-22 - extra-google-m2repository - extra-android-m2repository - sys-img-armeabi-v7a-android-19 diff --git a/circle.yml b/circle.yml deleted file mode 100644 index b002c44..0000000 --- a/circle.yml +++ /dev/null @@ -1,28 +0,0 @@ -general: - artifacts: - - mvp-test/build/outputs - - mvp/build/outputs - -machine: - environment: - ANDROID_HOME: /home/ubuntu/android - java: - version: oraclejdk8 - -dependencies: - cache_directories: - - ~/.android - - ~/android - - override: - - sh ./install-dependencies.sh - - ./gradlew dependencies - -test: - override: - - $ANDROID_HOME/tools/emulator -avd testing -no-window -no-boot-anim -no-audio: - background: true - parallel: true - - bash ./wait.sh: - parallel: true - - ./gradlew mvp-test:build mvp-test:jacocoTestReport From 7692c996319df2faa8fbd2c7ca5694384588157a Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 22:00:59 +0200 Subject: [PATCH 039/300] Fix travis config --- .travis.yml | 2 +- core/build.gradle | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c8a063..fe11d22 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,4 +31,4 @@ before_script: - android-wait-for-emulator - adb shell input keyevent 82 & -script: ./gradlew connectedAndroidTest testDebug mergeTestCodeCoverageResults jacocoTestReport coveralls --stacktrace \ No newline at end of file +script: ./gradlew :app:connectedAndroidTest :core:testDebug :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle index abed3c8..984db80 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,7 +1,13 @@ apply plugin: 'java' +apply plugin: "jacoco" + apply plugin: 'me.tatarka.retrolambda' +jacoco { + toolVersion = "0.7.2.201409121644" +} + dependencies { compile project(':coremvp') compile 'com.squareup.retrofit:retrofit:1.9.0' From 78d838591d8812da7aef9c1e31efc93a26ec540a Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 22:07:04 +0200 Subject: [PATCH 040/300] Fix travis config --- app/build.gradle | 2 +- core/build.gradle | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index aee4f66..df6d837 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -152,7 +152,7 @@ task mergeTestCodeCoverageResults(type: JacocoMerge) { description = 'Merge test code coverage results from junit and instrumentation test' destinationFile = file("build/outputs/code-coverage/merged-coverage.exec") doFirst {delete destinationFile} - executionData = files('build/outputs/code-coverage/connected/coverage.ec', 'build/jacoco/testDebug.exec') + executionData = files('build/outputs/code-coverage/connected/coverage.ec', '../core/build/jacoco/testDebug.exec') } task jacocoTestReport(type: JacocoReport) { diff --git a/core/build.gradle b/core/build.gradle index 984db80..aca62e1 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -8,6 +8,11 @@ jacoco { toolVersion = "0.7.2.201409121644" } +retrolambda { + oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home' +// oldJdk '/usr/lib/jvm/jdk1.7.0' +} + dependencies { compile project(':coremvp') compile 'com.squareup.retrofit:retrofit:1.9.0' From 3f4ad190109296302fcceebd6750019a8d608a74 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 3 May 2015 11:11:49 +0200 Subject: [PATCH 041/300] Fix travis config --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fe11d22..f18c705 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,4 +31,4 @@ before_script: - android-wait-for-emulator - adb shell input keyevent 82 & -script: ./gradlew :app:connectedAndroidTest :core:testDebug :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file +script: ./gradlew :app:connectedAndroidTest :core:test :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file From fead67069b7f5d960932037dd2bee97d54984d6d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 3 May 2015 11:25:48 +0200 Subject: [PATCH 042/300] Fix travis config --- .travis.yml | 2 +- core/build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index f18c705..2679991 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,4 +31,4 @@ before_script: - android-wait-for-emulator - adb shell input keyevent 82 & -script: ./gradlew :app:connectedAndroidTest :core:test :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file +script: ./gradlew :core:test :app:connectedAndroidTest :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle index aca62e1..5c7c8b0 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -9,8 +9,8 @@ jacoco { } retrolambda { - oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home' -// oldJdk '/usr/lib/jvm/jdk1.7.0' +// oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home' + oldJdk '/usr/lib/jvm/jdk1.7.0' } dependencies { From 0d72b958870d19dc8ca54b000a77f244cb766bcf Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 3 May 2015 11:33:11 +0200 Subject: [PATCH 043/300] Fix travis config --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 5c7c8b0..a123d22 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -10,7 +10,7 @@ jacoco { retrolambda { // oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home' - oldJdk '/usr/lib/jvm/jdk1.7.0' + oldJdk '/usr/lib/jvm/java-7-oracle' } dependencies { From 604bb819efb4342ea94721c6b7b5e19e14ed4595 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 3 May 2015 11:47:53 +0200 Subject: [PATCH 044/300] Fix travis config --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index df6d837..4d6367e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -152,7 +152,7 @@ task mergeTestCodeCoverageResults(type: JacocoMerge) { description = 'Merge test code coverage results from junit and instrumentation test' destinationFile = file("build/outputs/code-coverage/merged-coverage.exec") doFirst {delete destinationFile} - executionData = files('build/outputs/code-coverage/connected/coverage.ec', '../core/build/jacoco/testDebug.exec') + executionData = files('build/outputs/code-coverage/connected/coverage.ec', '../core/build/jacoco/test.exec') } task jacocoTestReport(type: JacocoReport) { From dfff25811aaa68874e44415d086319eb5df7ea5b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Tue, 5 May 2015 22:58:23 +0200 Subject: [PATCH 045/300] New class ViewMock to simplify JUnit tests --- .../java/it/cosenonjaviste/mvp/ViewMock.java | 69 +++++++++++++++++++ .../mvp/author/AuthorListPresenterTest.java | 15 ++-- .../mvp/page/PagePresenterTest.java | 20 ++---- 3 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 core/src/test/java/it/cosenonjaviste/mvp/ViewMock.java diff --git a/core/src/test/java/it/cosenonjaviste/mvp/ViewMock.java b/core/src/test/java/it/cosenonjaviste/mvp/ViewMock.java new file mode 100644 index 0000000..10b4a10 --- /dev/null +++ b/core/src/test/java/it/cosenonjaviste/mvp/ViewMock.java @@ -0,0 +1,69 @@ +package it.cosenonjaviste.mvp; + +import org.mockito.Mockito; +import org.mockito.stubbing.Answer; +import org.mockito.verification.VerificationMode; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; +import rx.Observable; +import rx.subjects.PublishSubject; + +public class ViewMock { + + private V mock; + + private Map> callbacks = new HashMap<>(); + + private Class viewClass; + + private TestLifeCycle testLifeCycle = new TestLifeCycle(); + + public ViewMock(Class viewClass) { + this.viewClass = viewClass; + mock = Mockito.mock(viewClass, (Answer) invocation -> { + if (invocation.getMethod().getReturnType().isAssignableFrom(Observable.class)) { + Method method = invocation.getMethod(); + PublishSubject subject = PublishSubject.create(); + callbacks.put(method, subject); + return subject; + } + return null; + }); + } + + public V get() { + return mock; + } + + public V emit(Object value) { + return Mockito.mock(viewClass, (Answer) invocation -> { + PublishSubject subject = callbacks.get(invocation.getMethod()); + subject.onNext(value); + return null; + }); + } + + public V text(String value) { + return emit(value); + } + + public V click() { + return emit(null); + } + + public V verify() { + return Mockito.verify(get()); + } + + public V verify(VerificationMode mode) { + return Mockito.verify(get(), mode); + } + + public void initAndResume(M model, RxMvpPresenter presenter) { + testLifeCycle.initAndResume(model, presenter, mock); + } +} diff --git a/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index b01520c..28f1d1f 100644 --- a/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -12,27 +12,24 @@ import it.cosenonjaviste.author.AuthorListPresenter; import it.cosenonjaviste.author.AuthorListView; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.TestLifeCycle; +import it.cosenonjaviste.mvp.ViewMock; import it.cosenonjaviste.post.PostListModel; import rx.Observable; import static it.cosenonjaviste.TestData.authorResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class AuthorListPresenterTest { - @Mock AuthorListView view; - @InjectMocks AuthorListPresenter presenter; @Mock WordPressService wordPressService; @Captor ArgumentCaptor modelCaptor; - private TestLifeCycle testLifeCycle = new TestLifeCycle(); + private ViewMock view = new ViewMock<>(AuthorListView.class); @Test public void testLoad() { @@ -40,7 +37,7 @@ public void testLoad() { .thenReturn(authorResponse(2)); AuthorListModel model = new AuthorListModel(); - testLifeCycle.initAndResume(model, presenter, view); + view.initAndResume(model, presenter); assertThat(model.size()).isEqualTo(2); } @@ -53,7 +50,7 @@ public void testRetryAfterError() { .thenReturn(authorResponse(2)); AuthorListModel model = new AuthorListModel(); - testLifeCycle.initAndResume(model, presenter, view); + view.initAndResume(model, presenter); presenter.loadAuthors(); @@ -66,11 +63,11 @@ public void testGoToDetail() { .thenReturn(authorResponse(2)); AuthorListModel authorListModel = new AuthorListModel(); - testLifeCycle.initAndResume(authorListModel, presenter, view); + view.initAndResume(authorListModel, presenter); presenter.goToAuthorDetail(1); - verify(view).openPostList(modelCaptor.capture()); + view.verify().openPostList(modelCaptor.capture()); PostListModel model = modelCaptor.getValue(); assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); diff --git a/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 17392a2..6fa0459 100644 --- a/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -1,44 +1,32 @@ package it.cosenonjaviste.mvp.page; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.mvp.TestLifeCycle; +import it.cosenonjaviste.mvp.ViewMock; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.page.PagePresenter; import it.cosenonjaviste.page.PageUrlManager; import it.cosenonjaviste.page.PageView; -import it.cosenonjaviste.post.PostListModel; import static org.assertj.core.api.Assertions.assertThat; @RunWith(MockitoJUnitRunner.class) public class PagePresenterTest { - @Mock PageView view; - - private TestLifeCycle testLifeCycle = new TestLifeCycle(); + private ViewMock view = new ViewMock<>(PageView.class); @Spy PageUrlManager pageUrlManager = new PageUrlManager(); @InjectMocks PagePresenter presenter; - @Captor ArgumentCaptor modelCaptor; - - @Before - public void setup() { - testLifeCycle.initAndResume(new PageModel("url"), presenter, view); - } - @Test public void testLoad() { + view.initAndResume(new PageModel("url"), presenter); + assertThat(presenter.getPostUrl()).isEqualTo("url"); } } \ No newline at end of file From 7950112299f8b67fc5c76b1ee8fdb971f072b53d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 30 May 2015 17:21:04 +0200 Subject: [PATCH 046/300] AppCompat 22.2.0 --- androidMvp/build.gradle | 4 ++-- app/build.gradle | 4 +++- app/src/main/java/it/cosenonjaviste/MainActivity.java | 4 ++-- app/src/main/res/values-v21/styles.xml | 10 ---------- app/src/main/res/values/styles.xml | 6 ++---- build.gradle | 5 +++-- 6 files changed, 12 insertions(+), 21 deletions(-) delete mode 100644 app/src/main/res/values-v21/styles.xml diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle index 52ad28a..a30b2f1 100644 --- a/androidMvp/build.gradle +++ b/androidMvp/build.gradle @@ -30,7 +30,7 @@ android { dependencies { compile project(':coremvp') - compile 'com.android.support:appcompat-v7:21.0.3' - compile 'com.android.support:support-annotations:20.0.0' + compile 'com.android.support:appcompat-v7:22.2.0' + compile 'com.android.support:support-annotations:22.2.0' compile 'org.parceler:parceler-api:0.2.14' } diff --git a/app/build.gradle b/app/build.gradle index 4d6367e..05ddea1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,6 +14,8 @@ buildscript { apply plugin: 'com.android.application' +apply plugin: 'com.android.databinding' + apply plugin: 'me.tatarka.retrolambda' apply plugin: 'com.neenbedankt.android-apt' @@ -84,7 +86,7 @@ dependencies { compile project(':androidMvp') compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' - compile 'com.android.support:cardview-v7:21.0.3' + compile 'com.android.support:cardview-v7:22.2.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' apt 'com.google.dagger:dagger-compiler:2.0' diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index 2bad1c7..1e05daa 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -7,8 +7,8 @@ import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.ArrayAdapter; @@ -30,7 +30,7 @@ import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; -public class MainActivity extends ActionBarActivity { +public class MainActivity extends AppCompatActivity { @InjectView(R.id.drawer_layout) DrawerLayout mDrawerLayout; @InjectView(R.id.left_drawer_menu) View mDrawerMenu; @InjectView(R.id.left_drawer) ListView mDrawerList; diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml deleted file mode 100644 index 27b65f4..0000000 --- a/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1ad41ed..47d5b50 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,14 +1,12 @@ - diff --git a/build.gradle b/build.gradle index 46c2ce5..3f5b92d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,9 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.2' - classpath 'me.tatarka:gradle-retrolambda:3.0.1' + classpath 'com.android.tools.build:gradle:1.3.0-beta1' + classpath "com.android.databinding:dataBinder:1.0-rc0" + classpath 'me.tatarka:gradle-retrolambda:3.1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From b9cc2ec7f0174f27ee3932a312a80e3fd7226340 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 31 May 2015 11:32:59 +0200 Subject: [PATCH 047/300] Author fragment using SuperRecyclerView --- app/build.gradle | 4 +- .../cosenonjaviste/author/AuthorAdapter.java | 79 ------------------- .../author/AuthorListFragment.java | 39 +++++---- .../author/AuthorViewHolder.java | 53 +++++++++++++ .../cosenonjaviste/utils/BindableAdapter.java | 37 +++++++++ .../utils/BindableViewHolder.java | 12 +++ app/src/main/res/layout/author_cell.xml | 25 +++--- app/src/main/res/layout/category_row.xml | 4 +- app/src/main/res/layout/error_view.xml | 15 ++-- app/src/main/res/layout/post_row.xml | 4 +- app/src/main/res/layout/super_recycler.xml | 20 +++++ app/src/main/res/layout/tweet_row.xml | 4 +- build.gradle | 3 +- 13 files changed, 179 insertions(+), 120 deletions(-) delete mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java create mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorViewHolder.java create mode 100644 app/src/main/java/it/cosenonjaviste/utils/BindableAdapter.java create mode 100644 app/src/main/java/it/cosenonjaviste/utils/BindableViewHolder.java create mode 100644 app/src/main/res/layout/super_recycler.xml diff --git a/app/build.gradle b/app/build.gradle index 05ddea1..7097aa4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,6 @@ buildscript { apply plugin: 'com.android.application' -apply plugin: 'com.android.databinding' - apply plugin: 'me.tatarka.retrolambda' apply plugin: 'com.neenbedankt.android-apt' @@ -89,6 +87,8 @@ dependencies { compile 'com.android.support:cardview-v7:22.2.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' + compile 'com.android.support:recyclerview-v7:22.2.0' + compile 'com.malinskiy:superrecyclerview:1.1.0' apt 'com.google.dagger:dagger-compiler:2.0' apt 'org.parceler:parceler:0.2.14' diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java deleted file mode 100644 index 335a505..0000000 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java +++ /dev/null @@ -1,79 +0,0 @@ -package it.cosenonjaviste.author; - -import android.content.Context; -import android.text.Html; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.squareup.picasso.Picasso; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import it.cosenonjaviste.R; -import it.cosenonjaviste.model.Author; -import it.cosenonjaviste.utils.CircleTransform; - -public class AuthorAdapter extends BaseAdapter { - - private List authors = new ArrayList<>(); - - private Context context; - private CircleTransform transformation; - - public AuthorAdapter(Context context) { - this.context = context; - transformation = CircleTransform.createWithBorder(context, R.dimen.author_image_size_big, R.color.colorPrimary, R.dimen.author_image_border); - } - - @Override public int getCount() { - return authors.size(); - } - - @Override public Author getItem(int position) { - return authors.get(position); - } - - @Override public long getItemId(int position) { - return getItem(position).getId(); - } - - @Override public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(context).inflate(R.layout.author_cell, parent, false); - RowWrapper rowWrapper = new RowWrapper(); - ButterKnife.inject(rowWrapper, convertView); - convertView.setTag(rowWrapper); - } - RowWrapper rowWrapper = (RowWrapper) convertView.getTag(); - Author author = getItem(position); - String description = author.getDescription(); - rowWrapper.title.setText(Html.fromHtml(description.replaceAll("^

", "").replaceAll("$

", ""))); - rowWrapper.firstName.setText(author.getFirstName()); - rowWrapper.lastName.setText(author.getLastName()); - String imageUrl = author.getImageUrl(); - if (!TextUtils.isEmpty(imageUrl)) { - Picasso.with(context).load(imageUrl).transform(transformation).into(rowWrapper.image); - } - return convertView; - } - - public void reloadData(List posts) { - this.authors = posts; - notifyDataSetChanged(); - } - - static class RowWrapper { - @InjectView(R.id.first_name) TextView firstName; - @InjectView(R.id.last_name) TextView lastName; - @InjectView(R.id.title) TextView title; - @InjectView(R.id.author_image) ImageView image; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index d6d94b8..6279112 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -1,13 +1,13 @@ package it.cosenonjaviste.author; -import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.v7.widget.GridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.quentindommerc.superlistview.SuperGridview; +import com.malinskiy.superrecyclerview.SuperRecyclerView; import org.parceler.ParcelClass; @@ -19,31 +19,38 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.model.Author; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; +import it.cosenonjaviste.utils.BindableAdapter; +import it.cosenonjaviste.utils.CircleTransform; import it.cosenonjaviste.utils.SingleFragmentActivity; @ParcelClass(AuthorListModel.class) public class AuthorListFragment extends RxMvpFragment implements AuthorListView { - @InjectView(R.id.grid) SuperGridview grid; + @InjectView(R.id.recycler) SuperRecyclerView superRecycler; + + @InjectView(R.id.error_root) View errorLayout; @Inject AuthorListPresenter presenter; - private AuthorAdapter adapter; + private BindableAdapter adapter; @Override public void init(Bundle state) { createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) .inject(this); } - @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.super_grid, container, false); + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_recycler, container, false); ButterKnife.inject(this, view); - adapter = new AuthorAdapter(getActivity()); - grid.getList().setOnItemClickListener((parent, view1, position, id) -> presenter.goToAuthorDetail(position)); - grid.getList().setNumColumns(2); - grid.setAdapter(adapter); + + CircleTransform transformation = CircleTransform.createWithBorder(getActivity(), R.dimen.author_image_size_big, R.color.colorPrimary, R.dimen.author_image_border); + adapter = new BindableAdapter<>(v -> new AuthorViewHolder(inflater.inflate(R.layout.author_cell, v, false), transformation, presenter)); + superRecycler.setAdapter(adapter); + GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 2); + superRecycler.setLayoutManager(layoutManager); return view; } @@ -52,20 +59,22 @@ public class AuthorListFragment extends RxMvpFragment implements AuthorListView } @Override public void update(AuthorListModel model) { - grid.showList(); - adapter.reloadData(model.getItems()); + superRecycler.showRecycler(); + adapter.reloadData(model.getItems()); } @Override public void showError() { - grid.showError(); + errorLayout.setVisibility(View.VISIBLE); + superRecycler.hideRecycler(); + superRecycler.hideProgress(); } @Override public void startLoading() { - grid.showProgress(); + superRecycler.showProgress(); + errorLayout.setVisibility(View.GONE); } @Override public void openPostList(PostListModel model) { SingleFragmentActivity.open(getActivity(), PostListFragment.class, model); } - } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorViewHolder.java b/app/src/main/java/it/cosenonjaviste/author/AuthorViewHolder.java new file mode 100644 index 0000000..9f7af52 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorViewHolder.java @@ -0,0 +1,53 @@ +package it.cosenonjaviste.author; + +import android.text.Html; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; + +import butterknife.ButterKnife; +import butterknife.InjectView; +import butterknife.OnClick; +import it.cosenonjaviste.R; +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.utils.BindableViewHolder; +import it.cosenonjaviste.utils.CircleTransform; + +public class AuthorViewHolder extends BindableViewHolder { + + private final CircleTransform transformation; + private final AuthorListPresenter presenter; + + @InjectView(R.id.first_name) TextView firstName; + @InjectView(R.id.last_name) TextView lastName; + @InjectView(R.id.title) TextView title; + @InjectView(R.id.author_image) ImageView image; + + private int position; + + public AuthorViewHolder(View itemView, CircleTransform transformation, AuthorListPresenter presenter) { + super(itemView); + this.transformation = transformation; + this.presenter = presenter; + ButterKnife.inject(this, itemView); + } + + @OnClick(R.id.author_cell) void goToDetail() { + presenter.goToAuthorDetail(position); + } + + @Override public void bind(Author author, int position) { + this.position = position; + String description = author.getDescription(); + title.setText(Html.fromHtml(description.replaceAll("^

", "").replaceAll("$

", ""))); + firstName.setText(author.getFirstName()); + lastName.setText(author.getLastName()); + String imageUrl = author.getImageUrl(); + if (!TextUtils.isEmpty(imageUrl)) { + Picasso.with(itemView.getContext()).load(imageUrl).transform(transformation).into(image); + } + } +} diff --git a/app/src/main/java/it/cosenonjaviste/utils/BindableAdapter.java b/app/src/main/java/it/cosenonjaviste/utils/BindableAdapter.java new file mode 100644 index 0000000..9ec1cbb --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/utils/BindableAdapter.java @@ -0,0 +1,37 @@ +package it.cosenonjaviste.utils; + +import android.support.v7.widget.RecyclerView; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +import rx.functions.Func1; + +public class BindableAdapter extends RecyclerView.Adapter> { + + private List authors = new ArrayList<>(); + + private Func1> viewHolderFactory; + + public BindableAdapter(Func1> viewHolderFactory) { + this.viewHolderFactory = viewHolderFactory; + } + + @Override public BindableViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + return viewHolderFactory.call(viewGroup); + } + + @Override public void onBindViewHolder(BindableViewHolder authorViewHolder, int i) { + authorViewHolder.bind(authors.get(i), i); + } + + @Override public int getItemCount() { + return authors.size(); + } + + public void reloadData(List posts) { + this.authors = posts; + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/utils/BindableViewHolder.java b/app/src/main/java/it/cosenonjaviste/utils/BindableViewHolder.java new file mode 100644 index 0000000..2f05634 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/utils/BindableViewHolder.java @@ -0,0 +1,12 @@ +package it.cosenonjaviste.utils; + +import android.support.v7.widget.RecyclerView; +import android.view.View; + +public abstract class BindableViewHolder extends RecyclerView.ViewHolder { + public BindableViewHolder(View itemView) { + super(itemView); + } + + public abstract void bind(T item, int pos); +} diff --git a/app/src/main/res/layout/author_cell.xml b/app/src/main/res/layout/author_cell.xml index 35036b1..80b2362 100644 --- a/app/src/main/res/layout/author_cell.xml +++ b/app/src/main/res/layout/author_cell.xml @@ -1,16 +1,19 @@ + android:layout_height="wrap_content" + card_view:cardUseCompatPadding="true"> + android:padding="16dp"> + android:textStyle="bold" + tools:text="Name"/> + android:textStyle="bold" + tools:text="Last name"/> + android:textSize="10sp" + android:visibility="gone" + tools:text="Title"/> \ No newline at end of file diff --git a/app/src/main/res/layout/category_row.xml b/app/src/main/res/layout/category_row.xml index 46f8885..ab45336 100644 --- a/app/src/main/res/layout/category_row.xml +++ b/app/src/main/res/layout/category_row.xml @@ -3,7 +3,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + xmlns:card_view="http://schemas.android.com/apk/res-auto" + card_view:cardUseCompatPadding="true"> - + android:gravity="center" + android:orientation="vertical"> + android:textAppearance="?android:attr/textAppearanceMedium"/>