package com.jparkie.aizoban.presenters; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.preference.PreferenceFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import com.jparkie.aizoban.BuildConfig; import com.jparkie.aizoban.controllers.QueryManager; import com.jparkie.aizoban.controllers.events.NavigationItemSelectEvent; import com.jparkie.aizoban.models.Manga; import com.jparkie.aizoban.utils.NavigationUtils; import com.jparkie.aizoban.utils.wrappers.RequestWrapper; import com.jparkie.aizoban.views.MainView; import com.jparkie.aizoban.views.activities.MainActivity; import com.jparkie.aizoban.views.activities.MangaActivity; import com.jparkie.aizoban.views.fragments.CatalogueFragment; import com.jparkie.aizoban.views.fragments.DownloadMangaFragment; import com.jparkie.aizoban.views.fragments.FavouriteMangaFragment; import com.jparkie.aizoban.views.fragments.LatestMangaFragment; import com.jparkie.aizoban.views.fragments.NavigationFragment; import com.jparkie.aizoban.views.fragments.QueueFragment; import com.jparkie.aizoban.views.fragments.RecentChapterFragment; import com.jparkie.aizoban.views.fragments.SettingsFragment; import de.greenrobot.event.EventBus; import rx.Observer; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; public class MainPresenterImpl implements MainPresenter { public static final String TAG = MainPresenterImpl.class.getSimpleName(); private static final String MAIN_FRAGMENT_PARCELABLE_KEY = TAG + ":" + "MainFragmentParcelableKey"; private static final String PREFERENCE_FRAGMENT_PARCELABLE_KEY = TAG + ":" + "PreferenceFragmentParcelableKey"; private MainView mMainView; private Fragment mFragment; private PreferenceFragment mPreferenceFragment; private int mInitialPosition; private Subscription mQueryRandomMangaSubscription; public MainPresenterImpl(MainView mainView) { mMainView = mainView; } @Override public void initializeViews() { mMainView.initializeToolbar(); mMainView.initializeDrawerLayout(); } @Override public void initializeMainLayout(Intent argument) { if (argument != null) { if (argument.hasExtra(MainActivity.POSITION_ARGUMENT_KEY)) { mInitialPosition = argument.getIntExtra(MainActivity.POSITION_ARGUMENT_KEY, NavigationUtils.POSITION_CATALOGUE); if (mInitialPosition == NavigationUtils.POSITION_CATALOGUE) { mFragment = new CatalogueFragment(); } else if (mInitialPosition == NavigationUtils.POSITION_LATEST) { mFragment = new LatestMangaFragment(); } else if (mInitialPosition == NavigationUtils.POSITION_DOWNLOAD) { mFragment = new DownloadMangaFragment(); } else if (mInitialPosition == NavigationUtils.POSITION_FAVOURITE) { mFragment = new FavouriteMangaFragment(); } else if (mInitialPosition == NavigationUtils.POSITION_RECENT) { mFragment = new RecentChapterFragment(); } else if (mInitialPosition == NavigationUtils.POSITION_QUEUE) { mFragment = new QueueFragment(); } argument.removeExtra(MainActivity.POSITION_ARGUMENT_KEY); } } if (mFragment == null) { mInitialPosition = NavigationUtils.POSITION_CATALOGUE; mFragment = new CatalogueFragment(); } ((FragmentActivity)mMainView.getContext()).getSupportFragmentManager().beginTransaction() .add(mMainView.getMainLayoutId(), mFragment) .commit(); } @Override public void initializeNavigationLayout() { Fragment navigationFragment = NavigationFragment.newInstance(mInitialPosition); ((FragmentActivity)mMainView.getContext()).getSupportFragmentManager().beginTransaction() .add(mMainView.getNavigationLayoutId(), navigationFragment) .commit(); } @Override public void registerForEvents() { EventBus.getDefault().register(this); } public void onEventMainThread(NavigationItemSelectEvent event) { if (event != null) { mMainView.closeDrawerLayout(); int position = event.getSelectedPosition(); if (position == NavigationUtils.POSITION_CATALOGUE) { onPositionCatalogue(); } else if (position == NavigationUtils.POSITION_LATEST){ onPositionLatest(); } else if (position == NavigationUtils.POSITION_EXPLORE){ onPositionExplore(); } else if (position == NavigationUtils.POSITION_DOWNLOAD){ onPositionDownload(); } else if (position == NavigationUtils.POSITION_FAVOURITE){ onPositionFavourite(); } else if (position == NavigationUtils.POSITION_RECENT){ onPositionRecent(); } else if (position == NavigationUtils.POSITION_QUEUE){ onPositionQueue(); } else if (position == NavigationUtils.POSITION_SETTINGS){ onPositionSettings(); } } } @Override public void unregisterForEvents() { EventBus.getDefault().unregister(this); } @Override public void saveState(Bundle outState) { if (mFragment != null) { ((FragmentActivity) mMainView.getContext()).getSupportFragmentManager().putFragment(outState, MAIN_FRAGMENT_PARCELABLE_KEY, mFragment); } if (mPreferenceFragment != null) { ((FragmentActivity) mMainView.getContext()).getFragmentManager().putFragment(outState, PREFERENCE_FRAGMENT_PARCELABLE_KEY, mPreferenceFragment); } } @Override public void restoreState(Bundle savedState) { if (savedState.containsKey(MAIN_FRAGMENT_PARCELABLE_KEY)) { mFragment = ((FragmentActivity) mMainView.getContext()).getSupportFragmentManager().getFragment(savedState, MAIN_FRAGMENT_PARCELABLE_KEY); savedState.remove(MAIN_FRAGMENT_PARCELABLE_KEY); } if (savedState.containsKey(PREFERENCE_FRAGMENT_PARCELABLE_KEY)) { mPreferenceFragment = (PreferenceFragment)((FragmentActivity) mMainView.getContext()).getFragmentManager().getFragment(savedState, PREFERENCE_FRAGMENT_PARCELABLE_KEY); savedState.remove(PREFERENCE_FRAGMENT_PARCELABLE_KEY); } } @Override public void destroyAllSubscriptions() { if (mQueryRandomMangaSubscription != null) { mQueryRandomMangaSubscription.unsubscribe(); mQueryRandomMangaSubscription = null; } } private void onPositionCatalogue() { mFragment = new CatalogueFragment(); removePreferenceFragment(); replaceMainFragment(); } private void onPositionLatest() { mFragment = new LatestMangaFragment(); removePreferenceFragment(); replaceMainFragment(); } private void onPositionExplore() { if (mQueryRandomMangaSubscription != null) { mQueryRandomMangaSubscription.unsubscribe(); mQueryRandomMangaSubscription = null; } mQueryRandomMangaSubscription = QueryManager .queryExploreMangaFromPreferenceSource() .map(new Func1<Cursor, Cursor>() { @Override public Cursor call(Cursor incomingCursor) { if (incomingCursor != null && incomingCursor.getCount() != 0) { return incomingCursor; } return null; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Cursor>() { @Override public void onCompleted() { // Do Nothing. } @Override public void onError(Throwable e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } @Override public void onNext(Cursor exploreCursor) { if (exploreCursor != null) { Manga exploreManga = QueryManager.toObject(exploreCursor, Manga.class); if (exploreManga != null) { String mangaSource = exploreManga.getSource(); String mangaUrl = exploreManga.getUrl(); Intent mangaIntent = MangaActivity.constructOnlineMangaActivityIntent(mMainView.getContext(), new RequestWrapper(mangaSource, mangaUrl)); mMainView.getContext().startActivity(mangaIntent); } } } }); } private void onPositionDownload() { mFragment = new DownloadMangaFragment(); removePreferenceFragment(); replaceMainFragment(); } private void onPositionFavourite() { mFragment = new FavouriteMangaFragment(); removePreferenceFragment(); replaceMainFragment(); } private void onPositionRecent() { mFragment = new RecentChapterFragment(); removePreferenceFragment(); replaceMainFragment(); } private void onPositionQueue() { mFragment = new QueueFragment(); removePreferenceFragment(); replaceMainFragment(); } private void onPositionSettings() { mPreferenceFragment = new SettingsFragment(); removeMainFragment(); replacePreferenceFragment(); } private void removePreferenceFragment() { if (mPreferenceFragment != null) { ((FragmentActivity) mMainView.getContext()).getFragmentManager().beginTransaction() .remove(mPreferenceFragment) .commit(); mPreferenceFragment = null; } } private void replaceMainFragment() { ((FragmentActivity)mMainView.getContext()).getSupportFragmentManager().beginTransaction() .replace(mMainView.getMainLayoutId(), mFragment) .commit(); } private void removeMainFragment() { if (mFragment != null) { ((FragmentActivity) mMainView.getContext()).getSupportFragmentManager().beginTransaction() .remove(mFragment) .commit(); mFragment = null; } } private void replacePreferenceFragment() { ((FragmentActivity)mMainView.getContext()).getFragmentManager().beginTransaction() .replace(mMainView.getMainLayoutId(), mPreferenceFragment) .commit(); } }