Browse Source

增加恢复订阅功能

zk 1 year ago
parent
commit
3e0770a864

+ 4 - 0
app/src/main/java/com/atmob/voiceai/data/api/AtmobApi.java

@@ -7,6 +7,7 @@ import com.atmob.voiceai.data.api.request.CloneDeleteRequest;
 import com.atmob.voiceai.data.api.request.OrderPayRequest;
 import com.atmob.voiceai.data.api.request.OrderStatusRequest;
 import com.atmob.voiceai.data.api.request.PayGoodsRequest;
+import com.atmob.voiceai.data.api.request.SubResumeRequest;
 import com.atmob.voiceai.data.api.request.TextTosSpeechRequest;
 import com.atmob.voiceai.data.api.request.VoiceCloneRequest;
 import com.atmob.voiceai.data.api.request.VoiceHistoryRequest;
@@ -60,4 +61,7 @@ public interface AtmobApi {
 
     @POST("/project/voice/v1/order/status")
     Single<BaseResponse<OrderStatusResponse>> orderStatus(@Body OrderStatusRequest request);
+
+    @POST("/project/voice/v1/member/subscription/resume")
+    Single<BaseResponse<Object>> subscriptionResume(@Body SubResumeRequest request);
 }

+ 36 - 0
app/src/main/java/com/atmob/voiceai/data/api/request/SubResumeRequest.java

@@ -0,0 +1,36 @@
+package com.atmob.voiceai.data.api.request;
+
+import com.google.gson.annotations.SerializedName;
+
+public class SubResumeRequest extends BaseRequest {
+
+
+    @SerializedName("payMethod")
+    private int payMethod;
+
+    @SerializedName("payPlatform")
+    private int payPlatform;
+
+    @SerializedName("receiptData")
+    private String receiptData;
+
+
+    public SubResumeRequest(int payMethod, int payPlatform, String receiptData) {
+        this.payMethod = payMethod;
+        this.payPlatform = payPlatform;
+        this.receiptData = receiptData;
+    }
+
+
+    public int getPayMethod() {
+        return payMethod;
+    }
+
+    public int getPayPlatform() {
+        return payPlatform;
+    }
+
+    public String getReceiptData() {
+        return receiptData;
+    }
+}

+ 27 - 1
app/src/main/java/com/atmob/voiceai/data/repositories/MemberRepository.java

@@ -5,7 +5,9 @@ import android.os.Handler;
 
 import androidx.lifecycle.MutableLiveData;
 
+import com.android.billingclient.api.AccountIdentifiers;
 import com.android.billingclient.api.BillingClient;
+import com.android.billingclient.api.Purchase;
 import com.atmob.app.lib.handler.RxHttpHandler;
 import com.atmob.common.logging.AtmobLog;
 import com.atmob.voiceai.data.api.AtmobApi;
@@ -14,18 +16,22 @@ import com.atmob.voiceai.data.api.request.BaseRequest;
 import com.atmob.voiceai.data.api.request.OrderPayRequest;
 import com.atmob.voiceai.data.api.request.OrderStatusRequest;
 import com.atmob.voiceai.data.api.request.PayGoodsRequest;
+import com.atmob.voiceai.data.api.request.SubResumeRequest;
 import com.atmob.voiceai.data.api.response.OrderPayResponse;
 import com.atmob.voiceai.data.api.response.OrderStatusResponse;
 import com.atmob.voiceai.data.api.response.PayGoodsResponse;
 import com.atmob.voiceai.data.api.response.UserInfoResponse;
+import com.atmob.voiceai.sdk.billing.GPBillingClient;
 import com.atmob.voiceai.utils.BoxingUtil;
 
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import atmob.reactivex.rxjava3.annotations.NonNull;
+import atmob.reactivex.rxjava3.core.Observable;
 import atmob.reactivex.rxjava3.core.Single;
 import atmob.reactivex.rxjava3.core.SingleObserver;
 import atmob.reactivex.rxjava3.disposables.Disposable;
@@ -37,12 +43,14 @@ public class MemberRepository {
 
     private final MutableLiveData<Boolean> isMember = new MutableLiveData<>();
     private final AtmobApi atmobApi;
+    private final GPBillingClient gpBillingClient;
     private boolean requestUserInfoDisabled;
     private final Handler refreshMemberHandler = new Handler();
 
     @Inject
-    public MemberRepository(AtmobApi atmobApi) {
+    public MemberRepository(AtmobApi atmobApi, GPBillingClient gpBillingClient) {
         this.atmobApi = atmobApi;
+        this.gpBillingClient = gpBillingClient;
         refreshUserData();
     }
 
@@ -51,8 +59,26 @@ public class MemberRepository {
         return isMember;
     }
 
+    public Single<Object> subscriptionResume() {
+        return gpBillingClient.queryPurchase(BillingClient.ProductType.SUBS)
+                .filter(purchases -> purchases != null && !purchases.isEmpty())
+                .toSingle()
+                .flatMap(purchases -> Observable.fromIterable(purchases)
+                        .filter(purchase -> purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED)
+                        .firstOrError()
+                        .flatMap(purchase -> {
+                            String googlePurchaseToken = purchase.getPurchaseToken();
+                            return subscriptionResume(4, 1, googlePurchaseToken);
+                        }))
+                .compose(RxJavaUtil.SingleSchedule.io2Main());
+    }
 
 
+    private Single<Object> subscriptionResume(int payMethod, int payPlatform, String receiptData) {
+        return atmobApi.subscriptionResume(new SubResumeRequest(payMethod, payPlatform, receiptData))
+                .compose(RxHttpHandler.handle(true))
+                .compose(RxJavaUtil.SingleSchedule.io2Main());
+    }
 
     public Single<PayGoodsResponse> payGoodsList() {
         return atmobApi.payGoodsList(new PayGoodsRequest(false))

+ 6 - 1
app/src/main/java/com/atmob/voiceai/helper/ErrorHelper.java

@@ -1,5 +1,6 @@
 package com.atmob.voiceai.helper;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
 import com.atmob.app.lib.handler.RxHttpHandler;
@@ -9,6 +10,10 @@ import com.atmob.voiceai.utils.ToastUtil;
 public class ErrorHelper {
 
     public static void errorThrowableToast(Throwable throwable, @ToastUtil.Duration int duration) {
+        errorThrowableToast(throwable, R.string.net_error_message, duration);
+    }
+
+    public static void errorThrowableToast(Throwable throwable, @StringRes int defaultToastTxtId, @ToastUtil.Duration int duration) {
         if (throwable instanceof RxHttpHandler.ServerErrorException) {
             RxHttpHandler.ServerErrorException serverErrorException = (RxHttpHandler.ServerErrorException) throwable;
             int errorResId = getErrorResId(serverErrorException.getCode());
@@ -18,7 +23,7 @@ public class ErrorHelper {
                 ToastUtil.show(errorResId, duration);
             }
         } else {
-            ToastUtil.show(R.string.net_error_message, duration);
+            ToastUtil.show(defaultToastTxtId, duration);
         }
     }
 

+ 1 - 0
app/src/main/java/com/atmob/voiceai/module/main/MainViewModel.java

@@ -14,5 +14,6 @@ public class MainViewModel extends BaseViewModel {
 
     @Inject
     public MainViewModel(MemberRepository memberRepository) {
+
     }
 }

+ 5 - 10
app/src/main/java/com/atmob/voiceai/module/subscription/SubscriptionPageViewModel.java

@@ -128,20 +128,21 @@ public class SubscriptionPageViewModel extends BaseViewModel {
     }
 
     public void onRestoreClick() {
-        queryPurchase()
-                .subscribe(new SingleObserver<List<Purchase>>() {
+        memberRepository.subscriptionResume()
+                .subscribe(new SingleObserver<Object>() {
                     @Override
                     public void onSubscribe(@NonNull Disposable d) {
                         addDisposable(d);
                     }
 
                     @Override
-                    public void onSuccess(@NonNull List<Purchase> purchases) {
+                    public void onSuccess(@NonNull Object object) {
+                        ToastUtil.show(R.string.member_restore_success, ToastUtil.LENGTH_SHORT);
                     }
 
                     @Override
                     public void onError(@NonNull Throwable e) {
-
+                        ErrorHelper.errorThrowableToast(e, R.string.member_restore_fail, ToastUtil.LENGTH_SHORT);
                     }
                 });
     }
@@ -281,12 +282,6 @@ public class SubscriptionPageViewModel extends BaseViewModel {
     }
 
 
-    private Single<List<Purchase>> queryPurchase() {
-        return gpBillingClient.queryPurchase(BillingClient.ProductType.SUBS)
-                .filter(purchases -> purchases != null && !purchases.isEmpty())
-                .toSingle()
-                .compose(RxJavaUtil.SingleSchedule.io2Main());
-    }
 
     @Override
     protected void onCleared() {

+ 1 - 0
app/src/main/java/com/atmob/voiceai/sdk/billing/BillingStrategy.java

@@ -44,4 +44,5 @@ public class BillingStrategy {
     public SingleSource<List<Purchase>> queryPurchase(@BillingClient.ProductType String productType) {
         return Purchases.queryPurchase(billingClient, productType);
     }
+
 }

+ 2 - 0
app/src/main/java/com/atmob/voiceai/sdk/billing/GPBillingClient.java

@@ -17,9 +17,11 @@ import com.android.billingclient.api.BillingResult;
 import com.android.billingclient.api.PendingPurchasesParams;
 import com.android.billingclient.api.Purchase;
 import com.android.billingclient.api.PurchasesUpdatedListener;
+import com.android.billingclient.api.QueryPurchasesParams;
 import com.atmob.common.logging.AtmobLog;
 import com.atmob.common.runtime.ProcessUtil;
 import com.atmob.voiceai.sdk.billing.bean.GPProductInfo;
+import com.atmob.voiceai.sdk.billing.operation.Purchases;
 import com.atmob.voiceai.utils.ToastUtil;
 
 import java.util.HashMap;

+ 2 - 1
app/src/main/java/com/atmob/voiceai/sdk/billing/operation/Purchases.java

@@ -1,6 +1,7 @@
 package com.atmob.voiceai.sdk.billing.operation;
 
 import com.android.billingclient.api.BillingClient;
+import com.android.billingclient.api.Purchase;
 import com.android.billingclient.api.QueryPurchasesParams;
 import com.atmob.common.logging.AtmobLog;
 
@@ -12,7 +13,7 @@ public class Purchases {
 
     private static final String TAG = Purchases.class.getSimpleName();
 
-    public static Single<List<com.android.billingclient.api.Purchase>> queryPurchase(BillingClient billingClient, @BillingClient.ProductType String productType) {
+    public static Single<List<Purchase>> queryPurchase(BillingClient billingClient, @BillingClient.ProductType String productType) {
         return Single.create(emitter -> billingClient.queryPurchasesAsync(
                 QueryPurchasesParams.newBuilder()
                         .setProductType(productType)

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -106,4 +106,6 @@
     <string name="please_select_goods">Please select a subscription product.</string>
     <string name="no_pay_way">Unable to make a payment at the moment.</string>
     <string name="pay_success">Subscription Successful</string>
+    <string name="member_restore_fail">Subscription restoration failed</string>
+    <string name="member_restore_success">Subscription restoration successful</string>
 </resources>