Skip to content
Snippets Groups Projects
Commit 6c6565b7 authored by Taras's avatar Taras
Browse files

Move subscriptions to auth

parent ae00d2b5
No related branches found
No related tags found
No related merge requests found
...@@ -67,9 +67,6 @@ dependencies { ...@@ -67,9 +67,6 @@ dependencies {
gplayImplementation 'com.google.firebase:firebase-analytics-ktx' gplayImplementation 'com.google.firebase:firebase-analytics-ktx'
gplayImplementation 'com.google.firebase:firebase-messaging-ktx' gplayImplementation 'com.google.firebase:firebase-messaging-ktx'
//Subscriptions
gplayImplementation 'com.android.billingclient:billing-ktx:6.0.0'
// UnifiedPush // UnifiedPush
implementation 'com.github.UnifiedPush:android-connector:2.1.1' implementation 'com.github.UnifiedPush:android-connector:2.1.1'
......
package org.futo.circles.di package org.futo.circles.di
import android.content.Context import android.content.Context
import androidx.fragment.app.Fragment
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import org.futo.circles.R
import org.futo.circles.auth.subscriptions.ItemPurchasedListener
import org.futo.circles.auth.subscriptions.SubscriptionManager
import org.futo.circles.auth.subscriptions.SubscriptionProvider
import org.futo.circles.core.provider.PreferencesProvider import org.futo.circles.core.provider.PreferencesProvider
import org.futo.circles.feature.notifications.FcmHelper import org.futo.circles.feature.notifications.FcmHelper
import org.futo.circles.feature.notifications.GuardServiceStarter import org.futo.circles.feature.notifications.GuardServiceStarter
...@@ -31,16 +26,6 @@ abstract class FlavorModule { ...@@ -31,16 +26,6 @@ abstract class FlavorModule {
@ApplicationContext appContext: Context @ApplicationContext appContext: Context
): GuardServiceStarter = FdroidGuardServiceStarter(appContext, preferences) ): GuardServiceStarter = FdroidGuardServiceStarter(appContext, preferences)
@Provides
fun provideSubscriptionProvider(): SubscriptionProvider {
return object : SubscriptionProvider {
override fun getManager(
fragment: Fragment,
itemPurchaseListener: ItemPurchasedListener?
): SubscriptionManager =
throw IllegalStateException(fragment.getString(R.string.flavour_does_not_support_subscriptions))
}
}
} }
@Binds @Binds
......
<resources> <resources>
<string name="flavour_does_not_support_subscriptions">This flavour does not support subscriptions</string>
<string name="settings_troubleshoot_test_battery_title">Battery Optimization</string> <string name="settings_troubleshoot_test_battery_title">Battery Optimization</string>
<string name="settings_troubleshoot_test_battery_success">Circles is not affected by Battery Optimization.</string> <string name="settings_troubleshoot_test_battery_success">Circles is not affected by Battery Optimization.</string>
<string name="settings_troubleshoot_test_battery_failed">If a user leaves a device unplugged and stationary for a period of time, with the screen off, the device enters Doze mode. This prevents apps from accessing the network and defers their jobs, syncs, and standard alarms. </string> <string name="settings_troubleshoot_test_battery_failed">If a user leaves a device unplugged and stationary for a period of time, with the screen off, the device enters Doze mode. This prevents apps from accessing the network and defers their jobs, syncs, and standard alarms. </string>
......
package org.futo.circles.di package org.futo.circles.di
import androidx.fragment.app.Fragment
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import org.futo.circles.auth.subscriptions.ItemPurchasedListener
import org.futo.circles.auth.subscriptions.SubscriptionManager
import org.futo.circles.auth.subscriptions.SubscriptionProvider
import org.futo.circles.feature.notifications.FcmHelper import org.futo.circles.feature.notifications.FcmHelper
import org.futo.circles.feature.notifications.GuardServiceStarter import org.futo.circles.feature.notifications.GuardServiceStarter
import org.futo.circles.feature.notifications.test.task.NotificationTestsProvider import org.futo.circles.feature.notifications.test.task.NotificationTestsProvider
import org.futo.circles.notifications.GoogleFcmHelper import org.futo.circles.notifications.GoogleFcmHelper
import org.futo.circles.notifications.test.GoogleNotificationTestProvider import org.futo.circles.notifications.test.GoogleNotificationTestProvider
import org.futo.circles.subscriptions.google.GoogleSubscriptionsManager
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
...@@ -25,16 +20,6 @@ abstract class FlavorModule { ...@@ -25,16 +20,6 @@ abstract class FlavorModule {
fun provideGuardServiceStarter(): GuardServiceStarter { fun provideGuardServiceStarter(): GuardServiceStarter {
return object : GuardServiceStarter {} return object : GuardServiceStarter {}
} }
@Provides
fun provideSubscriptionProvider(): SubscriptionProvider {
return object : SubscriptionProvider {
override fun getManager(
fragment: Fragment,
itemPurchaseListener: ItemPurchasedListener?
): SubscriptionManager = GoogleSubscriptionsManager(fragment, itemPurchaseListener)
}
}
} }
@Binds @Binds
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="feature_not_supported">Feature is not supported</string>
<string name="service_unavailable">Service unavailable</string>
<string name="item_unavailable">Item is unavailable</string>
<string name="user_canceled">User canceled</string>
<string name="item_not_owned">Item is not owned</string>
<string name="developer_error">Developer error</string>
<string name="purchase_failed_format">Purchase failed with code %d</string>
</resources>
\ No newline at end of file
...@@ -61,6 +61,9 @@ dependencies { ...@@ -61,6 +61,9 @@ dependencies {
//Password strength //Password strength
implementation 'com.nulab-inc:zxcvbn:1.7.0' implementation 'com.nulab-inc:zxcvbn:1.7.0'
//Subscriptions
implementation 'com.android.billingclient:billing-ktx:6.0.0'
//Hilt //Hilt
def hilt = '2.46.1' def hilt = '2.46.1'
implementation "com.google.dagger:hilt-android:$hilt" implementation "com.google.dagger:hilt-android:$hilt"
......
...@@ -20,7 +20,6 @@ import org.futo.circles.core.extensions.getOrThrow ...@@ -20,7 +20,6 @@ import org.futo.circles.core.extensions.getOrThrow
@InstallIn(ViewModelComponent::class) @InstallIn(ViewModelComponent::class)
object AuthModule { object AuthModule {
@Provides @Provides
@ViewModelScoped @ViewModelScoped
fun providePasswordDataSource( fun providePasswordDataSource(
......
package org.futo.circles.auth.di
import androidx.fragment.app.Fragment
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import org.futo.circles.auth.subscriptions.GoogleSubscriptionsManager
import org.futo.circles.auth.subscriptions.ItemPurchasedListener
import org.futo.circles.auth.subscriptions.SubscriptionManager
import org.futo.circles.auth.subscriptions.SubscriptionProvider
@Module
@InstallIn(SingletonComponent::class)
object SubscriptionsModule {
@Provides
fun provideSubscriptionProvider(): SubscriptionProvider {
return object : SubscriptionProvider {
override fun getManager(
fragment: Fragment,
itemPurchaseListener: ItemPurchasedListener?
): SubscriptionManager = GoogleSubscriptionsManager(fragment, itemPurchaseListener)
}
}
}
\ No newline at end of file
package org.futo.circles.subscriptions.google package org.futo.circles.auth.subscriptions
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import com.android.billingclient.api.* import com.android.billingclient.api.BillingClient
import com.android.billingclient.api.BillingClient.BillingResponseCode.* import com.android.billingclient.api.BillingClient.BillingResponseCode.BILLING_UNAVAILABLE
import com.android.billingclient.api.BillingClient.BillingResponseCode.DEVELOPER_ERROR
import com.android.billingclient.api.BillingClient.BillingResponseCode.ERROR
import com.android.billingclient.api.BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED
import com.android.billingclient.api.BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED
import com.android.billingclient.api.BillingClient.BillingResponseCode.ITEM_NOT_OWNED
import com.android.billingclient.api.BillingClient.BillingResponseCode.ITEM_UNAVAILABLE
import com.android.billingclient.api.BillingClient.BillingResponseCode.OK
import com.android.billingclient.api.BillingClient.BillingResponseCode.SERVICE_DISCONNECTED
import com.android.billingclient.api.BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE
import com.android.billingclient.api.BillingClient.BillingResponseCode.USER_CANCELED
import com.android.billingclient.api.BillingClientStateListener
import com.android.billingclient.api.BillingFlowParams
import com.android.billingclient.api.BillingResult
import com.android.billingclient.api.ProductDetails
import com.android.billingclient.api.Purchase
import com.android.billingclient.api.PurchasesUpdatedListener
import com.android.billingclient.api.QueryProductDetailsParams
import com.android.billingclient.api.QueryPurchasesParams
import com.android.billingclient.api.queryProductDetails
import com.android.billingclient.api.queryPurchasesAsync
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import org.futo.circles.R import org.futo.circles.auth.R
import org.futo.circles.auth.model.SubscriptionListItem import org.futo.circles.auth.model.SubscriptionListItem
import org.futo.circles.auth.model.SubscriptionReceiptData import org.futo.circles.auth.model.SubscriptionReceiptData
import org.futo.circles.auth.subscriptions.ItemPurchasedListener
import org.futo.circles.auth.subscriptions.SubscriptionManager
import org.futo.circles.core.extensions.Response import org.futo.circles.core.extensions.Response
import org.futo.circles.core.extensions.onBG import org.futo.circles.core.extensions.onBG
import kotlin.coroutines.resume import kotlin.coroutines.resume
...@@ -189,7 +207,7 @@ class GoogleSubscriptionsManager( ...@@ -189,7 +207,7 @@ class GoogleSubscriptionsManager(
else -> Response.Error(fragment.getString(R.string.purchase_failed_format, code)) else -> Response.Error(fragment.getString(R.string.purchase_failed_format, code))
} }
fun Purchase.toSubscriptionReceiptData(): SubscriptionReceiptData? { private fun Purchase.toSubscriptionReceiptData(): SubscriptionReceiptData? {
val productId = products.lastOrNull() ?: return null val productId = products.lastOrNull() ?: return null
return SubscriptionReceiptData(productId, purchaseToken) return SubscriptionReceiptData(productId, purchaseToken)
} }
......
package org.futo.circles.subscriptions.google package org.futo.circles.auth.subscriptions
import android.content.Context import android.content.Context
import com.android.billingclient.api.ProductDetails import com.android.billingclient.api.ProductDetails
import org.futo.circles.auth.model.SubscriptionListItem import org.futo.circles.auth.model.SubscriptionListItem
import org.futo.circles.auth.subscriptions.formatIsoPeriod
import org.futo.circles.core.extensions.Response import org.futo.circles.core.extensions.Response
fun ProductDetails.toSubscriptionListItem(context: Context): SubscriptionListItem { fun ProductDetails.toSubscriptionListItem(context: Context): SubscriptionListItem {
......
...@@ -92,6 +92,12 @@ ...@@ -92,6 +92,12 @@
<string name="remove_user_message">Are you sure you want to remove this user?</string> <string name="remove_user_message">Are you sure you want to remove this user?</string>
<string name="remove">Remove</string> <string name="remove">Remove</string>
<string name="not_supported_navigation_event">Not supported navigation event</string> <string name="not_supported_navigation_event">Not supported navigation event</string>
<string name="feature_not_supported">Feature is not supported</string>
<string name="service_unavailable">Service unavailable</string>
<string name="item_unavailable">Item is unavailable</string>
<string name="user_canceled">User canceled</string>
<string name="item_not_owned">Item is not owned</string>
<string name="developer_error">Developer error</string>
<string name="purchase_failed_format">Purchase failed with code %d</string> <string name="purchase_failed_format">Purchase failed with code %d</string>
<plurals name="days"> <plurals name="days">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment