BaseFragment.java 15 KB

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