Convert EHentai Login controller to a activity

This commit is contained in:
Jobobby04 2021-04-11 20:43:21 -04:00
parent 67cb42ff30
commit 5df0eb7ed1
6 changed files with 132 additions and 36 deletions

View File

@ -150,6 +150,10 @@
android:name=".extension.util.ExtensionInstallActivity" android:name=".extension.util.ExtensionInstallActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar" /> android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="exh.ui.login.EhLoginActivity"
android:label="EHentaiLogin" />
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"

View File

@ -40,7 +40,7 @@ import exh.metadata.metadata.EHentaiSearchMetadata.Companion.TAG_TYPE_WEAK
import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.TAG_TYPE_VIRTUAL import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.TAG_TYPE_VIRTUAL
import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.toGenreString import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.toGenreString
import exh.metadata.metadata.base.RaisedTag import exh.metadata.metadata.base.RaisedTag
import exh.ui.login.LoginController import exh.ui.login.EhLoginActivity
import exh.ui.metadata.adapters.EHentaiDescriptionAdapter import exh.ui.metadata.adapters.EHentaiDescriptionAdapter
import exh.util.UriFilter import exh.util.UriFilter
import exh.util.UriGroup import exh.util.UriGroup
@ -725,9 +725,9 @@ class EHentai(
private fun rawCookies(sp: Int): Map<String, String> { private fun rawCookies(sp: Int): Map<String, String> {
val cookies: MutableMap<String, String> = mutableMapOf() val cookies: MutableMap<String, String> = mutableMapOf()
if (preferences.enableExhentai().get()) { if (preferences.enableExhentai().get()) {
cookies[LoginController.MEMBER_ID_COOKIE] = preferences.memberIdVal().get() cookies[EhLoginActivity.MEMBER_ID_COOKIE] = preferences.memberIdVal().get()
cookies[LoginController.PASS_HASH_COOKIE] = preferences.passHashVal().get() cookies[EhLoginActivity.PASS_HASH_COOKIE] = preferences.passHashVal().get()
cookies[LoginController.IGNEOUS_COOKIE] = preferences.igneousVal().get() cookies[EhLoginActivity.IGNEOUS_COOKIE] = preferences.igneousVal().get()
cookies["sp"] = sp.toString() cookies["sp"] = sp.toString()
val sessionKey = preferences.exhSettingsKey().get() val sessionKey = preferences.exhSettingsKey().get()

View File

@ -1,6 +1,8 @@
package eu.kanade.tachiyomi.ui.setting package eu.kanade.tachiyomi.ui.setting
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent
import android.os.Handler import android.os.Handler
import android.text.InputType import android.text.InputType
import android.widget.Toast import android.widget.Toast
@ -19,7 +21,6 @@ import eu.kanade.tachiyomi.data.preference.PreferenceKeys
import eu.kanade.tachiyomi.data.preference.asImmediateFlow import eu.kanade.tachiyomi.data.preference.asImmediateFlow
import eu.kanade.tachiyomi.databinding.EhDialogCategoriesBinding import eu.kanade.tachiyomi.databinding.EhDialogCategoriesBinding
import eu.kanade.tachiyomi.databinding.EhDialogLanguagesBinding import eu.kanade.tachiyomi.databinding.EhDialogLanguagesBinding
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.preference.defaultValue import eu.kanade.tachiyomi.util.preference.defaultValue
import eu.kanade.tachiyomi.util.preference.entriesRes import eu.kanade.tachiyomi.util.preference.entriesRes
@ -43,7 +44,7 @@ import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.getFlatMetadataForManga import exh.metadata.metadata.base.getFlatMetadataForManga
import exh.source.isEhBasedManga import exh.source.isEhBasedManga
import exh.uconfig.WarnConfigureDialogController import exh.uconfig.WarnConfigureDialogController
import exh.ui.login.LoginController import exh.ui.login.EhLoginActivity
import exh.util.executeOnIO import exh.util.executeOnIO
import exh.util.floor import exh.util.floor
import exh.util.nullIfBlank import exh.util.nullIfBlank
@ -111,7 +112,7 @@ class SettingsEhController : SettingsController() {
preferences.enableExhentai().set(false) preferences.enableExhentai().set(false)
true true
} else { } else {
router.pushController(LoginController().withFadeTransaction()) startActivityForResult(EhLoginActivity.newIntent(activity!!), LOGIN_RESULT)
false false
} }
} }
@ -751,4 +752,17 @@ class SettingsEhController : SettingsController() {
} }
data class RelativeTime(var years: Int? = null, var months: Int? = null, var weeks: Int? = null, var days: Int? = null, var hours: Int? = null, var minutes: Int? = null, var seconds: Int? = null, var milliseconds: Int? = null) data class RelativeTime(var years: Int? = null, var months: Int? = null, var weeks: Int? = null, var days: Int? = null, var hours: Int? = null, var minutes: Int? = null, var seconds: Int? = null, var milliseconds: Int? = null)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == LOGIN_RESULT) {
// Upload settings
WarnConfigureDialogController.uploadSettings(router)
}
}
}
companion object {
const val LOGIN_RESULT = 500
}
} }

View File

@ -1,21 +1,32 @@
package exh.ui.login package exh.ui.login
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.net.Uri import android.net.Uri
import android.view.LayoutInflater import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.webkit.CookieManager import android.webkit.CookieManager
import android.webkit.WebChromeClient
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import android.widget.Toast
import androidx.core.view.isInvisible
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.EhActivityLoginBinding import eu.kanade.tachiyomi.databinding.EhActivityLoginBinding
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.activity.BaseViewBindingActivity
import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.WebViewUtil
import eu.kanade.tachiyomi.util.system.setDefaultSettings import eu.kanade.tachiyomi.util.system.setDefaultSettings
import eu.kanade.tachiyomi.util.system.toast
import exh.log.xLogD import exh.log.xLogD
import exh.uconfig.WarnConfigureDialogController import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import reactivecircus.flowbinding.appcompat.navigationClicks
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.net.HttpCookie import java.net.HttpCookie
import java.util.Locale import java.util.Locale
@ -24,24 +35,72 @@ import java.util.Locale
* LoginController * LoginController
*/ */
class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter>() { class EhLoginActivity : BaseViewBindingActivity<EhActivityLoginBinding>() {
val preferenceManager: PreferencesHelper by injectLazy() val preferenceManager: PreferencesHelper by injectLazy()
val sourceManager: SourceManager by injectLazy() val sourceManager: SourceManager by injectLazy()
override fun getTitle() = "ExHentai login" private var bundle: Bundle? = null
override fun createPresenter() = LoginPresenter() override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View { if (!WebViewUtil.supportsWebView(this)) {
binding = EhActivityLoginBinding.inflate(inflater) toast(R.string.information_webview_required, Toast.LENGTH_LONG)
return binding.root finish()
return
}
try {
binding = EhActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
} catch (e: Throwable) {
// Potentially throws errors like "Error inflating class android.webkit.WebView"
toast(R.string.information_webview_required, Toast.LENGTH_LONG)
finish()
return
}
title = "ExHentai login"
setSupportActionBar(binding.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
binding.toolbar.navigationClicks()
.onEach { finish() }
.launchIn(lifecycleScope)
onViewCreated()
if (bundle == null) {
binding.webview.setDefaultSettings()
// Debug mode (chrome://inspect/#devices)
if (BuildConfig.DEBUG && 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) {
WebView.setWebContentsDebuggingEnabled(true)
}
binding.webview.webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView?, newProgress: Int) {
binding.progressBar.isVisible = true
binding.progressBar.progress = newProgress
if (newProgress == 100) {
binding.progressBar.isInvisible = true
}
super.onProgressChanged(view, newProgress)
}
}
} else {
binding.webview.restoreState(bundle)
}
if (bundle == null) {
startWebview()
}
} }
override fun onViewCreated(view: View) { fun onViewCreated() {
super.onViewCreated(view) binding.btnCancel.setOnClickListener { finish() }
binding.btnCancel.setOnClickListener { router.popCurrentController() }
binding.btnAdvanced.setOnClickListener { binding.btnAdvanced.setOnClickListener {
binding.advancedOptions.isVisible = true binding.advancedOptions.isVisible = true
@ -71,7 +130,9 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
CookieManager.getInstance().removeAllCookies { CookieManager.getInstance().removeAllCookies {
launchUI { launchUI {
startWebview() if (bundle == null) {
startWebview()
}
} }
} }
} }
@ -107,18 +168,17 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
// At ExHentai, check that everything worked out... // At ExHentai, check that everything worked out...
if (applyExHentaiCookies(url)) { if (applyExHentaiCookies(url)) {
preferenceManager.enableExhentai().set(true) preferenceManager.enableExhentai().set(true)
finishLogin() setResult(RESULT_OK)
finish()
} }
} }
} }
} }
} }
fun finishLogin() { override fun onDestroy() {
router.popCurrentController() binding.webview?.destroy()
super.onDestroy()
// Upload settings
WarnConfigureDialogController.uploadSettings(router)
} }
/** /**
@ -216,5 +276,11 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
if(pc != null) pc.style.color = "#26353F"; if(pc != null) pc.style.color = "#26353F";
})() })()
""" """
fun newIntent(context: Context): Intent {
return Intent(context, EhLoginActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
}
}
} }
} }

View File

@ -1,5 +0,0 @@
package exh.ui.login
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
class LoginPresenter : BasePresenter<LoginController>()

View File

@ -13,9 +13,20 @@
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" >
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="?attr/actionBarTheme"
app:navigationIcon="@drawable/ic_close_24dp" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:animateLayoutChanges="true"> android:animateLayoutChanges="true">
@ -89,7 +100,13 @@
app:layout_constraintBottom_toTopOf="@+id/linearLayout" app:layout_constraintBottom_toTopOf="@+id/linearLayout"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" >
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</WebView>
<LinearLayout <LinearLayout
android:id="@+id/linearLayout" android:id="@+id/linearLayout"