2021-02-06 19:02:12 +01:00
package org.mosad.teapod.ui.activity.main.fragments
2020-10-08 22:20:20 +02:00
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
2021-05-09 20:31:51 +02:00
import androidx.core.view.isVisible
2020-10-08 22:20:20 +02:00
import androidx.fragment.app.Fragment
2021-06-06 17:54:19 +02:00
import androidx.lifecycle.lifecycleScope
2022-02-05 20:02:33 +01:00
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.async
2021-04-17 20:59:37 +02:00
import kotlinx.coroutines.launch
2022-03-04 20:29:37 +01:00
import kotlinx.coroutines.runBlocking
2020-10-11 23:16:47 +02:00
import org.mosad.teapod.BuildConfig
2020-10-08 22:20:20 +02:00
import org.mosad.teapod.R
2020-11-25 22:35:55 +01:00
import org.mosad.teapod.databinding.FragmentAccountBinding
2022-07-21 22:06:41 +02:00
import org.mosad.teapod.parser.crunchyroll.Benefits
2022-02-05 20:02:33 +01:00
import org.mosad.teapod.parser.crunchyroll.Crunchyroll
import org.mosad.teapod.parser.crunchyroll.Profile
import org.mosad.teapod.parser.crunchyroll.supportedLocals
2020-10-11 23:16:47 +02:00
import org.mosad.teapod.preferences.EncryptedPreferences
2020-10-23 11:28:47 +02:00
import org.mosad.teapod.preferences.Preferences
2021-05-26 19:46:46 +02:00
import org.mosad.teapod.ui.activity.main.MainActivity
2022-04-02 18:54:17 +02:00
import org.mosad.teapod.ui.components.LoginModalBottomSheet
2020-11-23 20:11:10 +01:00
import org.mosad.teapod.util.DataTypes.Theme
2021-01-20 16:10:41 +01:00
import org.mosad.teapod.util.showFragment
2022-03-04 20:29:37 +01:00
import org.mosad.teapod.util.toDisplayString
2022-02-05 20:02:33 +01:00
import java.util.*
2020-10-08 22:20:20 +02:00
class AccountFragment : Fragment ( ) {
2020-11-25 22:35:55 +01:00
private lateinit var binding : FragmentAccountBinding
2022-03-04 20:29:37 +01:00
private var profile : Deferred < Profile > = lifecycleScope . async {
2022-02-05 20:02:33 +01:00
Crunchyroll . profile ( )
}
2022-07-21 22:06:41 +02:00
private var benefits : Deferred < Benefits > = lifecycleScope . async {
Crunchyroll . benefits ( )
}
2020-11-23 20:11:10 +01:00
2020-11-25 22:35:55 +01:00
override fun onCreateView ( inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ) : View {
binding = FragmentAccountBinding . inflate ( inflater , container , false )
return binding . root
2020-10-08 22:20:20 +02:00
}
override fun onViewCreated ( view : View , savedInstanceState : Bundle ? ) {
super . onViewCreated ( view , savedInstanceState )
2022-02-05 20:02:33 +01:00
binding . textAccountLogin . text = EncryptedPreferences . login
2022-07-21 22:06:41 +02:00
// load account status and tier (async) info before anything else
2021-06-06 17:54:19 +02:00
lifecycleScope . launch {
2022-07-21 22:06:41 +02:00
benefits . await ( ) . apply {
this . items . firstOrNull { it . benefit == " cr_premium " } ?. let {
binding . textAccountSubscription . text = getString ( R . string . account _premium )
}
this . items . firstOrNull { it . benefit == " cr_fan_pack " } ?. let {
binding . textAccountSubscriptionDesc . text =
getString ( R . string . account _tier , getString ( R . string . account _tier _mega _fan ) )
}
}
2021-04-17 20:59:37 +02:00
}
2022-02-05 20:02:33 +01:00
// add preferred subtitles
lifecycleScope . launch {
binding . textSettingsContentLanguageDesc . text = Locale . forLanguageTag (
profile . await ( ) . preferredContentSubtitleLanguage
) . displayLanguage
}
2022-03-06 18:43:02 +01:00
binding . switchSecondary . isChecked = Preferences . preferSubbed
2022-02-05 20:02:33 +01:00
binding . switchAutoplay . isChecked = Preferences . autoplay
2020-11-25 22:35:55 +01:00
binding . textThemeSelected . text = when ( Preferences . theme ) {
2020-11-23 20:11:10 +01:00
Theme . DARK -> getString ( R . string . theme _dark )
else -> getString ( R . string . theme _light )
}
2021-05-09 20:31:51 +02:00
binding . linearDevSettings . isVisible = Preferences . devSettings
2022-03-20 12:38:49 +01:00
binding . switchUpdatePlayhead . isChecked = Preferences . updatePlayhead
2021-05-09 20:31:51 +02:00
2022-02-05 20:02:33 +01:00
binding . textInfoAboutDesc . text = getString ( R . string . info _about _desc , BuildConfig . VERSION _NAME , getString ( R . string . build _time ) )
2020-10-11 23:16:47 +02:00
initActions ( )
}
private fun initActions ( ) {
2020-11-25 22:35:55 +01:00
binding . linearAccountLogin . setOnClickListener {
2022-04-02 18:54:17 +02:00
showLoginDialog ( )
2020-10-11 23:16:47 +02:00
}
2022-02-05 20:02:33 +01:00
binding . linearSettingsContentLanguage . setOnClickListener {
showContentLanguageSelection ( )
2020-10-11 23:16:47 +02:00
}
2020-10-23 11:28:47 +02:00
2020-11-25 22:35:55 +01:00
binding . switchSecondary . setOnClickListener {
Preferences . savePreferSecondary ( requireContext ( ) , binding . switchSecondary . isChecked )
2020-10-23 11:28:47 +02:00
}
2020-11-15 13:39:33 +01:00
2020-11-25 22:35:55 +01:00
binding . switchAutoplay . setOnClickListener {
Preferences . saveAutoplay ( requireContext ( ) , binding . switchAutoplay . isChecked )
2020-11-15 13:39:33 +01:00
}
2021-05-09 20:31:51 +02:00
2022-02-05 20:02:33 +01:00
binding . linearTheme . setOnClickListener {
showThemeDialog ( )
}
binding . linearInfo . setOnClickListener {
activity ?. showFragment ( AboutFragment ( ) )
}
2022-03-20 12:38:49 +01:00
binding . switchUpdatePlayhead . setOnClickListener {
Preferences . saveUpdatePlayhead ( requireContext ( ) , binding . switchUpdatePlayhead . isChecked )
}
2021-05-09 20:31:51 +02:00
binding . linearExportData . setOnClickListener {
2022-04-02 18:54:17 +02:00
// unused
2021-05-09 20:31:51 +02:00
}
binding . linearImportData . setOnClickListener {
2022-04-02 18:54:17 +02:00
// unused
2021-05-09 20:31:51 +02:00
}
2020-10-08 22:20:20 +02:00
}
2020-10-12 23:26:32 +02:00
2022-04-02 18:54:17 +02:00
private fun showLoginDialog ( ) {
val loginModal = LoginModalBottomSheet ( ) . apply {
2020-10-12 23:26:32 +02:00
login = EncryptedPreferences . login
password = " "
2022-04-02 18:54:17 +02:00
positiveAction = {
EncryptedPreferences . saveCredentials ( login , password , requireContext ( ) )
// TODO only dismiss if login was successful
this . dismiss ( )
}
negativeAction = {
this . dismiss ( )
}
2020-10-12 23:26:32 +02:00
}
2022-04-02 18:54:17 +02:00
activity ?. let { loginModal . show ( it . supportFragmentManager , LoginModalBottomSheet . TAG ) }
2020-10-12 23:26:32 +02:00
}
2020-11-23 20:11:10 +01:00
2022-02-05 20:02:33 +01:00
private fun showContentLanguageSelection ( ) {
2022-03-04 20:29:37 +01:00
// we should be able to use the index of supportedLocals for language selection, items is GUI only
2022-02-05 20:02:33 +01:00
val items = supportedLocals . map {
2022-03-04 20:29:37 +01:00
it . toDisplayString ( getString ( R . string . settings _content _language _none ) )
2022-02-05 20:02:33 +01:00
} . toTypedArray ( )
2022-03-04 20:29:37 +01:00
var initialSelection : Int
// profile should be completed here, therefore blocking
runBlocking {
initialSelection = supportedLocals . indexOf ( Locale . forLanguageTag (
profile . await ( ) . preferredContentSubtitleLanguage ) )
if ( initialSelection < 0 ) initialSelection = supportedLocals . lastIndex
}
2022-02-05 20:02:33 +01:00
MaterialAlertDialogBuilder ( requireContext ( ) )
. setTitle ( R . string . settings _content _language )
2022-03-04 20:29:37 +01:00
. setSingleChoiceItems ( items , initialSelection ) { dialog , which ->
2022-03-05 20:41:39 +01:00
updatePrefContentLanguage ( supportedLocals [ which ] )
2022-03-04 20:29:37 +01:00
dialog . dismiss ( )
2022-02-05 20:02:33 +01:00
}
. show ( )
}
2022-03-04 20:29:37 +01:00
@kotlinx . coroutines . ExperimentalCoroutinesApi
2022-03-05 20:41:39 +01:00
private fun updatePrefContentLanguage ( preferredLocale : Locale ) {
2022-03-04 20:29:37 +01:00
lifecycleScope . launch {
2022-03-05 20:41:39 +01:00
Crunchyroll . postPrefSubLanguage ( preferredLocale . toLanguageTag ( ) )
2022-03-04 20:29:37 +01:00
} . invokeOnCompletion {
2022-03-05 20:41:39 +01:00
// update the local preferred content language
2023-02-19 14:21:46 +01:00
Preferences . savePreferredSubtitleLocal ( requireContext ( ) , preferredLocale )
2022-03-05 20:41:39 +01:00
2022-03-04 20:29:37 +01:00
// update profile since the language selection might have changed
profile = lifecycleScope . async { Crunchyroll . profile ( ) }
profile . invokeOnCompletion {
// update language once loading profile is completed
binding . textSettingsContentLanguageDesc . text = Locale . forLanguageTag (
profile . getCompleted ( ) . preferredContentSubtitleLanguage
) . displayLanguage
}
}
}
2020-11-23 20:11:10 +01:00
private fun showThemeDialog ( ) {
2022-02-05 20:02:33 +01:00
val items = arrayOf (
2020-11-23 20:11:10 +01:00
resources . getString ( R . string . theme _light ) ,
resources . getString ( R . string . theme _dark )
)
2022-02-05 20:02:33 +01:00
MaterialAlertDialogBuilder ( requireContext ( ) )
. setTitle ( R . string . settings _content _language )
. setSingleChoiceItems ( items , Preferences . theme . ordinal ) { _ , which ->
when ( which ) {
0 -> Preferences . saveTheme ( requireContext ( ) , Theme . LIGHT )
1 -> Preferences . saveTheme ( requireContext ( ) , Theme . DARK )
else -> Preferences . saveTheme ( requireContext ( ) , Theme . DARK )
2020-11-23 20:11:10 +01:00
}
( activity as MainActivity ) . restart ( )
}
2022-02-05 20:02:33 +01:00
. show ( )
2020-11-23 20:11:10 +01:00
}
2021-05-27 19:50:00 +02:00
2020-10-08 22:20:20 +02:00
}