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 android.widget.ImageView; import com.quran.labs.androidquran.common.AyahBounds; import com.quran.labs.androidquran.common.QuranAyahInfo; 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.AyahTrackerItem; import com.quran.labs.androidquran.presenter.quran.ayahtracker.AyahTrackerPresenter; import com.quran.labs.androidquran.presenter.quran.ayahtracker.AyahTranslationTrackerItem; import com.quran.labs.androidquran.presenter.translation.TranslationPresenter; 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.QuranPage; import com.quran.labs.androidquran.ui.translation.TranslationView; 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 com.quran.labs.androidquran.widgets.QuranTranslationPageLayout; import com.quran.labs.androidquran.widgets.TabletView; import java.util.List; import java.util.Map; import javax.inject.Inject; import dagger.Lazy; import io.reactivex.disposables.CompositeDisposable; import timber.log.Timber; import static com.quran.labs.androidquran.ui.helpers.AyahSelectedListener.EventType; public class TabletFragment extends Fragment implements PageController, TranslationPresenter.TranslationScreen, QuranPage, QuranPageScreen, AyahTrackerPresenter.AyahInteractionHandler { private static final String FIRST_PAGE_EXTRA = "pageNumber"; private static final String MODE_EXTRA = "mode"; public static class Mode { public static final int ARABIC = 1; public static final int TRANSLATION = 2; } private int mode; private int pageNumber; private boolean ayahCoordinatesError; private TabletView mainView; private TranslationView leftTranslation; private TranslationView rightTranslation; private HighlightingImageView leftImageView; private HighlightingImageView rightImageView; private CompositeDisposable compositeDisposable = new CompositeDisposable(); private AyahTrackerItem[] ayahTrackerItems; @Inject QuranSettings quranSettings; @Inject AyahTrackerPresenter ayahTrackerPresenter; @Inject Lazy<QuranPagePresenter> quranPagePresenter; @Inject Lazy<TranslationPresenter> translationPresenter; @Inject AyahSelectedListener ayahSelectedListener; public static TabletFragment newInstance(int firstPage, int mode) { final TabletFragment f = new TabletFragment(); final Bundle args = new Bundle(); args.putInt(FIRST_PAGE_EXTRA, firstPage); args.putInt(MODE_EXTRA, mode); f.setArguments(args); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final Context context = getActivity(); mainView = new TabletView(context); if (mode == Mode.ARABIC) { mainView.init(TabletView.QURAN_PAGE, TabletView.QURAN_PAGE); leftImageView = ((QuranImagePageLayout) mainView.getLeftPage()).getImageView(); rightImageView = ((QuranImagePageLayout) mainView.getRightPage()).getImageView(); mainView.setPageController(this, pageNumber, pageNumber - 1); } else if (mode == Mode.TRANSLATION) { mainView.init(TabletView.TRANSLATION_PAGE, TabletView.TRANSLATION_PAGE); leftTranslation = ((QuranTranslationPageLayout) mainView.getLeftPage()).getTranslationView(); rightTranslation = ((QuranTranslationPageLayout) mainView.getRightPage()).getTranslationView(); PagerActivity pagerActivity = (PagerActivity) context; leftTranslation.setTranslationClickedListener(v -> pagerActivity.toggleActionBar()); rightTranslation.setTranslationClickedListener(v -> pagerActivity.toggleActionBar()); mainView.setPageController(null, pageNumber, pageNumber - 1); } return mainView; } @Override public void onStart() { super.onStart(); ayahTrackerPresenter.bind(this); if (mode == Mode.ARABIC) { quranPagePresenter.get().bind(this); } else { translationPresenter.get().bind(this); } } @Override public void onStop() { ayahTrackerPresenter.unbind(this); if (mode == Mode.ARABIC) { quranPagePresenter.get().unbind(this); } else { translationPresenter.get().unbind(this); } super.onStop(); } @Override public void onResume() { super.onResume(); updateView(); if (mode == Mode.TRANSLATION) { rightTranslation.refresh(quranSettings); leftTranslation.refresh(quranSettings); } } @Override public void updateView() { if (isAdded()) { mainView.updateView(quranSettings); } } @Override public AyahTracker getAyahTracker() { return ayahTrackerPresenter; } @Override public AyahTrackerItem[] getAyahTrackerItems() { if (ayahTrackerItems == null) { AyahTrackerItem left; AyahTrackerItem right; if (mode == Mode.ARABIC) { left = new AyahImageTrackerItem(pageNumber, false, leftImageView); right = new AyahImageTrackerItem(pageNumber - 1, true, rightImageView); } else if (mode == Mode.TRANSLATION) { left = new AyahTranslationTrackerItem(pageNumber, leftTranslation); right = new AyahTranslationTrackerItem(pageNumber - 1, rightTranslation); } else { return new AyahTrackerItem[0]; } ayahTrackerItems = new AyahTrackerItem[]{ right, left }; } return ayahTrackerItems; } @Override public void onAttach(Context context) { super.onAttach(context); pageNumber = getArguments().getInt(FIRST_PAGE_EXTRA); mode = getArguments().getInt(MODE_EXTRA, Mode.ARABIC); ((PagerActivity) getActivity()).getPagerActivityComponent() .quranPageComponentBuilder() .withQuranPageModule(new QuranPageModule(pageNumber - 1, pageNumber)) .build() .inject(this); } @Override public void onDetach() { super.onDetach(); ayahSelectedListener = null; compositeDisposable.clear(); } @Override public void setPageDownloadError(@StringRes int errorMessage) { mainView.showError(errorMessage); mainView.setOnClickListener(v -> ayahSelectedListener.onClick(EventType.SINGLE_TAP)); } @Override public void setPageBitmap(int page, @NonNull Bitmap pageBitmap) { ImageView imageView = page == pageNumber - 1 ? rightImageView : leftImageView; imageView.setImageDrawable(new BitmapDrawable(getResources(), pageBitmap)); } @Override public void hidePageDownloadError() { mainView.hideError(); mainView.setOnClickListener(null); mainView.setClickable(false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (mode == Mode.TRANSLATION) { translationPresenter.get().refresh(); } } @Override public void setVerses(int page, @NonNull String[] translations, @NonNull List<QuranAyahInfo> verses) { if (page == pageNumber) { leftTranslation.setVerses(translations, verses); } else if (page == pageNumber - 1) { rightTranslation.setVerses(translations, verses); } } public void refresh() { if (mode == Mode.TRANSLATION) { translationPresenter.get().refresh(); } } public void cleanup() { Timber.d("cleaning up page %d", pageNumber); if (leftImageView != null) { leftImageView.setImageDrawable(null); } if (rightImageView != null) { rightImageView.setImageDrawable(null); } } @Override public void setBookmarksOnPage(List<Bookmark> bookmarks) { ayahTrackerPresenter.setAyahBookmarks(bookmarks); } @Override public void setPageCoordinates(int page, RectF pageCoordinates) { ayahTrackerPresenter.setPageBounds(page, pageCoordinates); } @Override public void setAyahCoordinatesError() { ayahCoordinatesError = true; } @Override public void setAyahCoordinatesData(int page, Map<String, List<AyahBounds>> coordinates) { ayahTrackerPresenter.setAyahCoordinates(page, coordinates); } @Override public boolean handleTouchEvent(MotionEvent event, EventType eventType, int page) { return isVisible() && ayahTrackerPresenter.handleTouchEvent(getActivity(), event, eventType, page, ayahSelectedListener, ayahCoordinatesError); } @Override public void handleRetryClicked() { hidePageDownloadError(); quranPagePresenter.get().downloadImages(); } @Override public void onScrollChanged(int x, int y, int oldx, int oldy) { // no-op - no image ScrollView in this mode. } }