From 6469121f410b1c8b2f3ba8c936d60f4a989759a1 Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Sat, 11 Jul 2020 20:55:06 -0400 Subject: [PATCH] Rewrite and enable manga cover editing, Manga info edit is finished! --- .../tachiyomi/ui/manga/EditMangaDialog.kt | 35 +++++++++------ .../ui/manga/MangaAllInOneController.kt | 34 +++++++++++++++ .../ui/manga/MangaAllInOnePresenter.kt | 43 +++++++++++++++---- app/src/main/res/layout/edit_manga_dialog.xml | 10 ++--- app/src/main/res/values/strings_extra.xml | 7 +++ 5 files changed, 102 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt index d28e36ac1..519a3c3d8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.ui.manga import android.app.Dialog +import android.net.Uri import android.os.Bundle import android.text.InputType import android.view.View @@ -21,12 +22,16 @@ import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.lang.chop import eu.kanade.tachiyomi.util.system.getResourceColor +import eu.kanade.tachiyomi.util.system.toast +import eu.kanade.tachiyomi.util.view.visibleIf import exh.util.trimOrNull +import kotlinx.android.synthetic.main.edit_manga_dialog.view.cover_layout import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_artist import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_author import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_cover import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_description import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_genres_tags +import kotlinx.android.synthetic.main.edit_manga_dialog.view.reset_cover import kotlinx.android.synthetic.main.edit_manga_dialog.view.reset_tags import kotlinx.android.synthetic.main.edit_manga_dialog.view.title import uy.kohesive.injekt.Injekt @@ -38,9 +43,9 @@ class EditMangaDialog : DialogController { private val manga: Manga - // private var customCoverUri: Uri? = null + private var customCoverUri: Uri? = null - // private var willResetCover = false + private var willResetCover = false private val infoController get() = targetController as MangaAllInOneController @@ -126,17 +131,16 @@ class EditMangaDialog : DialogController { } } view.manga_genres_tags.clearFocus() - /*view.cover_layout.setOnClickListener { + view.cover_layout.setOnClickListener { infoController.changeCover() - }*/ + } view.reset_tags.setOnClickListener { resetTags() } - /*view.reset_cover.visibleIf(!isLocal) + view.reset_cover.visibleIf { !isLocal } view.reset_cover.setOnClickListener { - view.manga_cover.loadAny(manga, builder = { - parameters(Parameters.Builder().set(MangaFetcher.realCover, true).build()) - }) + view.context.toast(R.string.cover_reset_toast) + customCoverUri = null willResetCover = true - }*/ + } } private fun resetTags() { @@ -146,11 +150,15 @@ class EditMangaDialog : DialogController { else dialogView?.manga_genres_tags?.setChips(manga.originalGenre?.split(", ")) } - /*fun updateCover(uri: Uri) { + fun updateCover(uri: Uri) { willResetCover = false - dialogView!!.manga_cover.loadAny(uri) + GlideApp.with(dialogView!!.context) + .load(uri) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .centerCrop() + .into(dialogView!!.manga_cover) customCoverUri = uri - }*/ + } override fun onDestroyView(view: View) { super.onDestroyView(view) @@ -161,7 +169,8 @@ class EditMangaDialog : DialogController { infoController.presenter.updateMangaInfo( dialogView?.title?.text.toString(), dialogView?.manga_author?.text.toString(), dialogView?.manga_artist?.text.toString(), - dialogView?.manga_description?.text.toString(), dialogView?.manga_genres_tags?.getTextStrings() + dialogView?.manga_description?.text.toString(), dialogView?.manga_genres_tags?.getTextStrings(), + customCoverUri, willResetCover ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt index 2e7bf46f2..dc00fdf31 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt @@ -60,6 +60,7 @@ import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.visible import exh.EH_SOURCE_ID import exh.EXH_SOURCE_ID +import java.io.IOException import java.util.Date import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CancellationException @@ -1024,6 +1025,39 @@ class MangaAllInOneController : } } + fun changeCover() { + if (manga?.favorite == true) { + val intent = Intent(Intent.ACTION_GET_CONTENT) + intent.type = "image/*" + startActivityForResult( + Intent.createChooser( + intent, + resources?.getString(R.string.select_cover_image) + ), + 101 + ) + } else { + activity?.toast(R.string.cover_must_be_in_library) + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (requestCode == 101) { + if (data == null || resultCode != Activity.RESULT_OK) return + val activity = activity ?: return + try { + val uri = data.data ?: return + if (editMangaDialog != null) editMangaDialog?.updateCover(uri) + else { + presenter.editCoverWithStream(uri) + } + } catch (error: IOException) { + activity.toast(R.string.failed_to_update_cover) + Timber.e(error) + } + } + } + companion object { // EXH --> const val UPDATE_EXTRA = "update" diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt index dd1fd4cdc..842a75965 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.ui.manga +import android.net.Uri import android.os.Bundle import com.google.gson.Gson import com.jakewharton.rxrelay.BehaviorRelay @@ -25,6 +26,7 @@ import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource import eu.kanade.tachiyomi.util.prepUpdateCover import eu.kanade.tachiyomi.util.removeCovers import eu.kanade.tachiyomi.util.shouldDownloadNewChapters +import eu.kanade.tachiyomi.util.updateCoverLastModified import exh.EH_SOURCE_ID import exh.EXH_SOURCE_ID import exh.MERGED_SOURCE_ID @@ -205,7 +207,9 @@ class MangaAllInOnePresenter( author: String?, artist: String?, description: String?, - tags: List? + tags: List?, + uri: Uri?, + resetCover: Boolean = false ) { if (manga.source == LocalSource.ID) { manga.title = if (title.isNullOrBlank()) manga.url else title.trim() @@ -232,13 +236,36 @@ class MangaAllInOnePresenter( ) customMangaManager.saveMangaInfo(manga) } - /*if (uri != null) { - editCoverWithStream(uri) - } else if (resetCover) { - coverCache.deleteCustomCover(manga) - controller.setPaletteColor() - }*/ - updateManga(updateInfo = false) + + if (uri != null) { + editCoverWithStream(uri) + } else if (resetCover) { + controller.setRefreshing(true) + coverCache.deleteCustomCover(manga) + } + + if (uri == null && resetCover) { + fetchMangaFromSource(manualFetch = true, fetchChapters = false) + } else { + updateManga(updateInfo = false) + } + } + + fun editCoverWithStream(uri: Uri): Boolean { + val inputStream = + downloadManager.context.contentResolver.openInputStream(uri) ?: return false + if (manga.source == LocalSource.ID) { + LocalSource.updateCover(downloadManager.context, manga, inputStream) + manga.updateCoverLastModified(db) + return true + } + + if (manga.favorite) { + coverCache.setCustomCoverToCache(manga, inputStream) + manga.updateCoverLastModified(db) + return true + } + return false } /** diff --git a/app/src/main/res/layout/edit_manga_dialog.xml b/app/src/main/res/layout/edit_manga_dialog.xml index b4cf7cd4e..79fb2c502 100644 --- a/app/src/main/res/layout/edit_manga_dialog.xml +++ b/app/src/main/res/layout/edit_manga_dialog.xml @@ -1,6 +1,5 @@ @@ -15,25 +14,24 @@ - + android:text="@string/reset_cover" /> No source categories available Invalid category name Add Tag + The cover will be updated when you exit manga info edit + Select cover image + Must be in library to edit cover images + Failed to update cover See Recommendations @@ -136,6 +140,9 @@ Manhua Comic Webtoon + + Reset Tags + Reset Cover \ No newline at end of file