package com.jparkie.aizoban.presenters; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.os.Parcelable; import android.util.SparseBooleanArray; import com.jparkie.aizoban.BuildConfig; import com.jparkie.aizoban.controllers.QueryManager; import com.jparkie.aizoban.controllers.databases.DatabaseService; import com.jparkie.aizoban.controllers.events.FavouriteMangaQueryEvent; import com.jparkie.aizoban.models.databases.FavouriteManga; import com.jparkie.aizoban.presenters.mapper.FavouriteMangaMapper; import com.jparkie.aizoban.utils.SearchUtils; import com.jparkie.aizoban.utils.wrappers.RequestWrapper; import com.jparkie.aizoban.views.FavouriteMangaView; import com.jparkie.aizoban.views.activities.MangaActivity; import com.jparkie.aizoban.views.adapters.FavouriteMangaAdapter; import java.util.ArrayList; import java.util.concurrent.TimeUnit; import de.greenrobot.event.EventBus; import rx.Observable; import rx.Observer; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; import rx.subjects.PublishSubject; public class FavouriteMangaPresenterImpl implements FavouriteMangaPresenter { public static final String TAG = FavouriteMangaPresenterImpl.class.getSimpleName(); private static final String SEARCH_NAME_PARCELABLE_KEY = TAG + ":" + "SearchNameParcelableKey"; private static final String POSITION_PARCELABLE_KEY = TAG + ":" + "PositionParcelableKey"; private FavouriteMangaView mFavouriteMangaView; private FavouriteMangaMapper mFavouriteMangaMapper; private FavouriteMangaAdapter mFavouriteMangaAdapter; private String mSearchName; private Parcelable mPositionSavedState; private Subscription mQueryFavouriteMangaSubscription; private Subscription mSearchViewSubscription; private PublishSubject<Observable<String>> mSearchViewPublishSubject; public FavouriteMangaPresenterImpl(FavouriteMangaView favouriteMangaView, FavouriteMangaMapper favouriteMangaMapper) { mFavouriteMangaView = favouriteMangaView; mFavouriteMangaMapper = favouriteMangaMapper; mSearchName = ""; } @Override public void initializeViews() { mFavouriteMangaView.initializeToolbar(); mFavouriteMangaView.initializeAbsListView(); mFavouriteMangaView.initializeEmptyRelativeLayout(); } @Override public void initializeSearch() { mSearchViewPublishSubject = PublishSubject.create(); mSearchViewSubscription = Observable.switchOnNext(mSearchViewPublishSubject) .debounce(SearchUtils.TIMEOUT, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<String>() { @Override public void onCompleted() { queryFavouriteMangaFromDatabase(); } @Override public void onError(Throwable e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } @Override public void onNext(String query) { if (query != null) { mSearchName = query; } onCompleted(); } }); } @Override public void initializeDataFromDatabase() { mFavouriteMangaAdapter = new FavouriteMangaAdapter(mFavouriteMangaView.getContext()); mFavouriteMangaMapper.registerAdapter(mFavouriteMangaAdapter); } @Override public void registerForEvents() { EventBus.getDefault().register(this); } public void onEventMainThread(FavouriteMangaQueryEvent event) { if (event != null) { queryFavouriteMangaFromDatabase(); } } @Override public void unregisterForEvents() { EventBus.getDefault().unregister(this); } @Override public void onResume() { queryFavouriteMangaFromDatabase(); } @Override public void saveState(Bundle outState) { if (mSearchName != null) { outState.putString(SEARCH_NAME_PARCELABLE_KEY, mSearchName); } if (mFavouriteMangaMapper.getPositionState() != null) { outState.putParcelable(POSITION_PARCELABLE_KEY, mFavouriteMangaMapper.getPositionState()); } } @Override public void restoreState(Bundle savedState) { if (savedState.containsKey(SEARCH_NAME_PARCELABLE_KEY)) { mSearchName = savedState.getString(SEARCH_NAME_PARCELABLE_KEY); savedState.remove(SEARCH_NAME_PARCELABLE_KEY); } if (savedState.containsKey(POSITION_PARCELABLE_KEY)) { mPositionSavedState = savedState.getParcelable(POSITION_PARCELABLE_KEY); savedState.remove(POSITION_PARCELABLE_KEY); } } @Override public void destroyAllSubscriptions() { if (mQueryFavouriteMangaSubscription != null) { mQueryFavouriteMangaSubscription.unsubscribe(); mQueryFavouriteMangaSubscription = null; } if (mSearchViewSubscription != null) { mSearchViewSubscription.unsubscribe(); mSearchViewSubscription = null; } } @Override public void releaseAllResources() { if (mFavouriteMangaAdapter != null) { mFavouriteMangaAdapter.setCursor(null); mFavouriteMangaAdapter = null; } } @Override public void onFavouriteMangaClick(int position) { if (mFavouriteMangaAdapter != null) { FavouriteManga selectedFavouriteManga = (FavouriteManga) mFavouriteMangaAdapter.getItem(position); if (selectedFavouriteManga != null) { String mangaSource = selectedFavouriteManga.getSource(); String mangaUrl = selectedFavouriteManga.getUrl(); Intent mangaIntent = MangaActivity.constructOnlineMangaActivityIntent(mFavouriteMangaView.getContext(), new RequestWrapper(mangaSource, mangaUrl)); mFavouriteMangaView.getContext().startActivity(mangaIntent); } } } @Override public void onQueryTextChange(String query) { if (mSearchViewPublishSubject != null) { mSearchViewPublishSubject.onNext(Observable.just(query)); } } @Override public void onOptionToTop() { mFavouriteMangaView.scrollToTop(); } @Override public void onOptionDelete() { if (mFavouriteMangaAdapter != null) { ArrayList<FavouriteManga> favouriteMangaToDelete = new ArrayList<FavouriteManga>(); SparseBooleanArray checkedItems = mFavouriteMangaMapper.getCheckedItemPositions(); for (int index = 0; index < mFavouriteMangaAdapter.getCount(); index++) { if (checkedItems.get(index)) { FavouriteManga favouriteManga = (FavouriteManga)mFavouriteMangaAdapter.getItem(index); favouriteMangaToDelete.add(favouriteManga); } } Intent startService = new Intent(mFavouriteMangaView.getContext(), DatabaseService.class); startService.putExtra(DatabaseService.INTENT_DELETE_FAVOURITE_MANGA, favouriteMangaToDelete); mFavouriteMangaView.getContext().startService(startService); } } @Override public void onOptionSelectAll() { mFavouriteMangaView.selectAll(); } @Override public void onOptionClear() { mFavouriteMangaView.clear(); } private void queryFavouriteMangaFromDatabase() { if (mQueryFavouriteMangaSubscription != null) { mQueryFavouriteMangaSubscription.unsubscribe(); mQueryFavouriteMangaSubscription = null; } if (mSearchName != null) { mQueryFavouriteMangaSubscription = QueryManager .queryFavouriteMangasFromName(mSearchName) .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() { restorePosition(); } @Override public void onError(Throwable e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } @Override public void onNext(Cursor cursor) { if (mFavouriteMangaAdapter != null) { mFavouriteMangaAdapter.setCursor(cursor); } if (cursor != null) { mFavouriteMangaView.hideEmptyRelativeLayout(); } else { mFavouriteMangaView.showEmptyRelativeLayout(); } } }); } } private void restorePosition() { if (mPositionSavedState != null) { mFavouriteMangaMapper.setPositionState(mPositionSavedState); mPositionSavedState = null; } } }