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
on: [issues]
on:
issues:
types: [opened, edited, reopened]
jobs:
autoclose:

View File

@ -141,7 +141,7 @@ dependencies {
// AndroidX libraries
implementation 'androidx.annotation:annotation:1.1.0'
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.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
@ -149,10 +149,10 @@ dependencies {
implementation 'androidx.core:core-ktx:1.4.0-alpha01'
implementation 'androidx.multidex:multidex:2.0.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'
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-process:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
@ -233,7 +233,7 @@ dependencies {
implementation "com.github.bumptech.glide:okhttp3-integration:$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
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)
}
/**
* 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.
*

View File

@ -187,6 +187,8 @@ object PreferenceKeys {
const val defaultChapterDisplayByNameOrNumber = "default_chapter_display_by_name_or_number"
const val incognitoMode = "incognito_mode"
fun trackUsername(syncId: Int) = "pref_mangasync_username_$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 incognitoMode() = flowPrefs.getBoolean(Keys.incognitoMode, false)
fun setChapterSettingsDefault(manga: Manga) {
prefs.edit {
putInt(Keys.defaultChapterFilterByRead, manga.readFilter)

View File

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

View File

@ -230,6 +230,14 @@ class MainActivity : BaseActivity<MainActivityBinding>() {
preferences.extensionUpdatesCount()
.asImmediateFlow { setExtensionsBadge() }
.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) {

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

View File

@ -87,12 +87,12 @@ class ChaptersSettingsSheet(
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 unread = Item.TriStateGroup(R.string.action_filter_unread, this)
private val bookmarked = Item.TriStateGroup(R.string.action_filter_bookmarked, this)
override val header = null
override val items = listOf(unread, downloaded, bookmarked)
override val items = listOf(downloaded, unread, bookmarked)
override val footer = null
override fun initModels() {

View File

@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.ui.manga.info
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
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.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.view.setTooltip
import exh.MERGED_SOURCE_ID
import exh.source.EnhancedHttpSource.Companion.getMainSource
import exh.util.SourceTagsUtil
@ -115,27 +113,17 @@ class MangaInfoHeaderAdapter(
isVisible = true
if (trackCount > 0) {
setCompoundDrawablesWithIntrinsicBounds(
null,
ContextCompat.getDrawable(context, R.drawable.ic_done_24dp),
null,
null
)
setIconResource(R.drawable.ic_done_24dp)
text = view.context.resources.getQuantityString(
R.plurals.num_trackers,
trackCount,
trackCount
)
isSelected = true
isActivated = true
} else {
setCompoundDrawablesWithIntrinsicBounds(
null,
ContextCompat.getDrawable(context, R.drawable.ic_sync_24dp),
null,
null
)
setIconResource(R.drawable.ic_sync_24dp)
text = view.context.getString(R.string.manga_tracking_tab)
isSelected = false
isActivated = false
}
clicks()
@ -151,7 +139,6 @@ class MangaInfoHeaderAdapter(
binding.btnWebview.clicks()
.onEach { controller.openMangaInWebView() }
.launchIn(scope)
binding.btnWebview.setTooltip(R.string.action_open_in_web_view)
}
// SY -->
@ -320,18 +307,10 @@ class MangaInfoHeaderAdapter(
// Set the Favorite drawable to the correct one.
// Border drawable if false, filled drawable if true.
binding.btnFavorite.apply {
setCompoundDrawablesWithIntrinsicBounds(
null,
ContextCompat.getDrawable(
context,
if (isFavorite) R.drawable.ic_favorite_24dp else R.drawable.ic_favorite_border_24dp
),
null,
null
)
setIconResource(if (isFavorite) R.drawable.ic_favorite_24dp else R.drawable.ic_favorite_border_24dp)
text =
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.SettingsMainController
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.iconTint
import eu.kanade.tachiyomi.util.preference.onClick
@ -54,6 +55,15 @@ class MoreController :
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 {
preference {
titleRes = R.string.label_download_queue

View File

@ -417,6 +417,7 @@ class ReaderPresenter(
// SY <--
updateTrackChapterRead(selectedChapter)
deleteChapterIfNeeded(selectedChapter)
deleteChapterFromDownloadQueue(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.
* If both conditions are satisfied enqueues chapter for delete
@ -470,11 +481,13 @@ class ReaderPresenter(
* Saves this [chapter] last read history.
*/
private fun saveChapterHistory(chapter: ReaderChapter) {
val history = History.create(chapter.chapter).apply { last_read = Date().time }
db.updateHistoryLastRead(history).asRxCompletable()
.onErrorComplete()
.subscribeOn(Schedulers.io())
.subscribe()
if (!preferences.incognitoMode().get()) {
val history = History.create(chapter.chapter).apply { last_read = Date().time }
db.updateHistoryLastRead(history).asRxCompletable()
.onErrorComplete()
.subscribeOn(Schedulers.io())
.subscribe()
}
}
/**

View File

@ -114,6 +114,16 @@ class SettingsAdvancedController : SettingsController() {
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 {
@ -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() {
db.deleteMangasNotInLibrary().executeAsBlocking()
db.deleteHistoryNoLastRead().executeAsBlocking()

View File

@ -160,9 +160,8 @@ fun syncChaptersWithSource(
// Fix order in source.
db.fixChaptersSourceOrder(sourceChapters).executeAsBlocking()
// Set manga's last update time to latest chapter's fetch time if possible
val newestChapter = db.getChapters(manga).executeAsBlocking().maxBy { it.date_fetch }
manga.last_update = newestChapter?.date_fetch ?: Date().time
// Set this manga as updated since chapters were changed
manga.last_update = Date().time
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: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
android:id="@+id/btn_global_search"
style="@style/Theme.Widget.Button"

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:id="@+id/root_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -25,6 +26,42 @@
android:layout_width="match_parent"
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>
<com.bluelinelabs.conductor.ChangeHandlerFrameLayout

View File

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

View File

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

View File

@ -403,6 +403,10 @@
<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_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 -->
<string name="website">Website</string>
@ -421,6 +425,8 @@
<!-- More -->
<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>
<plurals name="download_queue_summary">
<item quantity="one">1 remaining</item>

View File

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