mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Initial support for custom images scaling (#40)
This commit is contained in:
		| @@ -328,7 +328,6 @@ public class DownloadManager { | ||||
|  | ||||
|     // Return the page list from the chapter's directory if it exists, null otherwise | ||||
|     public List<Page> getSavedPageList(Source source, Manga manga, Chapter chapter) { | ||||
|         List<Page> pages = null; | ||||
|         File chapterDir = getAbsoluteChapterDirectory(source, manga, chapter); | ||||
|         File pagesFile = new File(chapterDir, PAGE_LIST_FILE); | ||||
|  | ||||
| @@ -337,14 +336,14 @@ public class DownloadManager { | ||||
|             if (pagesFile.exists()) { | ||||
|                 reader = new JsonReader(new FileReader(pagesFile.getAbsolutePath())); | ||||
|                 Type collectionType = new TypeToken<List<Page>>() {}.getType(); | ||||
|                 pages = gson.fromJson(reader, collectionType); | ||||
|                 return gson.fromJson(reader, collectionType); | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             Timber.e(e.getCause(), e.getMessage()); | ||||
|         } finally { | ||||
|             if (reader != null) try { reader.close(); } catch (IOException e) { /* Do nothing */ } | ||||
|         } | ||||
|         return pages; | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     // Shortcut for the method above | ||||
|   | ||||
| @@ -47,7 +47,7 @@ public class DownloadQueue extends ArrayList<Download> { | ||||
|     } | ||||
|  | ||||
|     public Observable<Download> getProgressObservable() { | ||||
|         return statusSubject | ||||
|         return statusSubject.onBackpressureBuffer() | ||||
|                 .startWith(getActiveDownloads()) | ||||
|                 .flatMap(download -> { | ||||
|                     if (download.getStatus() == Download.DOWNLOADING) { | ||||
|   | ||||
| @@ -88,6 +88,10 @@ public class PreferencesHelper { | ||||
|         return prefs.getInt(getKey(R.string.pref_default_viewer_key), 1); | ||||
|     } | ||||
|  | ||||
|     public Preference<Integer> imageScaleType() { | ||||
|         return rxPrefs.getInteger(getKey(R.string.pref_image_scale_type_key), 1); | ||||
|     } | ||||
|  | ||||
|     public Preference<Integer> portraitColumns() { | ||||
|         return rxPrefs.getInteger(getKey(R.string.pref_library_columns_portrait_key), 0); | ||||
|     } | ||||
|   | ||||
| @@ -7,6 +7,7 @@ import android.view.Gravity; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.view.WindowManager; | ||||
| import android.view.WindowManager.LayoutParams; | ||||
| import android.view.animation.Animation; | ||||
| @@ -44,7 +45,7 @@ public class ReaderMenu { | ||||
|     @Bind(R.id.lock_orientation) ImageButton lockOrientation; | ||||
|     @Bind(R.id.reader_selector) ImageButton readerSelector; | ||||
|     @Bind(R.id.reader_extra_settings) ImageButton extraSettings; | ||||
|     @Bind(R.id.reader_brightness) ImageButton brightnessSettings; | ||||
|     @Bind(R.id.reader_scale_type_selector) ImageButton scaleTypeSelector; | ||||
|  | ||||
|     private MenuItem nextChapterBtn; | ||||
|     private MenuItem prevChapterBtn; | ||||
| @@ -56,7 +57,6 @@ public class ReaderMenu { | ||||
|  | ||||
|     @State boolean showing; | ||||
|     private PopupWindow settingsPopup; | ||||
|     private PopupWindow brightnessPopup; | ||||
|     private boolean inverted; | ||||
|  | ||||
|     private DecimalFormat decimalFormat; | ||||
| @@ -73,7 +73,7 @@ public class ReaderMenu { | ||||
|         decimalFormat = new DecimalFormat("#.###"); | ||||
|         inverted = false; | ||||
|  | ||||
|         initializeOptions(); | ||||
|         initializeMenu(); | ||||
|     } | ||||
|  | ||||
|     public void add(Subscription subscription) { | ||||
| @@ -110,7 +110,6 @@ public class ReaderMenu { | ||||
|         bottomMenu.startAnimation(bottomMenuAnimation); | ||||
|  | ||||
|         settingsPopup.dismiss(); | ||||
|         brightnessPopup.dismiss(); | ||||
|  | ||||
|         showing = false; | ||||
|     } | ||||
| @@ -175,7 +174,7 @@ public class ReaderMenu { | ||||
|         if (nextChapterBtn != null) nextChapterBtn.setVisible(nextChapter != null); | ||||
|     } | ||||
|  | ||||
|     private void initializeOptions() { | ||||
|     private void initializeMenu() { | ||||
|         // Orientation changes | ||||
|         add(preferences.lockOrientation().asObservable() | ||||
|                 .subscribe(locked -> { | ||||
| @@ -190,6 +189,18 @@ public class ReaderMenu { | ||||
|         lockOrientation.setOnClickListener(v -> | ||||
|                 preferences.lockOrientation().set(!preferences.lockOrientation().get())); | ||||
|  | ||||
|         // Scale type selector | ||||
|         scaleTypeSelector.setOnClickListener(v -> { | ||||
|             showImmersiveDialog(new MaterialDialog.Builder(activity) | ||||
|                     .items(R.array.image_scale_type) | ||||
|                     .itemsCallbackSingleChoice(preferences.imageScaleType().get() - 1, | ||||
|                             (d, itemView, which, text) -> { | ||||
|                                 preferences.imageScaleType().set(which + 1); | ||||
|                                 return true; | ||||
|                             }) | ||||
|                     .build()); | ||||
|         }); | ||||
|  | ||||
|         // Reader selector | ||||
|         readerSelector.setOnClickListener(v -> { | ||||
|             final Manga manga = activity.getPresenter().getManga(); | ||||
| @@ -215,17 +226,6 @@ public class ReaderMenu { | ||||
|                 settingsPopup.dismiss(); | ||||
|         }); | ||||
|  | ||||
|         // Brightness popup | ||||
|         final View brightnessView = activity.getLayoutInflater().inflate(R.layout.reader_brightness, null); | ||||
|         brightnessPopup = new BrightnessPopupWindow(brightnessView); | ||||
|  | ||||
|         brightnessSettings.setOnClickListener(v -> { | ||||
|             if (!brightnessPopup.isShowing()) | ||||
|                 brightnessPopup.showAtLocation(brightnessSettings, | ||||
|                         Gravity.BOTTOM | Gravity.LEFT, 0, bottomMenu.getHeight()); | ||||
|             else | ||||
|                 brightnessPopup.dismiss(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     private void showImmersiveDialog(Dialog dialog) { | ||||
| @@ -247,8 +247,11 @@ public class ReaderMenu { | ||||
|         @Bind(R.id.hide_status_bar) CheckBox hideStatusBar; | ||||
|         @Bind(R.id.keep_screen_on) CheckBox keepScreenOn; | ||||
|         @Bind(R.id.reader_theme) CheckBox readerTheme; | ||||
|         @Bind(R.id.image_decoder_container) ViewGroup imageDecoderContainer; | ||||
|         @Bind(R.id.image_decoder) TextView imageDecoder; | ||||
|         @Bind(R.id.image_decoder_initial) TextView imageDecoderInitial; | ||||
|         @Bind(R.id.custom_brightness) CheckBox customBrightness; | ||||
|         @Bind(R.id.brightness_seekbar) SeekBar brightnessSeekbar; | ||||
|  | ||||
|         public SettingsPopupWindow(View view) { | ||||
|             super(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); | ||||
| @@ -282,7 +285,7 @@ public class ReaderMenu { | ||||
|             readerTheme.setOnCheckedChangeListener((view, isChecked) -> | ||||
|                     preferences.readerTheme().set(isChecked ? 1 : 0)); | ||||
|  | ||||
|             imageDecoder.setOnClickListener(v -> { | ||||
|             imageDecoderContainer.setOnClickListener(v -> { | ||||
|                 showImmersiveDialog(new MaterialDialog.Builder(activity) | ||||
|                         .title(R.string.pref_image_decoder) | ||||
|                         .items(R.array.image_decoders) | ||||
| @@ -294,6 +297,21 @@ public class ReaderMenu { | ||||
|                                 }) | ||||
|                         .build()); | ||||
|             }); | ||||
|  | ||||
|             add(preferences.customBrightness() | ||||
|                     .asObservable() | ||||
|                     .subscribe(isEnabled -> { | ||||
|                         customBrightness.setChecked(isEnabled); | ||||
|                         brightnessSeekbar.setEnabled(isEnabled); | ||||
|                     })); | ||||
|  | ||||
|             customBrightness.setOnCheckedChangeListener((view, isChecked) -> | ||||
|                     preferences.customBrightness().set(isChecked)); | ||||
|  | ||||
|             brightnessSeekbar.setMax(100); | ||||
|             brightnessSeekbar.setProgress(Math.round( | ||||
|                     preferences.customBrightnessValue().get() * brightnessSeekbar.getMax())); | ||||
|             brightnessSeekbar.setOnSeekBarChangeListener(new BrightnessSeekBarChangeListener()); | ||||
|         } | ||||
|  | ||||
|         private void setDecoderInitial(int decoder) { | ||||
| @@ -314,37 +332,6 @@ public class ReaderMenu { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     class BrightnessPopupWindow extends PopupWindow { | ||||
|  | ||||
|         @Bind(R.id.custom_brightness) CheckBox customBrightness; | ||||
|         @Bind(R.id.brightness_seekbar) SeekBar brightnessSeekbar; | ||||
|  | ||||
|         public BrightnessPopupWindow(View view) { | ||||
|             super(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); | ||||
|             setAnimationStyle(R.style.reader_brightness_popup_animation); | ||||
|             ButterKnife.bind(this, view); | ||||
|             initializePopupMenu(); | ||||
|         } | ||||
|  | ||||
|         private void initializePopupMenu() { | ||||
|             add(preferences.customBrightness() | ||||
|                     .asObservable() | ||||
|                     .subscribe(isEnabled -> { | ||||
|                         customBrightness.setChecked(isEnabled); | ||||
|                         brightnessSeekbar.setEnabled(isEnabled); | ||||
|                     })); | ||||
|  | ||||
|             customBrightness.setOnCheckedChangeListener((view, isChecked) -> | ||||
|                     preferences.customBrightness().set(isChecked)); | ||||
|  | ||||
|             brightnessSeekbar.setMax(100); | ||||
|             brightnessSeekbar.setProgress(Math.round( | ||||
|                     preferences.customBrightnessValue().get() * brightnessSeekbar.getMax())); | ||||
|             brightnessSeekbar.setOnSeekBarChangeListener(new BrightnessSeekBarChangeListener()); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     class PageSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener { | ||||
|  | ||||
|         @Override | ||||
|   | ||||
| @@ -22,6 +22,8 @@ public abstract class PagerReader extends BaseReader { | ||||
|     protected boolean transitions; | ||||
|     protected CompositeSubscription subscriptions; | ||||
|  | ||||
|     protected int scaleType = 1; | ||||
|  | ||||
|     protected void initializePager(Pager pager) { | ||||
|         this.pager = pager; | ||||
|         pager.setLayoutParams(new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); | ||||
| @@ -66,6 +68,13 @@ public abstract class PagerReader extends BaseReader { | ||||
|                 .distinctUntilChanged() | ||||
|                 .subscribe(v -> adapter.notifyDataSetChanged())); | ||||
|  | ||||
|         subscriptions.add(getReaderActivity().getPreferences().imageScaleType() | ||||
|                 .asObservable() | ||||
|                 .doOnNext(this::setImageScaleType) | ||||
|                 .skip(1) | ||||
|                 .distinctUntilChanged() | ||||
|                 .subscribe(v -> adapter.notifyDataSetChanged())); | ||||
|  | ||||
|         subscriptions.add(getReaderActivity().getPreferences().enableTransitions() | ||||
|                 .asObservable() | ||||
|                 .subscribe(value -> transitions = value)); | ||||
| @@ -110,6 +119,10 @@ public abstract class PagerReader extends BaseReader { | ||||
|         return pager.onImageTouch(motionEvent); | ||||
|     } | ||||
|  | ||||
|     private void setImageScaleType(int scaleType) { | ||||
|         this.scaleType = scaleType; | ||||
|     } | ||||
|  | ||||
|     public abstract void onFirstPageOut(); | ||||
|     public abstract void onLastPageOut(); | ||||
|  | ||||
|   | ||||
| @@ -25,7 +25,6 @@ import eu.kanade.tachiyomi.R; | ||||
| import eu.kanade.tachiyomi.data.source.model.Page; | ||||
| import eu.kanade.tachiyomi.ui.base.fragment.BaseFragment; | ||||
| import eu.kanade.tachiyomi.ui.reader.ReaderActivity; | ||||
| import eu.kanade.tachiyomi.ui.reader.viewer.base.BaseReader; | ||||
| import rx.Observable; | ||||
| import rx.Subscription; | ||||
| import rx.android.schedulers.AndroidSchedulers; | ||||
| @@ -55,7 +54,7 @@ public class PagerReaderFragment extends BaseFragment { | ||||
|         View view = inflater.inflate(R.layout.item_pager_reader, container, false); | ||||
|         ButterKnife.bind(this, view); | ||||
|         ReaderActivity activity = getReaderActivity(); | ||||
|         BaseReader parentFragment = (BaseReader) getParentFragment(); | ||||
|         PagerReader parentFragment = (PagerReader) getParentFragment(); | ||||
|  | ||||
|         if (activity.getReaderTheme() == ReaderActivity.BLACK_THEME) { | ||||
|              progressText.setTextColor(ContextCompat.getColor(getContext(), R.color.light_grey)); | ||||
| @@ -65,7 +64,7 @@ public class PagerReaderFragment extends BaseFragment { | ||||
|         imageView.setMaxDimensions(activity.getMaxBitmapSize(), activity.getMaxBitmapSize()); | ||||
|         imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED); | ||||
|         imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE); | ||||
|         imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE); | ||||
|         imageView.setMinimumScaleType(parentFragment.scaleType); | ||||
|         imageView.setRegionDecoderClass(parentFragment.getRegionDecoderClass()); | ||||
|         imageView.setOnTouchListener((v, motionEvent) -> parentFragment.onImageTouch(motionEvent)); | ||||
|         imageView.setOnImageEventListener(new SubsamplingScaleImageView.DefaultOnImageEventListener() { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user