mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	New reader menu (#368)
This commit is contained in:
		| @@ -18,7 +18,7 @@ class PreferenceKeys(context: Context) { | ||||
|  | ||||
|     val showPageNumber = context.getString(R.string.pref_show_page_number_key) | ||||
|  | ||||
|     val hideStatusBar = context.getString(R.string.pref_hide_status_bar_key) | ||||
|     val fullscreen = context.getString(R.string.pref_fullscreen_key) | ||||
|  | ||||
|     val keepScreenOn = context.getString(R.string.pref_keep_screen_on_key) | ||||
|  | ||||
|   | ||||
| @@ -42,7 +42,7 @@ class PreferencesHelper(context: Context) { | ||||
|  | ||||
|     fun showPageNumber() = rxPrefs.getBoolean(keys.showPageNumber, true) | ||||
|  | ||||
|     fun hideStatusBar() = rxPrefs.getBoolean(keys.hideStatusBar, true) | ||||
|     fun fullscreen() = rxPrefs.getBoolean(keys.fullscreen, true) | ||||
|  | ||||
|     fun keepScreenOn() = rxPrefs.getBoolean(keys.keepScreenOn, true) | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.data.source.model | ||||
|  | ||||
| import eu.kanade.tachiyomi.data.network.ProgressListener | ||||
| import eu.kanade.tachiyomi.ui.reader.ReaderChapter | ||||
| import rx.subjects.PublishSubject | ||||
| import rx.subjects.Subject | ||||
|  | ||||
| class Page( | ||||
|         val pageNumber: Int, | ||||
| @@ -21,13 +21,13 @@ class Page( | ||||
|  | ||||
|     @Transient @Volatile var progress: Int = 0 | ||||
|  | ||||
|     @Transient private var statusSubject: PublishSubject<Int>? = null | ||||
|     @Transient private var statusSubject: Subject<Int, Int>? = null | ||||
|  | ||||
|     override fun update(bytesRead: Long, contentLength: Long, done: Boolean) { | ||||
|         progress = (100 * bytesRead / contentLength).toInt() | ||||
|     } | ||||
|  | ||||
|     fun setStatusSubject(subject: PublishSubject<Int>?) { | ||||
|     fun setStatusSubject(subject: Subject<Int, Int>?) { | ||||
|         this.statusSubject = subject | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -1,16 +1,16 @@ | ||||
| package eu.kanade.tachiyomi.ui.reader | ||||
|  | ||||
| import android.app.Dialog | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.content.pm.ActivityInfo | ||||
| import android.content.res.Configuration | ||||
| import android.graphics.Color | ||||
| import android.os.Build | ||||
| import android.os.Build.VERSION_CODES.KITKAT | ||||
| import android.os.Bundle | ||||
| import android.support.v4.content.ContextCompat | ||||
| import android.view.* | ||||
| import android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | ||||
| import android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | ||||
| import android.view.animation.Animation | ||||
| import android.view.animation.AnimationUtils | ||||
| import android.widget.SeekBar | ||||
| @@ -33,11 +33,13 @@ import eu.kanade.tachiyomi.util.toast | ||||
| import eu.kanade.tachiyomi.widget.SimpleAnimationListener | ||||
| import eu.kanade.tachiyomi.widget.SimpleSeekBarListener | ||||
| import kotlinx.android.synthetic.main.activity_reader.* | ||||
| import kotlinx.android.synthetic.main.reader_menu.* | ||||
| import me.zhanghai.android.systemuihelper.SystemUiHelper | ||||
| import me.zhanghai.android.systemuihelper.SystemUiHelper.* | ||||
| import nucleus.factory.RequiresPresenter | ||||
| import rx.Subscription | ||||
| import rx.subscriptions.CompositeSubscription | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.text.DecimalFormat | ||||
|  | ||||
| @RequiresPresenter(ReaderPresenter::class) | ||||
| @@ -62,8 +64,6 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|  | ||||
|     private var viewer: BaseReader? = null | ||||
|  | ||||
|     private var uiFlags: Int = 0 | ||||
|  | ||||
|     lateinit var subscriptions: CompositeSubscription | ||||
|         private set | ||||
|  | ||||
| @@ -77,16 +77,13 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|  | ||||
|     private val decimalFormat = DecimalFormat("#.###") | ||||
|  | ||||
|     private var popupMenu: ReaderPopupMenu? = null | ||||
|  | ||||
|     private var nextChapterBtn: MenuItem? = null | ||||
|  | ||||
|     private var prevChapterBtn: MenuItem? = null | ||||
|  | ||||
|     private val volumeKeysEnabled by lazy { preferences.readWithVolumeKeys().getOrDefault() } | ||||
|  | ||||
|     val preferences: PreferencesHelper | ||||
|         get() = presenter.prefs | ||||
|     val preferences by injectLazy<PreferencesHelper>() | ||||
|  | ||||
|     private var systemUi: SystemUiHelper? = null | ||||
|  | ||||
|     private var menuVisible = false | ||||
|  | ||||
|     override fun onCreate(savedState: Bundle?) { | ||||
|         super.onCreate(savedState) | ||||
| @@ -100,47 +97,56 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|         setupToolbar(toolbar) | ||||
|         subscriptions = CompositeSubscription() | ||||
|  | ||||
|         initializeMenu() | ||||
|         initializeSettings() | ||||
|         initializeBottomMenu() | ||||
|  | ||||
|         if (savedState != null) { | ||||
|             setMenuVisibility(savedState.getBoolean(MENU_VISIBLE), animate = false) | ||||
|             menuVisible = savedState.getBoolean(MENU_VISIBLE) | ||||
|         } | ||||
|  | ||||
|         maxBitmapSize = GLUtil.getMaxTextureSize() | ||||
|     } | ||||
|         setMenuVisibility(menuVisible) | ||||
|  | ||||
|     override fun onResume() { | ||||
|         super.onResume() | ||||
|         setSystemUiVisibility() | ||||
|         maxBitmapSize = GLUtil.getMaxTextureSize() | ||||
|  | ||||
|         left_chapter.setOnClickListener { | ||||
|             if (viewer != null) { | ||||
|                 if (viewer is RightToLeftReader) | ||||
|                     requestNextChapter() | ||||
|                 else | ||||
|                     requestPreviousChapter() | ||||
|             } | ||||
|         } | ||||
|         right_chapter.setOnClickListener { | ||||
|             if (viewer != null) { | ||||
|                 if (viewer is RightToLeftReader) | ||||
|                     requestPreviousChapter() | ||||
|                 else | ||||
|                     requestNextChapter() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     override fun onDestroy() { | ||||
|         subscriptions.unsubscribe() | ||||
|         popupMenu?.dismiss() | ||||
|         viewer = null | ||||
|         super.onDestroy() | ||||
|     } | ||||
|  | ||||
|     override fun onCreateOptionsMenu(menu: Menu): Boolean { | ||||
|         menuInflater.inflate(R.menu.reader, menu) | ||||
|         nextChapterBtn = menu.findItem(R.id.action_next_chapter) | ||||
|         prevChapterBtn = menu.findItem(R.id.action_previous_chapter) | ||||
|         setAdjacentChaptersVisibility() | ||||
|         return true | ||||
|     } | ||||
|  | ||||
|     override fun onOptionsItemSelected(item: MenuItem): Boolean { | ||||
|         when (item.itemId) { | ||||
|             R.id.action_previous_chapter -> requestPreviousChapter() | ||||
|             R.id.action_next_chapter -> requestNextChapter() | ||||
|             R.id.action_settings -> ReaderSettingsDialog().show(supportFragmentManager, "settings") | ||||
|             else -> return super.onOptionsItemSelected(item) | ||||
|         } | ||||
|         return true | ||||
|     } | ||||
|  | ||||
|     override fun onSaveInstanceState(outState: Bundle) { | ||||
|         outState.putBoolean(MENU_VISIBLE, reader_menu.visibility == View.VISIBLE) | ||||
|         outState.putBoolean(MENU_VISIBLE, menuVisible) | ||||
|         super.onSaveInstanceState(outState) | ||||
|     } | ||||
|  | ||||
| @@ -148,7 +154,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|         val chapterToUpdate = presenter.getMangaSyncChapterToUpdate() | ||||
|  | ||||
|         if (chapterToUpdate > 0) { | ||||
|             if (presenter.prefs.askUpdateMangaSync()) { | ||||
|             if (preferences.askUpdateMangaSync()) { | ||||
|                 MaterialDialog.Builder(this) | ||||
|                         .content(getString(R.string.confirm_update_manga_sync, chapterToUpdate)) | ||||
|                         .positiveText(android.R.string.yes) | ||||
| @@ -165,13 +171,6 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     override fun onWindowFocusChanged(hasFocus: Boolean) { | ||||
|         super.onWindowFocusChanged(hasFocus) | ||||
|         if (hasFocus) { | ||||
|             setSystemUiVisibility() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     override fun dispatchKeyEvent(event: KeyEvent): Boolean { | ||||
|         if (!isFinishing) { | ||||
|             when (event.keyCode) { | ||||
| @@ -270,16 +269,19 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|         viewer?.onPageListAppendReady(chapter) | ||||
|     } | ||||
|  | ||||
|     @Suppress("UNUSED_PARAMETER") | ||||
|     fun onAdjacentChapters(previous: Chapter?, next: Chapter?) { | ||||
|         setAdjacentChaptersVisibility() | ||||
|     } | ||||
|         val isInverted = viewer is RightToLeftReader | ||||
|  | ||||
|     private fun setAdjacentChaptersVisibility() { | ||||
|         prevChapterBtn?.isVisible = presenter.hasPreviousChapter() | ||||
|         nextChapterBtn?.isVisible = presenter.hasNextChapter() | ||||
|     } | ||||
|         // Chapters are inverted for the right to left reader | ||||
|         val hasRightChapter = (if (isInverted) previous else next) != null | ||||
|         val hasLeftChapter = (if (isInverted) next else previous) != null | ||||
|  | ||||
|         right_chapter.isEnabled = hasRightChapter | ||||
|         right_chapter.alpha = if (hasRightChapter) 1f else 0.4f | ||||
|  | ||||
|         left_chapter.isEnabled = hasLeftChapter | ||||
|         left_chapter.alpha = if (hasLeftChapter) 1f else 0.4f | ||||
|     } | ||||
|  | ||||
|     private fun getOrCreateViewer(manga: Manga): BaseReader { | ||||
|         val mangaViewer = if (manga.viewer == 0) preferences.defaultViewer() else manga.viewer | ||||
| @@ -323,7 +325,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|     } | ||||
|  | ||||
|     fun toggleMenu() { | ||||
|         setMenuVisibility(reader_menu.visibility == View.GONE) | ||||
|         setMenuVisibility(!menuVisible) | ||||
|     } | ||||
|  | ||||
|     fun requestNextChapter() { | ||||
| @@ -338,34 +340,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun setMenuVisibility(visible: Boolean, animate: Boolean = true) { | ||||
|         if (visible) { | ||||
|             reader_menu.visibility = View.VISIBLE | ||||
|  | ||||
|             if (animate) { | ||||
|                 val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_top) | ||||
|                 toolbar.startAnimation(toolbarAnimation) | ||||
|  | ||||
|                 val bottomMenuAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_bottom) | ||||
|                 reader_menu_bottom.startAnimation(bottomMenuAnimation) | ||||
|             } | ||||
|         } else { | ||||
|             val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_top) | ||||
|             toolbarAnimation.setAnimationListener(object : SimpleAnimationListener() { | ||||
|                 override fun onAnimationEnd(animation: Animation) { | ||||
|                     reader_menu.visibility = View.GONE | ||||
|                 } | ||||
|             }) | ||||
|             toolbar.startAnimation(toolbarAnimation) | ||||
|  | ||||
|             val bottomMenuAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_bottom) | ||||
|             reader_menu_bottom.startAnimation(bottomMenuAnimation) | ||||
|  | ||||
|             popupMenu?.dismiss() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun initializeMenu() { | ||||
|     private fun initializeBottomMenu() { | ||||
|         // Intercept all events in this layout | ||||
|         reader_menu_bottom.setOnTouchListener { v, event -> true } | ||||
|  | ||||
| @@ -376,94 +351,17 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|  | ||||
|         lock_orientation.setOnClickListener { v -> | ||||
|             showImmersiveDialog(MaterialDialog.Builder(this) | ||||
|                     .title(R.string.pref_rotation_type) | ||||
|                     .items(R.array.rotation_type) | ||||
|                     .itemsCallbackSingleChoice(preferences.rotation().getOrDefault() - 1, | ||||
|                             { d, itemView, which, text -> | ||||
|                                 preferences.rotation().set(which + 1) | ||||
|                                 true | ||||
|                             }) | ||||
|                     .build()) | ||||
|         } | ||||
|  | ||||
|         reader_zoom_selector.setOnClickListener { v -> | ||||
|             showImmersiveDialog(MaterialDialog.Builder(this) | ||||
|                     .title(R.string.pref_zoom_start) | ||||
|                     .items(R.array.zoom_start) | ||||
|                     .itemsCallbackSingleChoice(preferences.zoomStart().getOrDefault() - 1, | ||||
|                             { d, itemView, which, text -> | ||||
|                                 preferences.zoomStart().set(which + 1) | ||||
|                                 true | ||||
|                             }) | ||||
|                     .build()) | ||||
|         } | ||||
|  | ||||
|         reader_scale_type_selector.setOnClickListener { v -> | ||||
|             showImmersiveDialog(MaterialDialog.Builder(this) | ||||
|                     .title(R.string.pref_image_scale_type) | ||||
|                     .items(R.array.image_scale_type) | ||||
|                     .itemsCallbackSingleChoice(preferences.imageScaleType().getOrDefault() - 1, | ||||
|                             { d, itemView, which, text -> | ||||
|                                 preferences.imageScaleType().set(which + 1) | ||||
|                                 true | ||||
|                             }) | ||||
|                     .build()) | ||||
|         } | ||||
|  | ||||
|         reader_selector.setOnClickListener { v -> | ||||
|             showImmersiveDialog(MaterialDialog.Builder(this) | ||||
|                     .title(R.string.pref_viewer_type) | ||||
|                     .items(R.array.viewers_selector) | ||||
|                     .itemsCallbackSingleChoice(presenter.manga.viewer, | ||||
|                             { d, itemView, which, text -> | ||||
|                                 presenter.updateMangaViewer(which) | ||||
|                                 recreate() | ||||
|                                 true | ||||
|                             }) | ||||
|                     .build()) | ||||
|         } | ||||
|  | ||||
|         val popupView = layoutInflater.inflate(R.layout.reader_popup, null) | ||||
|         popupMenu = ReaderPopupMenu(this, popupView) | ||||
|  | ||||
|         reader_extra_settings.setOnClickListener { | ||||
|             popupMenu?.let { | ||||
|                 if (!it.isShowing) | ||||
|                     it.showAtLocation(reader_extra_settings, | ||||
|                             Gravity.BOTTOM or Gravity.RIGHT, 0, reader_menu_bottom.height) | ||||
|                 else | ||||
|                     it.dismiss() | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     private fun initializeSettings() { | ||||
|         subscriptions += preferences.rotation().asObservable() | ||||
|                 .subscribe { setRotation(it) } | ||||
|  | ||||
|         subscriptions += preferences.showPageNumber().asObservable() | ||||
|                 .subscribe { setPageNumberVisibility(it) } | ||||
|  | ||||
|         subscriptions += preferences.rotation().asObservable() | ||||
|                 .subscribe { | ||||
|                     setRotation(it) | ||||
|  | ||||
|                     val isPortrait = resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT | ||||
|  | ||||
|                     val resourceId = if (it == 1) | ||||
|                         R.drawable.ic_screen_rotation_white_24dp | ||||
|                     else if (isPortrait) | ||||
|                         R.drawable.ic_screen_lock_portrait_white_24dp | ||||
|                     else | ||||
|                         R.drawable.ic_screen_lock_landscape_white_24dp | ||||
|  | ||||
|                     lock_orientation.setImageResource(resourceId) | ||||
|                 } | ||||
|  | ||||
|         subscriptions += preferences.hideStatusBar().asObservable() | ||||
|                 .subscribe { setStatusBarVisibility(it) } | ||||
|         subscriptions += preferences.fullscreen().asObservable() | ||||
|                 .subscribe { setFullscreen(it) } | ||||
|  | ||||
|         subscriptions += preferences.keepScreenOn().asObservable() | ||||
|                 .subscribe { setKeepScreenOn(it) } | ||||
| @@ -496,6 +394,16 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|         page_number.visibility = if (visible) View.VISIBLE else View.INVISIBLE | ||||
|     } | ||||
|  | ||||
|     private fun setFullscreen(enabled: Boolean) { | ||||
|         systemUi = if (enabled) { | ||||
|             val level = if (Build.VERSION.SDK_INT >= KITKAT) LEVEL_IMMERSIVE else LEVEL_HIDE_STATUS_BAR | ||||
|             val flags = FLAG_IMMERSIVE_STICKY or FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES | ||||
|             SystemUiHelper(this, level, flags) | ||||
|         } else { | ||||
|             null | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun setKeepScreenOn(enabled: Boolean) { | ||||
|         if (enabled) { | ||||
|             window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) | ||||
| @@ -523,29 +431,6 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|         window.attributes = window.attributes.apply { screenBrightness = value } | ||||
|     } | ||||
|  | ||||
|     private fun setStatusBarVisibility(hidden: Boolean) { | ||||
|         createUiHideFlags(hidden) | ||||
|         setSystemUiVisibility() | ||||
|     } | ||||
|  | ||||
|     private fun createUiHideFlags(statusBarHidden: Boolean) { | ||||
|         uiFlags = 0 | ||||
|         uiFlags = uiFlags or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | ||||
|         if (statusBarHidden) { | ||||
|             uiFlags = uiFlags or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or | ||||
|                     View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or | ||||
|                     View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or | ||||
|                     View.SYSTEM_UI_FLAG_FULLSCREEN | ||||
|         } | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { | ||||
|             uiFlags = uiFlags or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun setSystemUiVisibility() { | ||||
|         window.decorView.systemUiVisibility = uiFlags | ||||
|     } | ||||
|  | ||||
|     private fun applyTheme(theme: Int) { | ||||
|         readerTheme = theme | ||||
|         val rootView = window.decorView.rootView | ||||
| @@ -560,12 +445,38 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun showImmersiveDialog(dialog: Dialog) { | ||||
|         // Hack to not leave immersive mode | ||||
|         dialog.window.setFlags(FLAG_NOT_FOCUSABLE, FLAG_NOT_FOCUSABLE) | ||||
|         dialog.show() | ||||
|         dialog.window.decorView.systemUiVisibility = window.decorView.systemUiVisibility | ||||
|         dialog.window.clearFlags(FLAG_NOT_FOCUSABLE) | ||||
|     private fun setMenuVisibility(visible: Boolean) { | ||||
|         menuVisible = visible | ||||
|         if (visible) { | ||||
|             systemUi?.show() | ||||
|             reader_menu.visibility = View.VISIBLE | ||||
|  | ||||
|             val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_top) | ||||
|             toolbarAnimation.setAnimationListener(object : SimpleAnimationListener() { | ||||
|                 override fun onAnimationStart(animation: Animation) { | ||||
|                     // Fix status bar being translucent the first time it's opened. | ||||
|                     if (Build.VERSION.SDK_INT >= 21) { | ||||
|                         window.addFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) | ||||
|                     } | ||||
|                 } | ||||
|             }) | ||||
|             toolbar.startAnimation(toolbarAnimation) | ||||
|  | ||||
|             val bottomMenuAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_bottom) | ||||
|             reader_menu_bottom.startAnimation(bottomMenuAnimation) | ||||
|         } else { | ||||
|             systemUi?.hide() | ||||
|             val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_top) | ||||
|             toolbarAnimation.setAnimationListener(object : SimpleAnimationListener() { | ||||
|                 override fun onAnimationEnd(animation: Animation) { | ||||
|                     reader_menu.visibility = View.GONE | ||||
|                 } | ||||
|             }) | ||||
|             toolbar.startAnimation(toolbarAnimation) | ||||
|  | ||||
|             val bottomMenuAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_bottom) | ||||
|             reader_menu_bottom.startAnimation(bottomMenuAnimation) | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,108 +0,0 @@ | ||||
| package eu.kanade.tachiyomi.ui.reader | ||||
|  | ||||
| import android.app.Dialog | ||||
| import android.view.View | ||||
| import android.view.ViewGroup.LayoutParams.WRAP_CONTENT | ||||
| import android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | ||||
| import android.widget.PopupWindow | ||||
| import android.widget.SeekBar | ||||
| import com.afollestad.materialdialogs.MaterialDialog | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||
| import eu.kanade.tachiyomi.widget.SimpleSeekBarListener | ||||
| import kotlinx.android.synthetic.main.reader_popup.view.* | ||||
| import java.lang.ref.WeakReference | ||||
|  | ||||
| class ReaderPopupMenu(activity: ReaderActivity, val view: View) : PopupWindow(view, WRAP_CONTENT, WRAP_CONTENT) { | ||||
|  | ||||
|     val activity = WeakReference(activity) | ||||
|  | ||||
|     init { | ||||
|         animationStyle = R.style.reader_settings_popup_animation | ||||
|         setValues(activity.preferences) | ||||
|     } | ||||
|  | ||||
|     private fun setValues(preferences: PreferencesHelper) = with(view) { | ||||
|         enable_transitions.isChecked = preferences.enableTransitions().getOrDefault() | ||||
|         show_page_number.isChecked = preferences.showPageNumber().getOrDefault() | ||||
|         hide_status_bar.isChecked = preferences.hideStatusBar().getOrDefault() | ||||
|         keep_screen_on.isChecked = preferences.keepScreenOn().getOrDefault() | ||||
|         reader_theme.isChecked = preferences.readerTheme().getOrDefault() == 1 | ||||
|  | ||||
|         setDecoderInitial(preferences.imageDecoder().getOrDefault()) | ||||
|  | ||||
|         // Add a listener to change the corresponding setting | ||||
|         enable_transitions.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.enableTransitions().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         show_page_number.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.showPageNumber().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         hide_status_bar.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.hideStatusBar().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         keep_screen_on.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.keepScreenOn().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         reader_theme.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.readerTheme().set(if (isChecked) 1 else 0) | ||||
|         } | ||||
|  | ||||
|         image_decoder_container.setOnClickListener { v -> | ||||
|             showImmersiveDialog(MaterialDialog.Builder(view.context) | ||||
|                     .title(R.string.pref_image_decoder) | ||||
|                     .items(R.array.image_decoders) | ||||
|                     .itemsCallbackSingleChoice(preferences.imageDecoder().getOrDefault(), { dialog, itemView, which, text -> | ||||
|                         preferences.imageDecoder().set(which) | ||||
|                         setDecoderInitial(which) | ||||
|                         true | ||||
|                     }) | ||||
|                     .build()) | ||||
|         } | ||||
|  | ||||
|         activity.get().subscriptions.add(preferences.customBrightness().asObservable() | ||||
|                 .subscribe { isEnabled -> | ||||
|                     custom_brightness.isChecked = isEnabled | ||||
|                     brightness_seekbar.isEnabled = isEnabled | ||||
|                 }) | ||||
|  | ||||
|         custom_brightness.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.customBrightness().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         brightness_seekbar.max = 100 | ||||
|         brightness_seekbar.progress = Math.round( | ||||
|                 preferences.customBrightnessValue().getOrDefault() * brightness_seekbar.max) | ||||
|         brightness_seekbar.setOnSeekBarChangeListener(object : SimpleSeekBarListener() { | ||||
|             override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { | ||||
|                 if (fromUser) { | ||||
|                     preferences.customBrightnessValue().set(progress.toFloat() / seekBar.max) | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|     private fun setDecoderInitial(decoder: Int) { | ||||
|         val initial: String | ||||
|         when (decoder) { | ||||
|             0 -> initial = "R" | ||||
|             1 -> initial = "S" | ||||
|             else -> initial = "" | ||||
|         } | ||||
|         view.image_decoder_initial.text = initial | ||||
|     } | ||||
|  | ||||
|     private fun showImmersiveDialog(dialog: Dialog) { | ||||
|         // Hack to not leave immersive mode | ||||
|         dialog.window.setFlags(FLAG_NOT_FOCUSABLE, FLAG_NOT_FOCUSABLE) | ||||
|         dialog.show() | ||||
|         dialog.window.decorView.systemUiVisibility = activity.get().window.decorView.systemUiVisibility | ||||
|         dialog.window.clearFlags(FLAG_NOT_FOCUSABLE) | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,129 @@ | ||||
| package eu.kanade.tachiyomi.ui.reader | ||||
|  | ||||
| import android.app.Dialog | ||||
| import android.os.Bundle | ||||
| import android.support.v4.app.DialogFragment | ||||
| import android.view.View | ||||
| import android.widget.SeekBar | ||||
| import com.afollestad.materialdialogs.MaterialDialog | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||
| import eu.kanade.tachiyomi.util.plusAssign | ||||
| import eu.kanade.tachiyomi.widget.SimpleItemSelectedListener | ||||
| import eu.kanade.tachiyomi.widget.SimpleSeekBarListener | ||||
| import kotlinx.android.synthetic.main.dialog_reader_settings.view.* | ||||
| import rx.Observable | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.subscriptions.CompositeSubscription | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.util.concurrent.TimeUnit.MILLISECONDS | ||||
|  | ||||
| class ReaderSettingsDialog : DialogFragment() { | ||||
|  | ||||
|     private val preferences by injectLazy<PreferencesHelper>() | ||||
|  | ||||
|     private lateinit var subscriptions: CompositeSubscription | ||||
|  | ||||
|     override fun onCreateDialog(savedState: Bundle?): Dialog { | ||||
|         val dialog = MaterialDialog.Builder(activity) | ||||
|                 .title(R.string.label_settings) | ||||
|                 .customView(R.layout.dialog_reader_settings, true) | ||||
|                 .positiveText(android.R.string.ok) | ||||
|                 .build() | ||||
|  | ||||
|         subscriptions = CompositeSubscription() | ||||
|         onViewCreated(dialog.view, savedState) | ||||
|  | ||||
|         return dialog | ||||
|     } | ||||
|  | ||||
|     override fun onViewCreated(view: View, savedState: Bundle?) = with(view) { | ||||
|         viewer.setSelection((activity as ReaderActivity).presenter.manga.viewer, false) | ||||
|         viewer.onItemSelectedListener = SimpleItemSelectedListener { position -> | ||||
|             subscriptions += Observable.timer(250, MILLISECONDS) | ||||
|                     .observeOn(AndroidSchedulers.mainThread()) | ||||
|                     .subscribe { | ||||
|                         (activity as ReaderActivity).presenter.updateMangaViewer(position) | ||||
|                         activity.recreate() | ||||
|                     } | ||||
|         } | ||||
|  | ||||
|         rotation_mode.setSelection(preferences.rotation().getOrDefault() - 1, false) | ||||
|         rotation_mode.onItemSelectedListener = SimpleItemSelectedListener { position -> | ||||
|             subscriptions += Observable.timer(250, MILLISECONDS) | ||||
|                     .observeOn(AndroidSchedulers.mainThread()) | ||||
|                     .subscribe { | ||||
|                         preferences.rotation().set(position + 1) | ||||
|                     } | ||||
|         } | ||||
|  | ||||
|         scale_type.setSelection(preferences.imageScaleType().getOrDefault() - 1, false) | ||||
|         scale_type.onItemSelectedListener = SimpleItemSelectedListener { position -> | ||||
|             preferences.imageScaleType().set(position + 1) | ||||
|         } | ||||
|  | ||||
|         zoom_start.setSelection(preferences.zoomStart().getOrDefault() - 1, false) | ||||
|         zoom_start.onItemSelectedListener = SimpleItemSelectedListener { position -> | ||||
|             preferences.zoomStart().set(position + 1) | ||||
|         } | ||||
|  | ||||
|         image_decoder.setSelection(preferences.imageDecoder().getOrDefault(), false) | ||||
|         image_decoder.onItemSelectedListener = SimpleItemSelectedListener { position -> | ||||
|             preferences.imageDecoder().set(position) | ||||
|         } | ||||
|  | ||||
|         background_color.setSelection(preferences.readerTheme().getOrDefault(), false) | ||||
|         background_color.onItemSelectedListener = SimpleItemSelectedListener { position -> | ||||
|             preferences.readerTheme().set(position) | ||||
|         } | ||||
|  | ||||
|         enable_transitions.isChecked = preferences.enableTransitions().getOrDefault() | ||||
|         enable_transitions.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.enableTransitions().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         show_page_number.isChecked = preferences.showPageNumber().getOrDefault() | ||||
|         show_page_number.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.showPageNumber().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         fullscreen.isChecked = preferences.fullscreen().getOrDefault() | ||||
|         fullscreen.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.fullscreen().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         keep_screen_on.isChecked = preferences.keepScreenOn().getOrDefault() | ||||
|         keep_screen_on.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.keepScreenOn().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         subscriptions += preferences.customBrightness().asObservable() | ||||
|                 .subscribe { isEnabled -> | ||||
|                     custom_brightness.isChecked = isEnabled | ||||
|                     brightness_seekbar.isEnabled = isEnabled | ||||
|                 } | ||||
|  | ||||
|         custom_brightness.setOnCheckedChangeListener { v, isChecked -> | ||||
|             preferences.customBrightness().set(isChecked) | ||||
|         } | ||||
|  | ||||
|         brightness_seekbar.max = 100 | ||||
|         brightness_seekbar.progress = Math.round( | ||||
|                 preferences.customBrightnessValue().getOrDefault() * brightness_seekbar.max) | ||||
|         brightness_seekbar.setOnSeekBarChangeListener(object : SimpleSeekBarListener() { | ||||
|             override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { | ||||
|                 if (fromUser) { | ||||
|                     preferences.customBrightnessValue().set(progress.toFloat() / seekBar.max) | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|  | ||||
|     } | ||||
|  | ||||
|     override fun onDestroyView() { | ||||
|         subscriptions.unsubscribe() | ||||
|         super.onDestroyView() | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -23,6 +23,7 @@ import rx.Subscription | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.schedulers.Schedulers | ||||
| import rx.subjects.PublishSubject | ||||
| import rx.subjects.SerializedSubject | ||||
| import java.io.File | ||||
| import java.util.concurrent.TimeUnit | ||||
| import java.util.concurrent.atomic.AtomicInteger | ||||
| @@ -150,7 +151,7 @@ class PagerReaderFragment : BaseFragment() { | ||||
|      */ | ||||
|     private fun observeStatus() { | ||||
|         page?.let { page -> | ||||
|             val statusSubject = PublishSubject.create<Int>() | ||||
|             val statusSubject = SerializedSubject(PublishSubject.create<Int>()) | ||||
|             page.setStatusSubject(statusSubject) | ||||
|  | ||||
|             statusSubscription?.unsubscribe() | ||||
|   | ||||
| @@ -14,6 +14,7 @@ import kotlinx.android.synthetic.main.item_webtoon_reader.view.* | ||||
| import rx.Subscription | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.subjects.PublishSubject | ||||
| import rx.subjects.SerializedSubject | ||||
| import java.io.File | ||||
|  | ||||
| /** | ||||
| @@ -56,7 +57,7 @@ class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter) | ||||
|             setOnImageEventListener(object : SubsamplingScaleImageView.DefaultOnImageEventListener() { | ||||
|                 override fun onImageLoaded() { | ||||
|                     // When the image is loaded, reset the minimum height to avoid gaps | ||||
|                     view.frame_container.minimumHeight = 0 | ||||
|                     view.frame_container.minimumHeight = 30 | ||||
|                 } | ||||
|  | ||||
|                 override fun onImageLoadError(e: Exception) { | ||||
| @@ -106,7 +107,7 @@ class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter) | ||||
|      */ | ||||
|     private fun observeStatus() { | ||||
|         page?.let { page -> | ||||
|             val statusSubject = PublishSubject.create<Int>() | ||||
|             val statusSubject = SerializedSubject(PublishSubject.create<Int>()) | ||||
|             page.setStatusSubject(statusSubject) | ||||
|  | ||||
|             statusSubscription?.unsubscribe() | ||||
|   | ||||
| @@ -0,0 +1,16 @@ | ||||
| package eu.kanade.tachiyomi.widget | ||||
|  | ||||
| import android.view.View | ||||
| import android.widget.AdapterView | ||||
| import android.widget.AdapterView.OnItemSelectedListener | ||||
|  | ||||
| class SimpleItemSelectedListener(private val callback: (Int) -> Unit): OnItemSelectedListener { | ||||
|  | ||||
|     override fun onNothingSelected(parent: AdapterView<*>?) { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { | ||||
|         callback(position) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										10
									
								
								app/src/main/res/drawable/empty_divider.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/drawable/empty_divider.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <shape xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <size | ||||
|         android:height="@dimen/material_layout_keylines_horizontal_mobile_margin" | ||||
|         android:width="0dp"/> | ||||
|  | ||||
|     <solid | ||||
|         android:color="@android:color/transparent"/> | ||||
|  | ||||
| </shape> | ||||
							
								
								
									
										9
									
								
								app/src/main/res/drawable/ic_settings_white_24dp.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/src/main/res/drawable/ic_settings_white_24dp.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|         android:width="24dp" | ||||
|         android:height="24dp" | ||||
|         android:viewportWidth="24.0" | ||||
|         android:viewportHeight="24.0"> | ||||
|     <path | ||||
|         android:fillColor="#FFFFFFFF" | ||||
|         android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/> | ||||
| </vector> | ||||
| @@ -1,30 +1,102 @@ | ||||
| <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|              android:layout_width="match_parent" | ||||
|              android:layout_height="match_parent" | ||||
|              android:gravity="center"> | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     android:gravity="center"> | ||||
|  | ||||
|     <FrameLayout | ||||
|         android:id="@+id/reader" | ||||
|         android:id="@+id/reader_container" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent"> | ||||
|  | ||||
|         <FrameLayout | ||||
|             android:id="@+id/reader" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="match_parent"> | ||||
|         </FrameLayout> | ||||
|  | ||||
|         <ProgressBar | ||||
|             android:id="@+id/please_wait" | ||||
|             style="?android:attr/progressBarStyleLarge" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_gravity="center"/> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/page_number" | ||||
|             style="@style/TextAppearance.Regular.Caption" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_gravity="bottom|start" | ||||
|             android:background="?android:attr/colorBackground" | ||||
|             android:padding="4dp"/> | ||||
|  | ||||
|     </FrameLayout> | ||||
|  | ||||
|     <ProgressBar | ||||
|         android:id="@+id/please_wait" | ||||
|         style="?android:attr/progressBarStyleLarge" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_gravity="center"/> | ||||
|     <FrameLayout | ||||
|         android:id="@+id/reader_menu" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:fitsSystemWindows="true" | ||||
|         android:visibility="invisible" | ||||
|         tools:visibility="visible"> | ||||
|  | ||||
|     <TextView | ||||
|         android:id="@+id/page_number" | ||||
|         style="@style/TextAppearance.Regular.Caption" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_gravity="bottom|start" | ||||
|         android:background="?android:attr/colorBackground" | ||||
|         android:padding="4dp"/> | ||||
|         <android.support.v7.widget.Toolbar | ||||
|             android:id="@+id/toolbar" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="?attr/actionBarSize" | ||||
|             android:background="?colorPrimary" | ||||
|             android:elevation="4dp" | ||||
|             android:theme="?attr/actionBarTheme"/> | ||||
|  | ||||
|     <include layout="@layout/reader_menu"/> | ||||
|         <LinearLayout | ||||
|             android:id="@+id/reader_menu_bottom" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="?attr/actionBarSize" | ||||
|             android:layout_gravity="bottom" | ||||
|             android:gravity="center" | ||||
|             android:background="?colorPrimary" | ||||
|             android:orientation="horizontal"> | ||||
|  | ||||
|             <ImageButton | ||||
|                 android:id="@+id/left_chapter" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="@dimen/material_layout_keylines_screen_edge_margin" | ||||
|                 android:background="?android:selectableItemBackground" | ||||
|                 app:srcCompat="@drawable/ic_skip_previous_white_24dp"/> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/left_page_text" | ||||
|                 android:layout_width="32dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:gravity="center" | ||||
|                 android:textSize="15sp"/> | ||||
|  | ||||
|             <SeekBar | ||||
|                 android:id="@+id/page_seekbar" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_weight="1"/> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/right_page_text" | ||||
|                 android:layout_width="32dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:gravity="center" | ||||
|                 android:textSize="15sp"/> | ||||
|  | ||||
|             <ImageButton | ||||
|                 android:id="@+id/right_chapter" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="@dimen/material_layout_keylines_screen_edge_margin" | ||||
|                 android:background="?android:selectableItemBackground" | ||||
|                 app:srcCompat="@drawable/ic_skip_next_white_24dp"/> | ||||
|  | ||||
|         </LinearLayout> | ||||
|  | ||||
|     </FrameLayout> | ||||
|  | ||||
| </FrameLayout> | ||||
							
								
								
									
										197
									
								
								app/src/main/res/layout/dialog_reader_settings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								app/src/main/res/layout/dialog_reader_settings.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <LinearLayout | ||||
|     xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:orientation="vertical" | ||||
|     android:padding="@dimen/material_component_dialogs_padding_around_content_area" | ||||
|     android:divider="@drawable/empty_divider" | ||||
|     android:showDividers="middle"> | ||||
|  | ||||
|     <!-- Viewer for this series --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="horizontal" | ||||
|         android:layout_gravity="center_vertical"> | ||||
|  | ||||
|         <TextView | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="1" | ||||
|             android:layout_gravity="center_vertical" | ||||
|             android:text="@string/viewer_for_this_series" /> | ||||
|  | ||||
|         <android.support.v7.widget.AppCompatSpinner | ||||
|             android:id="@+id/viewer" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="2" | ||||
|             android:entries="@array/viewers_selector"> | ||||
|  | ||||
|         </android.support.v7.widget.AppCompatSpinner> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <!-- Rotation --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="horizontal" | ||||
|         android:layout_gravity="center_vertical"> | ||||
|  | ||||
|         <TextView | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="1" | ||||
|             android:layout_gravity="center_vertical" | ||||
|             android:text="@string/pref_rotation_type" /> | ||||
|  | ||||
|         <android.support.v7.widget.AppCompatSpinner | ||||
|             android:id="@+id/rotation_mode" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="2" | ||||
|             android:entries="@array/rotation_type"> | ||||
|  | ||||
|         </android.support.v7.widget.AppCompatSpinner> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <!-- Scale type --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="horizontal" | ||||
|         android:layout_gravity="center_vertical"> | ||||
|  | ||||
|         <TextView | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="1" | ||||
|             android:layout_gravity="center_vertical" | ||||
|             android:text="@string/pref_image_scale_type" /> | ||||
|  | ||||
|         <android.support.v7.widget.AppCompatSpinner | ||||
|             android:id="@+id/scale_type" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="2" | ||||
|             android:entries="@array/image_scale_type"> | ||||
|  | ||||
|         </android.support.v7.widget.AppCompatSpinner> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <!-- Zoom start position --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="horizontal" | ||||
|         android:layout_gravity="center_vertical"> | ||||
|  | ||||
|         <TextView | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="1" | ||||
|             android:layout_gravity="center_vertical" | ||||
|             android:text="@string/pref_zoom_start" /> | ||||
|  | ||||
|         <android.support.v7.widget.AppCompatSpinner | ||||
|             android:id="@+id/zoom_start" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="2" | ||||
|             android:entries="@array/zoom_start"> | ||||
|  | ||||
|         </android.support.v7.widget.AppCompatSpinner> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <!-- Image decoder --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="horizontal" | ||||
|         android:layout_gravity="center_vertical"> | ||||
|  | ||||
|         <TextView | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="1" | ||||
|             android:layout_gravity="center_vertical" | ||||
|             android:text="@string/pref_image_decoder" /> | ||||
|  | ||||
|         <android.support.v7.widget.AppCompatSpinner | ||||
|             android:id="@+id/image_decoder" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="2" | ||||
|             android:entries="@array/image_decoders"> | ||||
|  | ||||
|         </android.support.v7.widget.AppCompatSpinner> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <!-- Background color --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="horizontal" | ||||
|         android:layout_gravity="center_vertical"> | ||||
|  | ||||
|         <TextView | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="1" | ||||
|             android:layout_gravity="center_vertical" | ||||
|             android:text="@string/pref_reader_theme" /> | ||||
|  | ||||
|         <android.support.v7.widget.AppCompatSpinner | ||||
|             android:id="@+id/background_color" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="2" | ||||
|             android:entries="@array/reader_themes"> | ||||
|  | ||||
|         </android.support.v7.widget.AppCompatSpinner> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <android.support.v7.widget.SwitchCompat | ||||
|         android:id="@+id/enable_transitions" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/pref_enable_transitions"/> | ||||
|  | ||||
|     <android.support.v7.widget.SwitchCompat | ||||
|         android:id="@+id/show_page_number" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/pref_show_page_number"/> | ||||
|  | ||||
|     <android.support.v7.widget.SwitchCompat | ||||
|         android:id="@+id/fullscreen" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/pref_fullscreen"/> | ||||
|  | ||||
|     <android.support.v7.widget.SwitchCompat | ||||
|         android:id="@+id/keep_screen_on" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/pref_keep_screen_on"/> | ||||
|  | ||||
|     <android.support.v7.widget.SwitchCompat | ||||
|         android:id="@+id/custom_brightness" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/pref_custom_brightness"/> | ||||
|  | ||||
|     <SeekBar | ||||
|         android:id="@+id/brightness_seekbar" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         style="@style/TextAppearance.Regular.Body1.Light"/> | ||||
|  | ||||
| </LinearLayout> | ||||
| @@ -1,119 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <RelativeLayout android:id="@+id/reader_menu" | ||||
|                 xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|                 xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|                 xmlns:tools="http://schemas.android.com/tools" | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:visibility="gone" | ||||
|                 tools:visibility="visible"> | ||||
|  | ||||
|     <android.support.v7.widget.Toolbar | ||||
|         android:id="@+id/toolbar" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="?attr/actionBarSize" | ||||
|         android:background="?colorPrimary" | ||||
|         android:elevation="4dp" | ||||
|         android:theme="?attr/actionBarTheme"/> | ||||
|  | ||||
|     <LinearLayout | ||||
|         android:id="@+id/reader_menu_bottom" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_alignParentBottom="true" | ||||
|         android:background="?colorPrimary" | ||||
|         android:orientation="vertical"> | ||||
|  | ||||
|         <LinearLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="?attr/actionBarSize"> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/left_page_text" | ||||
|                 android:layout_width="32dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="center_vertical" | ||||
|                 android:layout_marginBottom="12dp" | ||||
|                 android:layout_marginLeft="8dp" | ||||
|                 android:layout_marginTop="12dp" | ||||
|                 android:gravity="center_horizontal" | ||||
|                 android:textSize="15sp"/> | ||||
|  | ||||
|             <SeekBar | ||||
|                 android:id="@+id/page_seekbar" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="center_vertical" | ||||
|                 android:layout_weight="1" | ||||
|                 /> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/right_page_text" | ||||
|                 android:layout_width="32dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="center_vertical" | ||||
|                 android:layout_marginRight="8dp" | ||||
|                 android:gravity="center_horizontal" | ||||
|                 android:textSize="15sp"/> | ||||
|  | ||||
|         </LinearLayout> | ||||
|  | ||||
|         <View | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="1dp" | ||||
|             android:background="#777777"/> | ||||
|  | ||||
|         <LinearLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="?attr/actionBarSize"> | ||||
|  | ||||
|             <android.support.v7.widget.AppCompatImageButton | ||||
|                 android:id="@+id/lock_orientation" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:layout_gravity="center_vertical" | ||||
|                 android:layout_weight="1" | ||||
|                 android:background="?android:selectableItemBackground" | ||||
|                 app:srcCompat="@drawable/ic_screen_rotation_white_24dp"/> | ||||
|  | ||||
|             <android.support.v7.widget.AppCompatImageButton | ||||
|                 android:id="@+id/reader_zoom_selector" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:layout_gravity="center_vertical" | ||||
|                 android:layout_weight="1" | ||||
|                 android:background="?android:selectableItemBackground" | ||||
|                 app:srcCompat="@drawable/ic_crop_original_white_24dp"/> | ||||
|  | ||||
|             <android.support.v7.widget.AppCompatImageButton | ||||
|                 android:id="@+id/reader_scale_type_selector" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:layout_gravity="center_vertical" | ||||
|                 android:layout_weight="1" | ||||
|                 android:background="?android:selectableItemBackground" | ||||
|                 app:srcCompat="@drawable/ic_zoom_out_map_white_24dp"/> | ||||
|  | ||||
|             <android.support.v7.widget.AppCompatImageButton | ||||
|                 android:id="@+id/reader_selector" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:layout_gravity="center_vertical" | ||||
|                 android:layout_weight="1" | ||||
|                 android:background="?android:selectableItemBackground" | ||||
|                 app:srcCompat="@drawable/ic_view_carousel_white_24dp"/> | ||||
|  | ||||
|             <android.support.v7.widget.AppCompatImageButton | ||||
|                 android:id="@+id/reader_extra_settings" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:layout_gravity="center_vertical" | ||||
|                 android:layout_weight="1" | ||||
|                 android:background="?android:selectableItemBackground" | ||||
|                 app:srcCompat="@drawable/ic_more_vert_white_24dp"/> | ||||
|  | ||||
|         </LinearLayout> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
| </RelativeLayout> | ||||
| @@ -1,85 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|               android:layout_width="match_parent" | ||||
|               android:layout_height="match_parent" | ||||
|               xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|               android:background="?attr/colorPrimary" | ||||
|               android:orientation="vertical" | ||||
|               android:paddingBottom="5dp" | ||||
|               android:paddingLeft="5dp" | ||||
|               android:paddingRight="10dp" | ||||
|               android:paddingTop="5dp"> | ||||
|  | ||||
|     <LinearLayout | ||||
|         android:id="@+id/image_decoder_container" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content"> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/image_decoder_initial" | ||||
|             android:layout_width="32dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:gravity="center" | ||||
|             android:textColor="?colorAccent" | ||||
|             style="@style/TextAppearance.Regular.SubHeading"/> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/image_decoder" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="36dp" | ||||
|             android:gravity="center" | ||||
|             android:text="@string/pref_image_decoder" | ||||
|             style="@style/TextAppearance.Regular.Body1.Light"/> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <android.support.v7.widget.AppCompatCheckBox | ||||
|         android:id="@+id/reader_theme" | ||||
|         android:button="@drawable/reader_background_checkbox" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="36dp" | ||||
|         android:gravity="center" | ||||
|         android:text="@string/pref_reader_theme"/> | ||||
|  | ||||
|     <android.support.v7.widget.AppCompatCheckBox | ||||
|         android:id="@+id/enable_transitions" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="36dp" | ||||
|         android:gravity="center" | ||||
|         android:text="@string/pref_enable_transitions"/> | ||||
|  | ||||
|     <android.support.v7.widget.AppCompatCheckBox | ||||
|         android:id="@+id/show_page_number" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="36dp" | ||||
|         android:gravity="center" | ||||
|         android:text="@string/pref_show_page_number"/> | ||||
|  | ||||
|     <android.support.v7.widget.AppCompatCheckBox | ||||
|         android:id="@+id/hide_status_bar" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="36dp" | ||||
|         android:gravity="center" | ||||
|         android:text="@string/pref_hide_status_bar"/> | ||||
|  | ||||
|     <android.support.v7.widget.AppCompatCheckBox | ||||
|         android:id="@+id/keep_screen_on" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="36dp" | ||||
|         android:gravity="center" | ||||
|         android:text="@string/pref_keep_screen_on"/> | ||||
|  | ||||
|     <android.support.v7.widget.AppCompatCheckBox | ||||
|         android:id="@+id/custom_brightness" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:gravity="center" | ||||
|         android:text="@string/pref_custom_brightness"/> | ||||
|  | ||||
|     <SeekBar | ||||
|         android:id="@+id/brightness_seekbar" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         style="@style/TextAppearance.Regular.Body1.Light"/> | ||||
|  | ||||
| </LinearLayout> | ||||
| @@ -3,17 +3,10 @@ | ||||
|       xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|  | ||||
|     <item | ||||
|         android:id="@+id/action_previous_chapter" | ||||
|         android:title="@string/action_previous_chapter" | ||||
|         android:icon="@drawable/ic_skip_previous_white_24dp" | ||||
|         android:visible="false" | ||||
|         app:showAsAction="always" /> | ||||
|  | ||||
|     <item | ||||
|         android:id="@+id/action_next_chapter" | ||||
|         android:title="@string/action_next_chapter" | ||||
|         android:icon="@drawable/ic_skip_next_white_24dp" | ||||
|         android:visible="false" | ||||
|         app:showAsAction="always" /> | ||||
|         android:id="@+id/action_settings" | ||||
|         android:title="@string/label_settings" | ||||
|         android:icon="@drawable/ic_settings_white_24dp" | ||||
|         app:showAsAction="always" | ||||
|         /> | ||||
|  | ||||
| </menu> | ||||
| @@ -19,4 +19,14 @@ | ||||
|         <item name="android:statusBarColor">@android:color/transparent</item> | ||||
|         <item name="android:navigationBarColor">@color/colorPrimaryDark</item> | ||||
|     </style> | ||||
|  | ||||
|     <!--==============--> | ||||
|     <!-- Reader Theme --> | ||||
|     <!--==============--> | ||||
|     <style name="Theme.Reader" parent="Theme.Base.Reader"> | ||||
|         <!-- Attributes specific for SDK 21 and up  --> | ||||
|         <item name="android:statusBarColor">?colorPrimaryDark</item> | ||||
|         <item name="android:navigationBarColor">?colorPrimaryDark</item> | ||||
|     </style> | ||||
|  | ||||
| </resources> | ||||
| @@ -21,7 +21,7 @@ | ||||
|     <string name="pref_default_viewer_key">pref_default_viewer_key</string> | ||||
|     <string name="pref_image_scale_type_key">pref_image_scale_type_key</string> | ||||
|     <string name="pref_zoom_start_key">pref_zoom_start_key</string> | ||||
|     <string name="pref_hide_status_bar_key">pref_hide_status_bar_key</string> | ||||
|     <string name="pref_fullscreen_key">fullscreen</string> | ||||
|     <string name="pref_rotation_type_key">pref_rotation_type_key</string> | ||||
|     <string name="pref_enable_transitions_key">pref_enable_transitions_key</string> | ||||
|     <string name="pref_show_page_number_key">pref_show_page_number_key</string> | ||||
|   | ||||
| @@ -96,7 +96,7 @@ | ||||
|     <string name="dark_theme">Dark theme</string> | ||||
|  | ||||
|       <!-- Reader section --> | ||||
|     <string name="pref_hide_status_bar">Hide status bar</string> | ||||
|     <string name="pref_fullscreen">Fullscreen</string> | ||||
|     <string name="pref_lock_orientation">Lock orientation</string> | ||||
|     <string name="pref_enable_transitions">Enable transitions</string> | ||||
|     <string name="pref_show_page_number">Show page number</string> | ||||
| @@ -264,6 +264,7 @@ | ||||
|     <string name="no_previous_chapter">Previous chapter not found</string> | ||||
|     <string name="decode_image_error">Image could not be loaded.\nTry changing the image decoder or with one of the options below</string> | ||||
|     <string name="confirm_update_manga_sync">Update last chapter read in enabled services to %1$d?</string> | ||||
|     <string name="viewer_for_this_series">Viewer for this series</string> | ||||
|  | ||||
|     <!-- Backup fragment --> | ||||
|     <string name="backup">Backup</string> | ||||
|   | ||||
| @@ -83,10 +83,16 @@ | ||||
|     <!--==============--> | ||||
|     <!-- Reader Theme --> | ||||
|     <!--==============--> | ||||
|     <style name="Theme.Reader" parent="Theme.Base.Dark"> | ||||
|     <style name="Theme.Base.Reader" parent="Theme.Base.Dark"> | ||||
|         <item name="colorPrimary">@color/md_blue_grey_900</item> | ||||
|         <item name="colorPrimaryDark">#171E22</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="Theme.Reader" parent="Theme.Base.Reader"> | ||||
|         <!-- Attributes specific for SDK 16 to SDK 20 --> | ||||
|     </style> | ||||
|  | ||||
|  | ||||
|     <!--===============--> | ||||
|     <!-- Launch Screen --> | ||||
|     <!--===============--> | ||||
|   | ||||
| @@ -55,8 +55,8 @@ | ||||
|             android:summary="%s" /> | ||||
|  | ||||
|         <SwitchPreference | ||||
|             android:title="@string/pref_hide_status_bar" | ||||
|             android:key="@string/pref_hide_status_bar_key" | ||||
|             android:title="@string/pref_fullscreen" | ||||
|             android:key="@string/pref_fullscreen_key" | ||||
|             android:defaultValue="true" /> | ||||
|  | ||||
|         <SwitchPreference | ||||
|   | ||||
		Reference in New Issue
	
	Block a user