diff --git a/app/build.gradle b/app/build.gradle index e7626c2..13fd76d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { minSdkVersion 23 targetSdkVersion 29 - versionCode 33 - versionName "1.3.2" + versionCode 34 + versionName "1.3.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/xwad/os/activity/activation/ActivationActivity.java b/app/src/main/java/com/xwad/os/activity/activation/ActivationActivity.java index 7a9df0d..fe2cb2e 100644 --- a/app/src/main/java/com/xwad/os/activity/activation/ActivationActivity.java +++ b/app/src/main/java/com/xwad/os/activity/activation/ActivationActivity.java @@ -34,6 +34,7 @@ import io.reactivex.rxjava3.schedulers.Schedulers; public class ActivationActivity extends BaseMvvmActivity { private Disposable pollingDisposable; + private String mCoupons; @Override protected int getLayoutId() { @@ -75,10 +76,10 @@ public class ActivationActivity extends BaseMvvmActivity() { + @Override + public void onChanged(String s) { + mViewDataBinding.llCouponsInput.setVisibility(View.GONE); + mViewDataBinding.llCouponsQrcode.setVisibility(View.VISIBLE); + mCoupons = s; + } + }); + mViewModel.mCouponsLegalData.observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + mViewModel.getCouponsVipList(); + } + } + }); + mViewModel.mCouponsVipInfoListData.observe(this, new Observer>() { + @Override + public void onChanged(List vipInfos) { + Optional optional = vipInfos.stream().findFirst(); + if (optional.isPresent()) { + VipInfo vipInfo = optional.get(); + mViewDataBinding.tvCouponsVipOriginPrice.setText("¥" + vipInfo.getOrigin_price()); +// mViewDataBinding.tvCouponsVipPrice.setText("¥" + vipInfo.getPrice()); + mViewModel.getCouponsPayInfo(vipInfo.getId(), mCoupons); + } + } + }); + mViewModel.mCouponsOrderInfoData.observe(this, new Observer() { + @Override + public void onChanged(OrderInfo orderInfo) { + if (orderInfo != null) { + mViewModel.getCouponsQrCodeUrl(orderInfo.getOrder_sn()); + } + } + }); + mViewModel.mCouponsAlreadyActivatedData.observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + finish(); + } + }); + + mViewModel.mCouponsPayInfoData.observe(this, new Observer() { + @Override + public void onChanged(PayInfo payInfo) { + if (payInfo != null) { + String url = payInfo.getCode_url(); + long expireTime = payInfo.getTime_expire(); +// initWechatCountdown(expireTime); + mViewDataBinding.tvCouponsVipPrice.setText("¥" + payInfo.getPrice()); + Bitmap bitmap = BitmapUtils.createQRImage(url, 400, getColor(R.color.black), getColor(R.color.white)); + mViewDataBinding.ivCouponsQrcode.setImageBitmap(bitmap); + } + } + }); + } @Override @@ -197,6 +256,8 @@ public class ActivationActivity extends BaseMvvmActivity { + private static final String TAG = "ActivationViewModel"; + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); @@ -82,12 +84,12 @@ public class ActivationViewModel extends BaseViewModel>() { @Override public void onSubscribe(@NonNull Disposable d) { - Log.e("getPayUrl", "onSubscribe: "); + Log.e("getPayInfo", "onSubscribe: "); } @Override public void onNext(@NonNull BaseResponse baseResponse) { - Log.e("getPayUrl", "onNext: " + baseResponse); + Log.e("getPayInfo", "onNext: " + baseResponse); if (baseResponse.code == 200) { OrderInfo orderInfo = baseResponse.data; mOrderInfoData.setValue(orderInfo); @@ -102,12 +104,12 @@ public class ActivationViewModel extends BaseViewModel mCouponsLegalData = new MutableLiveData<>(); + public MutableLiveData mCouponsData = new MutableLiveData<>(); + + public void checkCoupons(String coupons) { + NetInterfaceManager.getInstance().getCheckCouponsControl(coupons) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("checkCoupons", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("checkCoupons", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + mCouponsLegalData.setValue(true); + mCouponsData.setValue(coupons); + } else { + Toaster.show(baseResponse.msg); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("checkCoupons", "onError: "); + } + + @Override + public void onComplete() { + Log.e("checkCoupons", "onComplete: "); + } + }); + } + + public MutableLiveData> mCouponsVipInfoListData = new MutableLiveData<>(); + + public void getCouponsVipList() { + NetInterfaceManager.getInstance().getVipListControl() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getCouponsVipList", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getCouponsVipList", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + List vipInfos = listBaseResponse.data; + mCouponsVipInfoListData.setValue(vipInfos); + } else { + Toaster.show(listBaseResponse.msg); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getCouponsVipList", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getCouponsVipList", "onComplete: "); + } + }); + } + + public MutableLiveData mCouponsOrderInfoData = new MutableLiveData<>(); + public MutableLiveData mCouponsAlreadyActivatedData = new MutableLiveData<>(); + + public void getCouponsPayInfo(String vipId, String coupons) { + NetInterfaceManager.getInstance().getBuyVipControl(vipId, coupons) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getCouponsPayInfo", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("getCouponsPayInfo", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + OrderInfo orderInfo = baseResponse.data; + mCouponsOrderInfoData.setValue(orderInfo); + } else if (baseResponse.code == 4009) { + ActivationUtil.getInstance().setActivation(1); + + mCouponsAlreadyActivatedData.setValue(true); + } else { + Toaster.show(baseResponse.msg); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getCouponsPayInfo", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getCouponsPayInfo", "onComplete: "); + } + }); + } + + public MutableLiveData mCouponsPayInfoData = new MutableLiveData<>(); + + public void getCouponsQrCodeUrl(String orderSn) { + NetInterfaceManager.getInstance().getPayQrcodeControl(orderSn) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getQrCodeUrl", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("getQrCodeUrl", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + PayInfo payInfo = baseResponse.data; + mCouponsPayInfoData.setValue(payInfo); + } else { + Toaster.show(baseResponse.data); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getQrCodeUrl", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getQrCodeUrl", "onComplete: "); + } + }); + } + } diff --git a/app/src/main/java/com/xwad/os/activity/homework/HomeworkDetailsActivity.java b/app/src/main/java/com/xwad/os/activity/homework/HomeworkDetailsActivity.java index a68b64d..79ccf73 100644 --- a/app/src/main/java/com/xwad/os/activity/homework/HomeworkDetailsActivity.java +++ b/app/src/main/java/com/xwad/os/activity/homework/HomeworkDetailsActivity.java @@ -109,9 +109,9 @@ public class HomeworkDetailsActivity extends BaseMvvmActivity() { @Override - public void onChanged(AppInfo appUpdateInfo) { - if (appUpdateInfo == null) { + public void onChanged(AppInfo appInfo) { + if (appInfo == null) { // Toaster.show("已是最新版本"); } else { - if (ApkUtils.isUpdate(UserActivity.this, appUpdateInfo)) { + if (ApkUtils.isUpdate(UserActivity.this, appInfo)) { Intent intent = new Intent(UserActivity.this, UpdateActivity.class); - intent.putExtra("appUpdateInfo", appUpdateInfo); + intent.putExtra("appUpdateInfo", appInfo); startActivity(intent); Toaster.show("有新的版本需要更新"); } else { diff --git a/app/src/main/java/com/xwad/os/fragment/usercenter/device/DeviceFragment.java b/app/src/main/java/com/xwad/os/fragment/usercenter/device/DeviceFragment.java index 77acc38..850c3ce 100644 --- a/app/src/main/java/com/xwad/os/fragment/usercenter/device/DeviceFragment.java +++ b/app/src/main/java/com/xwad/os/fragment/usercenter/device/DeviceFragment.java @@ -53,13 +53,13 @@ public class DeviceFragment extends BaseMvvmFragment() { @Override - public void onChanged(AppInfo appUpdateInfo) { - if (appUpdateInfo == null) { + public void onChanged(AppInfo appInfo) { + if (appInfo == null) { Toaster.show("已是最新版本"); } else { - if (ApkUtils.isUpdate(mContext, appUpdateInfo)) { + if (ApkUtils.isUpdate(mContext, appInfo)) { Intent intent = new Intent(mContext, UpdateActivity.class); - intent.putExtra("appUpdateInfo", appUpdateInfo); + intent.putExtra("appUpdateInfo", appInfo); startActivity(intent); Toaster.show("有新的版本需要更新"); } else { diff --git a/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java b/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java index 809ae0b..09df1fd 100644 --- a/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java +++ b/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java @@ -521,6 +521,20 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable> getBuyVipControl(String vipId, String coupons) { + return mRetrofit.create(UserApi.class) + .buyVip(getToken(), DeviceSNManager.getDeviceSN(), vipId, coupons) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getCheckCouponsControl(String coupons) { + return mRetrofit.create(UserApi.class) + .checkCoupons(getToken(), coupons) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + public Observable getCodeActivationControl(String code) { return mRetrofit.create(UserApi.class) .codeActivation(getToken(), DeviceSNManager.getDeviceSN(), code) diff --git a/app/src/main/java/com/xwad/os/network/UrlAddress.java b/app/src/main/java/com/xwad/os/network/UrlAddress.java index 0688892..ffa68da 100644 --- a/app/src/main/java/com/xwad/os/network/UrlAddress.java +++ b/app/src/main/java/com/xwad/os/network/UrlAddress.java @@ -24,6 +24,9 @@ public class UrlAddress { public static final String VIP_LIST = "user/vip-list"; /*购买VIP下订单*/ public static final String BUY = "user/buy"; + /*优惠口令查询*/ + public static final String DISCOUNT_CODE_QUERY = "user/discount-code-query"; + /*激活码激活*/ public static final String activation_code = "activation/code"; /*获取激活码(激活成功后才有)*/ diff --git a/app/src/main/java/com/xwad/os/network/api/UserApi.java b/app/src/main/java/com/xwad/os/network/api/UserApi.java index 8f9ec49..eb2bcdf 100644 --- a/app/src/main/java/com/xwad/os/network/api/UserApi.java +++ b/app/src/main/java/com/xwad/os/network/api/UserApi.java @@ -38,6 +38,21 @@ public interface UserApi { @Field("vip_level_id") String vip_level_id ); + @FormUrlEncoded + @POST(UrlAddress.BUY) + Observable> buyVip( + @Header("token") String token, + @Field("sn") String sn, + @Field("vip_level_id") String vip_level_id, + @Field("discount_code") String coupons + ); + + @GET(UrlAddress.DISCOUNT_CODE_QUERY) + Observable checkCoupons( + @Header("token") String token, + @Query("discount_code") String discount_code + ); + @FormUrlEncoded @POST(UrlAddress.activation_code) Observable codeActivation( diff --git a/app/src/main/res/drawable-xxhdpi/icon_activation_use_coupons.png b/app/src/main/res/drawable-xxhdpi/icon_activation_use_coupons.png index 3fb340b..f746af5 100644 Binary files a/app/src/main/res/drawable-xxhdpi/icon_activation_use_coupons.png and b/app/src/main/res/drawable-xxhdpi/icon_activation_use_coupons.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_activation_use_key.png b/app/src/main/res/drawable-xxhdpi/icon_activation_use_key.png index 0b27f3a..76dcdaa 100644 Binary files a/app/src/main/res/drawable-xxhdpi/icon_activation_use_key.png and b/app/src/main/res/drawable-xxhdpi/icon_activation_use_key.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_activation_use_qrcode.png b/app/src/main/res/drawable-xxhdpi/icon_activation_use_qrcode.png index 5b9929c..d9bddb4 100644 Binary files a/app/src/main/res/drawable-xxhdpi/icon_activation_use_qrcode.png and b/app/src/main/res/drawable-xxhdpi/icon_activation_use_qrcode.png differ diff --git a/app/src/main/res/layout/activity_activation.xml b/app/src/main/res/layout/activity_activation.xml index 0912630..7227396 100644 --- a/app/src/main/res/layout/activity_activation.xml +++ b/app/src/main/res/layout/activity_activation.xml @@ -162,7 +162,7 @@ android:textSize="9sp" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +