ReaderPageFragment.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package eu.kanade.mangafeed.ui.fragment;
  2. import android.os.Bundle;
  3. import android.support.annotation.Nullable;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.LinearLayout;
  8. import android.widget.ProgressBar;
  9. import android.widget.TextView;
  10. import com.davemorrissey.labs.subscaleview.ImageSource;
  11. import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
  12. import java.util.concurrent.TimeUnit;
  13. import java.util.concurrent.atomic.AtomicInteger;
  14. import butterknife.Bind;
  15. import butterknife.ButterKnife;
  16. import eu.kanade.mangafeed.R;
  17. import eu.kanade.mangafeed.data.models.Page;
  18. import eu.kanade.mangafeed.ui.activity.ReaderActivity;
  19. import eu.kanade.mangafeed.ui.fragment.base.BaseFragment;
  20. import rx.Observable;
  21. import rx.Subscription;
  22. import rx.android.schedulers.AndroidSchedulers;
  23. import rx.schedulers.Schedulers;
  24. import rx.subjects.PublishSubject;
  25. public class ReaderPageFragment extends BaseFragment {
  26. @Bind(R.id.page_image_view) SubsamplingScaleImageView imageView;
  27. @Bind(R.id.progress_container) LinearLayout progressContainer;
  28. @Bind(R.id.progress) ProgressBar progressBar;
  29. @Bind(R.id.progress_text) TextView progressText;
  30. @Bind(R.id.image_error) TextView errorText;
  31. private Page page;
  32. private Subscription progressSubscription;
  33. private Subscription statusSubscription;
  34. public static ReaderPageFragment newInstance(Page page) {
  35. ReaderPageFragment fragment = new ReaderPageFragment();
  36. fragment.setPage(page);
  37. return fragment;
  38. }
  39. @Override
  40. public void onCreate(Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. setRetainInstance(true);
  43. }
  44. @Override
  45. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  46. View view = inflater.inflate(R.layout.fragment_page, container, false);
  47. ButterKnife.bind(this, view);
  48. imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED);
  49. imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE);
  50. imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE);
  51. imageView.setOnTouchListener((v, motionEvent) ->
  52. ((ReaderActivity) getActivity()).onImageSingleTap(motionEvent));
  53. return view;
  54. }
  55. public void onStart() {
  56. super.onStart();
  57. observeStatus();
  58. }
  59. @Override
  60. public void onStop() {
  61. unsubscribeProgress();
  62. unsubscribeStatus();
  63. super.onStop();
  64. }
  65. public void setPage(Page page) {
  66. this.page = page;
  67. }
  68. private void showImage() {
  69. if (page == null || page.getImagePath() == null)
  70. return;
  71. imageView.setImage(ImageSource.uri(page.getImagePath()).tilingDisabled());
  72. progressContainer.setVisibility(View.GONE);
  73. }
  74. private void showDownloading() {
  75. progressText.setVisibility(View.VISIBLE);
  76. }
  77. private void showLoading() {
  78. progressText.setVisibility(View.VISIBLE);
  79. progressText.setText(R.string.downloading);
  80. }
  81. private void showError() {
  82. progressContainer.setVisibility(View.GONE);
  83. errorText.setVisibility(View.VISIBLE);
  84. }
  85. private void processStatus(int status) {
  86. switch (status) {
  87. case Page.LOAD_PAGE:
  88. showLoading();
  89. break;
  90. case Page.DOWNLOAD_IMAGE:
  91. observeProgress();
  92. showDownloading();
  93. break;
  94. case Page.READY:
  95. showImage();
  96. unsubscribeProgress();
  97. unsubscribeStatus();
  98. break;
  99. case Page.ERROR:
  100. showError();
  101. unsubscribeProgress();
  102. break;
  103. }
  104. }
  105. private void observeStatus() {
  106. if (page == null || statusSubscription != null)
  107. return;
  108. PublishSubject<Integer> statusSubject = PublishSubject.create();
  109. page.setStatusSubject(statusSubject);
  110. statusSubscription = statusSubject
  111. .startWith(page.getStatus())
  112. .observeOn(AndroidSchedulers.mainThread())
  113. .subscribe(this::processStatus);
  114. }
  115. private void observeProgress() {
  116. if (progressSubscription != null)
  117. return;
  118. final AtomicInteger currentValue = new AtomicInteger(-1);
  119. progressSubscription = Observable.interval(75, TimeUnit.MILLISECONDS)
  120. .subscribeOn(Schedulers.io())
  121. .observeOn(AndroidSchedulers.mainThread())
  122. .subscribe(tick -> {
  123. // Refresh UI only if progress change
  124. if (page.getProgress() != currentValue.get()) {
  125. currentValue.set(page.getProgress());
  126. progressText.setText(getString(R.string.download_progress, page.getProgress()));
  127. }
  128. });
  129. }
  130. private void unsubscribeStatus() {
  131. if (statusSubscription != null) {
  132. page.setStatusSubject(null);
  133. statusSubscription.unsubscribe();
  134. statusSubscription = null;
  135. }
  136. }
  137. private void unsubscribeProgress() {
  138. if (progressSubscription != null) {
  139. progressSubscription.unsubscribe();
  140. progressSubscription = null;
  141. }
  142. }
  143. }