diff --git a/.travis.yml b/.travis.yml
index b3681d5..8e6bb1c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,26 +9,31 @@ cache:
- $HOME/.gradle/caches/
env:
+ global:
+ MALLOC_ARENA_MAX=2
matrix:
- - ANDROID_TARGET=android-19 ANDROID_ABI=armeabi-v7a
+ - ANDROID_TARGET=android-18 ANDROID_ABI=armeabi-v7a
android:
components:
+ - tools
- platform-tools
- - build-tools-21.1.2
- - android-21
+ - build-tools-25.0.2
+ - android-25
- extra-google-m2repository
- extra-android-m2repository
- - sys-img-armeabi-v7a-android-19
+ - sys-img-armeabi-v7a-android-18
before_script:
- - ls -l /usr/lib/jvm/
- - ls -l /usr/lib/jvm/java-7-oracle
+ - export "JAVA_OPTS=-Xmx1024m"
- export "JAVA7_HOME=/usr/lib/jvm/java-7-oracle"
- export "JAVA8_HOME=/usr/lib/jvm/java-8-oracle"
- - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI
- - emulator -avd test -no-skin -no-audio -no-window &
- - android-wait-for-emulator
- - adb shell input keyevent 82 &
+# - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI --skin WVGA800
+# - ./gradlew :app:assembleDebug
+# - emulator -avd test -no-skin -no-audio -no-window &
+# - 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:test :app:jacocoUnitTestReport :app:coveralls --stacktrace
+# - ./gradlew :app:test :app:connectedAndroidTest :app:jacocoTestReport :app:jacocoUnitTestReport :app:coveralls --stacktrace
\ No newline at end of file
diff --git a/ObjectGraphHolder/.gitignore b/ObjectGraphHolder/.gitignore
deleted file mode 100644
index e8fa30f..0000000
--- a/ObjectGraphHolder/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/build
-*.iml
diff --git a/ObjectGraphHolder/build.gradle b/ObjectGraphHolder/build.gradle
deleted file mode 100644
index d105428..0000000
--- a/ObjectGraphHolder/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-apply plugin: 'com.android.library'
-
-apply plugin: 'me.tatarka.retrolambda'
-
-android {
- compileSdkVersion 21
- buildToolsVersion "21.1.2"
-
- defaultConfig {
- minSdkVersion 9
- targetSdkVersion 21
- versionCode 1
- versionName "1.0"
- }
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- lintOptions {
- abortOnError false
- }
-}
-dependencies {
- compile 'com.squareup.dagger:dagger:1.2.2'
-}
\ No newline at end of file
diff --git a/ObjectGraphHolder/src/main/AndroidManifest.xml b/ObjectGraphHolder/src/main/AndroidManifest.xml
deleted file mode 100644
index 048b558..0000000
--- a/ObjectGraphHolder/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
After creating the listener, the caller should also call - * {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}, passing - * in the scroll listener returned by {@link #makeScrollListener()}. If a scroll listener is - * already assigned, the caller should still pass scroll changes through to this listener. This will - * ensure that this {@link com.quentindommerc.superlistview.SwipeDismissListViewTouchListener} is paused during list view - * scrolling.
- * - *Example usage:
- * - *
- * SwipeDismissListViewTouchListener touchListener =
- * new SwipeDismissListViewTouchListener(
- * listView,
- * new SwipeDismissListViewTouchListener.OnDismissCallback() {
- * public void onDismiss(ListView listView, int[] reverseSortedPositions) {
- * for (int position : reverseSortedPositions) {
- * adapter.remove(adapter.getItem(position));
- * }
- * adapter.notifyDataSetChanged();
- * }
- * });
- * listView.setOnTouchListener(touchListener);
- * listView.setOnScrollListener(touchListener.makeScrollListener());
- *
- *
- * This class Requires API level 12 or later due to use of {@link - * ViewPropertyAnimator}.
- * - *For a generalized {@link View.OnTouchListener} that makes any view dismissable, - * see {@link SwipeDismissTouchListener}.
- * - * @see SwipeDismissTouchListener - */ -public class SwipeDismissListViewTouchListener implements View.OnTouchListener { - // Cached ViewConfiguration and system-wide constant values - private int mSlop; - private int mMinFlingVelocity; - private int mMaxFlingVelocity; - private long mAnimationTime; - - // Fixed properties - private ListView mListView; - private DismissCallbacks mCallbacks; - private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero - - // Transient properties - private ListFor {@link ListView} list items that don't manage their own touch events - * (i.e. you're using - * {@link ListView#setOnItemClickListener(AdapterView.OnItemClickListener)} - * or an equivalent listener on {@link ListActivity} or - * {@link ListFragment}, use {@link SwipeDismissListViewTouchListener} instead.
- * - *Example usage:
- * - *
- * view.setOnTouchListener(new SwipeDismissTouchListener(
- * view,
- * null, // Optional token/cookie object
- * new SwipeDismissTouchListener.OnDismissCallback() {
- * public void onDismiss(View view, Object token) {
- * parent.removeView(view);
- * }
- * }));
- *
- *
- * This class Requires API level 12 or later due to use of {@link - * android.view.ViewPropertyAnimator}.
- * - * @see SwipeDismissListViewTouchListener - */ -public class SwipeDismissTouchListener implements View.OnTouchListener { - // Cached ViewConfiguration and system-wide constant values - private int mSlop; - private int mMinFlingVelocity; - private int mMaxFlingVelocity; - private long mAnimationTime; - - // Fixed properties - private View mView; - private DismissCallbacks mCallbacks; - private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero - - // Transient properties - private float mDownX; - private float mDownY; - private boolean mSwiping; - private int mSwipingSlop; - private Object mToken; - private VelocityTracker mVelocityTracker; - private float mTranslationX; - - /** - * The callback interface used by {@link com.quentindommerc.superlistview.SwipeDismissTouchListener} to inform its client - * about a successful dismissal of the view for which it was created. - */ - public interface DismissCallbacks { - /** - * Called to determine whether the view can be dismissed. - */ - boolean canDismiss(Object token); - - /** - * Called when the user has indicated they she would like to dismiss the view. - * - * @param view The originating {@link View} to be dismissed. - * @param token The optional token passed to this object's constructor. - */ - void onDismiss(View view, Object token); - } - - /** - * Constructs a new swipe-to-dismiss touch listener for the given view. - * - * @param view The view to make dismissable. - * @param token An optional token/cookie object to be passed through to the callback. - * @param callbacks The callback to trigger when the user has indicated that she would like to - * dismiss this view. - */ - @TargetApi(Build.VERSION_CODES.DONUT) - public SwipeDismissTouchListener(View view, Object token, DismissCallbacks callbacks) { - ViewConfiguration vc = ViewConfiguration.get(view.getContext()); - mSlop = vc.getScaledTouchSlop(); - mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 16; - mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity(); - mAnimationTime = view.getContext().getResources().getInteger( - android.R.integer.config_shortAnimTime); - mView = view; - mToken = token; - mCallbacks = callbacks; - } - - @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) - @Override - public boolean onTouch(View view, MotionEvent motionEvent) { - // offset because the view is translated during swipe - motionEvent.offsetLocation(mTranslationX, 0); - - if (mViewWidth < 2) { - mViewWidth = mView.getWidth(); - } - - switch (motionEvent.getActionMasked()) { - case MotionEvent.ACTION_DOWN: { - // TODO: ensure this is a finger, and set a flag - mDownX = motionEvent.getRawX(); - mDownY = motionEvent.getRawY(); - if (mCallbacks.canDismiss(mToken)) { - mVelocityTracker = VelocityTracker.obtain(); - mVelocityTracker.addMovement(motionEvent); - } - return false; - } - - case MotionEvent.ACTION_UP: { - if (mVelocityTracker == null) { - break; - } - - float deltaX = motionEvent.getRawX() - mDownX; - mVelocityTracker.addMovement(motionEvent); - mVelocityTracker.computeCurrentVelocity(1000); - float velocityX = mVelocityTracker.getXVelocity(); - float absVelocityX = Math.abs(velocityX); - float absVelocityY = Math.abs(mVelocityTracker.getYVelocity()); - boolean dismiss = false; - boolean dismissRight = false; - if (Math.abs(deltaX) > mViewWidth / 2 && mSwiping) { - dismiss = true; - dismissRight = deltaX > 0; - } else if (mMinFlingVelocity <= absVelocityX && absVelocityX <= mMaxFlingVelocity - && absVelocityY < absVelocityX - && absVelocityY < absVelocityX && mSwiping) { - // dismiss only if flinging in the same direction as dragging - dismiss = (velocityX < 0) == (deltaX < 0); - dismissRight = mVelocityTracker.getXVelocity() > 0; - } - if (dismiss) { - // dismiss - mView.animate() - .translationX(dismissRight ? mViewWidth : -mViewWidth) - .alpha(0) - .setDuration(mAnimationTime) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - performDismiss(); - } - }); - } else if (mSwiping) { - // cancel - mView.animate() - .translationX(0) - .alpha(1) - .setDuration(mAnimationTime) - .setListener(null); - } - mVelocityTracker.recycle(); - mVelocityTracker = null; - mTranslationX = 0; - mDownX = 0; - mDownY = 0; - mSwiping = false; - break; - } - - case MotionEvent.ACTION_CANCEL: { - if (mVelocityTracker == null) { - break; - } - - mView.animate() - .translationX(0) - .alpha(1) - .setDuration(mAnimationTime) - .setListener(null); - mVelocityTracker.recycle(); - mVelocityTracker = null; - mTranslationX = 0; - mDownX = 0; - mDownY = 0; - mSwiping = false; - break; - } - - case MotionEvent.ACTION_MOVE: { - if (mVelocityTracker == null) { - break; - } - - mVelocityTracker.addMovement(motionEvent); - float deltaX = motionEvent.getRawX() - mDownX; - float deltaY = motionEvent.getRawY() - mDownY; - if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) { - mSwiping = true; - mSwipingSlop = (deltaX > 0 ? mSlop : -mSlop); - mView.getParent().requestDisallowInterceptTouchEvent(true); - - // Cancel listview's touch - MotionEvent cancelEvent = MotionEvent.obtain(motionEvent); - cancelEvent.setAction(MotionEvent.ACTION_CANCEL | - (motionEvent.getActionIndex() << - MotionEvent.ACTION_POINTER_INDEX_SHIFT)); - mView.onTouchEvent(cancelEvent); - cancelEvent.recycle(); - } - - if (mSwiping) { - mTranslationX = deltaX; - mView.setTranslationX(deltaX - mSwipingSlop); - // TODO: use an ease-out interpolator or such - mView.setAlpha(Math.max(0f, Math.min(1f, - 1f - 2f * Math.abs(deltaX) / mViewWidth))); - return true; - } - break; - } - } - return false; - } - - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - private void performDismiss() { - // Animate the dismissed view to zero-height and then fire the dismiss callback. - // This triggers layout on each animation frame; in the future we may want to do something - // smarter and more performant. - - final ViewGroup.LayoutParams lp = mView.getLayoutParams(); - final int originalHeight = mView.getHeight(); - - ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime); - - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mCallbacks.onDismiss(mView, mToken); - // Reset view presentation - mView.setAlpha(1f); - mView.setTranslationX(0); - lp.height = originalHeight; - mView.setLayoutParams(lp); - } - }); - - animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - lp.height = (Integer) valueAnimator.getAnimatedValue(); - mView.setLayoutParams(lp); - } - }); - - animator.start(); - } -} \ No newline at end of file diff --git a/SuperListviewLibrary/src/main/res/drawable-hdpi/ic_launcher.png b/SuperListviewLibrary/src/main/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index 96a442e..0000000 Binary files a/SuperListviewLibrary/src/main/res/drawable-hdpi/ic_launcher.png and /dev/null differ diff --git a/SuperListviewLibrary/src/main/res/drawable-mdpi/ic_launcher.png b/SuperListviewLibrary/src/main/res/drawable-mdpi/ic_launcher.png deleted file mode 100644 index 359047d..0000000 Binary files a/SuperListviewLibrary/src/main/res/drawable-mdpi/ic_launcher.png and /dev/null differ diff --git a/SuperListviewLibrary/src/main/res/drawable-xhdpi/ic_launcher.png b/SuperListviewLibrary/src/main/res/drawable-xhdpi/ic_launcher.png deleted file mode 100644 index 71c6d76..0000000 Binary files a/SuperListviewLibrary/src/main/res/drawable-xhdpi/ic_launcher.png and /dev/null differ diff --git a/SuperListviewLibrary/src/main/res/drawable-xxhdpi/ic_launcher.png b/SuperListviewLibrary/src/main/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100644 index 4df1894..0000000 Binary files a/SuperListviewLibrary/src/main/res/drawable-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/SuperListviewLibrary/src/main/res/layout/view_more_progress.xml b/SuperListviewLibrary/src/main/res/layout/view_more_progress.xml deleted file mode 100644 index 6ebd8a4..0000000 --- a/SuperListviewLibrary/src/main/res/layout/view_more_progress.xml +++ /dev/null @@ -1,7 +0,0 @@ - - -, M> extends Fragment implements MvpView load(getFragmentManager(), presenterId);
- if (presenter == null) {
- presenter = createPresenter();
- }
- presenter.init(restoredModel);
-
- PresenterSaverFragment.save(getFragmentManager(), 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() {
- 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/MvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java
deleted file mode 100644
index a73f3ea..0000000
--- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package it.cosenonjaviste.lib.mvp;
-
-import java.util.concurrent.atomic.AtomicLong;
-
-public abstract class MvpPresenter > P load(FragmentManager fragmentManager, long id) {
- if (id != 0) {
- PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager);
- return (P) fragment.presenters.get(id);
- } else {
- return null;
- }
- }
-
- @Override public void onDestroy() {
- super.onDestroy();
- for (MvpPresenter> presenter : presenters.values()) {
- presenter.destroy();
- }
- }
-}
diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java
deleted file mode 100644
index 66814b0..0000000
--- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package it.cosenonjaviste.lib.mvp.utils;
-
-import rx.Observable;
-import rx.Scheduler;
-import rx.schedulers.Schedulers;
-
-import static rx.android.schedulers.AndroidSchedulers.mainThread;
-
-public class SchedulerManager {
- public static Scheduler io = Schedulers.io();
-
- public static , M> extends MvpFragment {
-
- @Override public void onCreate(Bundle savedInstanceState) {
- ObjectGraphHolder.inject((DaggerApplication) getActivity().getApplication(), this);
- super.onCreate(savedInstanceState);
- }
-
- @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 ", "").replaceAll("$> implements Parcelable {
- public OptionalList() {
- this(new ArrayList<>());
- }
-
- public OptionalList(List
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A");
+ }
+
+ @Test public void testDetailFragment() {
+ fragmentRule.launchFragment(TestData.createPost(1, server.getUrl(false) + "abc"));
+ TestUtils.sleep(100);
+ }
+}
diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/post/PostListFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/post/PostListFragmentTest.java
new file mode 100644
index 0000000..a5da543
--- /dev/null
+++ b/app/src/androidTest/java/it/cosenonjaviste/ui/post/PostListFragmentTest.java
@@ -0,0 +1,53 @@
+package it.cosenonjaviste.ui.post;
+
+import android.support.test.espresso.contrib.RecyclerViewActions;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+
+import it.cosenonjaviste.R;
+import it.cosenonjaviste.TestData;
+import it.cosenonjaviste.androidtest.base.FragmentRule;
+import it.cosenonjaviste.core.post.PostListModel;
+import it.cosenonjaviste.model.WordPressService;
+import it.cosenonjaviste.ui.CnjDaggerRule;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+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.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.when;
+
+public class PostListFragmentTest {
+
+ @Mock WordPressService wordPressService;
+
+ @Rule public FragmentRule fragmentRule = new FragmentRule(PostListFragment.class);
+
+ @Rule public final CnjDaggerRule daggerRule = new CnjDaggerRule();
+
+ @Before public void setUp() {
+ when(wordPressService.listPosts(eq(1)))
+ .thenReturn(TestData.postResponse(0, 10));
+ when(wordPressService.listPosts(eq(2)))
+ .thenReturn(TestData.postResponse(10, 10));
+ }
+
+ @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());
+
+ onView(withId(R.id.list))
+ .perform(RecyclerViewActions.actionOnItemAtPosition(3, click()));
+ }
+}
diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/twitter/TweetListFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/twitter/TweetListFragmentTest.java
new file mode 100644
index 0000000..e85d40b
--- /dev/null
+++ b/app/src/androidTest/java/it/cosenonjaviste/ui/twitter/TweetListFragmentTest.java
@@ -0,0 +1,40 @@
+package it.cosenonjaviste.ui.twitter;
+
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import it.cosenonjaviste.TestData;
+import it.cosenonjaviste.androidtest.base.FragmentRule;
+import it.cosenonjaviste.core.twitter.TweetListModel;
+import it.cosenonjaviste.model.TwitterService;
+import it.cosenonjaviste.ui.CnjDaggerRule;
+
+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.Matchers.eq;
+import static org.mockito.Mockito.when;
+
+@RunWith(AndroidJUnit4.class)
+public class TweetListFragmentTest {
+
+ @Mock TwitterService twitterService;
+
+ @Rule public FragmentRule fragmentRule = new FragmentRule(TweetListFragment.class);
+
+ @Rule public final CnjDaggerRule daggerRule = new CnjDaggerRule();
+
+ @Test public void testTweetList() {
+ when(twitterService.loadTweets(eq(1)))
+ .thenReturn(TestData.tweets(10));
+
+ fragmentRule.launchFragment(new TweetListModel());
+
+ onView(withText("tweet text 1")).check(matches(isDisplayed()));
+ }
+}
diff --git a/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java b/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java
deleted file mode 100644
index b3812d2..0000000
--- a/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package it.cosenonjaviste;
-
-import javax.inject.Singleton;
-
-import dagger.Module;
-import dagger.Provides;
-import it.cosenonjaviste.model.TwitterService;
-import it.cosenonjaviste.stubs.TwitterServiceStub;
-
-@Module(library = true, overrides = true)
-public class MvpTestModule {
- @Provides @Singleton TwitterService provideTwitterService(TwitterServiceStub twitterServiceStub) {
- return twitterServiceStub;
- }
-}
diff --git a/app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java b/app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java
deleted file mode 100644
index 77bd308..0000000
--- a/app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package it.cosenonjaviste.stubs;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import it.cosenonjaviste.lib.mvp.utils.SchedulerManager;
-import rx.Observable;
-
-@Singleton
-public class TestSchedulerManager extends SchedulerManager {
- @Inject public TestSchedulerManager() {
- }
-
- @Override public > loadTweets(int page) {
- List
> call(Action1
> action) {
- return items.call(action);
- }
-}
diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java
deleted file mode 100644
index 28bb477..0000000
--- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package it.cosenonjaviste.author;
-
-import java.util.Collections;
-import java.util.List;
-
-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;
-import it.cosenonjaviste.model.AuthorResponse;
-import it.cosenonjaviste.model.WordPressService;
-import it.cosenonjaviste.post.PostListFragment;
-import it.cosenonjaviste.post.PostListModel;
-import rx.Observable;
-
-public class AuthorListPresenter extends RxMvpPresenter
> observable = wordPressService
- .listAuthors()
- .map(AuthorResponse::getAuthors)
- .doOnNext(Collections::sort);
-
- subscribe(observable,
- () -> {
- loadStarted = true;
- getView().startLoading();
- },
- posts -> {
- model.done(posts);
- view.update(model);
- }, throwable -> {
- model.error(throwable);
- view.update(model);
- });
- }
-
- @Override public void subscribe(MvpView
> call(Action1
> action) {
- return items.call(action);
- }
-}
diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java
deleted file mode 100644
index f1e57d7..0000000
--- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package it.cosenonjaviste.category;
-
-import java.util.List;
-
-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;
-import it.cosenonjaviste.model.CategoryResponse;
-import it.cosenonjaviste.model.WordPressService;
-import it.cosenonjaviste.post.PostListFragment;
-import it.cosenonjaviste.post.PostListModel;
-import rx.Observable;
-
-public class CategoryListPresenter extends RxMvpPresenter
> observable = wordPressService
- .listCategories()
- .map(CategoryResponse::getCategories);
-
- subscribe(observable,
- () -> {
- loadStarted = true;
- getView().startLoading();
- },
- posts -> {
- model.done(posts);
- view.update(model);
- }, throwable -> {
- model.error(throwable);
- view.update(model);
- });
- }
-
- public void goToPosts(int position) {
- Category category = model.get(position);
- getView().open(PostListFragment.class, new PostListModel(category));
- }
-
- @Override public CategoryListFragment getView() {
- return (CategoryListFragment) super.getView();
- }
-}
diff --git a/app/src/main/java/it/cosenonjaviste/core/Navigator.java b/app/src/main/java/it/cosenonjaviste/core/Navigator.java
new file mode 100644
index 0000000..efa33d3
--- /dev/null
+++ b/app/src/main/java/it/cosenonjaviste/core/Navigator.java
@@ -0,0 +1,15 @@
+package it.cosenonjaviste.core;
+
+import it.codingjam.lifecyclebinder.DefaultLifeCycleAware;
+import it.cosenonjaviste.core.post.PostListArgument;
+import it.cosenonjaviste.model.Post;
+
+public abstract class Navigator extends DefaultLifeCycleAware