BaseFragment.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. package com.edufound.reader.base;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.os.Bundle;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.Toast;
  10. import com.alibaba.fastjson.JSONObject;
  11. import com.baidu.duer.bot.directive.payload.AmountInfo;
  12. import com.baidu.duer.botsdk.BotIntent;
  13. import com.baidu.duer.botsdk.IAccountChargeMsgListener;
  14. import com.edufound.reader.apiserver.UserApiServerImpl;
  15. import com.edufound.reader.application.EApplication;
  16. import com.edufound.reader.bean.BaiDuUserInfo;
  17. import com.edufound.reader.bean.ChannelCodeEnum;
  18. import com.edufound.reader.bean.HttpResultBean;
  19. import com.edufound.reader.bean.SignBean;
  20. import com.edufound.reader.bean.UserBean;
  21. import com.edufound.reader.botsdk.BotRegisterListener;
  22. import com.edufound.reader.botsdk.IBotIntentCallback;
  23. import com.edufound.reader.cusview.CusToast;
  24. import com.edufound.reader.receiver.NetworkChangeReceiver;
  25. import com.edufound.reader.util.Consts;
  26. import com.edufound.reader.util.DeviceUuidFactory;
  27. import com.edufound.reader.util.EfunboxUtil;
  28. import com.edufound.reader.util.MMKVEncodeKey;
  29. import com.edufound.reader.util.MMKVUtil;
  30. import com.google.gson.Gson;
  31. import com.google.gson.reflect.TypeToken;
  32. import com.jakewharton.rxbinding4.view.RxView;
  33. import com.okhttplib.HttpInfo;
  34. import com.okhttplib.callback.Callback;
  35. import com.orhanobut.logger.Logger;
  36. import java.io.IOException;
  37. import java.util.HashMap;
  38. import java.util.Map;
  39. import java.util.concurrent.TimeUnit;
  40. import androidx.annotation.NonNull;
  41. import androidx.fragment.app.Fragment;
  42. import io.reactivex.rxjava3.annotations.Nullable;
  43. import io.reactivex.rxjava3.disposables.CompositeDisposable;
  44. import io.reactivex.rxjava3.disposables.Disposable;
  45. import io.reactivex.rxjava3.functions.Consumer;
  46. public abstract class BaseFragment extends Fragment {
  47. public CompositeDisposable mCompositeDisposable;
  48. Gson mGson;
  49. @Override
  50. public void onCreate(@Nullable Bundle savedInstanceState) {
  51. super.onCreate(savedInstanceState);
  52. mGson = new Gson();
  53. // 注册网络广播
  54. NetworkChangeReceiver.registerReceiver(getContext());
  55. NetworkChangeReceiver.registerObserver(NetStateChangeObserver);
  56. }
  57. @Nullable
  58. @Override
  59. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
  60. EfunboxUtil.initDesignSize(getActivity());
  61. View view = inflater.inflate(this.getLayoutId(), container, false);
  62. initView(view);
  63. initViewListener();
  64. return view;
  65. }
  66. @Override
  67. public void onAttach(@NonNull Context context) {
  68. super.onAttach(context);
  69. if (Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
  70. BotRegisterListener.registerListener(mBotIntentCallBack, mIAccountChargeMsgListener);
  71. }
  72. }
  73. @Override
  74. public void onDetach() {
  75. super.onDetach();
  76. }
  77. @Override
  78. public void onDestroyView() {
  79. super.onDestroyView();
  80. }
  81. /**
  82. * 初始化视图
  83. *
  84. * @param view
  85. */
  86. protected abstract void initView(View view);
  87. protected abstract int getLayoutId();
  88. protected abstract void initViewListener();
  89. /**
  90. * 添加订阅
  91. */
  92. public void addDisposable(Disposable mDisposable) {
  93. if (mCompositeDisposable == null) {
  94. mCompositeDisposable = new CompositeDisposable();
  95. }
  96. mCompositeDisposable.add(mDisposable);
  97. }
  98. /**
  99. * 取消所有订阅
  100. */
  101. public void clearDisposable() {
  102. if (mCompositeDisposable != null) {
  103. mCompositeDisposable.clear();
  104. }
  105. }
  106. @Override
  107. public void onDestroy() {
  108. BotRegisterListener.removeListener(mBotIntentCallBack);
  109. clearDisposable();
  110. super.onDestroy();
  111. }
  112. @SuppressLint("AutoDispose")
  113. public void addUiClickListener(View view, Consumer onNext) {
  114. addDisposable(RxView.clicks(view).throttleFirst(2, TimeUnit.SECONDS).subscribe(onNext));
  115. }
  116. public abstract void onGetDisconnect();
  117. public abstract void onGetMobileConnect();
  118. public abstract void onGetWifiConnect();
  119. NetworkChangeReceiver.NetStateChangeObserver NetStateChangeObserver = new NetworkChangeReceiver.NetStateChangeObserver() {
  120. @Override
  121. public void onDisconnect() {
  122. //断网了
  123. onGetDisconnect();
  124. }
  125. @Override
  126. public void onMobileConnect() {
  127. //有网了(移动网络)
  128. onGetMobileConnect();
  129. }
  130. @Override
  131. public void onWifiConnect() {
  132. //有网了(wifi)
  133. onGetWifiConnect();
  134. }
  135. };
  136. protected void refUserInfo(UserBean bean) {
  137. }
  138. //百度的回调逻辑代码块
  139. protected void botHandleIntent(BotIntent intent, String customData) {
  140. }
  141. protected void botOnClickLink(String url, HashMap<String, String> paramMap) {
  142. }
  143. protected void botOnHandleScreenNavigatorEvent(int event) {
  144. }
  145. protected void botOnLinkAccountSucceed(String s, String s1) {
  146. }
  147. protected void botOnChargeStatusUpdated(String purchaseResult, AmountInfo authorizationAmount,
  148. AmountInfo capturedAmount, long creationTimestamp,
  149. String baiduOrderReferenceId, String sellerOrderId, String msg) {
  150. }
  151. protected void botOnBuyStatusUpdated(@NonNull final String purchaseResult,
  152. @NonNull final String productId,
  153. @NonNull final String baiduOrderId,
  154. @NonNull final String sellerOrderId, @Nullable final String msg, String token) {
  155. }
  156. IBotIntentCallback mBotIntentCallBack = new IBotIntentCallback() {
  157. @Override
  158. public void handleIntent(BotIntent intent, String customData) {
  159. Logger.e("fragment---intent.name:" + intent.name);
  160. if (intent.name.equals("all_login")) {
  161. //用户主动要求登录
  162. Consts.setIsNeedLogin(true);
  163. EfunboxUtil.userLogin(EApplication.mActivityList.get(EApplication.mActivityList.size() - 1), getView());
  164. return;
  165. } else if (intent.name.equals("user_info")) {
  166. //获取是不是百度VIP
  167. Consts.setmConstsBaiDuUserBean(mGson.fromJson(customData, BaiDuUserInfo.class));
  168. Logger.e("json----" + mGson.toJson(Consts.getmConstsBaiDuUserBean()));
  169. if (Consts.getIsNeedLogin()) {
  170. BotRegisterListener.BaiDuLogin();
  171. } else {
  172. Consts.setIsNeedLogin(true);
  173. }
  174. botHandleIntent(intent, customData);
  175. return;
  176. }
  177. if (BotRegisterListener.isNoLoginIntent(intent)) {
  178. //不是获取手机号
  179. Logger.e("不是获取手机号--不是获取手机号:" + intent.name + "---" + intent.slots.toString());
  180. botHandleIntent(intent, customData);
  181. } else {
  182. Logger.e("是获取手机号--是获取手机号");
  183. //是获取手机号
  184. if (intent.slots.get(0).value.equals("SUCCESS")) {
  185. //获取手机号Token成功
  186. String token = intent.slots.get(1).value;
  187. UserApiServerImpl userApiServer = new UserApiServerImpl();
  188. Activity topActivity = EApplication.mActivityList.get(EApplication.mActivityList.size() - 1);
  189. userApiServer.getBaiDuUserPhone(topActivity, token, new Callback() {
  190. @Override
  191. public void onSuccess(HttpInfo info) throws IOException {
  192. JSONObject object = JSONObject.parseObject(info.getRetDetail().toString());
  193. String phone = JSONObject.parseObject(object.getString("data")).getString("phone");
  194. if (EfunboxUtil.isMobileNO(phone)) {
  195. Map<String, String> map = new HashMap<>();
  196. map.put("deviceCode", DeviceUuidFactory.getUuid());
  197. map.put("channel", Consts.getUMengChannel());
  198. map.put("mobileNo", phone);
  199. map.put("nickName", EfunboxUtil.setPhoneMiddle(phone));
  200. Logger.e("Consts.getmConstsBaiDuUserBean().getUserInfo().getUserId():" + Consts.getmConstsBaiDuUserBean().getUserInfo().getUserId());
  201. map.put("userId", Consts.getmConstsBaiDuUserBean().getUserInfo().getUserId());
  202. if (MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE).equals("") || MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE) == null) {
  203. //如果没有,默认给一年级
  204. map.put("grade", "PRIMARY_FIRST_GRADE");
  205. } else {
  206. map.put("grade", MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE));
  207. }
  208. String json = mGson.toJson(map);
  209. userApiServer.registerUserId(topActivity, json, new Callback() {
  210. @Override
  211. public void onSuccess(HttpInfo info) throws IOException {
  212. Logger.e("注册用户:" + info.getRetDetail());
  213. HttpResultBean<UserBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserBean>>() {
  214. }.getType());
  215. Consts.setUID(bean.getData().getUid());
  216. //用户是否登录,登录了,创建Consts的userbean
  217. String nickName = EfunboxUtil.setPhoneMiddle(bean.getData().getMobile());
  218. bean.getData().setNickName(nickName);
  219. Consts.setmConstsUserBean(bean.getData());
  220. refUserInfo(Consts.getmConstsUserBean());
  221. Toast.makeText(topActivity, "登录成功", Toast.LENGTH_SHORT).show();
  222. userApiServer.loginSign(topActivity, new Callback() {
  223. @Override
  224. public void onSuccess(HttpInfo info) throws IOException {
  225. HttpResultBean<SignBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<SignBean>>() {
  226. }.getType());
  227. if (bean.getData().getIsSign()) {
  228. CusToast.getInstance(topActivity).show("恭喜签到成功\n奖励" + bean.getData().getCount() + "朵小红花", 2000);
  229. }
  230. }
  231. @Override
  232. public void onFailure(HttpInfo info) throws IOException {
  233. }
  234. });
  235. }
  236. @Override
  237. public void onFailure(HttpInfo info) throws IOException {
  238. Logger.e("手机号注册失败:" + info.getRetDetail());
  239. // CusToast.getInstance(topActivity).show("注册失败",2000);
  240. Toast.makeText(topActivity, "注册失败", Toast.LENGTH_SHORT).show();
  241. }
  242. });
  243. } else {
  244. // CusToast.getInstance(topActivity).show("手机号不正确",2000);
  245. Toast.makeText(topActivity, "手机号不正确", Toast.LENGTH_SHORT).show();
  246. }
  247. }
  248. @Override
  249. public void onFailure(HttpInfo info) throws IOException {
  250. }
  251. });
  252. } else if (intent.slots.get(0).value.equals("FAIL")) {
  253. //获取手机号Token失败
  254. }
  255. }
  256. }
  257. @Override
  258. public void onClickLink(String url, HashMap<String, String> paramMap) {
  259. botOnClickLink(url, paramMap);
  260. }
  261. @Override
  262. public void onHandleScreenNavigatorEvent(int event) {
  263. botOnHandleScreenNavigatorEvent(event);
  264. }
  265. };
  266. IAccountChargeMsgListener mIAccountChargeMsgListener = new IAccountChargeMsgListener() {
  267. @Override
  268. public void onLinkAccountSucceed(String s, String s1) {
  269. botOnLinkAccountSucceed(s, s1);
  270. }
  271. @Override
  272. public void onChargeStatusUpdated(String purchaseResult, AmountInfo authorizationAmount,
  273. AmountInfo capturedAmount, long creationTimestamp,
  274. String baiduOrderReferenceId, String sellerOrderId, String msg) {
  275. botOnChargeStatusUpdated(purchaseResult, authorizationAmount, capturedAmount, creationTimestamp, baiduOrderReferenceId, sellerOrderId, msg);
  276. }
  277. @Override
  278. public void onBuyStatusUpdated(@NonNull final String purchaseResult,
  279. @NonNull final String productId,
  280. @NonNull final String baiduOrderId,
  281. @NonNull final String sellerOrderId, @Nullable final String msg, String token) {
  282. Consts.setIsNeedLogin(false);
  283. //处理支付回调
  284. Logger.e("purchaseResult:" + purchaseResult);
  285. Logger.e("productId:" + productId);
  286. Logger.e("baiduOrderId:" + baiduOrderId);
  287. Logger.e("sellerOrderId:" + sellerOrderId);
  288. Logger.e("msg:" + msg);
  289. Logger.e("token:" + token);
  290. if (purchaseResult.equals("SUCCESS")) {
  291. //成功
  292. } else if (purchaseResult.equals("ERROR")) {
  293. //支付失败
  294. }
  295. botOnBuyStatusUpdated(purchaseResult, productId, baiduOrderId, sellerOrderId, msg, token);
  296. }
  297. };
  298. @Override
  299. public void onResume() {
  300. super.onResume();
  301. if (Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
  302. if (!Consts.getIsNeedLogin()) {
  303. BotRegisterListener.getBaiDuVipInfo();
  304. }
  305. }
  306. }
  307. }