MemberViewModel.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. package com.datarecovery.master.module.member;
  2. import android.text.TextUtils;
  3. import android.util.Pair;
  4. import androidx.lifecycle.LiveData;
  5. import androidx.lifecycle.MutableLiveData;
  6. import com.atmob.app.lib.base.BaseViewModel;
  7. import com.atmob.app.lib.handler.RxHttpHandler;
  8. import com.atmob.app.lib.livedata.SingleLiveEvent;
  9. import com.atmob.common.runtime.ActivityUtil;
  10. import com.atmob.common.runtime.ContextUtil;
  11. import com.datarecovery.master.R;
  12. import com.datarecovery.master.data.api.bean.MemberGoodsBean;
  13. import com.datarecovery.master.data.api.bean.PayOptionsBean;
  14. import com.datarecovery.master.data.api.bean.WechatPaymentSignBean;
  15. import com.datarecovery.master.data.api.response.MemberDetailResponse;
  16. import com.datarecovery.master.data.api.response.MemberPayResponse;
  17. import com.datarecovery.master.data.repositories.AccountRepository;
  18. import com.datarecovery.master.data.repositories.MemberRepository;
  19. import com.datarecovery.master.module.login.LoginActivity;
  20. import com.datarecovery.master.module.member.bean.EvaluateBean;
  21. import com.datarecovery.master.module.member.bean.SuperScenesBean;
  22. import com.datarecovery.master.module.wxrecover.WeChatRecoverActivity;
  23. import com.datarecovery.master.utils.BoxingUtil;
  24. import com.datarecovery.master.utils.ToastUtil;
  25. import com.google.gson.Gson;
  26. import java.util.ArrayList;
  27. import java.util.HashMap;
  28. import java.util.List;
  29. import java.util.Objects;
  30. import java.util.concurrent.TimeUnit;
  31. import javax.inject.Inject;
  32. import atmob.reactivex.rxjava3.annotations.NonNull;
  33. import atmob.reactivex.rxjava3.core.SingleObserver;
  34. import atmob.reactivex.rxjava3.disposables.Disposable;
  35. import atmob.rxjava.utils.RxJavaUtil;
  36. import dagger.hilt.android.lifecycle.HiltViewModel;
  37. import plus.pay.AgilePay;
  38. import plus.pay.alipay.AlipayInfo;
  39. import plus.pay.listener.AgilePayState;
  40. import plus.pay.wxpay.WXpayInfo;
  41. @HiltViewModel
  42. public class MemberViewModel extends BaseViewModel {
  43. private final MemberRepository memberRepository;
  44. private final MutableLiveData<String> subscribeTxt = new MutableLiveData<>();
  45. private final MutableLiveData<List<MemberGoodsBean>> memberGoodsList = new MutableLiveData<>();
  46. private final MutableLiveData<List<PayOptionsBean>> payWayList = new MutableLiveData<>();
  47. private final MutableLiveData<MemberGoodsBean> selectBean = new MutableLiveData<>();
  48. private final MutableLiveData<String> serviceContentTxt = new MutableLiveData<>();
  49. private final MutableLiveData<List<EvaluateBean>> evaluateList = new MutableLiveData<>();
  50. private final SingleLiveEvent<String> onSubscribeSuccessEvent = new SingleLiveEvent<>();
  51. private final Gson gson;
  52. private final AccountRepository accountRepository;
  53. private List<SuperScenesBean> superScenesBeans;
  54. private final SingleLiveEvent<Boolean> showLoadingEvent = new SingleLiveEvent<>();
  55. private final SingleLiveEvent<?> goTargetActEvent = new SingleLiveEvent<>();
  56. private final SingleLiveEvent<?> showChoicePayWayDialog = new SingleLiveEvent<>();
  57. private final SingleLiveEvent<Pair<String, String>> showWxQRPaymentEvent = new SingleLiveEvent<>();
  58. private final SingleLiveEvent<Pair<String, String>> showAliQRPaymentEvent = new SingleLiveEvent<>();
  59. @MemberType
  60. private String memberType;
  61. @Inject
  62. public MemberViewModel(MemberRepository memberRepository, Gson gson, AccountRepository accountRepository) {
  63. this.memberRepository = memberRepository;
  64. this.accountRepository = accountRepository;
  65. this.gson = gson;
  66. }
  67. public LiveData<?> getGoTargetActEvent() {
  68. return goTargetActEvent;
  69. }
  70. public String getMemberType() {
  71. return memberType;
  72. }
  73. public LiveData<String> getSubscribeTxt() {
  74. return subscribeTxt;
  75. }
  76. public LiveData<Pair<String, String>> getShowWxQRPaymentEvent() {
  77. return showWxQRPaymentEvent;
  78. }
  79. public LiveData<Pair<String, String>> getShowAliQRPaymentEvent() {
  80. return showAliQRPaymentEvent;
  81. }
  82. public LiveData<Boolean> getShowLoadingEvent() {
  83. return showLoadingEvent;
  84. }
  85. public LiveData<?> getShowChoicePayWayDialog() {
  86. return showChoicePayWayDialog;
  87. }
  88. public LiveData<String> getServiceContentTxt() {
  89. return serviceContentTxt;
  90. }
  91. public LiveData<MemberGoodsBean> getSelectBean() {
  92. return selectBean;
  93. }
  94. public void setSelectBean(MemberGoodsBean bean) {
  95. selectBean.setValue(bean);
  96. }
  97. public LiveData<List<MemberGoodsBean>> getMemberGoodsList() {
  98. return memberGoodsList;
  99. }
  100. public LiveData<List<PayOptionsBean>> getPayWayList() {
  101. return payWayList;
  102. }
  103. public List<SuperScenesBean> getSuperScenesBeans() {
  104. return superScenesBeans;
  105. }
  106. public LiveData<List<EvaluateBean>> getEvaluateList() {
  107. return evaluateList;
  108. }
  109. public LiveData<String> getOnSubscribeSuccessEvent() {
  110. return onSubscribeSuccessEvent;
  111. }
  112. public void setMemberType(@MemberType String type) {
  113. this.memberType = type;
  114. if (Objects.equals(memberType, MemberType.APP_IMAGE_CLEAN)) {
  115. subscribeTxt.setValue(ContextUtil.getContext().getString(R.string.member_clear_buy));
  116. } else {
  117. subscribeTxt.setValue(ContextUtil.getContext().getString(R.string.member_recover_buy));
  118. }
  119. initScenes();
  120. initCommentData();
  121. refreshMemberDetail();
  122. }
  123. private void initCommentData() {
  124. List<EvaluateBean> evaluateBeans = new ArrayList<>();
  125. evaluateBeans.add(new EvaluateBean(R.drawable.icon_evaluate_1, "冬季温暖优雅", "我非常满意数据恢复服务的效果。他们专业的团队帮助我成功恢复了丢失的文件,让我感到非常安心和放心。他们高效的工作速度和专业的技术水平让我对他们的服务印象深刻。强烈推荐!"));
  126. evaluateBeans.add(new EvaluateBean(R.drawable.icon_evaluate_2, "Starlight99", "我遇到了数据丢失的问题,但幸运的是找到了文件数据恢复大师。他们的技术团队非常专业,通过他们的努力,我成功地恢复了关键文件。他们提供的服务超出了我的期望,我对他们的工作非常满意。如果您需要数据恢复,我强烈推荐选择他们!"));
  127. evaluateBeans.add(new EvaluateBean(R.drawable.icon_evaluate_3, "FreeSpirit777", "文件数据恢复大师为我提供了出色的帮助。他们的团队非常耐心地解释了整个恢复过程,并及时与我沟通进展。最重要的是,他们成功地找回了我认为已经永远丢失的数据。感谢他们的专业和高效服务!"));
  128. evaluateList.setValue(evaluateBeans);
  129. }
  130. private void initScenes() {
  131. superScenesBeans = new ArrayList<>();
  132. superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_1, R.string.scenes_message_recover));
  133. superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_2, R.string.scenes_friend_recover));
  134. superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_3, R.string.scenes_img_recover));
  135. superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_4, R.string.scenes_file_recover));
  136. superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_5, R.string.scenes_video_recover));
  137. superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_6, R.string.scenes_audio_recover));
  138. superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_7, R.string.scenes_more, ContextUtil.getContext().getString(R.string.stay_tuned)));
  139. }
  140. public void refreshMemberDetail() {
  141. if (TextUtils.isEmpty(memberType)) {
  142. return;
  143. }
  144. memberRepository.memberDetail(memberType)
  145. .map(memberDetailResponse -> {
  146. List<MemberGoodsBean> list = memberDetailResponse.getList();
  147. if (list != null && !list.isEmpty()) {
  148. for (MemberGoodsBean bean : list) {
  149. if (Objects.equals(bean.getAuths(), MemberType.APP_WX_MESSAGE_RECOVER)) {
  150. bean.setScenesArray(new String[]{"微信好友误删", "微信信息恢复", "导出微信记录", "左滑误删消息"});
  151. } else if (Objects.equals(bean.getAuths(), MemberType.APP_WX_FRIEND_RECOVER)) {
  152. bean.setScenesArray(new String[]{"微信好友被删", "微信好友找回", "恢复恢复好友"});
  153. } else if (Objects.equals(bean.getAuths(), MemberType.APP_IMAGE_RECOVER)) {
  154. bean.setScenesArray(new String[]{"相册误删图片", "手机图片丢失", "手机照片找回"});
  155. } else if (Objects.equals(bean.getAuths(), MemberType.APP_FILE_RECOVER)) {
  156. bean.setScenesArray(new String[]{"手机文件清理", "多类型文件找回", "微信/QQ文件找回"});
  157. } else if (Objects.equals(bean.getAuths(), MemberType.APP_VIDEO_RECOVER)) {
  158. bean.setScenesArray(new String[]{"误删手机视频", "手机视频丢失", "手机视频找回"});
  159. } else if (Objects.equals(bean.getAuths(), MemberType.APP_AUDIO_RECOVER)) {
  160. bean.setScenesArray(new String[]{"误删手机音频", "手机音频丢失", "手机音频找回"});
  161. } else if (Objects.equals(bean.getAuths(), MemberType.APP_IMAGE_CLEAN)) {
  162. bean.setScenesArray(new String[]{"手机图片彻底删除", "选择清除手机图片", "扫描手机图片"});
  163. }
  164. }
  165. }
  166. return memberDetailResponse;
  167. })
  168. .subscribe(new SingleObserver<MemberDetailResponse>() {
  169. @Override
  170. public void onSubscribe(@NonNull Disposable d) {
  171. addDisposable(d);
  172. }
  173. @Override
  174. public void onSuccess(@NonNull MemberDetailResponse memberDetailResponse) {
  175. memberGoodsList.setValue(memberDetailResponse.getList());
  176. payWayList.setValue(memberDetailResponse.getPayOptions());
  177. serviceContentTxt.setValue(memberDetailResponse.getDescription());
  178. }
  179. @Override
  180. public void onError(@NonNull Throwable e) {
  181. e.printStackTrace();
  182. }
  183. });
  184. }
  185. public boolean isMember() {
  186. return false;
  187. }
  188. public MemberGoodsBean getMostBuyItem() {
  189. List<MemberGoodsBean> memberBeans = memberGoodsList.getValue();
  190. if (memberBeans == null) {
  191. return null;
  192. }
  193. for (MemberGoodsBean memberBean : memberBeans) {
  194. if (Objects.equals(memberBean.getAuths(), MemberType.APP_SUPER_RECOVER)) {
  195. return memberBean;
  196. }
  197. }
  198. return null;
  199. }
  200. public void setCurrentSelectedMember(MemberGoodsBean memberBean) {
  201. if (Objects.equals(memberBean, selectBean.getValue())) {
  202. return;
  203. }
  204. selectBean.setValue(memberBean);
  205. }
  206. public void onRetainMemberSubscribeClick() {
  207. // if (!BoxingUtil.boxing(accountRepository.getIsLogin().getValue())) {
  208. // ToastUtil.show(R.string.no_login, ToastUtil.LENGTH_SHORT);
  209. // LoginActivity.start(ActivityUtil.getTopActivity());
  210. // return;
  211. // }
  212. MemberGoodsBean mostBuyItem = getMostBuyItem();
  213. if (mostBuyItem == null) {
  214. return;
  215. }
  216. setCurrentSelectedMember(mostBuyItem);
  217. //选择支付方式
  218. showChoicePayWayDialog.call();
  219. }
  220. public void onMemberSubscribeClick() {
  221. // if (!BoxingUtil.boxing(accountRepository.getIsLogin().getValue())) {
  222. // ToastUtil.show(R.string.no_login, ToastUtil.LENGTH_SHORT);
  223. // LoginActivity.start(ActivityUtil.getTopActivity());
  224. // return;
  225. // }
  226. MemberGoodsBean currentSelected = selectBean.getValue();
  227. if (currentSelected == null) {
  228. return;
  229. }
  230. //选择支付方式
  231. showChoicePayWayDialog.call();
  232. }
  233. public void submitOrder(int payPlatform, int payMethod) {
  234. MemberGoodsBean bean = selectBean.getValue();
  235. if (bean == null) {
  236. return;
  237. }
  238. memberRepository.requestPayOrder(bean.getId(), payPlatform, payMethod).subscribe(new SingleObserver<MemberPayResponse>() {
  239. @Override
  240. public void onSubscribe(@NonNull Disposable d) {
  241. addDisposable(d);
  242. showLoadingEvent.setValue(true);
  243. }
  244. @Override
  245. public void onSuccess(@NonNull MemberPayResponse memberPayResponse) {
  246. showLoadingEvent.setValue(false);
  247. if (payPlatform == 1 && payMethod == 2) {
  248. onWeChatPay(memberPayResponse.getWechatPayPrepayJson(), memberPayResponse.getOutTradeNo());
  249. } else if (payPlatform == 4 && payMethod == 2) {
  250. onWeChatScanPay(memberPayResponse.getWechatPayPrepayJson(), memberPayResponse.getOutTradeNo());
  251. } else if (payPlatform == 1 && payMethod == 1) {
  252. onAliPay(memberPayResponse.getAlipayOrderString(), memberPayResponse.getOutTradeNo());
  253. } else if (payPlatform == 4 && payMethod == 1) {
  254. onAliPayScan(memberPayResponse.getAlipayQrcodeHtml(), memberPayResponse.getOutTradeNo());
  255. }
  256. }
  257. @Override
  258. public void onError(@NonNull Throwable throwable) {
  259. throwable.printStackTrace();
  260. showLoadingEvent.setValue(false);
  261. if (throwable instanceof RxHttpHandler.ServerErrorException) {
  262. RxHttpHandler.ServerErrorException serverErrorException = (RxHttpHandler.ServerErrorException) throwable;
  263. ToastUtil.show(serverErrorException.getMsg(), ToastUtil.LENGTH_SHORT);
  264. } else {
  265. ToastUtil.show(R.string.member_payment_failed, ToastUtil.LENGTH_SHORT);
  266. }
  267. }
  268. });
  269. }
  270. private void onAliPayScan(String s, String orderId) {
  271. showAliQRPaymentEvent.setValue(new Pair<>(s, orderId));
  272. }
  273. private void onAliPay(String s, String orderId) {
  274. AlipayInfo alipayInfo = new AlipayInfo();
  275. alipayInfo.setContent(s);
  276. requestSdkPay(alipayInfo, orderId);
  277. }
  278. private void onWeChatScanPay(String s, String orderId) {
  279. showWxQRPaymentEvent.setValue(new Pair<>(s, orderId));
  280. }
  281. private void onWeChatPay(String s, String orderId) {
  282. try {
  283. WechatPaymentSignBean wechatPaymentSignBean = gson.fromJson(s, WechatPaymentSignBean.class);
  284. WXpayInfo wXpayInfo = new WXpayInfo();
  285. wXpayInfo.setAppid(wechatPaymentSignBean.getAppId());
  286. wXpayInfo.setPartnerid(wechatPaymentSignBean.getPartnerId());
  287. wXpayInfo.setPrepayid(wechatPaymentSignBean.getPrePayId());
  288. wXpayInfo.set_package(wechatPaymentSignBean.getPackageName());
  289. wXpayInfo.setNoncestr(wechatPaymentSignBean.getRandomStr());
  290. wXpayInfo.setTimestamp(wechatPaymentSignBean.getTimeStamp());
  291. wXpayInfo.setSign(wechatPaymentSignBean.getSign());
  292. requestSdkPay(wXpayInfo, orderId);
  293. } catch (Exception e) {
  294. e.printStackTrace();
  295. }
  296. }
  297. private void requestSdkPay(Object payInfo, String orderId) {
  298. AgilePay.pay(payInfo, ActivityUtil.getTopActivity(), new AgilePayState() {
  299. @Override
  300. public void error(int errno, String error) {
  301. if (errno == 6001) {
  302. //用户取消支付
  303. return;
  304. }
  305. ToastUtil.show(R.string.member_payment_failed, ToastUtil.LENGTH_SHORT);
  306. }
  307. @Override
  308. public void payError(int errno, String error) {
  309. if (errno == 6001) {
  310. //用户取消支付
  311. return;
  312. }
  313. ToastUtil.show(R.string.member_payment_failed, ToastUtil.LENGTH_SHORT);
  314. }
  315. @Override
  316. public void paySuccess(String result) {
  317. queryOrderStatus(orderId, true);
  318. }
  319. @Override
  320. public void payBefore() {
  321. }
  322. });
  323. }
  324. public @NonNull Disposable queryOrderStatus(String orderId, boolean showLoading) {
  325. return memberRepository.getPayStatus(orderId)
  326. .doOnSubscribe(disposable -> {
  327. if (showLoading) {
  328. showLoadingEvent.setValue(true);
  329. addDisposable(RxJavaUtil.timer(10, TimeUnit.SECONDS, () -> showLoadingEvent.setValue(false)));
  330. }
  331. })
  332. .subscribe(aBoolean -> {
  333. showLoadingEvent.setValue(false);
  334. if (BoxingUtil.boxing(aBoolean)) {
  335. if (BoxingUtil.boxing(accountRepository.getIsLogin().getValue())) {
  336. goTargetActEvent.call();
  337. }
  338. onSubscribeSuccessEvent.setValue(orderId);
  339. } else {
  340. }
  341. }, throwable -> {
  342. throwable.printStackTrace();
  343. showLoadingEvent.setValue(false);
  344. });
  345. }
  346. }