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:
parent
349a0e451a
commit
e98e75456e
|
@ -38,6 +38,14 @@ object Crunchyroll {
|
||||||
|
|
||||||
private val browsingCache = arrayListOf<Item>()
|
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 {
|
fun login(username: String, password: String): Boolean = runBlocking {
|
||||||
val tokenEndpoint = "/auth/v1/token"
|
val tokenEndpoint = "/auth/v1/token"
|
||||||
val formData = listOf(
|
val formData = listOf(
|
||||||
|
@ -47,6 +55,7 @@ object Crunchyroll {
|
||||||
"scope" to "offline_access"
|
"scope" to "offline_access"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var success: Boolean // is false
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
val (request, response, result) = Fuel.post("$baseUrl$tokenEndpoint", parameters = formData)
|
val (request, response, result) = Fuel.post("$baseUrl$tokenEndpoint", parameters = formData)
|
||||||
.header("Content-Type", "application/x-www-form-urlencoded")
|
.header("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
@ -67,11 +76,10 @@ object Crunchyroll {
|
||||||
// println("response: $result")
|
// println("response: $result")
|
||||||
|
|
||||||
Log.i(javaClass.name, "login complete with code ${response.statusCode}")
|
Log.i(javaClass.name, "login complete with code ${response.statusCode}")
|
||||||
|
success = (response.statusCode == 200)
|
||||||
return@withContext 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
|
private var activeBaseFragment: Fragment = HomeFragment() // the currently active fragment, home at the start
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
var wasInitialized = false
|
|
||||||
lateinit var instance: MainActivity
|
lateinit var instance: MainActivity
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +62,7 @@ class MainActivity : AppCompatActivity(), NavigationBarView.OnItemSelectedListen
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
if (!wasInitialized) { load() }
|
load() // start the initial loading
|
||||||
theme.applyStyle(getThemeResource(), true)
|
theme.applyStyle(getThemeResource(), true)
|
||||||
|
|
||||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||||
|
@ -132,47 +131,27 @@ class MainActivity : AppCompatActivity(), NavigationBarView.OnItemSelectedListen
|
||||||
*/
|
*/
|
||||||
private fun load() {
|
private fun load() {
|
||||||
val time = measureTimeMillis {
|
val time = measureTimeMillis {
|
||||||
// start the initial loading
|
|
||||||
|
|
||||||
// load all saved stuff here
|
// load all saved stuff here
|
||||||
Preferences.load(this)
|
Preferences.load(this)
|
||||||
EncryptedPreferences.readCredentials(this)
|
EncryptedPreferences.readCredentials(this)
|
||||||
|
|
||||||
// show onboarding TODO rework
|
// show onboarding if no password is set, or login fails
|
||||||
if (EncryptedPreferences.password.isEmpty()) {
|
if (EncryptedPreferences.password.isEmpty() || !Crunchyroll.login(
|
||||||
|
EncryptedPreferences.login,
|
||||||
|
EncryptedPreferences.password
|
||||||
|
)
|
||||||
|
) {
|
||||||
showOnboarding()
|
showOnboarding()
|
||||||
} else {
|
} else {
|
||||||
Crunchyroll.login(EncryptedPreferences.login, EncryptedPreferences.password)
|
|
||||||
runBlocking { initCrunchyroll().joinAll() }
|
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")
|
Log.i(javaClass.name, "loading in $time ms")
|
||||||
|
|
||||||
wasInitialized = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initCrunchyroll(): List<Job> {
|
private fun initCrunchyroll(): List<Job> {
|
||||||
|
println("init")
|
||||||
|
|
||||||
val scope = CoroutineScope(Dispatchers.IO + CoroutineName("InitialLoadingScope"))
|
val scope = CoroutineScope(Dispatchers.IO + CoroutineName("InitialLoadingScope"))
|
||||||
return listOf(
|
return listOf(
|
||||||
scope.launch { Crunchyroll.index() },
|
scope.launch { Crunchyroll.index() },
|
||||||
|
|
|
@ -4,16 +4,18 @@ import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import android.view.inputmethod.EditorInfo
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
|
import org.mosad.teapod.R
|
||||||
import org.mosad.teapod.databinding.FragmentOnLoginBinding
|
import org.mosad.teapod.databinding.FragmentOnLoginBinding
|
||||||
|
import org.mosad.teapod.parser.crunchyroll.Crunchyroll
|
||||||
import org.mosad.teapod.preferences.EncryptedPreferences
|
import org.mosad.teapod.preferences.EncryptedPreferences
|
||||||
|
|
||||||
class OnLoginFragment: Fragment() {
|
class OnLoginFragment: Fragment() {
|
||||||
|
|
||||||
private lateinit var binding: FragmentOnLoginBinding
|
private lateinit var binding: FragmentOnLoginBinding
|
||||||
private var loginJob: Job? = null
|
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
||||||
binding = FragmentOnLoginBinding.inflate(inflater, container, false)
|
binding = FragmentOnLoginBinding.inflate(inflater, container, false)
|
||||||
|
@ -27,26 +29,41 @@ class OnLoginFragment: Fragment() {
|
||||||
|
|
||||||
private fun initActions() {
|
private fun initActions() {
|
||||||
binding.buttonLogin.setOnClickListener {
|
binding.buttonLogin.setOnClickListener {
|
||||||
|
onLogin()
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.editTextPassword.setOnEditorActionListener { _, actionId, _ ->
|
||||||
|
return@setOnEditorActionListener when (actionId) {
|
||||||
|
EditorInfo.IME_ACTION_DONE -> {
|
||||||
|
onLogin()
|
||||||
|
false // false will hide the keyboards
|
||||||
|
}
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onLogin() {
|
||||||
// get login credentials from gui
|
// get login credentials from gui
|
||||||
val email = binding.editTextLogin.text.toString()
|
val email = binding.editTextLogin.text.toString()
|
||||||
val password = binding.editTextPassword.text.toString()
|
val password = binding.editTextPassword.text.toString()
|
||||||
|
|
||||||
EncryptedPreferences.saveCredentials(email, password, requireContext()) // save the credentials
|
|
||||||
|
|
||||||
binding.buttonLogin.isClickable = false
|
binding.buttonLogin.isClickable = false
|
||||||
loginJob = lifecycleScope.launch {
|
// FIXME, this seems to run blocking
|
||||||
// TODO
|
lifecycleScope.launch {
|
||||||
// if (AoDParser.login()) {
|
// try login credentials
|
||||||
// // if login was successful, switch to main
|
val login = Crunchyroll.login(email, password)
|
||||||
// if (activity is OnboardingActivity) {
|
|
||||||
// (activity as OnboardingActivity).launchMainActivity()
|
if (login) {
|
||||||
// }
|
// save the credentials and show the main activity
|
||||||
// } else {
|
EncryptedPreferences.saveCredentials(email, password, requireContext())
|
||||||
// withContext(Dispatchers.Main) {
|
if (activity is OnboardingActivity) (activity as OnboardingActivity).launchMainActivity()
|
||||||
// binding.textLoginDesc.text = getString(R.string.on_login_failed)
|
} else {
|
||||||
// binding.buttonLogin.isClickable = true
|
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 binding: ActivityOnboardingBinding
|
||||||
private lateinit var pagerAdapter: FragmentStateAdapter
|
private lateinit var pagerAdapter: FragmentStateAdapter
|
||||||
|
|
||||||
private val fragments = arrayOf(OnLoginFragment())
|
private val fragments = arrayOf(OnWelcomeFragment(), OnLoginFragment())
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
android:layout_margin="7dp"
|
android:layout_margin="7dp"
|
||||||
android:ems="10"
|
android:ems="10"
|
||||||
android:hint="@string/password"
|
android:hint="@string/password"
|
||||||
|
android:imeOptions="actionDone"
|
||||||
android:importantForAutofill="no"
|
android:importantForAutofill="no"
|
||||||
android:inputType="textPassword" />
|
android:inputType="textPassword" />
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
android:id="@+id/text_app_name"
|
android:id="@+id/text_app_name"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/app_name"
|
android:text="@string/on_welcome_heading"
|
||||||
android:textAlignment="center"
|
android:textAlignment="center"
|
||||||
android:textSize="26sp"
|
android:textSize="26sp"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
<string name="authors">Autor</string>
|
<string name="authors">Autor</string>
|
||||||
<string name="source">Quellcode</string>
|
<string name="source">Quellcode</string>
|
||||||
<string name="license">Lizenz</string>
|
<string name="license">Lizenz</string>
|
||||||
<string name="about_info">Eine inoffizielle App für Anime on Demand.</string>
|
<string name="about_info">Eine inoffizielle App für Crunchyroll.</string>
|
||||||
<string name="third_party_heading">Lizenzen von Drittanbietern</string>
|
<string name="third_party_heading">Lizenzen von Drittanbietern</string>
|
||||||
<string name="third_party_component_desc">© %1$s %2$s unter %3$s</string>
|
<string name="third_party_component_desc">© %1$s %2$s unter %3$s</string>
|
||||||
<string name="dev_settings_enabled">Du bist jetzt ein Entwickler</string>
|
<string name="dev_settings_enabled">Du bist jetzt ein Entwickler</string>
|
||||||
|
@ -81,10 +81,11 @@
|
||||||
<string name="skip">Überspringen</string>
|
<string name="skip">Überspringen</string>
|
||||||
<string name="next">Weiter</string>
|
<string name="next">Weiter</string>
|
||||||
<string name="start">Fertig</string>
|
<string name="start">Fertig</string>
|
||||||
<string name="on_welcome">Willkommen!\nTeapod ist eine inoffizielle App für AoD.</string>
|
<string name="on_welcome_heading">Willkommen</string>
|
||||||
|
<string name="on_welcome">Teapod ist eine inoffizielle App für Crunchyroll, die unter den Bedingungen der GPL 3 lizenziert ist.\n\nHinweis: Die Benutzung von Teapod kann gegen die Nutzungsbedingungen von Crunchyroll verstoßen.</string>
|
||||||
<string name="on_get_started">Los geht\'s</string>
|
<string name="on_get_started">Los geht\'s</string>
|
||||||
<string name="on_login_heading">Login</string>
|
<string name="on_login_heading">Login</string>
|
||||||
<string name="on_login_desc">Um Teapod verwenden zu können musst du dich mit deinem AoD Account anmelden. Deine Login-Daten werden verschlüsselt auf deinem Gerät gespeichert.</string>
|
<string name="on_login_desc">Um Teapod verwenden zu können musst du dich mit deinem Crunchyroll Account anmelden. Deine Login-Daten werden verschlüsselt auf deinem Gerät gespeichert.</string>
|
||||||
<string name="on_login_failed">Login nicht erfolgreich! Stelle sicher das deine Login-Daten korrekt sind und versuche es erneut.</string>
|
<string name="on_login_failed">Login nicht erfolgreich! Stelle sicher das deine Login-Daten korrekt sind und versuche es erneut.</string>
|
||||||
|
|
||||||
<!-- dialogs -->
|
<!-- dialogs -->
|
||||||
|
|
|
@ -74,7 +74,7 @@
|
||||||
<string name="teapod_repo" translatable="false">git.mosad.xyz/Seil0/teapod</string>
|
<string name="teapod_repo" translatable="false">git.mosad.xyz/Seil0/teapod</string>
|
||||||
<string name="license">License</string>
|
<string name="license">License</string>
|
||||||
<string name="license_desc" translatable="false">GNU General Public License 3</string>
|
<string name="license_desc" translatable="false">GNU General Public License 3</string>
|
||||||
<string name="about_info">An unofficial app for anime on demand.</string>
|
<string name="about_info">An unofficial app for Crunchyroll.</string>
|
||||||
<string name="tmdb_notice" translatable="false">This product uses the TMDb API but is not endorsed or certified by TMDb.</string>
|
<string name="tmdb_notice" translatable="false">This product uses the TMDb API but is not endorsed or certified by TMDb.</string>
|
||||||
<string name="third_party_heading">Third Party Licenses</string>
|
<string name="third_party_heading">Third Party Licenses</string>
|
||||||
<string name="third_party_component_desc">© %1$s %2$s under %3$s</string>
|
<string name="third_party_component_desc">© %1$s %2$s under %3$s</string>
|
||||||
|
@ -102,10 +102,11 @@
|
||||||
<string name="skip">Skip</string>
|
<string name="skip">Skip</string>
|
||||||
<string name="next">Next</string>
|
<string name="next">Next</string>
|
||||||
<string name="start">Start</string>
|
<string name="start">Start</string>
|
||||||
<string name="on_welcome">Welcome!\nTeapod is an unofficial App for AoD.</string>
|
<string name="on_welcome_heading">Welcome</string>
|
||||||
|
<string name="on_welcome">Teapod is an unofficial app for Crunchyroll, licensed under the terms and conditions of GPL 3.\n\nPlease note: Using Teapod may violate the ToS of Crunchyroll.</string>
|
||||||
<string name="on_get_started">Get started</string>
|
<string name="on_get_started">Get started</string>
|
||||||
<string name="on_login_heading">Login</string>
|
<string name="on_login_heading">Login</string>
|
||||||
<string name="on_login_desc">To use Teapod you need to log in with your AoD account. Your Login-Data will be stored encrypted on your device.</string>
|
<string name="on_login_desc">To use Teapod you have to log in with your Crunchyroll account. Your login data will be stored encrypted on your device.</string>
|
||||||
<string name="on_login_failed">Could not login! Make sure Username and Password are correct and try again.</string>
|
<string name="on_login_failed">Could not login! Make sure Username and Password are correct and try again.</string>
|
||||||
|
|
||||||
<!-- dialogs -->
|
<!-- dialogs -->
|
||||||
|
|
Loading…
Reference in New Issue