Skip to content

Commit 3f5de2f

Browse files
committed
feat(fc): add iap protos and integrate into GooglePlayBillingClient
Signed-off-by: Brandon McAnsh <[email protected]>
1 parent 88a80a2 commit 3f5de2f

File tree

17 files changed

+249
-49
lines changed

17 files changed

+249
-49
lines changed

definitions/flipchat/protos/src/main/proto/common/v1/flipchat.proto

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,8 @@ message QueryOptions {
8888
DESC = 1;
8989
}
9090
}
91+
enum Platform {
92+
UNKNOWN = 0;
93+
APPLE = 1;
94+
GOOGLE = 2;
95+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
syntax = "proto3";
2+
package flipchat.iap.v1;
3+
option go_package = "github.com/code-payments/flipchat-protobuf-api/generated/go/iap/v1;iappb";
4+
option java_package = "com.codeinc.flipchat.gen.iap.v1";
5+
option objc_class_prefix = "FPBIapV1";
6+
import "common/v1/flipchat.proto";
7+
8+
service Iap {
9+
// OnPurchaseCompleted is called when an IAP has been completed
10+
rpc OnPurchaseCompleted(OnPurchaseCompletedRequest) returns (OnPurchaseCompletedResponse);
11+
}
12+
message OnPurchaseCompletedRequest {
13+
common.v1.Platform platform = 1;
14+
Receipt receipt = 2;
15+
common.v1.Auth auth = 3;
16+
}
17+
message OnPurchaseCompletedResponse {
18+
Result result = 1;
19+
enum Result {
20+
OK = 0;
21+
DENIED = 1;
22+
INVALID_RECEIPT = 2; // Returned if the receipt is invalid, or not in a completed payment state
23+
}
24+
}
25+
message Receipt {
26+
string value = 1 ;
27+
}

flipchatApp/src/main/kotlin/xyz/flipchat/app/MainActivity.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,13 @@ import com.getcode.utils.network.NetworkConnectivityListener
2424
import com.google.firebase.crashlytics.FirebaseCrashlytics
2525
import dagger.hilt.android.AndroidEntryPoint
2626
import dev.bmcreations.tipkit.engines.TipsEngine
27-
import dev.theolm.rinku.RinkuInit
2827
import dev.theolm.rinku.compose.ext.Rinku
2928
import xyz.flipchat.app.beta.BetaFlags
30-
import xyz.flipchat.app.features.home.HomeViewModel
3129
import xyz.flipchat.app.ui.LocalBetaFeatures
32-
import xyz.flipchat.app.util.Router
3330
import xyz.flipchat.services.LocalPaymentController
3431
import xyz.flipchat.services.PaymentController
35-
import xyz.flipchat.services.billing.BillingController
36-
import xyz.flipchat.services.billing.GooglePlayBillingController
37-
import xyz.flipchat.services.billing.LocalIapController
32+
import xyz.flipchat.services.billing.BillingClient
33+
import xyz.flipchat.services.billing.LocalBillingClient
3834
import xyz.flipchat.services.user.UserManager
3935
import javax.inject.Inject
4036
import kotlin.system.exitProcess
@@ -70,7 +66,7 @@ class MainActivity : FragmentActivity() {
7066
lateinit var betaFeatures: BetaFlags
7167

7268
@Inject
73-
lateinit var iapController: BillingController
69+
lateinit var iapController: BillingClient
7470

7571
override fun onCreate(savedInstanceState: Bundle?) {
7672
super.onCreate(savedInstanceState)
@@ -87,7 +83,7 @@ class MainActivity : FragmentActivity() {
8783
LocalUserManager provides userManager,
8884
LocalPaymentController provides paymentController,
8985
LocalBetaFeatures provides betaFeatures,
90-
LocalIapController provides iapController
86+
LocalBillingClient provides iapController
9187
) {
9288
Rinku {
9389
App(tipsEngine = tipsEngine)

flipchatApp/src/main/kotlin/xyz/flipchat/app/features/login/register/PurchaseAccountScreen.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ import xyz.flipchat.app.R
5858
import xyz.flipchat.app.auth.AuthManager
5959
import xyz.flipchat.app.features.chat.lookup.confirm.LoadingSuccessState
6060
import xyz.flipchat.app.ui.LocalUserManager
61-
import xyz.flipchat.services.billing.BillingController
61+
import xyz.flipchat.controllers.PurchaseController
62+
import xyz.flipchat.services.billing.BillingClient
6263
import xyz.flipchat.services.billing.IapPaymentEvent
6364
import xyz.flipchat.services.billing.IapProduct
64-
import xyz.flipchat.services.billing.LocalIapController
65+
import xyz.flipchat.services.billing.LocalBillingClient
6566
import xyz.flipchat.services.user.UserManager
6667
import javax.inject.Inject
6768
import kotlin.time.Duration.Companion.seconds
@@ -85,7 +86,7 @@ class PurchaseAccountScreen : ModalScreen, Parcelable {
8586
private fun PurchaseAccountScreenContent(viewModel: PurchaseAccountViewModel) {
8687
val navigator = LocalCodeNavigator.current
8788
val context = LocalContext.current
88-
val billingController = LocalIapController.current
89+
val billingController = LocalBillingClient.current
8990
val userManager = LocalUserManager.current
9091
val composeScope = rememberCoroutineScope()
9192

@@ -179,7 +180,8 @@ private fun PurchaseAccountScreenContent(viewModel: PurchaseAccountViewModel) {
179180
private class PurchaseAccountViewModel @Inject constructor(
180181
private val userManager: UserManager,
181182
private val authManager: AuthManager,
182-
iapController: BillingController,
183+
iapController: PurchaseController,
184+
billingClient: BillingClient,
183185
resources: ResourceHelper,
184186
) : BaseViewModel2<PurchaseAccountViewModel.State, PurchaseAccountViewModel.Event>(
185187
initialState = State(),
@@ -205,10 +207,10 @@ private class PurchaseAccountViewModel @Inject constructor(
205207
.launchIn(viewModelScope)
206208

207209
viewModelScope.launch {
208-
dispatchEvent(Event.OnCostChanged(iapController.costOf(IapProduct.CreateAccount)))
210+
dispatchEvent(Event.OnCostChanged(billingClient.costOf(IapProduct.CreateAccount)))
209211
}
210212

211-
iapController.eventFlow
213+
billingClient.eventFlow
212214
.mapNotNull { event ->
213215
when (event) {
214216
IapPaymentEvent.OnCancelled -> null
@@ -224,6 +226,7 @@ private class PurchaseAccountViewModel @Inject constructor(
224226
is IapPaymentEvent.OnSuccess -> event
225227
}
226228
}.filterIsInstance<IapPaymentEvent.OnSuccess>()
229+
227230
.onEach {
228231
dispatchEvent(Event.OnCreatingChanged(true))
229232
authManager.register(userManager.displayName!!)

flipchatApp/src/main/kotlin/xyz/flipchat/app/features/login/register/RegisterInfoScreen.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import androidx.compose.material.icons.filled.Person
1717
import androidx.compose.runtime.Composable
1818
import androidx.compose.ui.Alignment
1919
import androidx.compose.ui.Modifier
20-
import androidx.compose.ui.draw.alpha
2120
import androidx.compose.ui.draw.clip
2221
import androidx.compose.ui.graphics.Color
2322
import androidx.compose.ui.graphics.ColorFilter
@@ -41,7 +40,7 @@ import com.getcode.ui.theme.CodeScaffold
4140
import dagger.hilt.android.lifecycle.HiltViewModel
4241
import kotlinx.parcelize.Parcelize
4342
import xyz.flipchat.app.R
44-
import xyz.flipchat.services.billing.BillingController
43+
import xyz.flipchat.services.billing.BillingClient
4544
import xyz.flipchat.services.billing.IapProduct
4645
import xyz.flipchat.services.user.UserManager
4746
import javax.inject.Inject
@@ -164,7 +163,7 @@ private fun RegisterInfoScreenContent(
164163
@HiltViewModel
165164
private class RegisterInfoViewModel @Inject constructor(
166165
private val userManager: UserManager,
167-
private val iapController: BillingController
166+
private val iapController: BillingClient
168167
) : ViewModel() {
169168

170169
val userId: ID?

flipchatApp/src/main/kotlin/xyz/flipchat/app/inject/AppModule.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import android.net.ConnectivityManager
77
import android.net.wifi.WifiManager
88
import android.os.Build
99
import android.os.VibratorManager
10-
import android.support.v4.os.IResultReceiver.Stub
1110
import android.telephony.TelephonyManager
1211
import androidx.core.app.NotificationManagerCompat
1312
import com.getcode.services.analytics.AnalyticsService
@@ -36,9 +35,9 @@ import xyz.flipchat.app.util.AndroidLocale
3635
import xyz.flipchat.app.util.FcTab
3736
import xyz.flipchat.app.util.Router
3837
import xyz.flipchat.app.util.RouterImpl
39-
import xyz.flipchat.services.billing.BillingController
40-
import xyz.flipchat.services.billing.GooglePlayBillingController
41-
import xyz.flipchat.services.billing.StubBillingController
38+
import xyz.flipchat.services.billing.BillingClient
39+
import xyz.flipchat.services.billing.GooglePlayBillingClient
40+
import xyz.flipchat.services.billing.StubBillingClient
4241
import xyz.flipchat.services.user.UserManager
4342
import javax.inject.Singleton
4443

@@ -152,9 +151,9 @@ object AppModule {
152151
fun providesBillingController(
153152
@ApplicationContext context: Context,
154153
userManager: UserManager,
155-
): BillingController = if (BuildConfig.DEBUG) {
156-
StubBillingController
154+
): BillingClient = if (BuildConfig.DEBUG) {
155+
StubBillingClient
157156
} else {
158-
GooglePlayBillingController(context, userManager)
157+
GooglePlayBillingClient(context, userManager)
159158
}
160159
}

services/flipchat/chat/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ dependencies {
4646
implementation(Libs.kotlinx_serialization_json)
4747
implementation(Libs.inject)
4848

49+
implementation(platform(Libs.compose_bom))
50+
implementation(Libs.compose_ui)
51+
4952
implementation(Libs.grpc_android)
5053
implementation(Libs.grpc_okhttp)
5154
implementation(Libs.grpc_kotlin)
@@ -70,6 +73,9 @@ dependencies {
7073
kapt(Libs.androidx_room_compiler)
7174
implementation(Libs.sqlcipher)
7275

76+
api(Libs.google_play_billing_runtime)
77+
api(Libs.google_play_billing_ktx)
78+
7379
implementation(Libs.fingerprint_pro)
7480

7581
implementation(Libs.lib_phone_number_google)

services/flipchat/payments/src/main/kotlin/xyz/flipchat/services/billing/BillingController.kt renamed to services/flipchat/chat/src/main/kotlin/xyz/flipchat/services/billing/BillingClient.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ enum class BillingClientState {
3232
fun canConnect() = this == Disconnected || this == ConnectionLost || this == Failed
3333
}
3434

35-
val LocalIapController = staticCompositionLocalOf<BillingController> { StubBillingController }
35+
val LocalBillingClient = staticCompositionLocalOf<BillingClient> { StubBillingClient }
3636

37-
interface BillingController {
37+
interface BillingClient {
3838
val eventFlow: SharedFlow<IapPaymentEvent>
3939
val state: StateFlow<BillingClientState>
4040

@@ -45,7 +45,7 @@ interface BillingController {
4545
suspend fun purchase(activity: Activity, product: IapProduct)
4646
}
4747

48-
object StubBillingController: BillingController {
48+
object StubBillingClient: BillingClient {
4949
private val _eventFlow: MutableSharedFlow<IapPaymentEvent> = MutableSharedFlow()
5050
override val eventFlow: SharedFlow<IapPaymentEvent> = _eventFlow.asSharedFlow()
5151

0 commit comments

Comments
 (0)