Update the onboarding process to support crunchyroll
* only save credentials during onboarding, if login was successful * show onboarding, if login failed
This commit is contained in:
@ -38,6 +38,14 @@ object Crunchyroll {
|
||||
|
||||
private val browsingCache = arrayListOf<Item>()
|
||||
|
||||
/**
|
||||
* Login to the crunchyroll API.
|
||||
*
|
||||
* @param username The Username/Email of the user to log in
|
||||
* @param password The Accounts Password
|
||||
*
|
||||
* @return Boolean: True if login was successful, else false
|
||||
*/
|
||||
fun login(username: String, password: String): Boolean = runBlocking {
|
||||
val tokenEndpoint = "/auth/v1/token"
|
||||
val formData = listOf(
|
||||
@ -47,6 +55,7 @@ object Crunchyroll {
|
||||
"scope" to "offline_access"
|
||||
)
|
||||
|
||||
var success: Boolean // is false
|
||||
withContext(Dispatchers.IO) {
|
||||
val (request, response, result) = Fuel.post("$baseUrl$tokenEndpoint", parameters = formData)
|
||||
.header("Content-Type", "application/x-www-form-urlencoded")
|
||||
@ -67,11 +76,10 @@ object Crunchyroll {
|
||||
// println("response: $result")
|
||||
|
||||
Log.i(javaClass.name, "login complete with code ${response.statusCode}")
|
||||
|
||||
return@withContext response.statusCode == 200
|
||||
success = (response.statusCode == 200)
|
||||
}
|
||||
|
||||
return@runBlocking false
|
||||
return@runBlocking success
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -52,7 +52,6 @@ class MainActivity : AppCompatActivity(), NavigationBarView.OnItemSelectedListen
|
||||
private var activeBaseFragment: Fragment = HomeFragment() // the currently active fragment, home at the start
|
||||
|
||||
companion object {
|
||||
var wasInitialized = false
|
||||
lateinit var instance: MainActivity
|
||||
}
|
||||
|
||||
@ -63,7 +62,7 @@ class MainActivity : AppCompatActivity(), NavigationBarView.OnItemSelectedListen
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
if (!wasInitialized) { load() }
|
||||
load() // start the initial loading
|
||||
theme.applyStyle(getThemeResource(), true)
|
||||
|
||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||
@ -132,47 +131,27 @@ class MainActivity : AppCompatActivity(), NavigationBarView.OnItemSelectedListen
|
||||
*/
|
||||
private fun load() {
|
||||
val time = measureTimeMillis {
|
||||
// start the initial loading
|
||||
|
||||
// load all saved stuff here
|
||||
Preferences.load(this)
|
||||
EncryptedPreferences.readCredentials(this)
|
||||
|
||||
// show onboarding TODO rework
|
||||
if (EncryptedPreferences.password.isEmpty()) {
|
||||
// show onboarding if no password is set, or login fails
|
||||
if (EncryptedPreferences.password.isEmpty() || !Crunchyroll.login(
|
||||
EncryptedPreferences.login,
|
||||
EncryptedPreferences.password
|
||||
)
|
||||
) {
|
||||
showOnboarding()
|
||||
} else {
|
||||
Crunchyroll.login(EncryptedPreferences.login, EncryptedPreferences.password)
|
||||
runBlocking { initCrunchyroll().joinAll() }
|
||||
}
|
||||
|
||||
// if (EncryptedPreferences.password.isEmpty()) {
|
||||
// showOnboarding()
|
||||
// } else {
|
||||
// try {
|
||||
// if (!AoDParser.login()) {
|
||||
// showLoginDialog()
|
||||
// }
|
||||
// } catch (ex: SocketTimeoutException) {
|
||||
// Log.w(javaClass.name, "Timeout during login!")
|
||||
//
|
||||
// // show waring dialog before finishing
|
||||
// MaterialDialog(this).show {
|
||||
// title(R.string.dialog_timeout_head)
|
||||
// message(R.string.dialog_timeout_desc)
|
||||
// onDismiss { exitAndRemoveTask() }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// runBlocking { loadingJob.await() } // wait for initial loading to finish
|
||||
}
|
||||
Log.i(javaClass.name, "loading and login in $time ms")
|
||||
|
||||
wasInitialized = true
|
||||
Log.i(javaClass.name, "loading in $time ms")
|
||||
}
|
||||
|
||||
private fun initCrunchyroll(): List<Job> {
|
||||
println("init")
|
||||
|
||||
val scope = CoroutineScope(Dispatchers.IO + CoroutineName("InitialLoadingScope"))
|
||||
return listOf(
|
||||
scope.launch { Crunchyroll.index() },
|
||||
|
@ -4,16 +4,18 @@ import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import kotlinx.coroutines.*
|
||||
import org.mosad.teapod.R
|
||||
import org.mosad.teapod.databinding.FragmentOnLoginBinding
|
||||
import org.mosad.teapod.parser.crunchyroll.Crunchyroll
|
||||
import org.mosad.teapod.preferences.EncryptedPreferences
|
||||
|
||||
class OnLoginFragment: Fragment() {
|
||||
|
||||
private lateinit var binding: FragmentOnLoginBinding
|
||||
private var loginJob: Job? = null
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
||||
binding = FragmentOnLoginBinding.inflate(inflater, container, false)
|
||||
@ -27,26 +29,41 @@ class OnLoginFragment: Fragment() {
|
||||
|
||||
private fun initActions() {
|
||||
binding.buttonLogin.setOnClickListener {
|
||||
// get login credentials from gui
|
||||
val email = binding.editTextLogin.text.toString()
|
||||
val password = binding.editTextPassword.text.toString()
|
||||
onLogin()
|
||||
}
|
||||
|
||||
EncryptedPreferences.saveCredentials(email, password, requireContext()) // save the credentials
|
||||
binding.editTextPassword.setOnEditorActionListener { _, actionId, _ ->
|
||||
return@setOnEditorActionListener when (actionId) {
|
||||
EditorInfo.IME_ACTION_DONE -> {
|
||||
onLogin()
|
||||
false // false will hide the keyboards
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
|
||||
binding.buttonLogin.isClickable = false
|
||||
loginJob = lifecycleScope.launch {
|
||||
// TODO
|
||||
// if (AoDParser.login()) {
|
||||
// // if login was successful, switch to main
|
||||
// if (activity is OnboardingActivity) {
|
||||
// (activity as OnboardingActivity).launchMainActivity()
|
||||
// }
|
||||
// } else {
|
||||
// withContext(Dispatchers.Main) {
|
||||
// binding.textLoginDesc.text = getString(R.string.on_login_failed)
|
||||
// binding.buttonLogin.isClickable = true
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
private fun onLogin() {
|
||||
// get login credentials from gui
|
||||
val email = binding.editTextLogin.text.toString()
|
||||
val password = binding.editTextPassword.text.toString()
|
||||
|
||||
binding.buttonLogin.isClickable = false
|
||||
// FIXME, this seems to run blocking
|
||||
lifecycleScope.launch {
|
||||
// try login credentials
|
||||
val login = Crunchyroll.login(email, password)
|
||||
|
||||
if (login) {
|
||||
// save the credentials and show the main activity
|
||||
EncryptedPreferences.saveCredentials(email, password, requireContext())
|
||||
if (activity is OnboardingActivity) (activity as OnboardingActivity).launchMainActivity()
|
||||
} else {
|
||||
withContext(Dispatchers.Main) {
|
||||
binding.textLoginDesc.text = getString(R.string.on_login_failed)
|
||||
binding.buttonLogin.isClickable = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ class OnboardingActivity : AppCompatActivity() {
|
||||
private lateinit var binding: ActivityOnboardingBinding
|
||||
private lateinit var pagerAdapter: FragmentStateAdapter
|
||||
|
||||
private val fragments = arrayOf(OnLoginFragment())
|
||||
private val fragments = arrayOf(OnWelcomeFragment(), OnLoginFragment())
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
Reference in New Issue
Block a user