diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ae4cea7b..029531748 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +### 6.8.0 +- Various performance improvements +- Fix library search query being lost +- Upstream merge +- Fix Tsumino and HentaiCafe links not triggering a link import +- Fix many bugs in link interceptor + ### 6.6.0 - Many performance improvements - Stability improvements and bug fixes diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 476de40e7..5593d6e8d 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -105,7 +105,8 @@ + android:excludeFromRecents="true" + android:label="Tachiyomi"> @@ -146,21 +147,35 @@ android:scheme="https"/> + + diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/PervEden.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/PervEden.kt index 85f758961..193f82c24 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/PervEden.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/PervEden.kt @@ -7,7 +7,11 @@ import eu.kanade.tachiyomi.source.online.LewdSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.ChapterRecognition import eu.kanade.tachiyomi.util.asJsoup -import exh.metadata.models.* +import exh.metadata.EMULATED_TAG_NAMESPACE +import exh.metadata.models.PervEdenGalleryMetadata +import exh.metadata.models.PervEdenLang +import exh.metadata.models.PervEdenTitle +import exh.metadata.models.Tag import exh.util.UriFilter import exh.util.UriGroup import exh.util.urlImportFetchSearchManga @@ -139,7 +143,7 @@ class PervEden(override val id: Long, val pvLang: PervEdenLang) : ParsedHttpSour } "Genres" -> { if(it is Element && it.tagName() == "a") - tags.add(Tag("genre", it.text().toLowerCase(), false)) + tags.add(Tag(EMULATED_TAG_NAMESPACE, it.text().toLowerCase(), false)) } "Type" -> { if(it is TextNode) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/HentaiCafe.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/HentaiCafe.kt index d562053fe..1b3b64268 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/HentaiCafe.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/HentaiCafe.kt @@ -8,6 +8,7 @@ import eu.kanade.tachiyomi.source.online.LewdSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup import exh.HENTAI_CAFE_SOURCE_ID +import exh.metadata.EMULATED_TAG_NAMESPACE import exh.metadata.models.HentaiCafeMetadata import exh.metadata.models.HentaiCafeMetadata.Companion.BASE_URL import exh.metadata.models.Tag @@ -128,7 +129,7 @@ class HentaiCafe : ParsedHttpSource(), LewdSource val firstPath = parsed.pathSegments.first() when(firstPath) { - "tag" -> tags.add(Tag("tag", it.text(), false)) + "tag" -> tags.add(Tag(EMULATED_TAG_NAMESPACE, it.text(), false)) "artist" -> { artist = it.text() tags.add(Tag("artist", it.text(), false)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Tsumino.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Tsumino.kt index 897871aea..0a7795568 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Tsumino.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Tsumino.kt @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.source.online.LewdSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup import exh.TSUMINO_SOURCE_ID +import exh.metadata.EMULATED_TAG_NAMESPACE import exh.metadata.models.Tag import exh.metadata.models.TsuminoMetadata import exh.metadata.models.TsuminoMetadata.Companion.BASE_URL @@ -96,7 +97,7 @@ class Tsumino: ParsedHttpSource(), LewdSource { it.getElementById("Tag")?.children()?.let { tags.addAll(it.map { - Tag("tag", it.text().trim(), false) + Tag(EMULATED_TAG_NAMESPACE, it.text().trim(), false) }) } } 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 8fc426ff9..a145f8124 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 @@ -36,11 +36,11 @@ import eu.kanade.tachiyomi.ui.migration.MigrationController import eu.kanade.tachiyomi.util.inflate import eu.kanade.tachiyomi.util.toast import eu.kanade.tachiyomi.widget.DrawerSwipeCloseListener +import exh.FavoritesSyncHelper import exh.metadata.loadAllMetadata import exh.metadata.models.SearchableGalleryMetadata import io.realm.Realm import io.realm.RealmResults -import kotlinx.android.synthetic.main.main_activity.* import kotlinx.android.synthetic.main.library_controller.* import kotlinx.android.synthetic.main.main_activity.* import rx.Subscription @@ -133,6 +133,8 @@ class LibraryController( var realm: Realm? = null //Cached metadata var meta: Map, RealmResults>? = null + //Favorites + val favorites by lazy { FavoritesSyncHelper(activity!!) } // <-- EH init { @@ -403,6 +405,9 @@ class LibraryController( R.id.action_source_migration -> { router.pushController(MigrationController().withFadeTransaction()) } + R.id.action_download_favorites -> { + favorites.guiSyncFavorites { } + } else -> return super.onOptionsItemSelected(item) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt index 507eaffb3..5b4c3ba29 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt @@ -32,6 +32,7 @@ import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.base.controller.DialogController @@ -45,6 +46,8 @@ import eu.kanade.tachiyomi.util.getResourceColor import eu.kanade.tachiyomi.util.snack import eu.kanade.tachiyomi.util.toast import eu.kanade.tachiyomi.util.truncateCenter +import exh.EH_SOURCE_ID +import exh.EXH_SOURCE_ID import jp.wasabeef.glide.transformations.CropSquareTransformation import jp.wasabeef.glide.transformations.MaskTransformation import kotlinx.android.synthetic.main.manga_info_controller.* @@ -66,6 +69,8 @@ class MangaInfoController : NucleusController(), */ private val preferences: PreferencesHelper by injectLazy() + private val sourceManager: SourceManager by injectLazy() + init { setHasOptionsMenu(true) setOptionsMenuHidden(true) @@ -103,22 +108,38 @@ class MangaInfoController : NucleusController(), } manga_artist.clicks().subscribeUntilDestroy { - performGlobalSearch(manga_artist.text.toString()) + //EXH Special case E-Hentai/ExHentai to use tag based search + var text = manga_artist.text.toString() + if(isEHentaiBasedSource()) + text = wrapTag("artist", text) + performGlobalSearch(text) } manga_author.longClicks().subscribeUntilDestroy { - copyToClipboard(manga_author.text.toString(), manga_author.text.toString()) + //EXH Special case E-Hentai/ExHentai to ignore author field (unused) + if(!isEHentaiBasedSource()) + copyToClipboard(manga_author.text.toString(), manga_author.text.toString()) } manga_author.clicks().subscribeUntilDestroy { - performGlobalSearch(manga_author.text.toString()) + //EXH Special case E-Hentai/ExHentai to ignore author field (unused) + if(!isEHentaiBasedSource()) + performGlobalSearch(manga_author.text.toString()) } manga_summary.longClicks().subscribeUntilDestroy { copyToClipboard(view.context.getString(R.string.description), manga_summary.text.toString()) } - manga_genres_tags.setOnTagClickListener { tag -> performGlobalSearch(tag) } + manga_genres_tags.setOnTagClickListener { tag -> + //EXH Special case E-Hentai/ExHentai to use tag based search + var text = tag + if(isEHentaiBasedSource()) { + val parsed = parseTag(text) + text = wrapTag(parsed.first, parsed.second) + } + performGlobalSearch(text) + } manga_cover.longClicks().subscribeUntilDestroy { copyToClipboard(view.context.getString(R.string.title), presenter.manga.title) @@ -491,6 +512,32 @@ class MangaInfoController : NucleusController(), router.pushController(CatalogueSearchController(query).withFadeTransaction()) } + // --> EH + private fun wrapTag(namespace: String, tag: String) + = if(tag.contains(' ')) + "$namespace:\"$tag$\"" + else + "$namespace:$tag$" + + private fun parseTag(tag: String) = tag.substringBefore(':').trim() to tag.substringAfter(':').trim() + + private fun isEHentaiBasedSource(): Boolean { + val mangaSourceText = manga_source.text + + sourceManager.get(EH_SOURCE_ID)?.let { + if(mangaSourceText.startsWith(it.name)) + return true + } + + sourceManager.get(EXH_SOURCE_ID)?.let { + if(mangaSourceText.startsWith(it.name)) + return true + } + + return false + } + // <-- EH + /** * Create shortcut using ShortcutManager. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt index d39f9fee8..f6190cca9 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt @@ -5,6 +5,7 @@ import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.changehandler.FadeChangeHandler import exh.ui.login.LoginController import rx.android.schedulers.AndroidSchedulers +import rx.schedulers.Schedulers /** * EH Settings fragment @@ -22,6 +23,7 @@ class SettingsEhController : SettingsController() { defaultValue = false preferences.enableExhentai() .asObservable() + .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeUntilDestroy { isChecked = it diff --git a/app/src/main/java/exh/FavoritesSyncHelper.kt b/app/src/main/java/exh/FavoritesSyncHelper.kt index 35a41df44..db1528a03 100755 --- a/app/src/main/java/exh/FavoritesSyncHelper.kt +++ b/app/src/main/java/exh/FavoritesSyncHelper.kt @@ -74,8 +74,10 @@ class FavoritesSyncHelper(val activity: Activity) { (exSource ?: ehSource)?.let { source -> val favResponse = source.fetchFavorites() - val ourCategories = ArrayList(db.getCategories().executeAsBlocking()) - val ourMangas = ArrayList(db.getMangas().executeAsBlocking()) + val ourCategories = db.getCategories().executeAsBlocking().toMutableList() + val ourMangas = db.getMangas().executeAsBlocking().filter { + it.source == EH_SOURCE_ID || it.source == EXH_SOURCE_ID + }.toMutableList() //Add required categories (categories do not sync upwards) favResponse.second.filter { theirCategory -> ourCategories.find { @@ -93,7 +95,7 @@ class FavoritesSyncHelper(val activity: Activity) { val categoryMap = (it + ourCategories).associateBy { it.name } //Insert new mangas - val mangaToInsert = java.util.ArrayList() + val mangaToInsert = mutableListOf() favResponse.first.map { val category = categoryMap[it.fav]!! var manga = it.manga diff --git a/app/src/main/java/exh/metadata/MetadataUtil.kt b/app/src/main/java/exh/metadata/MetadataUtil.kt index 6acb2eb24..3e80ce933 100755 --- a/app/src/main/java/exh/metadata/MetadataUtil.kt +++ b/app/src/main/java/exh/metadata/MetadataUtil.kt @@ -83,3 +83,11 @@ fun buildTagsDescription(metadata: SearchableGalleryMetadata) } } } + +fun joinTagsToGenreString(metadata: SearchableGalleryMetadata) + = metadata.tags.joinToString { "${it.namespace}: ${it.name}" } + +fun joinEmulatedTagsToGenreString(metadata: SearchableGalleryMetadata) + = metadata.tags.filter { it.namespace == EMULATED_TAG_NAMESPACE }.joinToString { it.name.toString() } + +val EMULATED_TAG_NAMESPACE = "tag" \ No newline at end of file diff --git a/app/src/main/java/exh/metadata/models/ExGalleryMetadata.kt b/app/src/main/java/exh/metadata/models/ExGalleryMetadata.kt index b5c4da343..9e3d63ea9 100755 --- a/app/src/main/java/exh/metadata/models/ExGalleryMetadata.kt +++ b/app/src/main/java/exh/metadata/models/ExGalleryMetadata.kt @@ -4,10 +4,7 @@ import android.net.Uri import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.source.model.SManga -import exh.metadata.EX_DATE_FORMAT -import exh.metadata.ONGOING_SUFFIX -import exh.metadata.buildTagsDescription -import exh.metadata.humanReadableByteCount +import exh.metadata.* import exh.plusAssign import io.realm.RealmList import io.realm.RealmObject @@ -110,12 +107,9 @@ open class ExGalleryMetadata : RealmObject(), SearchableGalleryMetadata { tags.filter { it.namespace == EH_ARTIST_NAMESPACE }.let { if(it.isNotEmpty()) manga.artist = it.joinToString(transform = { it.name!! }) } - //Set author (if we can find one) - tags.filter { it.namespace == EH_AUTHOR_NAMESPACE }.let { - if(it.isNotEmpty()) manga.author = it.joinToString(transform = { it.name!! }) - } - //Set genre - genre?.let { manga.genre = it } + + //Copy tags -> genres + manga.genre = joinTagsToGenreString(this) //Try to automatically identify if it is ongoing, we try not to be too lenient here to avoid making mistakes //We default to completed @@ -134,6 +128,7 @@ open class ExGalleryMetadata : RealmObject(), SearchableGalleryMetadata { altTitle?.let { titleDesc += "Alternate Title: $it\n" } val detailsDesc = StringBuilder() + genre?.let { detailsDesc += "Genre: $it\n" } uploader?.let { detailsDesc += "Uploader: $it\n" } datePosted?.let { detailsDesc += "Posted: ${EX_DATE_FORMAT.format(Date(it))}\n" } visible?.let { detailsDesc += "Visible: $it\n" } @@ -176,7 +171,6 @@ open class ExGalleryMetadata : RealmObject(), SearchableGalleryMetadata { ) private const val EH_ARTIST_NAMESPACE = "artist" - private const val EH_AUTHOR_NAMESPACE = "author" } } \ No newline at end of file diff --git a/app/src/main/java/exh/metadata/models/NHentaiMetadata.kt b/app/src/main/java/exh/metadata/models/NHentaiMetadata.kt index 6b301dbe8..409fdb1aa 100755 --- a/app/src/main/java/exh/metadata/models/NHentaiMetadata.kt +++ b/app/src/main/java/exh/metadata/models/NHentaiMetadata.kt @@ -3,10 +3,7 @@ package exh.metadata.models import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.source.model.SManga -import exh.metadata.EX_DATE_FORMAT -import exh.metadata.ONGOING_SUFFIX -import exh.metadata.buildTagsDescription -import exh.metadata.nullIfBlank +import exh.metadata.* import exh.plusAssign import io.realm.RealmList import io.realm.RealmObject @@ -106,10 +103,14 @@ open class NHentaiMetadata : RealmObject(), SearchableGalleryMetadata { if(it.isNotEmpty()) manga.artist = it.joinToString(transform = { it.name!! }) } + var category: String? = null tags.filter { it.namespace == NHENTAI_CATEGORIES_NAMESPACE }.let { - if(it.isNotEmpty()) manga.genre = it.joinToString(transform = { it.name!! }) + if(it.isNotEmpty()) category = it.joinToString(transform = { it.name!! }) } + //Copy tags -> genres + manga.genre = joinEmulatedTagsToGenreString(this) + //Try to automatically identify if it is ongoing, we try not to be too lenient here to avoid making mistakes //We default to completed manga.status = SManga.COMPLETED @@ -127,6 +128,7 @@ open class NHentaiMetadata : RealmObject(), SearchableGalleryMetadata { shortTitle?.let { titleDesc += "Short Title: $it\n" } val detailsDesc = StringBuilder() + category?.let { detailsDesc += "Category: $it\n" } uploadDate?.let { detailsDesc += "Upload Date: ${EX_DATE_FORMAT.format(Date(it * 1000))}\n" } pageImageTypes.size.let { detailsDesc += "Length: $it pages\n" } favoritesCount?.let { detailsDesc += "Favorited: $it times\n" } diff --git a/app/src/main/java/exh/metadata/models/PervEdenGalleryMetadata.kt b/app/src/main/java/exh/metadata/models/PervEdenGalleryMetadata.kt index 187e697b4..d8736462a 100755 --- a/app/src/main/java/exh/metadata/models/PervEdenGalleryMetadata.kt +++ b/app/src/main/java/exh/metadata/models/PervEdenGalleryMetadata.kt @@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.source.model.SManga import exh.PERV_EDEN_EN_SOURCE_ID import exh.PERV_EDEN_IT_SOURCE_ID import exh.metadata.buildTagsDescription +import exh.metadata.joinEmulatedTagsToGenreString import exh.plusAssign import io.realm.RealmList import io.realm.RealmObject @@ -77,7 +78,6 @@ open class PervEdenGalleryMetadata : RealmObject(), SearchableGalleryMetadata { } type?.let { - manga.genre = it detailsDesc += "Type: $it\n" } @@ -94,6 +94,9 @@ open class PervEdenGalleryMetadata : RealmObject(), SearchableGalleryMetadata { detailsDesc += "Rating: %.2\n".format(it) } + //Copy tags -> genres + manga.genre = joinEmulatedTagsToGenreString(this) + val tagsDesc = buildTagsDescription(this) manga.description = listOf(titleDesc.toString(), detailsDesc.toString(), tagsDesc.toString()) @@ -164,6 +167,7 @@ open class PervEdenTitle(var metadata: PervEdenGalleryMetadata? = null, } enum class PervEdenLang(val id: Long) { + //DO NOT RENAME THESE TO CAPITAL LETTERS! The enum names are used to build URLs en(PERV_EDEN_EN_SOURCE_ID), it(PERV_EDEN_IT_SOURCE_ID); diff --git a/app/src/main/java/exh/metadata/models/TsuminoMetadata.kt b/app/src/main/java/exh/metadata/models/TsuminoMetadata.kt index 172ce0af4..12276b3fb 100644 --- a/app/src/main/java/exh/metadata/models/TsuminoMetadata.kt +++ b/app/src/main/java/exh/metadata/models/TsuminoMetadata.kt @@ -4,6 +4,7 @@ import android.net.Uri import eu.kanade.tachiyomi.source.model.SManga import exh.metadata.EX_DATE_FORMAT import exh.metadata.buildTagsDescription +import exh.metadata.joinEmulatedTagsToGenreString import exh.plusAssign import io.realm.RealmList import io.realm.RealmObject @@ -96,7 +97,6 @@ open class TsuminoMetadata : RealmObject(), SearchableGalleryMetadata { length?.let { detailsDesc += "Length: $it pages\n" } ratingString?.let { detailsDesc += "Rating: $it\n" } category?.let { - manga.genre = it detailsDesc += "Category: $it\n" } collection?.let { detailsDesc += "Collection: $it\n" } @@ -109,7 +109,10 @@ open class TsuminoMetadata : RealmObject(), SearchableGalleryMetadata { if(charactersString.isNotEmpty()) { detailsDesc += "Character: $charactersString\n" } - + + //Copy tags -> genres + manga.genre = joinEmulatedTagsToGenreString(this) + val tagsDesc = buildTagsDescription(this) manga.description = listOf(titleDesc, detailsDesc.toString(), tagsDesc.toString()) diff --git a/app/src/main/java/exh/ui/intercept/InterceptActivity.kt b/app/src/main/java/exh/ui/intercept/InterceptActivity.kt index a3023e2f9..c87c58581 100755 --- a/app/src/main/java/exh/ui/intercept/InterceptActivity.kt +++ b/app/src/main/java/exh/ui/intercept/InterceptActivity.kt @@ -5,32 +5,19 @@ import android.os.Bundle import android.view.MenuItem import com.afollestad.materialdialogs.MaterialDialog import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.ui.base.activity.BaseActivity +import eu.kanade.tachiyomi.ui.base.activity.BaseRxActivity import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.manga.MangaController -import exh.GalleryAddEvent -import exh.GalleryAdder import kotlinx.android.synthetic.main.eh_activity_intercept.* -import uy.kohesive.injekt.injectLazy -import kotlin.concurrent.thread +import nucleus.factory.RequiresPresenter +import rx.Subscription +import rx.android.schedulers.AndroidSchedulers -class InterceptActivity : BaseActivity() { - - private val preferences: PreferencesHelper by injectLazy() - - private val galleryAdder = GalleryAdder() - - var finished = false +@RequiresPresenter(InterceptActivityPresenter::class) +class InterceptActivity : BaseRxActivity() { + private var statusSubscription: Subscription? = null override fun onCreate(savedInstanceState: Bundle?) { - //Set theme - setTheme(when (preferences.theme()) { - 2 -> R.style.Theme_Tachiyomi_Dark - 3 -> R.style.Theme_Tachiyomi_Amoled - else -> R.style.Theme_Tachiyomi - }) - super.onCreate(savedInstanceState) setContentView(R.layout.eh_activity_intercept) @@ -38,37 +25,12 @@ class InterceptActivity : BaseActivity() { setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) - if(savedInstanceState == null) - thread { processLink() } + processLink() } private fun processLink() { - if(Intent.ACTION_VIEW == intent.action) { - val result = galleryAdder.addGallery(intent.dataString) - - when(result) { - is GalleryAddEvent.Success -> - if(!finished) - startActivity(Intent(this, MainActivity::class.java) - .setAction(MainActivity.SHORTCUT_MANGA) - .putExtra(MangaController.MANGA_EXTRA, result.manga.id)) - is GalleryAddEvent.Fail -> - if(!finished) - runOnUiThread { - MaterialDialog.Builder(this) - .title("Error") - .content("Could not open this gallery:\n\n${result.logMessage}") - .cancelable(true) - .canceledOnTouchOutside(true) - .cancelListener { onBackPressed() } - .positiveText("Ok") - .onPositive { _, _ -> onBackPressed() } - .dismissListener { onBackPressed() } - .show() - } - } - onBackPressed() - } + if(Intent.ACTION_VIEW == intent.action) + presenter.loadGallery(intent.dataString) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -79,15 +41,36 @@ class InterceptActivity : BaseActivity() { return true } - override fun onBackPressed() { - if(!finished) - runOnUiThread { - super.onBackPressed() - } + override fun onStart() { + super.onStart() + statusSubscription?.unsubscribe() + statusSubscription = presenter.status + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + when(it) { + is InterceptResult.Success -> { + startActivity(Intent(this, MainActivity::class.java) + .setAction(MainActivity.SHORTCUT_MANGA) + .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + .putExtra(MangaController.MANGA_EXTRA, it.mangaId)) + onBackPressed() + } + is InterceptResult.Failure -> + MaterialDialog.Builder(this) + .title("Error") + .content("Could not open this gallery:\n\n${it.reason}") + .cancelable(true) + .canceledOnTouchOutside(true) + .positiveText("Ok") + .cancelListener { onBackPressed() } + .dismissListener { onBackPressed() } + .show() + } + } } override fun onStop() { super.onStop() - finished = true + statusSubscription?.unsubscribe() } } diff --git a/app/src/main/java/exh/ui/intercept/InterceptActivityPresenter.kt b/app/src/main/java/exh/ui/intercept/InterceptActivityPresenter.kt new file mode 100644 index 000000000..89c4c64b7 --- /dev/null +++ b/app/src/main/java/exh/ui/intercept/InterceptActivityPresenter.kt @@ -0,0 +1,40 @@ +package exh.ui.intercept + +import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter +import exh.GalleryAddEvent +import exh.GalleryAdder +import rx.subjects.BehaviorSubject +import kotlin.concurrent.thread + +class InterceptActivityPresenter : BasePresenter() { + private val galleryAdder = GalleryAdder() + + val status = BehaviorSubject.create(InterceptResult.Idle()) + + @Synchronized + fun loadGallery(gallery: String) { + //Do not load gallery if already loading + if(status.value is InterceptResult.Idle) { + status.onNext(InterceptResult.Loading()) + + //Load gallery async + thread { + val result = galleryAdder.addGallery(gallery) + + status.onNext(when (result) { + is GalleryAddEvent.Success -> result.manga.id?.let { + InterceptResult.Success(it) + } ?: InterceptResult.Failure("Manga ID is null!") + is GalleryAddEvent.Fail -> InterceptResult.Failure(result.logMessage) + }) + } + } + } +} + +sealed class InterceptResult { + class Idle : InterceptResult() + class Loading : InterceptResult() + data class Success(val mangaId: Long): InterceptResult() + data class Failure(val reason: String): InterceptResult() +} \ No newline at end of file diff --git a/app/src/main/res/layout/eh_activity_intercept.xml b/app/src/main/res/layout/eh_activity_intercept.xml index cc11ab373..8ad4ca2cc 100755 --- a/app/src/main/res/layout/eh_activity_intercept.xml +++ b/app/src/main/res/layout/eh_activity_intercept.xml @@ -15,7 +15,8 @@ + android:layout_height="wrap_content" + app:elevation="0dp"> - - + + + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:text="Loading gallery..." + android:textAppearance="@style/TextAppearance.Medium.Title" + android:textColor="@color/white" /> - - - - - + + diff --git a/app/src/main/res/layout/manga_info_controller.xml b/app/src/main/res/layout/manga_info_controller.xml index 5690ffa2c..c1412444b 100755 --- a/app/src/main/res/layout/manga_info_controller.xml +++ b/app/src/main/res/layout/manga_info_controller.xml @@ -240,7 +240,7 @@ + app:layout_constraintTop_toBottomOf="@+id/guideline" + app:layout_constraintBottom_toBottomOf="parent"> + + - - - diff --git a/app/src/main/res/menu/library.xml b/app/src/main/res/menu/library.xml index 83062e358..c51eb7c68 100755 --- a/app/src/main/res/menu/library.xml +++ b/app/src/main/res/menu/library.xml @@ -23,7 +23,7 @@ app:showAsAction="ifRoom"/>