Browse Source

Create subscription API integrated, but navigation is left..

Khubaib 1 year ago
parent
commit
42280794bd

+ 6 - 0
app/src/main/java/com/vpn/fastestvpnservice/retrofit/Api.kt

@@ -61,4 +61,10 @@ interface Api {
     @GET("products")
     fun getProducts(): Call<Any>
 
+    @FormUrlEncoded
+    @POST("create-subscription?test=313912")
+    fun createSubscription(
+        @Field("transaction_id") transaction_id: String?, @Field("receipt_data") receipt_data: String?,
+        @Field("productId") productId: String?
+    ): Call<Any>
 }

+ 12 - 8
app/src/main/java/com/vpn/fastestvpnservice/screens/LoginScreen.kt

@@ -492,14 +492,18 @@ fun BoxScope.SignInButton(
 //            showLoader = true
             if (loginViewModel.liveDataLoginStatus.value == false) {
                 Log.d("test_api_response live", "SignIn: $email $password")
-                loginViewModel.setLoginStatus(true)
-                loginViewModel.loginRequest(
-                    email,
-                    password,
-                    "android",
-                    "11",
-                    "3.2.4"
-                )
+
+                if (email.isNotEmpty() && password.isNotEmpty()) {
+                    loginViewModel.setLoginStatus(true)
+                    loginViewModel.loginRequest(
+                        email,
+                        password,
+                        "android",
+                        "11",
+                        "3.2.4"
+                    )
+                }
+
             }
         },
         shape = RoundedCornerShape(15.dp),

+ 3 - 1
app/src/main/java/com/vpn/fastestvpnservice/screens/accountScreensAll/SubscriptionScreen.kt

@@ -120,7 +120,9 @@ fun SubscriptionScreen(navHostController: NavHostController, activity: Component
 
         LaunchedEffect(key1 = true) {
             Log.d("test_api_response_p", "Products API called!")
-            subscriptionViewModel.getProducts()
+            subscriptionViewModel.getProducts(onProductResult = {
+                isLoaderShow = false
+            })
         }
 
         if (isLoaderShow) {

+ 127 - 3
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SubscriptionViewModel.kt

@@ -2,6 +2,7 @@ package com.vpn.fastestvpnservice.viewmodels
 
 import android.app.Activity
 import android.content.Context
+import android.util.Base64
 import android.util.Log
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.mutableStateOf
@@ -9,6 +10,7 @@ import androidx.core.app.ComponentActivity
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
+import com.android.billingclient.api.AcknowledgePurchaseParams
 import com.android.billingclient.api.BillingClient
 import com.android.billingclient.api.BillingClientStateListener
 import com.android.billingclient.api.BillingFlowParams
@@ -19,16 +21,21 @@ import com.android.billingclient.api.SkuDetails
 import com.android.billingclient.api.SkuDetailsParams
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
+import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.application.App
 import com.vpn.fastestvpnservice.beans.DataResponse
+import com.vpn.fastestvpnservice.beans.DataResponseServers
 import com.vpn.fastestvpnservice.beans.Features
 import com.vpn.fastestvpnservice.beans.ProductFeatures
+import com.vpn.fastestvpnservice.beans.ServerData
 import com.vpn.fastestvpnservice.beans.SubscriptionPackageList
 import com.vpn.fastestvpnservice.customItems.getSelectedPosition
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.retrofit.RetrofitNetworkHandling
 import com.vpn.fastestvpnservice.retrofit.WebServiceFactory
 import com.vpn.fastestvpnservice.screens.accountScreensAll.SubscriptionScreen
+import org.json.JSONArray
+import org.json.JSONObject
 import retrofit2.Call
 
 class SubscriptionViewModel constructor(context: Context, activity: ComponentActivity): ViewModel(), PurchasesUpdatedListener {
@@ -36,6 +43,8 @@ class SubscriptionViewModel constructor(context: Context, activity: ComponentAct
     var mutableLiveDataProducts = MutableLiveData<DataResponse<ArrayList<ProductFeatures>>>()
     var liveDataProducts: LiveData<DataResponse<ArrayList<ProductFeatures>>> = mutableLiveDataProducts
 
+    val mutableLiveDataSubscription = MutableLiveData<DataResponseServers<ArrayList<ServerData>>>()
+
     var mutableLiveDataSkuDetails = MutableLiveData<MutableList<SkuDetails>>()
     var liveDataSkuDetails: LiveData<MutableList<SkuDetails>> = mutableLiveDataSkuDetails
 
@@ -85,7 +94,7 @@ class SubscriptionViewModel constructor(context: Context, activity: ComponentAct
     fun setProductsData(products: DataResponse<ArrayList<ProductFeatures>>) {
         mutableLiveDataProducts.value = products
     }
-    fun getProducts(){
+    fun getProducts(onProductResult: () -> Unit){
         WebServiceFactory.getInstance().getProducts().enqueue(
             RetrofitNetworkHandling<Any>(object :
                 RetrofitNetworkHandling.ResponseCallback<Any>{
@@ -97,12 +106,15 @@ class SubscriptionViewModel constructor(context: Context, activity: ComponentAct
                         val type = object : TypeToken<DataResponse<ArrayList<ProductFeatures>>>() {}.type
                         val data = gson.fromJson<DataResponse<ArrayList<ProductFeatures>>>(jsonString, type)
 
-                        Log.d("test_api_response_p", "Products try = ${data.status} ${data.message}")
+                        Log.d("test_api_response_p", "Products try = ${data.status} ${data.message} ${data.data?.size}")
 
                         data?.data?.let {
                             preferenceHelper.saveFeaturesData(it)
                             featuresList.value = it
                         }
+                        if (data.data?.size == 0){
+                            onProductResult()
+                        }
                         mutableLiveDataProducts.value = data
                         mutableLiveDataProductsErrorStatus.value = false
 
@@ -129,6 +141,42 @@ class SubscriptionViewModel constructor(context: Context, activity: ComponentAct
         )
     }
 
+    fun create_subscription(transaction_id: String, receipt_data: String, productId: String) {
+        Log.d("test_api_response", "create_subscription params = $transaction_id $receipt_data $productId")
+
+        WebServiceFactory.getInstance().createSubscription(transaction_id, receipt_data, productId).enqueue(
+            RetrofitNetworkHandling<Any>(object :
+                RetrofitNetworkHandling.ResponseCallback<Any> {
+                override fun onSuccess(call: Call<Any>?, response: Any?) {
+                    try {
+                        Log.d("test_api_response", "create_subscription try = $response")
+                        val gson = Gson()
+                        val jsonString = gson.toJson(response)
+                        val type = object : TypeToken<DataResponseServers<ArrayList<ServerData>>>() {}.type
+                        val data = gson.fromJson<DataResponseServers<ArrayList<ServerData>>>(jsonString, type)
+
+                        Log.d("test_api_response", "create_subscription try = ${data.status} ${data.message}")
+
+                        data?.let {
+                            mutableLiveDataSubscription.value = it
+                        }
+
+                    } catch (ex: Exception) {
+                        Log.d("test_api_response", "create_subscription catch = $response")
+                    }
+                }
+
+                override fun onFail(call: Call<Any>?, response: Any?) {
+                    Log.d("test_api_response", "create_subscription onFail = $response")
+                }
+
+                override fun onError(call: Call<Any>?, response: Any?) {
+                    Log.d("test_api_response", "create_subscription onError = $response")
+                }
+            })
+        )
+    }
+
     fun startConnection(selectedPosition: Int) {
         SubscriptionViewModel.selectedPosition = selectedPosition
         Log.d(tag, "startConnection Billing")
@@ -307,7 +355,83 @@ class SubscriptionViewModel constructor(context: Context, activity: ComponentAct
     }
 
 
-    override fun onPurchasesUpdated(p0: BillingResult, p1: MutableList<Purchase>?) {
+    override fun onPurchasesUpdated(p0: BillingResult, purchases: MutableList<Purchase>?) {
+        if (purchases != null && purchases.size > 0) {
+            Log.d("purchases_product", purchases.toString())
+            parseDataAndMakeApiCall(purchases)
+        }
+        acknowledgePurchases(purchases)
     }
 
+
+    private fun parseDataAndMakeApiCall(purchases: MutableList<Purchase>?) {
+
+        try {
+            val objectArray = JSONArray(Gson().toJson(purchases))
+            val obj: JSONObject = objectArray.getJSONObject(0)
+            val parsedJson = obj.getJSONObject("zzc")
+            val nameValuePairs = parsedJson.getJSONObject("nameValuePairs")
+            val orderId = nameValuePairs.getString("orderId")
+            val productId = nameValuePairs.getString("productId")
+            val packageName = nameValuePairs.getString("packageName")
+            val purchaseToken = nameValuePairs.getString("purchaseToken")
+
+            val billingCycle =
+                productId.substring(productId.lastIndexOf('.') + 1) //removing pacakge name
+            Log.d("purchases_product", billingCycle.toString())
+
+
+            val receiptData = JSONObject()
+            receiptData.put("orderId", orderId)
+            receiptData.put("productId", productId)
+            receiptData.put("packageName", packageName)
+            receiptData.put("purchaseToken", purchaseToken)
+
+            val receiptDataStr = receiptData.toString()
+            val receiptDataStrEncoded: String =
+                Base64.encodeToString(receiptDataStr.toByteArray(), Base64.NO_PADDING)
+
+            create_subscription_Product(orderId, receiptDataStrEncoded, productId)
+
+//            createOrder(billingCycle, orderId, receiptData)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    private fun create_subscription_Product(orderId: String, receiptData: String,
+                                    productId: String) {
+        Log.d("purchases_product", "$orderId, $receiptData, $productId")
+
+        create_subscription(
+            orderId, receiptData, productId
+        )
+
+    }
+    private fun acknowledgePurchases(purchases: MutableList<Purchase>?) {
+        val purchase = purchases?.first()
+
+        if (purchase != null && !purchase.isAcknowledged
+            && purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {
+            val acknowledgePurchaseParams =
+                AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.purchaseToken)
+                    .build()
+            billingClient.acknowledgePurchase(acknowledgePurchaseParams) { billingResult ->
+                if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
+                    Log.d(
+                        "purchases_product",
+                        "AcknowledgePurchases success, responseCode: ${billingResult.responseCode}"
+                    )
+                } else {
+                    Log.d(
+                        "purchases_product",
+                        "Can't allowMultiplePurchases, responseCode: ${billingResult.responseCode}"
+                    )
+                }
+            }
+        }
+
+    }
+
+
 }