diff --git a/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Crunchyroll.kt b/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Crunchyroll.kt index 2867969..9cf0ffa 100644 --- a/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Crunchyroll.kt +++ b/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Crunchyroll.kt @@ -38,6 +38,14 @@ object Crunchyroll { private val browsingCache = arrayListOf() + /** + * 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 } /** diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/MainActivity.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/MainActivity.kt index a36859a..ae99d38 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/MainActivity.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/MainActivity.kt @@ -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 { + println("init") + val scope = CoroutineScope(Dispatchers.IO + CoroutineName("InitialLoadingScope")) return listOf( scope.launch { Crunchyroll.index() }, diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/onboarding/OnLoginFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/onboarding/OnLoginFragment.kt index 9f7a060..a388852 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/onboarding/OnLoginFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/onboarding/OnLoginFragment.kt @@ -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 + } } } } diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/onboarding/OnboardingActivity.kt b/app/src/main/java/org/mosad/teapod/ui/activity/onboarding/OnboardingActivity.kt index 8087e98..27ea14c 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/onboarding/OnboardingActivity.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/onboarding/OnboardingActivity.kt @@ -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) diff --git a/app/src/main/res/layout/fragment_on_login.xml b/app/src/main/res/layout/fragment_on_login.xml index b1a106f..20b2b0e 100644 --- a/app/src/main/res/layout/fragment_on_login.xml +++ b/app/src/main/res/layout/fragment_on_login.xml @@ -65,6 +65,7 @@ android:layout_margin="7dp" android:ems="10" android:hint="@string/password" + android:imeOptions="actionDone" android:importantForAutofill="no" android:inputType="textPassword" /> diff --git a/app/src/main/res/layout/fragment_on_welcome.xml b/app/src/main/res/layout/fragment_on_welcome.xml index fb8ada8..a4e41ea 100644 --- a/app/src/main/res/layout/fragment_on_welcome.xml +++ b/app/src/main/res/layout/fragment_on_welcome.xml @@ -38,7 +38,7 @@ android:id="@+id/text_app_name" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/app_name" + android:text="@string/on_welcome_heading" android:textAlignment="center" android:textSize="26sp" android:textStyle="bold" /> diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 7ecf195..a9d613b 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -58,7 +58,7 @@ Autor Quellcode Lizenz - Eine inoffizielle App für Anime on Demand. + Eine inoffizielle App für Crunchyroll. Lizenzen von Drittanbietern © %1$s %2$s unter %3$s Du bist jetzt ein Entwickler @@ -81,10 +81,11 @@ Überspringen Weiter Fertig - Willkommen!\nTeapod ist eine inoffizielle App für AoD. + Willkommen + 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. Los geht\'s Login - 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. + 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. Login nicht erfolgreich! Stelle sicher das deine Login-Daten korrekt sind und versuche es erneut. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d13bb14..75966da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,7 +74,7 @@ git.mosad.xyz/Seil0/teapod License GNU General Public License 3 - An unofficial app for anime on demand. + An unofficial app for Crunchyroll. This product uses the TMDb API but is not endorsed or certified by TMDb. Third Party Licenses © %1$s %2$s under %3$s @@ -102,10 +102,11 @@ Skip Next Start - Welcome!\nTeapod is an unofficial App for AoD. + 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. Get started Login - To use Teapod you need to log in with your AoD account. Your Login-Data will be stored encrypted on your device. + To use Teapod you have to log in with your Crunchyroll account. Your login data will be stored encrypted on your device. Could not login! Make sure Username and Password are correct and try again.