diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 19bfbb066..20a29269b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -218,6 +218,9 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { get() = prefs.getEnumValue(KEY_LOCAL_LIST_ORDER, SortOrder.NEWEST) set(value) = prefs.edit { putEnumValue(KEY_LOCAL_LIST_ORDER, value) } + val isWebtoonZoomEnable: Boolean + get() = prefs.getBoolean(KEY_WEBTOON_ZOOM, true) + fun isPagesPreloadAllowed(cm: ConnectivityManager): Boolean { return when (prefs.getString(KEY_PAGES_PRELOAD, null)?.toIntOrNull()) { NETWORK_ALWAYS -> true @@ -337,6 +340,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_SHORTCUTS = "dynamic_shortcuts" const val KEY_READER_TAPS_LTR = "reader_taps_ltr" const val KEY_LOCAL_LIST_ORDER = "local_order" + const val KEY_WEBTOON_ZOOM = "webtoon_zoom" // About const val KEY_APP_UPDATE = "app_update" diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index ea9abd350..feb64b21b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -106,6 +106,12 @@ class ReaderViewModel @AssistedInject constructor( valueProducer = { isReaderBarEnabled }, ) + val isWebtoonZoomEnabled = settings.observeAsLiveData( + context = viewModelScope.coroutineContext + Dispatchers.Default, + key = AppSettings.KEY_WEBTOON_ZOOM, + valueProducer = { isWebtoonZoomEnable }, + ) + val readerSettings = ReaderSettings( parentScope = viewModelScope, settings = settings, diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderSettings.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderSettings.kt index 9619e53df..03a6c49e9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderSettings.kt @@ -2,9 +2,13 @@ package org.koitharu.kotatsu.reader.ui.config import android.content.SharedPreferences import androidx.lifecycle.MediatorLiveData -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.koitharu.kotatsu.core.model.ZoomMode import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.reader.domain.ReaderColorFilter @@ -60,7 +64,7 @@ class ReaderSettings( } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == AppSettings.KEY_ZOOM_MODE || key == AppSettings.KEY_PAGES_NUMBERS) { + if (key == AppSettings.KEY_ZOOM_MODE || key == AppSettings.KEY_PAGES_NUMBERS || key == AppSettings.KEY_WEBTOON_ZOOM) { notifyChanged() } } diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt index e91f1467c..79a4e8927 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt @@ -35,6 +35,10 @@ class WebtoonReaderFragment : BaseReader() { adapter = webtoonAdapter addOnPageScrollListener(PageScrollListener()) } + + viewModel.isWebtoonZoomEnabled.observe(viewLifecycleOwner) { + binding.frame.isZoomEnable = it + } } override fun onDestroyView() { diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt new file mode 100644 index 000000000..b834ecf1e --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt @@ -0,0 +1,210 @@ +package org.koitharu.kotatsu.reader.ui.pager.webtoon + +import android.animation.ObjectAnimator +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.view.GestureDetector +import android.view.MotionEvent +import android.view.ScaleGestureDetector +import android.view.animation.AccelerateDecelerateInterpolator +import android.widget.FrameLayout +import android.widget.OverScroller +import androidx.core.view.GestureDetectorCompat + +private const val MAX_SCALE = 2.5f +private const val MIN_SCALE = 0.5f + +class WebtoonScalingFrame @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyles: Int = 0 +): FrameLayout(context, attrs, defStyles), ScaleGestureDetector.OnScaleGestureListener { + private val targetChild by lazy(LazyThreadSafetyMode.NONE) { getChildAt(0) } + + private val scaleDetector = ScaleGestureDetector(context, this) + private val gestureDetector = GestureDetectorCompat(context, GestureListener()) + private val overScroller = OverScroller(context, AccelerateDecelerateInterpolator()) + private val transformMatrix = Matrix() + private val matrixValues = FloatArray(9) + private val scale + get() = matrixValues[Matrix.MSCALE_X] + private val transX + get() = halfWidth * (scale - 1f) + matrixValues[Matrix.MTRANS_X] + private val transY + get() = halfHeight * (scale - 1f) + matrixValues[Matrix.MTRANS_Y] + private var halfWidth = 0f + private var halfHeight = 0f + private val translateBounds = RectF() + private val targetHitRect = Rect() + private var pendingScroll = 0 + + var isZoomEnable = true + set(value) { + field = value + if (scale != 1f) { + scaleChild(1f, halfWidth, halfHeight) + } + } + + init { + syncMatrixValues() + } + + override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { + if (!isZoomEnable || ev == null) { + return super.dispatchTouchEvent(ev) + } + + if (ev.action == MotionEvent.ACTION_DOWN && overScroller.computeScrollOffset()) { + overScroller.forceFinished(true) + } + + gestureDetector.onTouchEvent(ev) + scaleDetector.onTouchEvent(ev) + + // Offset event to inside the child view + if (scale < 1 && !targetHitRect.contains(ev.x.toInt(), ev.y.toInt())) { + ev.offsetLocation(halfWidth - ev.x + targetHitRect.width() / 3, 0f) + } + + // Send action cancel to avoid recycler jump when scale end + if (scaleDetector.isInProgress) { + ev.action = MotionEvent.ACTION_CANCEL + } + return super.dispatchTouchEvent(ev) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + halfWidth = measuredWidth / 2f + halfHeight = measuredHeight / 2f + } + + private fun invalidateTarget() { + adjustBounds() + targetChild.run { + scaleX = scale + scaleY = scale + translationX = transX + translationY = transY + } + + val newHeight = if (scale < 1f) (height / scale).toInt() else height + if (newHeight != targetChild.height) { + targetChild.layoutParams.height = newHeight + targetChild.requestLayout() + } + + if (scale < 1) { + targetChild.getHitRect(targetHitRect) + targetChild.scrollBy(0, pendingScroll) + pendingScroll = 0 + } + } + + private fun syncMatrixValues() { + transformMatrix.getValues(matrixValues) + } + + private fun adjustBounds() { + syncMatrixValues() + val dx = when { + transX < translateBounds.left -> translateBounds.left - transX + transX > translateBounds.right -> translateBounds.right - transX + else -> 0f + } + + val dy = when { + transY < translateBounds.top -> translateBounds.top - transY + transY > translateBounds.bottom -> translateBounds.bottom - transY + else -> 0f + } + + pendingScroll = dy.toInt() + transformMatrix.postTranslate(dx, dy) + syncMatrixValues() + } + + private fun scaleChild(newScale: Float, focusX: Float, focusY: Float) { + val factor = newScale / scale + if (newScale > 1) { + translateBounds.set( + halfWidth * (1 - newScale), + halfHeight * (1 - newScale), + halfWidth * (newScale - 1), + halfHeight * (newScale - 1) + ) + } else { + translateBounds.set( + 0f, + halfHeight - halfHeight / newScale, + 0f, + halfHeight - halfHeight / newScale + ) + } + transformMatrix.postScale(factor, factor, focusX, focusY) + invalidateTarget() + } + + + override fun onScale(detector: ScaleGestureDetector): Boolean { + val newScale = (scale * detector.scaleFactor).coerceIn(MIN_SCALE, MAX_SCALE) + scaleChild(newScale, detector.focusX, detector.focusY) + return true + } + + override fun onScaleBegin(detector: ScaleGestureDetector): Boolean = true + + override fun onScaleEnd(p0: ScaleGestureDetector) { + pendingScroll = 0 + } + + + private inner class GestureListener(): GestureDetector.SimpleOnGestureListener(), Runnable { + override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean { + if (scale <= 1f) return false + transformMatrix.postTranslate(-distanceX, -distanceY) + invalidateTarget() + return true + } + + override fun onDoubleTap(e: MotionEvent): Boolean { + val newScale = if (scale != 1f) 1f else MAX_SCALE * 0.8f + ObjectAnimator.ofFloat(scale, newScale).run { + interpolator = AccelerateDecelerateInterpolator() + duration = 300 + addUpdateListener { + scaleChild(it.animatedValue as Float, e.x, e.y) + } + start() + } + return true + } + + override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { + if (scale <= 1) return false + + overScroller.fling( + transX.toInt(), + transY.toInt(), + velocityX.toInt(), + velocityY.toInt(), + translateBounds.left.toInt(), + translateBounds.right.toInt(), + translateBounds.top.toInt(), + translateBounds.bottom.toInt() + ) + postOnAnimation(this) + return true + } + + override fun run() { + if (overScroller.computeScrollOffset()) { + transformMatrix.postTranslate(overScroller.currX - transX, overScroller.currY - transY) + invalidateTarget() + postOnAnimation(this) + } + } + } +} diff --git a/app/src/main/res/layout/fragment_reader_webtoon.xml b/app/src/main/res/layout/fragment_reader_webtoon.xml index 2a3020690..63c406385 100644 --- a/app/src/main/res/layout/fragment_reader_webtoon.xml +++ b/app/src/main/res/layout/fragment_reader_webtoon.xml @@ -1,9 +1,14 @@ - \ No newline at end of file + android:layout_height="match_parent"> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b8ef0887a..fca55785f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,393 +1,395 @@ - Kotatsu - Close menu - Open menu - Local storage - Favourites - History - An error occurred - Could not connect to the Internet - Details - Chapters - List - Detailed list - Grid - List mode - Settings - Remote sources - Loading… - Computing… - Chapter %1$d of %2$d - Close - Try again - Clear history - Nothing found - No history yet - Read - No favourites yet - Favourite this - New category - Add - Enter category name - Save - Share - Create shortcut… - Share %s - Search - Search manga - Downloading… - Processing… - Downloaded - Downloads - Name - Popular - Updated - Newest - Rating - Sorting order - Filter - Theme - Light - Dark - Follow system - Pages - Clear - Clear all reading history permanently? - Remove - \"%s\" removed from history - \"%s\" deleted from local storage - Wait for loading to finish… - Save page - Saved - Share image - Import - Delete - This operation is not supported - Either pick a ZIP or CBZ file. - No description - History and cache - Clear page cache - Cache - B|kB|MB|GB|TB - Standard - Webtoon - Read mode - Grid size - Search on %s - Delete manga - Delete \"%s\" from device permanently? - Reader settings - Switch pages - Edge taps - Volume buttons - Continue - Warning - This may transfer a lot of data - Don\'t ask again - Cancelling… - Error - Clear thumbnails cache - Clear search history - Cleared - Gestures only - Internal storage - External storage - Domain - Check for new versions of the app - A new version of the app is available - Show notification if a new version is available - Open in web browser - This manga has %s. Save all of it? - Save - Notifications - %1$d of %2$d on - New chapters - Download - Read from start - Restart - Notifications settings - Notification sound - LED indicator - Vibration - Favourite categories - Categories… - Rename - Remove the \"%s\" category from your favourites? \nAll manga in it will be lost. - Remove - It\'s kind of empty here… - You can use categories to organize your favourites. Press «+» to create a category - Try to reformulate the query. - What you read will be displayed here - Find what to read in side menu. - Your manga will be displayed here - Find what to read in the «Explore» section - Save something first - Save it from online sources or import files. - Shelf - Recent - Page animation - Folder for downloads - Not available - No available storage - Other storage - Done - All favourites - Empty category - Read later - Updates - New chapters of what you are reading is shown here - Search results - Related - New version: %s - Size: %s - Waiting for network… - Clear updates feed - Cleared - Rotate screen - Update - Feed update will start soon - Look for updates - Don\'t check - Enter password - Wrong password - Protect the app - Ask for password when starting Kotatsu - Repeat the password - Mismatching passwords - About - Version %s - Check for updates - Checking for updates… - Could not look for updates - No updates available - Right-to-left - New category - Scale mode - Fit center - Fit to height - Fit to width - Keep at start - Black - Uses less power on AMOLED screens - Backup and restore - Create data backup - Restore from backup - Restored - Preparing… - Create issue on GitHub - File not found - All data was restored - The data was restored, but there are errors - You can create backup of your history and favourites and restore it - Just now - Yesterday - Long ago - Group - Today - Tap to try again - The chosen configuration will be remembered for this manga - Silent - CAPTCHA required - Solve - Clear cookies - All cookies were removed - Checking for new chapters: %1$d of %2$d - Clear feed - Clear all update history permanently? - Check for new chapters - Reverse - Sign in - Sign in to view this content - Default: %s - …and %1$d more - Next - Enter a password to start the app with - Confirm - The password must be 4 characters or more - Search only on %s - Remove all recent search queries permanently? - Other - Welcome - Backup saved - Some devices have different system behavior, which may break background tasks. - Read more - Queued - No active downloads - Download or read this missing chapter online. - The chapter is missing - Translate this app - Translation - Feedback - Topic on 4PDA - Authorized - Logging in on %s is not supported - You will be logged out from all sources - Genres - Finished - Ongoing - Date format - Default - Exclude NSFW manga from history - You must enter a name - Numbered pages - Used sources - Available sources - Dynamic theme - Applies a theme created on the color scheme of your wallpaper - Importing manga: %1$d of %2$d - Screenshot policy - Allow - Block on NSFW - Always block - Suggestions - Enable suggestions - Suggest manga based on your preferences - All data is analyzed locally on this device. There is no transfer of your personal data to any services - Start reading manga and you will get personalized suggestions - Do not suggest NSFW manga - Enabled - Disabled - Unable to load genres list - Reset filter - Find genre - Select languages which you want to read manga. You can change it later in settings. - Never - Only on Wi-Fi - Always - Preload pages - Logged in as %s - 18+ - Various languages - Find chapter - No chapters in this manga - %1$s%% - Appearance - Content - GitHub - Discord - Suggestions updating - Exclude genres - Specify genres that you do not want to see in the suggestions - Delete selected items from device permanently? - Removal completed - Download all selected manga and its chapters\? This can consume a lot of traffic and storage. - Shikimori - Parallel downloads - Download slowdown - Helps avoid blocking your IP address - Saved manga processing - Chapters will be removed in the background. It can take some time - Canceled - Account already exists - Back - Synchronization - Sync your data - Enter your email to continue - Hide - New manga sources are available - Check for new chapters and notify about it - You will receive notifications about updates of manga you are reading - You will not receive notifications but new chapters will be highlighted in the lists - Enable notifications - Name - Edit - Edit category - Tracking - No favourite categories - Log out - Add bookmark - Remove bookmark - Bookmarks - Bookmark removed - Bookmark added - Undo - Removed from history - DNS over HTTPS - Default mode - Autodetect reader mode - Automatically detect if manga is webtoon - Disable battery optimization - Helps with background updates checks - Something went wrong. Please submit a bug report to the developers to help us fix it. - Send - Planned - Reading - Re-reading - Completed - On hold - Dropped - Disable all - Use fingerprint if available - Manga from your favourites - Your recently read manga - Report - Show reading progress indicators - Data deletion - Show percentage read in history and favourites - Manga marked as NSFW will never added to the history and your progress will not be saved - Can help in case of some issues. All authorizations will be invalidated - Show all - Invalid domain - Select range - Clear all history - Last 2 hours - History cleared - Manage - No bookmarks yet - You can create bookmark while reading manga - Bookmarks removed - No manga sources - Enable manga sources to read manga online - Random - Are you sure you want to delete the selected favorite categories?\nAll manga in it will be lost and this cannot be undone. - Reorder - Empty - Changelog - Explore - Press "Back" again to exit - Press "Back" twice to exit the app - Exit confirmation - Saved manga - Pages cache - Other cache - Storage usage - Available - %s - %s - Enter your email to continue - Removed from favourites - Removed from \"%s\" - Options - Content not found or removed - Downloading manga - <b>%1$s</b> %2$s - Incognito mode - Application update available: %s - No chapters - Automatic scroll - Off - %ss - Ch. %1$d/%2$d Pg. %3$d/%4$d - Show information bar in reader - Comics archive - Folder with images - Importing manga - Import completed - You can delete the original file from storage to save space - Import will start soon - Feed - Error details:<br><tt>%1$s</tt><br><br>1. Try to <a href="%2$s">open manga in a web browser</a> to ensure it is available on its source<br>2. If it is available, send an error report to the developers. - Show recent manga shortcuts - Make recent manga available by long pressing on application icon - Tap on the right edge or pressing the right key always switches to the next page - Ergonomic reader control - Color correction - Brightness - Contrast - Reset - The chosen color settings will be remembered for this manga - Save or discard unsaved changes\? - Discard - No space left on device - Show page switching slider - \ No newline at end of file + Kotatsu + Close menu + Open menu + Local storage + Favourites + History + An error occurred + Could not connect to the Internet + Details + Chapters + List + Detailed list + Grid + List mode + Settings + Remote sources + Loading… + Computing… + Chapter %1$d of %2$d + Close + Try again + Clear history + Nothing found + No history yet + Read + No favourites yet + Favourite this + New category + Add + Enter category name + Save + Share + Create shortcut… + Share %s + Search + Search manga + Downloading… + Processing… + Downloaded + Downloads + Name + Popular + Updated + Newest + Rating + Sorting order + Filter + Theme + Light + Dark + Follow system + Pages + Clear + Clear all reading history permanently? + Remove + \"%s\" removed from history + \"%s\" deleted from local storage + Wait for loading to finish… + Save page + Saved + Share image + Import + Delete + This operation is not supported + Either pick a ZIP or CBZ file. + No description + History and cache + Clear page cache + Cache + B|kB|MB|GB|TB + Standard + Webtoon + Read mode + Grid size + Search on %s + Delete manga + Delete \"%s\" from device permanently? + Reader settings + Switch pages + Edge taps + Volume buttons + Continue + Warning + This may transfer a lot of data + Don\'t ask again + Cancelling… + Error + Clear thumbnails cache + Clear search history + Cleared + Gestures only + Internal storage + External storage + Domain + Check for new versions of the app + A new version of the app is available + Show notification if a new version is available + Open in web browser + This manga has %s. Save all of it? + Save + Notifications + %1$d of %2$d on + New chapters + Download + Read from start + Restart + Notifications settings + Notification sound + LED indicator + Vibration + Favourite categories + Categories… + Rename + Remove the \"%s\" category from your favourites? \nAll manga in it will be lost. + Remove + It\'s kind of empty here… + You can use categories to organize your favourites. Press «+» to create a category + Try to reformulate the query. + What you read will be displayed here + Find what to read in side menu. + Your manga will be displayed here + Find what to read in the «Explore» section + Save something first + Save it from online sources or import files. + Shelf + Recent + Page animation + Folder for downloads + Not available + No available storage + Other storage + Done + All favourites + Empty category + Read later + Updates + New chapters of what you are reading is shown here + Search results + Related + New version: %s + Size: %s + Waiting for network… + Clear updates feed + Cleared + Rotate screen + Update + Feed update will start soon + Look for updates + Don\'t check + Enter password + Wrong password + Protect the app + Ask for password when starting Kotatsu + Repeat the password + Mismatching passwords + About + Version %s + Check for updates + Checking for updates… + Could not look for updates + No updates available + Right-to-left + New category + Scale mode + Fit center + Fit to height + Fit to width + Keep at start + Black + Uses less power on AMOLED screens + Backup and restore + Create data backup + Restore from backup + Restored + Preparing… + Create issue on GitHub + File not found + All data was restored + The data was restored, but there are errors + You can create backup of your history and favourites and restore it + Just now + Yesterday + Long ago + Group + Today + Tap to try again + The chosen configuration will be remembered for this manga + Silent + CAPTCHA required + Solve + Clear cookies + All cookies were removed + Checking for new chapters: %1$d of %2$d + Clear feed + Clear all update history permanently? + Check for new chapters + Reverse + Sign in + Sign in to view this content + Default: %s + …and %1$d more + Next + Enter a password to start the app with + Confirm + The password must be 4 characters or more + Search only on %s + Remove all recent search queries permanently? + Other + Welcome + Backup saved + Some devices have different system behavior, which may break background tasks. + Read more + Queued + No active downloads + Download or read this missing chapter online. + The chapter is missing + Translate this app + Translation + Feedback + Topic on 4PDA + Authorized + Logging in on %s is not supported + You will be logged out from all sources + Genres + Finished + Ongoing + Date format + Default + Exclude NSFW manga from history + You must enter a name + Numbered pages + Used sources + Available sources + Dynamic theme + Applies a theme created on the color scheme of your wallpaper + Importing manga: %1$d of %2$d + Screenshot policy + Allow + Block on NSFW + Always block + Suggestions + Enable suggestions + Suggest manga based on your preferences + All data is analyzed locally on this device. There is no transfer of your personal data to any services + Start reading manga and you will get personalized suggestions + Do not suggest NSFW manga + Enabled + Disabled + Unable to load genres list + Reset filter + Find genre + Select languages which you want to read manga. You can change it later in settings. + Never + Only on Wi-Fi + Always + Preload pages + Logged in as %s + 18+ + Various languages + Find chapter + No chapters in this manga + %1$s%% + Appearance + Content + GitHub + Discord + Suggestions updating + Exclude genres + Specify genres that you do not want to see in the suggestions + Delete selected items from device permanently? + Removal completed + Download all selected manga and its chapters\? This can consume a lot of traffic and storage. + Shikimori + Parallel downloads + Download slowdown + Helps avoid blocking your IP address + Saved manga processing + Chapters will be removed in the background. It can take some time + Canceled + Account already exists + Back + Synchronization + Sync your data + Enter your email to continue + Hide + New manga sources are available + Check for new chapters and notify about it + You will receive notifications about updates of manga you are reading + You will not receive notifications but new chapters will be highlighted in the lists + Enable notifications + Name + Edit + Edit category + Tracking + No favourite categories + Log out + Add bookmark + Remove bookmark + Bookmarks + Bookmark removed + Bookmark added + Undo + Removed from history + DNS over HTTPS + Default mode + Autodetect reader mode + Automatically detect if manga is webtoon + Disable battery optimization + Helps with background updates checks + Something went wrong. Please submit a bug report to the developers to help us fix it. + Send + Planned + Reading + Re-reading + Completed + On hold + Dropped + Disable all + Use fingerprint if available + Manga from your favourites + Your recently read manga + Report + Show reading progress indicators + Data deletion + Show percentage read in history and favourites + Manga marked as NSFW will never added to the history and your progress will not be saved + Can help in case of some issues. All authorizations will be invalidated + Show all + Invalid domain + Select range + Clear all history + Last 2 hours + History cleared + Manage + No bookmarks yet + You can create bookmark while reading manga + Bookmarks removed + No manga sources + Enable manga sources to read manga online + Random + Are you sure you want to delete the selected favorite categories?\nAll manga in it will be lost and this cannot be undone. + Reorder + Empty + Changelog + Explore + Press "Back" again to exit + Press "Back" twice to exit the app + Exit confirmation + Saved manga + Pages cache + Other cache + Storage usage + Available + %s - %s + Enter your email to continue + Removed from favourites + Removed from \"%s\" + Options + Content not found or removed + Downloading manga + <b>%1$s</b> %2$s + Incognito mode + Application update available: %s + No chapters + Automatic scroll + Off + %ss + Ch. %1$d/%2$d Pg. %3$d/%4$d + Show information bar in reader + Comics archive + Folder with images + Importing manga + Import completed + You can delete the original file from storage to save space + Import will start soon + Feed + Error details:<br><tt>%1$s</tt><br><br>1. Try to <a href="%2$s">open manga in a web browser</a> to ensure it is available on its source<br>2. If it is available, send an error report to the developers. + Show recent manga shortcuts + Make recent manga available by long pressing on application icon + Tap on the right edge or pressing the right key always switches to the next page + Ergonomic reader control + Color correction + Brightness + Contrast + Reset + The chosen color settings will be remembered for this manga + Save or discard unsaved changes\? + Discard + No space left on device + Show page switching slider + Webtoon zoom + Allow zoom in/zoom out gesture in webtoon mode (beta) + diff --git a/app/src/main/res/xml/pref_reader.xml b/app/src/main/res/xml/pref_reader.xml index 1842876fa..eedcddc3e 100644 --- a/app/src/main/res/xml/pref_reader.xml +++ b/app/src/main/res/xml/pref_reader.xml @@ -40,6 +40,11 @@ android:key="reader_animation" android:title="@string/pages_animation" /> + +