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 a319a67..a700ce4 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 @@ -61,6 +61,7 @@ object Crunchyroll { private val tokenRefreshContext = newSingleThreadContext("TokenRefreshContext") private var accountID = "" + private var externalID = "" private var policy = "" private var signature = "" @@ -245,6 +246,7 @@ object Crunchyroll { } accountID = account.accountId + externalID = account.externalId } /** @@ -704,4 +706,20 @@ object Crunchyroll { requestPatch(profileEndpoint, bodyObject = json) } + /** + * Get additional profile (benefits) information for the currently logged in account. + * + * * @return A **[Profile]** object + */ + suspend fun benefits(): Benefits { + val profileEndpoint = "/subs/v1/subscriptions/$externalID/benefits" + + return try { + requestGet(profileEndpoint) + } catch (ex: SerializationException) { + Log.e(TAG, "SerializationException in benefits().", ex) + NoneBenefits + } + } + } diff --git a/app/src/main/java/org/mosad/teapod/parser/crunchyroll/DataTypes.kt b/app/src/main/java/org/mosad/teapod/parser/crunchyroll/DataTypes.kt index 0aaf2ca..0dda7db 100644 --- a/app/src/main/java/org/mosad/teapod/parser/crunchyroll/DataTypes.kt +++ b/app/src/main/java/org/mosad/teapod/parser/crunchyroll/DataTypes.kt @@ -125,6 +125,7 @@ typealias DiscSeasonList = Collection typealias Watchlist = Collection typealias ContinueWatchingList = Collection typealias RecommendationsList = Collection +typealias Benefits = Collection @Serializable data class UpNextSeriesItem( @@ -226,6 +227,7 @@ val NoneSimilarToResult = SimilarToResult(0, emptyList()) val NoneDiscSeasonList = DiscSeasonList(0, emptyList()) val NoneContinueWatchingList = ContinueWatchingList(0, emptyList()) val NoneRecommendationsList = RecommendationsList(0, emptyList()) +val NoneBenefits = Benefits(0, emptyList()) val NoneUpNextSeriesItem = UpNextSeriesItem( playhead = 0, @@ -412,3 +414,16 @@ val NoneProfile = Profile( preferredContentSubtitleLanguage = "", username = "" ) + +/** + * benefit data class + */ +@Serializable +data class Benefit( + @SerialName("benefit") val benefit: String, + @SerialName("source") val source: String, +) +val NoneBenefit = Benefit( + benefit = "", + source = "" +) diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AccountFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AccountFragment.kt index dd8dc8e..cbc5cd1 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AccountFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AccountFragment.kt @@ -15,6 +15,7 @@ import kotlinx.coroutines.runBlocking import org.mosad.teapod.BuildConfig import org.mosad.teapod.R import org.mosad.teapod.databinding.FragmentAccountBinding +import org.mosad.teapod.parser.crunchyroll.Benefits import org.mosad.teapod.parser.crunchyroll.Crunchyroll import org.mosad.teapod.parser.crunchyroll.Profile import org.mosad.teapod.parser.crunchyroll.supportedLocals @@ -33,6 +34,9 @@ class AccountFragment : Fragment() { private var profile: Deferred = lifecycleScope.async { Crunchyroll.profile() } + private var benefits: Deferred = lifecycleScope.async { + Crunchyroll.benefits() + } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { binding = FragmentAccountBinding.inflate(inflater, container, false) @@ -44,14 +48,18 @@ class AccountFragment : Fragment() { binding.textAccountLogin.text = EncryptedPreferences.login - // TODO reimplement for cr, if possible (maybe account status would be better? (premium)) - // load subscription (async) info before anything else - binding.textAccountSubscription.text = getString(R.string.account_subscription, getString(R.string.loading)) + // load account status and tier (async) info before anything else lifecycleScope.launch { - binding.textAccountSubscription.text = getString( - R.string.account_subscription, - "TODO" - ) + 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)) + } + } } // add preferred subtitles @@ -80,12 +88,6 @@ class AccountFragment : Fragment() { showLoginDialog() } - binding.linearAccountSubscription.setOnClickListener { - // TODO - //startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(AoDParser.getSubscriptionUrl()))) - } - - binding.linearSettingsContentLanguage.setOnClickListener { showContentLanguageSelection() } diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index 9c8f86f..303bc92 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -112,7 +112,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:text="@string/account_subscription" + android:text="@string/loading" android:textSize="16sp" /> diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 3dc06cf..be9a759 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -37,6 +37,8 @@ Zum bearbeiten tippen Abo %1$s Zum verlängern tippen + Premium Mitglied + Typ: %1$s Info Version %1$s (%2$s) Einstellungen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e319e8d..111b6df 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,6 +49,11 @@ Tap to edit Subscription %1$s Tap to extend + Premium member + Tier: %1$s + Fan + Mega Fan + Ultimate Fan Settings Preferred content language English