diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 625ed318dba8ffa6dbd5cb9caed588037b46ec5e..f748de26c95780acd5a507c8210aba181ac0e295 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -222,7 +222,6 @@ <string name="rich_text_editor_unindent">Unindent</string> <string name="rich_text_editor_quote">Toggle quote</string> <string name="rich_text_editor_code_block">Toggle code block</string> - <string name="manage_subscription">Manage subscription</string> <string-array name="report_categories"> <item>@string/crude_language</item> diff --git a/auth/src/main/java/org/futo/circles/auth/feature/manage_subscription/ManageSubscriptionDialogFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/manage_subscription/ManageSubscriptionDialogFragment.kt index ea7e7f5ac643068dab8b30d4aa42bc4706851762..e841124b06de3b41473bf6933205df3f8decf3a5 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/manage_subscription/ManageSubscriptionDialogFragment.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/manage_subscription/ManageSubscriptionDialogFragment.kt @@ -6,27 +6,45 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint import org.futo.circles.auth.databinding.DialogFragmentManageSubscriptionBinding +import org.futo.circles.auth.subscriptions.SubscriptionProvider import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment -import org.futo.circles.core.base.fragment.HasLoadingState +import javax.inject.Inject @AndroidEntryPoint class ManageSubscriptionDialogFragment : - BaseFullscreenDialogFragment(DialogFragmentManageSubscriptionBinding::inflate), - HasLoadingState { + BaseFullscreenDialogFragment(DialogFragmentManageSubscriptionBinding::inflate) { - override val fragment: Fragment = this private val viewModel by viewModels<ManageSubscriptionViewModel>() private val binding by lazy { getBinding() as DialogFragmentManageSubscriptionBinding } + @Inject + lateinit var subscriptionProvider: SubscriptionProvider + + private val subscriptionManager by lazy { + subscriptionProvider.getManager(this, null) + } + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + viewModel.getSubscriptionInfo(subscriptionManager) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupViews() + setupObservers() } private fun setupViews() { } + + private fun setupObservers() { + + } } \ No newline at end of file diff --git a/auth/src/main/java/org/futo/circles/auth/feature/manage_subscription/ManageSubscriptionViewModel.kt b/auth/src/main/java/org/futo/circles/auth/feature/manage_subscription/ManageSubscriptionViewModel.kt index c97d3b893cd4df81b7c85ec46e25b3a464d5f4b2..67b4e086d429e769e9c6cf209d78bbd3365a7e0a 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/manage_subscription/ManageSubscriptionViewModel.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/manage_subscription/ManageSubscriptionViewModel.kt @@ -2,14 +2,52 @@ package org.futo.circles.auth.feature.manage_subscription import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import org.futo.circles.auth.model.ActiveSubscriptionInfo +import org.futo.circles.auth.subscriptions.SubscriptionManager import org.futo.circles.core.base.SingleEventLiveData import org.futo.circles.core.extensions.Response +import org.futo.circles.core.extensions.launchBg import javax.inject.Inject @HiltViewModel class ManageSubscriptionViewModel @Inject constructor( ) : ViewModel() { + val subscriptionInfoLiveData = SingleEventLiveData<Response<ActiveSubscriptionInfo>>() + + fun getSubscriptionInfo(subscriptionManager: SubscriptionManager) { + launchBg { + val activeReceipt = + (subscriptionManager.getActiveSubscriptionReceipt() as? Response.Success)?.data + ?: kotlin.run { + subscriptionInfoLiveData.postValue( + Response.Error("Failed to fetch active subscription info") + ) + return@launchBg + } + val details = + (subscriptionManager.getDetails(listOf(activeReceipt.productId)) as? Response.Success)?.data?.lastOrNull() + ?: kotlin.run { + subscriptionInfoLiveData.postValue( + Response.Error("Failed to fetch active subscription details") + ) + return@launchBg + } + subscriptionInfoLiveData.postValue( + Response.Success( + ActiveSubscriptionInfo( + productId = activeReceipt.productId, + purchaseTime = activeReceipt.purchaseTime, + isAutoRenewing = activeReceipt.isAutoRenewing, + name = details.name, + description = details.description, + price = details.price, + duration = details.duration + ) + ) + ) + } + } } \ No newline at end of file diff --git a/auth/src/main/java/org/futo/circles/auth/model/ActiveSubscriptionInfo.kt b/auth/src/main/java/org/futo/circles/auth/model/ActiveSubscriptionInfo.kt new file mode 100644 index 0000000000000000000000000000000000000000..9de531451a1ce8ed43a90ad93afb5aa1cde81d2c --- /dev/null +++ b/auth/src/main/java/org/futo/circles/auth/model/ActiveSubscriptionInfo.kt @@ -0,0 +1,11 @@ +package org.futo.circles.auth.model + +data class ActiveSubscriptionInfo( + val productId: String, + val purchaseTime: Long, + val isAutoRenewing: Boolean, + val name: String, + val description: String, + val price: String, + val duration: String +) \ No newline at end of file diff --git a/auth/src/main/java/org/futo/circles/auth/model/SubscriptionReceiptData.kt b/auth/src/main/java/org/futo/circles/auth/model/SubscriptionReceiptData.kt index fc281d28245a6efc1ff5e5c53e11c6b9e86552a3..19d516ccdbf40835900c5203151cea343eee6c9e 100644 --- a/auth/src/main/java/org/futo/circles/auth/model/SubscriptionReceiptData.kt +++ b/auth/src/main/java/org/futo/circles/auth/model/SubscriptionReceiptData.kt @@ -4,5 +4,7 @@ data class SubscriptionReceiptData( val productId: String, val purchaseToken: String, val orderId: String, - val packageName: String + val packageName: String, + val purchaseTime: Long, + val isAutoRenewing: Boolean ) \ No newline at end of file diff --git a/auth/src/main/java/org/futo/circles/auth/subscriptions/GoogleSubscriptionsManager.kt b/auth/src/main/java/org/futo/circles/auth/subscriptions/GoogleSubscriptionsManager.kt index 9d97f104fe3d630b77328e2de8ec77f98e7bb447..4e6404053c084b3901b7cf38bc4131b000c6d8b9 100644 --- a/auth/src/main/java/org/futo/circles/auth/subscriptions/GoogleSubscriptionsManager.kt +++ b/auth/src/main/java/org/futo/circles/auth/subscriptions/GoogleSubscriptionsManager.kt @@ -225,6 +225,13 @@ class GoogleSubscriptionsManager( private fun Purchase.toSubscriptionReceiptData(): SubscriptionReceiptData { val orderId = orderId ?: "" val productId = products.lastOrNull() ?: "" - return SubscriptionReceiptData(productId, purchaseToken, orderId, packageName) + return SubscriptionReceiptData( + productId, + purchaseToken, + orderId, + packageName, + purchaseTime, + isAutoRenewing + ) } } \ No newline at end of file diff --git a/auth/src/main/res/layout/dialog_fragment_manage_subscription.xml b/auth/src/main/res/layout/dialog_fragment_manage_subscription.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c64170396f9e98af3ef56fe57e20939b26c2c64 --- /dev/null +++ b/auth/src/main/res/layout/dialog_fragment_manage_subscription.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + + <com.google.android.material.appbar.MaterialToolbar + android:id="@+id/toolbar" + android:layout_width="0dp" + android:layout_height="?attr/actionBarSize" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:navigationIcon="?attr/homeAsUpIndicator" + app:title="@string/manage_subscription" + app:titleCentered="true" /> + + + <View + android:id="@+id/toolbarDivider" + android:layout_width="0dp" + android:layout_height="@dimen/divider_height" + android:background="@color/divider_color" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/toolbar" /> + + + <TextView + android:id="@+id/tvEmptyMessage" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:gravity="center" + android:text="@string/you_don_t_have_any_active_subscriptions" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/toolbarDivider" /> + + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml index 1ec0c2a7554020d88e86172d665669b0d2ede9d8..6726c3a87d25c5d9679983fb9773b60ad02be1c9 100644 --- a/auth/src/main/res/values/strings.xml +++ b/auth/src/main/res/values/strings.xml @@ -70,6 +70,7 @@ <string name="skip">Skip</string> <string name="subscriptions">Subscriptions</string> <string name="subscription">Subscription</string> + <string name="manage_subscription">Manage subscription</string> <string name="enter_your_username">Enter your username</string> <string name="set_username">Set username</string> <string name="send_validation_code">Send validation code</string> @@ -157,6 +158,7 @@ Or, think about all of your friends across all of the places you\'ve ever lived. <br/><br/>If you want to share with lots of different people who <i>don\'t</i> all know each other, then you should invite those people to follow you in a <b>Circle</b> instead.]]></string> <string name="configure">Configure</string> <string name="receive_email_updates">Receive email updates</string> + <string name="you_don_t_have_any_active_subscriptions">You don\'t have any active subscriptions</string> <plurals name="days"> <item quantity="one">%1$d day</item>