package com.quran.labs.androidquran.ui.fragment;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import com.quran.labs.androidquran.common.AyahBounds;
import com.quran.labs.androidquran.dao.Bookmark;
import com.quran.labs.androidquran.module.fragment.QuranPageModule;
import com.quran.labs.androidquran.presenter.quran.QuranPagePresenter;
import com.quran.labs.androidquran.presenter.quran.QuranPageScreen;
import com.quran.labs.androidquran.presenter.quran.ayahtracker.AyahImageTrackerItem;
import com.quran.labs.androidquran.presenter.quran.ayahtracker.AyahScrollableImageTrackerItem;
import com.quran.labs.androidquran.presenter.quran.ayahtracker.AyahTrackerItem;
import com.quran.labs.androidquran.presenter.quran.ayahtracker.AyahTrackerPresenter;
import com.quran.labs.androidquran.ui.PagerActivity;
import com.quran.labs.androidquran.ui.helpers.AyahSelectedListener;
import com.quran.labs.androidquran.ui.helpers.AyahTracker;
import com.quran.labs.androidquran.ui.helpers.HighlightType;
import com.quran.labs.androidquran.ui.helpers.QuranPage;
import com.quran.labs.androidquran.ui.util.PageController;
import com.quran.labs.androidquran.util.QuranSettings;
import com.quran.labs.androidquran.widgets.HighlightingImageView;
import com.quran.labs.androidquran.widgets.QuranImagePageLayout;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import timber.log.Timber;
import static com.quran.labs.androidquran.ui.helpers.AyahSelectedListener.EventType;
public class QuranPageFragment extends Fragment implements PageController,
QuranPage, QuranPageScreen, AyahTrackerPresenter.AyahInteractionHandler {
private static final String PAGE_NUMBER_EXTRA = "pageNumber";
private int pageNumber;
private AyahTrackerItem[] ayahTrackerItems;
@Inject QuranSettings quranSettings;
@Inject QuranPagePresenter quranPagePresenter;
@Inject AyahTrackerPresenter ayahTrackerPresenter;
@Inject AyahSelectedListener ayahSelectedListener;
private HighlightingImageView imageView;
private QuranImagePageLayout quranPageLayout;
private boolean ayahCoordinatesError;
public static QuranPageFragment newInstance(int page) {
final QuranPageFragment f = new QuranPageFragment();
final Bundle args = new Bundle();
args.putInt(PAGE_NUMBER_EXTRA, page);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onResume() {
super.onResume();
updateView();
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
final Context context = getActivity();
quranPageLayout = new QuranImagePageLayout(context);
quranPageLayout.setPageController(this, pageNumber);
imageView = quranPageLayout.getImageView();
return quranPageLayout;
}
@Override
public void updateView() {
if (isAdded()) {
quranPageLayout.updateView(quranSettings);
if (!quranSettings.highlightBookmarks()) {
imageView.unHighlight(HighlightType.BOOKMARK);
}
quranPagePresenter.refresh();
}
}
@Override
public AyahTracker getAyahTracker() {
return ayahTrackerPresenter;
}
@Override
public AyahTrackerItem[] getAyahTrackerItems() {
if (ayahTrackerItems == null) {
ayahTrackerItems = new AyahTrackerItem[]{
quranPageLayout.canScroll() ?
new AyahScrollableImageTrackerItem(pageNumber, quranPageLayout, imageView) :
new AyahImageTrackerItem(pageNumber, imageView)
};
}
return ayahTrackerItems;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
pageNumber = getArguments().getInt(PAGE_NUMBER_EXTRA);
((PagerActivity) getActivity()).getPagerActivityComponent()
.quranPageComponentBuilder()
.withQuranPageModule(new QuranPageModule(pageNumber))
.build()
.inject(this);
}
@Override
public void onDetach() {
ayahSelectedListener = null;
super.onDetach();
}
@Override
public void onStart() {
super.onStart();
quranPagePresenter.bind(this);
ayahTrackerPresenter.bind(this);
}
@Override
public void onStop() {
quranPagePresenter.unbind(this);
ayahTrackerPresenter.unbind(this);
super.onStop();
}
public void cleanup() {
Timber.d("cleaning up page %d", pageNumber);
if (quranPageLayout != null) {
imageView.setImageDrawable(null);
quranPageLayout = null;
}
}
@Override
public void setPageCoordinates(int page, RectF pageCoordinates) {
ayahTrackerPresenter.setPageBounds(page, pageCoordinates);
}
@Override
public void setBookmarksOnPage(List<Bookmark> bookmarks) {
ayahTrackerPresenter.setAyahBookmarks(bookmarks);
}
@Override
public void setAyahCoordinatesData(int page, Map<String, List<AyahBounds>> coordinates) {
ayahTrackerPresenter.setAyahCoordinates(page, coordinates);
ayahCoordinatesError = false;
}
@Override
public void setAyahCoordinatesError() {
ayahCoordinatesError = true;
}
@Override
public void onScrollChanged(int x, int y, int oldx, int oldy) {
PagerActivity activity = (PagerActivity) getActivity();
if (activity != null) {
activity.onQuranPageScroll(y);
}
}
@Override
public void setPageDownloadError(@StringRes int errorMessage) {
quranPageLayout.showError(errorMessage);
quranPageLayout.setOnClickListener(v -> ayahSelectedListener.onClick(EventType.SINGLE_TAP));
}
@Override
public void setPageBitmap(int page, @NonNull Bitmap pageBitmap) {
imageView.setImageDrawable(new BitmapDrawable(getResources(), pageBitmap));
}
@Override
public void hidePageDownloadError() {
quranPageLayout.hideError();
quranPageLayout.setOnClickListener(null);
quranPageLayout.setClickable(false);
}
@Override
public void handleRetryClicked() {
hidePageDownloadError();
quranPagePresenter.downloadImages();
}
@Override
public boolean handleTouchEvent(MotionEvent event, EventType eventType, int page) {
return isVisible() && ayahTrackerPresenter.handleTouchEvent(getActivity(), event, eventType,
page, ayahSelectedListener, ayahCoordinatesError);
}
}