MemberViewModel.java 20 KB

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