diff --git a/.github/workflows/issue_closer.yml b/.github/workflows/issue_closer.yml index de3c7107c..33cc62f39 100644 --- a/.github/workflows/issue_closer.yml +++ b/.github/workflows/issue_closer.yml @@ -1,5 +1,7 @@ name: Issue closer -on: [issues] +on: + issues: + types: [opened, edited, reopened] jobs: autoclose: diff --git a/app/build.gradle b/app/build.gradle index 35f8f5ead..c111b5c83 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt index c872ee31f..2cde20893 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt @@ -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. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index f14f31dce..6538db8cc 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -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" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index d35ddba03..12a21c2be 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -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) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 4c37ed05d..59d4136e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -226,10 +226,6 @@ class LibraryController( } } - if (preferences.downloadedOnly().get()) { - binding.downloadedOnly.isVisible = true - } - binding.btnGlobalSearch.clicks() .onEach { router.pushController( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 14fb9e97d..db706ba25 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -230,6 +230,14 @@ class MainActivity : BaseActivity() { 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) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index 48c5eb05d..64d084048 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -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) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt index e79b47dd0..b1bdce8d1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt @@ -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() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoHeaderAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoHeaderAdapter.kt index fcbdccf44..db49bf05e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoHeaderAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoHeaderAdapter.kt @@ -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 } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreController.kt index 4e0c56f17..da30335ef 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreController.kt @@ -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 diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index 4a1366b41..752c800a1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -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() + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt index edab951ac..7838b718b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt @@ -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() diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSourceSync.kt b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSourceSync.kt index 94795ccb5..fd09f703b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSourceSync.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSourceSync.kt @@ -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() } diff --git a/app/src/main/res/color/button_action_selector.xml b/app/src/main/res/color/button_action_selector.xml new file mode 100644 index 000000000..e457c5a52 --- /dev/null +++ b/app/src/main/res/color/button_action_selector.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/color/outlined_button_bg.xml b/app/src/main/res/color/outlined_button_bg.xml deleted file mode 100644 index b95df40de..000000000 --- a/app/src/main/res/color/outlined_button_bg.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/library_controller.xml b/app/src/main/res/layout/library_controller.xml index 1bae7b217..b60444697 100644 --- a/app/src/main/res/layout/library_controller.xml +++ b/app/src/main/res/layout/library_controller.xml @@ -10,24 +10,6 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - -