From 28d05b629f3b6fbfbe533431344b460a8da9b265 Mon Sep 17 00:00:00 2001 From: NerdNumber9 Date: Sun, 8 Jul 2018 17:53:03 -0400 Subject: [PATCH] Add additional advanced options to login screen Add "more" button into global search results Retry-all button is now more explicit on what was retried Minor performance fix in hitomi search --- .../tachiyomi/source/online/all/Hitomi.kt | 4 +- .../browse/BrowseCatalogueController.kt | 10 +- .../browse/BrowseCataloguePresenter.kt | 3 +- .../global_search/CatalogueSearchAdapter.kt | 10 ++ .../CatalogueSearchController.kt | 22 +++- .../global_search/CatalogueSearchHolder.kt | 8 ++ .../tachiyomi/ui/reader/ReaderActivity.kt | 6 +- .../main/java/exh/ui/login/LoginController.kt | 47 +++++++- .../exh/ui/migration/MetadataFetchDialog.kt | 2 +- ...atalogue_global_search_controller_card.xml | 11 ++ app/src/main/res/layout/eh_activity_login.xml | 106 ++++++++++++++---- 11 files changed, 197 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/Hitomi.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/Hitomi.kt index 93fad2a70..6defb477a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/Hitomi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/Hitomi.kt @@ -466,9 +466,7 @@ class Hitomi(private val context: Context) .map { response -> val doc = response.asJsoup() - val res = parsePage(doc).map { - it - } + val res = parsePage(doc) val sManga = res.map { SManga.create().apply { setUrlWithoutDomain(it.url!!) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt index 80f284204..e5928aa4a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt @@ -45,8 +45,12 @@ open class BrowseCatalogueController(bundle: Bundle) : FlexibleAdapter.EndlessScrollListener, ChangeMangaCategoriesDialog.Listener { - constructor(source: CatalogueSource) : this(Bundle().apply { + constructor(source: CatalogueSource, + searchQuery: String? = null) : this(Bundle().apply { putLong(SOURCE_ID_KEY, source.id) + + if(searchQuery != null) + putString(SEARCH_QUERY_KEY, searchQuery) }) /** @@ -98,7 +102,8 @@ open class BrowseCatalogueController(bundle: Bundle) : } override fun createPresenter(): BrowseCataloguePresenter { - return BrowseCataloguePresenter(args.getLong(SOURCE_ID_KEY)) + return BrowseCataloguePresenter(args.getLong(SOURCE_ID_KEY), + args.getString(SEARCH_QUERY_KEY)) } override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View { @@ -507,6 +512,7 @@ open class BrowseCatalogueController(bundle: Bundle) : protected companion object { const val SOURCE_ID_KEY = "sourceId" + const val SEARCH_QUERY_KEY = "searchQuery" } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt index 6bc440eae..61d57d749 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt @@ -30,6 +30,7 @@ import uy.kohesive.injekt.api.get */ open class BrowseCataloguePresenter( sourceId: Long, + searchQuery: String? = null, sourceManager: SourceManager = Injekt.get(), private val db: DatabaseHelper = Injekt.get(), private val prefs: PreferencesHelper = Injekt.get(), @@ -44,7 +45,7 @@ open class BrowseCataloguePresenter( /** * Query from the view. */ - var query = "" + var query = searchQuery ?: "" private set /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt index 0b1b822e0..cb8b473aa 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt @@ -5,6 +5,7 @@ import android.os.Parcelable import android.support.v7.widget.RecyclerView import android.util.SparseArray import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.kanade.tachiyomi.source.CatalogueSource /** * Adapter that holds the search cards. @@ -14,6 +15,11 @@ import eu.davidea.flexibleadapter.FlexibleAdapter class CatalogueSearchAdapter(val controller: CatalogueSearchController) : FlexibleAdapter(null, controller, true) { + /** + * Listen for more button clicks. + */ + val moreClickListener: OnMoreClickListener = controller + /** * Bundle where the view state of the holders is saved. */ @@ -68,6 +74,10 @@ class CatalogueSearchAdapter(val controller: CatalogueSearchController) : } } + interface OnMoreClickListener { + fun onMoreClick(source: CatalogueSource) + } + private companion object { const val HOLDER_BUNDLE_KEY = "holder_bundle" } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt index 77e23a6ba..0d7911d9f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt @@ -7,11 +7,14 @@ import android.view.* import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction +import eu.kanade.tachiyomi.ui.catalogue.browse.BrowseCatalogueController import eu.kanade.tachiyomi.ui.manga.MangaController import kotlinx.android.synthetic.main.catalogue_global_search_controller.* +import uy.kohesive.injekt.injectLazy /** * This controller shows and manages the different search result in global search. @@ -20,7 +23,12 @@ import kotlinx.android.synthetic.main.catalogue_global_search_controller.* */ open class CatalogueSearchController(protected val initialQuery: String? = null) : NucleusController(), - CatalogueSearchCardAdapter.OnMangaClickListener { + CatalogueSearchCardAdapter.OnMangaClickListener, CatalogueSearchAdapter.OnMoreClickListener { + + /** + * Application preferences. + */ + private val preferences: PreferencesHelper by injectLazy() /** * Adapter containing search results grouped by lang. @@ -185,4 +193,16 @@ open class CatalogueSearchController(protected val initialQuery: String? = null) getHolder(source)?.setImage(manga) } + override fun onMoreClick(source: CatalogueSource) { + openCatalogue(source, BrowseCatalogueController(source, presenter.query)) + } + + /** + * Opens a catalogue with the given controller. + */ + private fun openCatalogue(source: CatalogueSource, controller: BrowseCatalogueController) { + preferences.lastUsedCatalogueSource().set(source.id) + router.pushController(controller.withFadeTransaction()) + } + } \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchHolder.kt index b0c06cbbe..f55a50c7a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchHolder.kt @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.util.gone import eu.kanade.tachiyomi.util.setVectorCompat import eu.kanade.tachiyomi.util.visible import kotlinx.android.synthetic.main.catalogue_global_search_controller_card.* +import kotlinx.android.synthetic.main.catalogue_global_search_controller_card.view.* /** * Holder that binds the [CatalogueSearchItem] containing catalogue cards. @@ -34,6 +35,13 @@ class CatalogueSearchHolder(view: View, val adapter: CatalogueSearchAdapter) : nothing_found_icon.setVectorCompat(R.drawable.ic_search_black_112dp, view.context.getResourceColor(android.R.attr.textColorHint)) + + more.setOnClickListener { + val item = adapter.getItem(adapterPosition) + if (item != null) { + adapter.moreClickListener.onMoreClick(item.source) + } + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 2fefcbb93..e2449aa1d 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -204,6 +204,8 @@ class ReaderActivity : BaseRxActivity() { } subscriptions += eh_retry_all.clicks().subscribe { + var retried = 0 + viewer?.pages?.forEachIndexed { index, page -> if(page.status == Page.ERROR) page.status = Page.QUEUE @@ -218,9 +220,11 @@ class ReaderActivity : BaseRxActivity() { presenter.loader.loadPriorizedPage(page) else presenter.loader.loadPage(page) + + retried++ } - toast("Retrying all failed pages...") + toast("Retried $retried failed pages...") } subscriptions += eh_retry_all_help.clicks().subscribe { diff --git a/app/src/main/java/exh/ui/login/LoginController.kt b/app/src/main/java/exh/ui/login/LoginController.kt index a391115b7..7266d4dbd 100755 --- a/app/src/main/java/exh/ui/login/LoginController.kt +++ b/app/src/main/java/exh/ui/login/LoginController.kt @@ -9,12 +9,16 @@ import android.webkit.CookieManager import android.webkit.WebView import android.webkit.WebViewClient import com.afollestad.materialdialogs.MaterialDialog +import com.jakewharton.rxbinding.view.clicks import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.all.EHentai import eu.kanade.tachiyomi.ui.base.controller.NucleusController +import eu.kanade.tachiyomi.util.gone +import eu.kanade.tachiyomi.util.invisible import eu.kanade.tachiyomi.util.launchUI +import eu.kanade.tachiyomi.util.visible import exh.EXH_SOURCE_ID import exh.uconfig.WarnConfigureDialogController import kotlinx.android.synthetic.main.eh_activity_login.view.* @@ -46,7 +50,33 @@ class LoginController : NucleusController() { with(view) { btn_cancel.setOnClickListener { router.popCurrentController() } - btn_recheck.setOnClickListener { webview.loadUrl("https://exhentai.org/") } + + btn_advanced.setOnClickListener { + advanced_options.visible() + adv_shim.visible() + webview.gone() + btn_advanced.isEnabled = false + btn_cancel.isEnabled = false + } + + btn_close.setOnClickListener { + hideAdvancedOptions(this) + } + + btn_recheck.setOnClickListener { + hideAdvancedOptions(this) + webview.loadUrl("https://exhentai.org/") + } + + btn_alt_login.setOnClickListener { + hideAdvancedOptions(this) + webview.loadUrl("https://e-hentai.org/bounce_login.php") + } + + btn_skip_restyle.setOnClickListener { + hideAdvancedOptions(this) + webview.loadUrl("https://forums.e-hentai.org/index.php?act=Login&$PARAM_SKIP_INJECT=true") + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { CookieManager.getInstance().removeAllCookies { @@ -61,6 +91,16 @@ class LoginController : NucleusController() { } } + private fun hideAdvancedOptions(view: View) { + with(view) { + advanced_options.gone() + adv_shim.gone() + webview.visible() + btn_advanced.isEnabled = true + btn_cancel.isEnabled = true + } + } + fun startWebview(view: View) { with(view) { webview.settings.javaScriptEnabled = true @@ -75,7 +115,8 @@ class LoginController : NucleusController() { val parsedUrl = Uri.parse(url) if (parsedUrl.host.equals("forums.e-hentai.org", ignoreCase = true)) { //Hide distracting content - view.loadUrl(HIDE_JS) + if(!parsedUrl.queryParameterNames.contains(PARAM_SKIP_INJECT)) + view.loadUrl(HIDE_JS) //Check login result if (parsedUrl.getQueryParameter("code")?.toInt() != 0) { @@ -177,6 +218,8 @@ class LoginController : NucleusController() { } companion object { + const val PARAM_SKIP_INJECT = "TEH_SKIP_INJECT" + const val MEMBER_ID_COOKIE = "ipb_member_id" const val PASS_HASH_COOKIE = "ipb_pass_hash" const val IGNEOUS_COOKIE = "igneous" diff --git a/app/src/main/java/exh/ui/migration/MetadataFetchDialog.kt b/app/src/main/java/exh/ui/migration/MetadataFetchDialog.kt index ee563c05f..a977fee25 100755 --- a/app/src/main/java/exh/ui/migration/MetadataFetchDialog.kt +++ b/app/src/main/java/exh/ui/migration/MetadataFetchDialog.kt @@ -84,7 +84,7 @@ class MetadataFetchDialog { fun askMigration(activity: Activity, explicit: Boolean) { var extra = "" db.getLibraryMangas().asRxSingle().subscribe { - if(!explicit && it.isEmpty()) { + if(!explicit && it.none { isLewdSource(it.source) }) { //Do not open dialog on startup if no manga } else { //Not logged in but have ExHentai galleries diff --git a/app/src/main/res/layout/catalogue_global_search_controller_card.xml b/app/src/main/res/layout/catalogue_global_search_controller_card.xml index 6d220c41b..61f0efe50 100644 --- a/app/src/main/res/layout/catalogue_global_search_controller_card.xml +++ b/app/src/main/res/layout/catalogue_global_search_controller_card.xml @@ -18,6 +18,17 @@ app:layout_constraintTop_toTopOf="parent" tools:text="Title" /> +