Merge pull request #125 from jobobby04/pr

Update to preview
This commit is contained in:
jobobby04 2020-10-03 17:27:39 -04:00 committed by GitHub
commit 05bcdadbd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 168 additions and 92 deletions

View File

@ -1,5 +1,7 @@
name: Issue closer name: Issue closer
on: [issues] on:
issues:
types: [opened, edited, reopened]
jobs: jobs:
autoclose: autoclose:

View File

@ -141,7 +141,7 @@ dependencies {
// AndroidX libraries // AndroidX libraries
implementation 'androidx.annotation:annotation:1.1.0' implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02' implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
implementation 'androidx.biometric:biometric:1.1.0-alpha02' implementation 'androidx.biometric:biometric:1.1.0-beta01'
implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.browser:browser:1.2.0'
implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
@ -149,10 +149,10 @@ dependencies {
implementation 'androidx.core:core-ktx:1.4.0-alpha01' implementation 'androidx.core:core-ktx:1.4.0-alpha01'
implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha05' implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha06'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01'
final lifecycle_version = '2.3.0-alpha07' final lifecycle_version = '2.3.0-beta01'
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
@ -233,7 +233,7 @@ dependencies {
implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version" implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version"
kapt "com.github.bumptech.glide:compiler:$glide_version" kapt "com.github.bumptech.glide:compiler:$glide_version"
implementation 'com.github.tachiyomiorg:subsampling-scale-image-view:bff2806' implementation 'com.github.tachiyomiorg:subsampling-scale-image-view:6caf219'
// Logging // Logging
implementation 'com.jakewharton.timber:timber:4.7.1' implementation 'com.jakewharton.timber:timber:4.7.1'

View File

@ -173,6 +173,17 @@ class DownloadManager(/* SY private */ val context: Context) {
return cache.isChapterDownloaded(chapter, manga, skipCache) return cache.isChapterDownloaded(chapter, manga, skipCache)
} }
/**
* Returns the download from queue if the chapter is queued for download
* else it will return null which means that the chapter is not queued for download
*
* @param chapter the chapter to check.
*/
fun getChapterDownloadOrNull(chapter: Chapter): Download? {
return downloader.queue
.firstOrNull { it.chapter.id == chapter.id && it.chapter.manga_id == chapter.manga_id }
}
/** /**
* Returns the amount of downloaded chapters for a manga. * Returns the amount of downloaded chapters for a manga.
* *

View File

@ -187,6 +187,8 @@ object PreferenceKeys {
const val defaultChapterDisplayByNameOrNumber = "default_chapter_display_by_name_or_number" const val defaultChapterDisplayByNameOrNumber = "default_chapter_display_by_name_or_number"
const val incognitoMode = "incognito_mode"
fun trackUsername(syncId: Int) = "pref_mangasync_username_$syncId" fun trackUsername(syncId: Int) = "pref_mangasync_username_$syncId"
fun trackPassword(syncId: Int) = "pref_mangasync_password_$syncId" fun trackPassword(syncId: Int) = "pref_mangasync_password_$syncId"

View File

@ -275,6 +275,8 @@ class PreferencesHelper(val context: Context) {
fun sortChapterByAscendingOrDescending() = prefs.getInt(Keys.defaultChapterSortByAscendingOrDescending, Manga.SORT_DESC) fun sortChapterByAscendingOrDescending() = prefs.getInt(Keys.defaultChapterSortByAscendingOrDescending, Manga.SORT_DESC)
fun incognitoMode() = flowPrefs.getBoolean(Keys.incognitoMode, false)
fun setChapterSettingsDefault(manga: Manga) { fun setChapterSettingsDefault(manga: Manga) {
prefs.edit { prefs.edit {
putInt(Keys.defaultChapterFilterByRead, manga.readFilter) putInt(Keys.defaultChapterFilterByRead, manga.readFilter)

View File

@ -226,10 +226,6 @@ class LibraryController(
} }
} }
if (preferences.downloadedOnly().get()) {
binding.downloadedOnly.isVisible = true
}
binding.btnGlobalSearch.clicks() binding.btnGlobalSearch.clicks()
.onEach { .onEach {
router.pushController( router.pushController(

View File

@ -230,6 +230,14 @@ class MainActivity : BaseActivity<MainActivityBinding>() {
preferences.extensionUpdatesCount() preferences.extensionUpdatesCount()
.asImmediateFlow { setExtensionsBadge() } .asImmediateFlow { setExtensionsBadge() }
.launchIn(scope) .launchIn(scope)
preferences.downloadedOnly()
.asImmediateFlow { binding.downloadedOnly.isVisible = it }
.launchIn(scope)
preferences.incognitoMode()
.asImmediateFlow { binding.incognitoMode.isVisible = it }
.launchIn(scope)
} }
override fun onNewIntent(intent: Intent) { override fun onNewIntent(intent: Intent) {

View File

@ -61,6 +61,7 @@ import eu.kanade.tachiyomi.ui.browse.source.SourceController
import eu.kanade.tachiyomi.ui.browse.source.SourceController.Companion.SMART_SEARCH_SOURCE_TAG import eu.kanade.tachiyomi.ui.browse.source.SourceController.Companion.SMART_SEARCH_SOURCE_TAG
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController
import eu.kanade.tachiyomi.ui.browse.source.latest.LatestUpdatesController
import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog
import eu.kanade.tachiyomi.ui.library.ChangeMangaCoverDialog import eu.kanade.tachiyomi.ui.library.ChangeMangaCoverDialog
import eu.kanade.tachiyomi.ui.library.LibraryController import eu.kanade.tachiyomi.ui.library.LibraryController
@ -879,6 +880,10 @@ class MangaController :
val controller = router.getControllerWithTag(R.id.nav_library.toString()) as LibraryController val controller = router.getControllerWithTag(R.id.nav_library.toString()) as LibraryController
controller.search(query) controller.search(query)
} }
is LatestUpdatesController -> {
// Search doesn't currently work in source Latest view
return
}
is BrowseSourceController -> { is BrowseSourceController -> {
router.handleBack() router.handleBack()
previousController.searchWithQuery(query) previousController.searchWithQuery(query)

View File

@ -87,12 +87,12 @@ class ChaptersSettingsSheet(
inner class FilterGroup : Group { inner class FilterGroup : Group {
private val unread = Item.TriStateGroup(R.string.action_filter_unread, this)
private val downloaded = Item.TriStateGroup(R.string.action_filter_downloaded, this) private val downloaded = Item.TriStateGroup(R.string.action_filter_downloaded, this)
private val unread = Item.TriStateGroup(R.string.action_filter_unread, this)
private val bookmarked = Item.TriStateGroup(R.string.action_filter_bookmarked, this) private val bookmarked = Item.TriStateGroup(R.string.action_filter_bookmarked, this)
override val header = null override val header = null
override val items = listOf(unread, downloaded, bookmarked) override val items = listOf(downloaded, unread, bookmarked)
override val footer = null override val footer = null
override fun initModels() { override fun initModels() {

View File

@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.ui.manga.info
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
@ -22,7 +21,6 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.source.online.all.MangaDex import eu.kanade.tachiyomi.source.online.all.MangaDex
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.view.setTooltip
import exh.MERGED_SOURCE_ID import exh.MERGED_SOURCE_ID
import exh.source.EnhancedHttpSource.Companion.getMainSource import exh.source.EnhancedHttpSource.Companion.getMainSource
import exh.util.SourceTagsUtil import exh.util.SourceTagsUtil
@ -115,27 +113,17 @@ class MangaInfoHeaderAdapter(
isVisible = true isVisible = true
if (trackCount > 0) { if (trackCount > 0) {
setCompoundDrawablesWithIntrinsicBounds( setIconResource(R.drawable.ic_done_24dp)
null,
ContextCompat.getDrawable(context, R.drawable.ic_done_24dp),
null,
null
)
text = view.context.resources.getQuantityString( text = view.context.resources.getQuantityString(
R.plurals.num_trackers, R.plurals.num_trackers,
trackCount, trackCount,
trackCount trackCount
) )
isSelected = true isActivated = true
} else { } else {
setCompoundDrawablesWithIntrinsicBounds( setIconResource(R.drawable.ic_sync_24dp)
null,
ContextCompat.getDrawable(context, R.drawable.ic_sync_24dp),
null,
null
)
text = view.context.getString(R.string.manga_tracking_tab) text = view.context.getString(R.string.manga_tracking_tab)
isSelected = false isActivated = false
} }
clicks() clicks()
@ -151,7 +139,6 @@ class MangaInfoHeaderAdapter(
binding.btnWebview.clicks() binding.btnWebview.clicks()
.onEach { controller.openMangaInWebView() } .onEach { controller.openMangaInWebView() }
.launchIn(scope) .launchIn(scope)
binding.btnWebview.setTooltip(R.string.action_open_in_web_view)
} }
// SY --> // SY -->
@ -320,18 +307,10 @@ class MangaInfoHeaderAdapter(
// Set the Favorite drawable to the correct one. // Set the Favorite drawable to the correct one.
// Border drawable if false, filled drawable if true. // Border drawable if false, filled drawable if true.
binding.btnFavorite.apply { binding.btnFavorite.apply {
setCompoundDrawablesWithIntrinsicBounds( setIconResource(if (isFavorite) R.drawable.ic_favorite_24dp else R.drawable.ic_favorite_border_24dp)
null,
ContextCompat.getDrawable(
context,
if (isFavorite) R.drawable.ic_favorite_24dp else R.drawable.ic_favorite_border_24dp
),
null,
null
)
text = text =
context.getString(if (isFavorite) R.string.in_library else R.string.add_to_library) context.getString(if (isFavorite) R.string.in_library else R.string.add_to_library)
isSelected = isFavorite isActivated = isFavorite
} }
} }
} }

View File

@ -15,6 +15,7 @@ import eu.kanade.tachiyomi.ui.download.DownloadController
import eu.kanade.tachiyomi.ui.setting.SettingsController import eu.kanade.tachiyomi.ui.setting.SettingsController
import eu.kanade.tachiyomi.ui.setting.SettingsMainController import eu.kanade.tachiyomi.ui.setting.SettingsMainController
import eu.kanade.tachiyomi.util.preference.add import eu.kanade.tachiyomi.util.preference.add
import eu.kanade.tachiyomi.util.preference.defaultValue
import eu.kanade.tachiyomi.util.preference.iconRes import eu.kanade.tachiyomi.util.preference.iconRes
import eu.kanade.tachiyomi.util.preference.iconTint import eu.kanade.tachiyomi.util.preference.iconTint
import eu.kanade.tachiyomi.util.preference.onClick import eu.kanade.tachiyomi.util.preference.onClick
@ -54,6 +55,15 @@ class MoreController :
iconTint = tintColor iconTint = tintColor
} }
switchPreference {
key = Keys.incognitoMode
summaryRes = R.string.pref_incognito_mode_summary
titleRes = R.string.pref_incognito_mode
iconRes = R.drawable.ic_glasses_black_24dp
iconTint = tintColor
defaultValue = false
}
preferenceCategory { preferenceCategory {
preference { preference {
titleRes = R.string.label_download_queue titleRes = R.string.label_download_queue

View File

@ -417,6 +417,7 @@ class ReaderPresenter(
// SY <-- // SY <--
updateTrackChapterRead(selectedChapter) updateTrackChapterRead(selectedChapter)
deleteChapterIfNeeded(selectedChapter) deleteChapterIfNeeded(selectedChapter)
deleteChapterFromDownloadQueue(currentChapters.currChapter)
} }
if (selectedChapter != currentChapters.currChapter) { if (selectedChapter != currentChapters.currChapter) {
@ -431,6 +432,16 @@ class ReaderPresenter(
} }
} }
/**
* Removes [currentChapter] from download queue
* if setting is enabled and [currentChapter] is queued for download
*/
private fun deleteChapterFromDownloadQueue(currentChapter: ReaderChapter) {
downloadManager.getChapterDownloadOrNull(currentChapter.chapter)?.let { download ->
downloadManager.deletePendingDownload(download)
}
}
/** /**
* Determines if deleting option is enabled and nth to last chapter actually exists. * Determines if deleting option is enabled and nth to last chapter actually exists.
* If both conditions are satisfied enqueues chapter for delete * If both conditions are satisfied enqueues chapter for delete
@ -470,11 +481,13 @@ class ReaderPresenter(
* Saves this [chapter] last read history. * Saves this [chapter] last read history.
*/ */
private fun saveChapterHistory(chapter: ReaderChapter) { private fun saveChapterHistory(chapter: ReaderChapter) {
val history = History.create(chapter.chapter).apply { last_read = Date().time } if (!preferences.incognitoMode().get()) {
db.updateHistoryLastRead(history).asRxCompletable() val history = History.create(chapter.chapter).apply { last_read = Date().time }
.onErrorComplete() db.updateHistoryLastRead(history).asRxCompletable()
.subscribeOn(Schedulers.io()) .onErrorComplete()
.subscribe() .subscribeOn(Schedulers.io())
.subscribe()
}
} }
/** /**

View File

@ -114,6 +114,16 @@ class SettingsAdvancedController : SettingsController() {
ctrl.showDialog(router) ctrl.showDialog(router)
} }
} }
preference {
titleRes = R.string.pref_clear_history
summaryRes = R.string.pref_clear_history_summary
onClick {
val ctrl = ClearHistoryDialogController()
ctrl.targetController = this@SettingsAdvancedController
ctrl.showDialog(router)
}
}
} }
preferenceCategory { preferenceCategory {
@ -402,6 +412,22 @@ class SettingsAdvancedController : SettingsController() {
} }
} }
class ClearHistoryDialogController : DialogController() {
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.message(R.string.clear_history_confirmation)
.positiveButton(android.R.string.ok) {
(targetController as? SettingsAdvancedController)?.clearHistory()
}
.negativeButton(android.R.string.cancel)
}
}
private fun clearHistory() {
db.deleteHistory().executeAsBlocking()
activity?.toast(R.string.clear_history_completed)
}
private fun clearDatabase() { private fun clearDatabase() {
db.deleteMangasNotInLibrary().executeAsBlocking() db.deleteMangasNotInLibrary().executeAsBlocking()
db.deleteHistoryNoLastRead().executeAsBlocking() db.deleteHistoryNoLastRead().executeAsBlocking()

View File

@ -160,9 +160,8 @@ fun syncChaptersWithSource(
// Fix order in source. // Fix order in source.
db.fixChaptersSourceOrder(sourceChapters).executeAsBlocking() db.fixChaptersSourceOrder(sourceChapters).executeAsBlocking()
// Set manga's last update time to latest chapter's fetch time if possible // Set this manga as updated since chapters were changed
val newestChapter = db.getChapters(manga).executeAsBlocking().maxBy { it.date_fetch } manga.last_update = Date().time
manga.last_update = newestChapter?.date_fetch ?: Date().time
db.updateLastUpdated(manga).executeAsBlocking() db.updateLastUpdated(manga).executeAsBlocking()
} }

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorAccent" android:state_activated="true" />
<item android:color="?attr/colorOnBackground" android:state_activated="false" />
</selector>

View File

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="0.25" android:color="?attr/colorAccent" android:state_checked="true" />
<item android:color="@android:color/transparent" android:state_checked="false" />
</selector>

View File

@ -10,24 +10,6 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<FrameLayout
android:id="@+id/downloaded_only"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/green"
android:visibility="gone"
tools:visibility="visible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="4dp"
android:text="@string/label_downloaded_only"
android:textColor="@color/md_white_1000" />
</FrameLayout>
<Button <Button
android:id="@+id/btn_global_search" android:id="@+id/btn_global_search"
style="@style/Theme.Widget.Button" style="@style/Theme.Widget.Button"

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root_coordinator" android:id="@+id/root_coordinator"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -25,6 +26,42 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/downloaded_only"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/green"
android:visibility="gone"
tools:visibility="visible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="4dp"
android:text="@string/label_downloaded_only"
android:textColor="@color/md_white_1000" />
</FrameLayout>
<FrameLayout
android:id="@+id/incognito_mode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/md_grey_800"
android:visibility="gone"
tools:visibility="visible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="4dp"
android:text="@string/pref_incognito_mode"
android:textColor="@color/md_white_1000" />
</FrameLayout>
</eu.kanade.tachiyomi.widget.ElevationAppBarLayout> </eu.kanade.tachiyomi.widget.ElevationAppBarLayout>
<com.bluelinelabs.conductor.ChangeHandlerFrameLayout <com.bluelinelabs.conductor.ChangeHandlerFrameLayout

View File

@ -133,59 +133,56 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<androidx.appcompat.widget.AppCompatButton <com.google.android.material.button.MaterialButton
android:id="@+id/btn_favorite" android:id="@+id/btn_favorite"
style="@style/Theme.Widget.Button.Action" style="@style/Theme.Widget.Button.Action"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:checkable="true"
android:text="@string/add_to_library" android:text="@string/add_to_library"
app:drawableTopCompat="@drawable/ic_favorite_border_24dp" app:icon="@drawable/ic_favorite_border_24dp"
app:layout_constraintEnd_toStartOf="@+id/btn_tracking" app:layout_constraintEnd_toStartOf="@+id/btn_tracking"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatButton <com.google.android.material.button.MaterialButton
android:id="@+id/btn_tracking" android:id="@+id/btn_tracking"
style="@style/Theme.Widget.Button.Action" style="@style/Theme.Widget.Button.Action"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:checkable="true"
android:text="@string/manga_tracking_tab" android:text="@string/manga_tracking_tab"
android:visibility="gone" android:visibility="gone"
app:drawableTopCompat="@drawable/ic_sync_24dp" app:icon="@drawable/ic_sync_24dp"
app:layout_constraintEnd_toStartOf="@+id/btn_webview" app:layout_constraintEnd_toStartOf="@+id/btn_webview"
app:layout_constraintStart_toEndOf="@+id/btn_favorite" app:layout_constraintStart_toEndOf="@+id/btn_favorite"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.appcompat.widget.AppCompatButton <com.google.android.material.button.MaterialButton
android:id="@+id/btn_webview" android:id="@+id/btn_webview"
style="@style/Theme.Widget.Button.Action" style="@style/Theme.Widget.Button.Action"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/action_web_view" android:text="@string/action_web_view"
android:visibility="gone" android:visibility="gone"
app:drawableTopCompat="@drawable/ic_public_24dp" app:icon="@drawable/ic_public_24dp"
app:layout_constraintEnd_toStartOf="@+id/btn_migrate" app:layout_constraintEnd_toStartOf="@+id/btn_migrate"
app:layout_constraintStart_toEndOf="@+id/btn_tracking" app:layout_constraintStart_toEndOf="@+id/btn_tracking"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.appcompat.widget.AppCompatButton <com.google.android.material.button.MaterialButton
android:id="@+id/btn_migrate" android:id="@+id/btn_migrate"
style="@style/Theme.Widget.Button.Action" style="@style/Theme.Widget.Button.Action"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/migrate" android:text="@string/migrate"
android:visibility="gone" android:visibility="gone"
app:drawableTopCompat="@drawable/baseline_swap_calls_24" app:icon="@drawable/baseline_swap_calls_24"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn_webview" app:layout_constraintStart_toEndOf="@+id/btn_webview"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"

View File

@ -69,6 +69,8 @@
android:layout_height="0dp" android:layout_height="0dp"
android:layout_gravity="top" android:layout_gravity="top"
android:layout_weight="1" android:layout_weight="1"
android:paddingBottom="8dp" /> android:paddingBottom="8dp"
android:clipChildren="false"
android:clipToPadding="false" />
</LinearLayout> </LinearLayout>

View File

@ -403,6 +403,10 @@
<string name="pref_disable_battery_optimization_summary">Helps with background library updates and backups</string> <string name="pref_disable_battery_optimization_summary">Helps with background library updates and backups</string>
<string name="battery_optimization_disabled">Battery optimization is already disabled</string> <string name="battery_optimization_disabled">Battery optimization is already disabled</string>
<string name="battery_optimization_setting_activity_not_found">Couldn\'t open device settings</string> <string name="battery_optimization_setting_activity_not_found">Couldn\'t open device settings</string>
<string name="clear_history_completed">History deleted</string>
<string name="clear_history_confirmation">Are you sure? All history will be lost.</string>
<string name="pref_clear_history">Clear history</string>
<string name="pref_clear_history_summary">Delete reading history for all manga</string>
<!-- About section --> <!-- About section -->
<string name="website">Website</string> <string name="website">Website</string>
@ -421,6 +425,8 @@
<!-- More --> <!-- More -->
<string name="label_downloaded_only">Downloaded only</string> <string name="label_downloaded_only">Downloaded only</string>
<string name="pref_incognito_mode">Incognito mode</string>
<string name="pref_incognito_mode_summary">Pauses reading history</string>
<string name="downloaded_only_summary">Filters all manga in your library</string> <string name="downloaded_only_summary">Filters all manga in your library</string>
<plurals name="download_queue_summary"> <plurals name="download_queue_summary">
<item quantity="one">1 remaining</item> <item quantity="one">1 remaining</item>

View File

@ -254,17 +254,16 @@
<item name="android:textAllCaps">false</item> <item name="android:textAllCaps">false</item>
</style> </style>
<style name="Theme.Widget.Button.Action" parent="Widget.MaterialComponents.Button.Icon"> <style name="Theme.Widget.Button.Action" parent="Widget.MaterialComponents.Button.UnelevatedButton.Icon">
<item name="elevation">0dp</item>
<item name="android:textSize">12sp</item> <item name="android:textSize">12sp</item>
<item name="android:textAllCaps">false</item>
<item name="drawableTint">?attr/colorOnBackground</item> <item name="backgroundTint">@android:color/transparent</item>
<item name="android:drawablePadding">4dp</item>
<item name="rippleColor">?attr/colorAccent</item>
<item name="android:textColor">?attr/colorOnBackground</item>
<item name="backgroundTint">@color/outlined_button_bg</item> <item name="iconGravity">top</item>
<item name="iconTint">@color/button_action_selector</item>
<item name="iconPadding">4dp</item>
<item name="android:textColor">@color/button_action_selector</item>
</style> </style>
<style name="Theme.Widget.Button.TextButton" parent="Widget.MaterialComponents.Button.TextButton"> <style name="Theme.Widget.Button.TextButton" parent="Widget.MaterialComponents.Button.TextButton">