Browse Source

1.首页用户逻辑
2.视频点赞接口和显示逻辑
3.视频收藏/取消收藏接口和显示逻辑
4.评论界面逻辑
5.评论界面获取所有评论和回复
6.增加评论接口和显示逻辑

FailedToRead 3 years ago
parent
commit
8fa00041e0
76 changed files with 3559 additions and 559 deletions
  1. 4 2
      .idea/misc.xml
  2. 1 0
      app/src/main/AndroidManifest.xml
  3. 57 6
      app/src/main/java/com/edufound/reader/activity/CommentActivity.java
  4. 30 2
      app/src/main/java/com/edufound/reader/activity/MainActivity.java
  5. 2 1
      app/src/main/java/com/edufound/reader/activity/MyCollectionActivity.java
  6. 29 17
      app/src/main/java/com/edufound/reader/activity/RecordActivity.java
  7. 120 0
      app/src/main/java/com/edufound/reader/adapter/CommentItemAdapter.java
  8. 51 24
      app/src/main/java/com/edufound/reader/adapter/SlideVideoAdapter.java
  9. 4 4
      app/src/main/java/com/edufound/reader/adapter/SlideVideoDanMarqueenAdapter.java
  10. 97 0
      app/src/main/java/com/edufound/reader/apiserver/UserApiServerImpl.java
  11. 60 39
      app/src/main/java/com/edufound/reader/application/EApplication.java
  12. 8 0
      app/src/main/java/com/edufound/reader/base/BaseActivity.java
  13. 4 0
      app/src/main/java/com/edufound/reader/base/BasePresenter.java
  14. 151 0
      app/src/main/java/com/edufound/reader/bean/CommentListBean.java
  15. 488 0
      app/src/main/java/com/edufound/reader/bean/CommentListReplyBean.java
  16. 132 0
      app/src/main/java/com/edufound/reader/bean/FavoritesBean.java
  17. 40 0
      app/src/main/java/com/edufound/reader/bean/HttpResultBean.java
  18. 50 0
      app/src/main/java/com/edufound/reader/bean/HttpResultDataListBean.java
  19. 101 0
      app/src/main/java/com/edufound/reader/bean/MyInfoBean.java
  20. 65 0
      app/src/main/java/com/edufound/reader/bean/RecordResultBean.java
  21. 0 6
      app/src/main/java/com/edufound/reader/bean/SlideVideoBean.java
  22. 195 0
      app/src/main/java/com/edufound/reader/bean/UserBean.java
  23. 0 60
      app/src/main/java/com/edufound/reader/bean/UserInfoBean.java
  24. 227 0
      app/src/main/java/com/edufound/reader/bean/UserRecordBean.java
  25. 5 0
      app/src/main/java/com/edufound/reader/contract/CharacterFragmentContract.java
  26. 18 0
      app/src/main/java/com/edufound/reader/contract/CommentContract.java
  27. 0 7
      app/src/main/java/com/edufound/reader/contract/CrashDialogContract.java
  28. 3 1
      app/src/main/java/com/edufound/reader/contract/LoginAlertContract.java
  29. 14 1
      app/src/main/java/com/edufound/reader/contract/MainContract.java
  30. 5 1
      app/src/main/java/com/edufound/reader/contract/MyCollectionContract.java
  31. 13 6
      app/src/main/java/com/edufound/reader/contract/MyTabFragmentContract.java
  32. 29 5
      app/src/main/java/com/edufound/reader/contract/RecommendFragmentContract.java
  33. 13 1
      app/src/main/java/com/edufound/reader/contract/RecordContract.java
  34. 6 0
      app/src/main/java/com/edufound/reader/contract/SafflowerContract.java
  35. 1 1
      app/src/main/java/com/edufound/reader/cusview/AutoPollRecyclerView.java
  36. 29 2
      app/src/main/java/com/edufound/reader/cusview/RvListJzvdStd.java
  37. 1 1
      app/src/main/java/com/edufound/reader/fragment/CharacterFragment.java
  38. 23 28
      app/src/main/java/com/edufound/reader/fragment/MyTabFragment.java
  39. 66 21
      app/src/main/java/com/edufound/reader/fragment/RecommendFragment.java
  40. 3 0
      app/src/main/java/com/edufound/reader/model/CharacterFragmentModel.java
  41. 17 0
      app/src/main/java/com/edufound/reader/model/CommentModel.java
  42. 15 0
      app/src/main/java/com/edufound/reader/model/LoginAlertModel.java
  43. 3 0
      app/src/main/java/com/edufound/reader/model/MainModel.java
  44. 13 0
      app/src/main/java/com/edufound/reader/model/MyCollectionModel.java
  45. 2 2
      app/src/main/java/com/edufound/reader/model/MyFollowModel.java
  46. 17 0
      app/src/main/java/com/edufound/reader/model/MyTabFragmentModel.java
  47. 28 0
      app/src/main/java/com/edufound/reader/model/RecommendFragmentModel.java
  48. 12 0
      app/src/main/java/com/edufound/reader/model/SafflowerModel.java
  49. 35 5
      app/src/main/java/com/edufound/reader/popwindow/PopWindowUtil.java
  50. 5 0
      app/src/main/java/com/edufound/reader/presenter/CharacterFragmentPresenter.java
  51. 131 1
      app/src/main/java/com/edufound/reader/presenter/CommentPresenter.java
  52. 0 56
      app/src/main/java/com/edufound/reader/presenter/CrashDialogPresenter.java
  53. 45 27
      app/src/main/java/com/edufound/reader/presenter/LoginAlertPresenter.java
  54. 122 37
      app/src/main/java/com/edufound/reader/presenter/MainPresenter.java
  55. 30 9
      app/src/main/java/com/edufound/reader/presenter/MyCollectionPresenter.java
  56. 75 51
      app/src/main/java/com/edufound/reader/presenter/MyTabFragmentPresenter.java
  57. 65 29
      app/src/main/java/com/edufound/reader/presenter/PopWindowPresneter.java
  58. 120 32
      app/src/main/java/com/edufound/reader/presenter/RecommendFragmentPresenter.java
  59. 113 28
      app/src/main/java/com/edufound/reader/presenter/RecordPresenter.java
  60. 22 1
      app/src/main/java/com/edufound/reader/presenter/SafflowerPresenter.java
  61. 8 6
      app/src/main/java/com/edufound/reader/services/RecordServices.java
  62. 31 5
      app/src/main/java/com/edufound/reader/util/Consts.java
  63. 2 3
      app/src/main/java/com/edufound/reader/util/DeviceUuidFactory.java
  64. 62 0
      app/src/main/java/com/edufound/reader/util/EfunboxUtil.java
  65. 5 0
      app/src/main/java/com/edufound/reader/util/MMKVEncodeKey.java
  66. 25 21
      app/src/main/java/com/edufound/reader/util/MMKVUtil.java
  67. 69 0
      app/src/main/java/com/edufound/reader/util/OkHttpClient.java
  68. 172 0
      app/src/main/java/com/edufound/reader/util/TimeUtil.java
  69. BIN
      app/src/main/res/drawable/adapter_item_comment_item_recomment.png
  70. BIN
      app/src/main/res/drawable/adapter_item_comment_item_thumb_false.png
  71. BIN
      app/src/main/res/drawable/adapter_item_comment_item_thumb_true.png
  72. 4 2
      app/src/main/res/layout/activity_comment.xml
  73. 136 0
      app/src/main/res/layout/adapter_item_comment.xml
  74. 21 0
      app/src/main/res/layout/adapter_item_comment_relayout_item.xml
  75. 5 4
      app/src/main/res/layout/fragment_main_user.xml
  76. 4 4
      app/src/main/res/layout/popupwindow_record_status.xml

+ 4 - 2
.idea/misc.xml

@@ -24,7 +24,7 @@
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/fragmentRecommend/drawable/fragment_recommend_userhead_round.xml" value="0.26197916666666665" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/fragmentRecommend/drawable/slidevideo_switch_track.xml" value="0.32734375" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/fragmentRecommend/drawable/slidevideo_switch_track_selector.xml" value="0.32734375" />
-        <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/fragmentRecommend/layout/fragment_main_recommend.xml" value="4.0" />
+        <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/fragmentRecommend/layout/fragment_main_recommend.xml" value="0.33" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/fragmentRecommend/layout/popup_myorder.xml" value="0.2889294403892944" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/fragmentRecommend/layout/popupwindow_myorder.xml" value="0.2889294403892944" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/fragmentRecommend/layout/popupwindow_record_remove.xml" value="0.2980535279805353" />
@@ -68,6 +68,8 @@
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/activity_userinfo_setting.xml" value="0.33" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/activity_video.xml" value="0.18824087245139876" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/activity_web.xml" value="0.2731143552311436" />
+        <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/adapter_item_comment.xml" value="0.5" />
+        <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/adapter_item_comment_relayout_item.xml" value="0.25" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/adapter_item_message.xml" value="0.22" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/adapter_item_myfollow.xml" value="0.5" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/adapter_item_myollow.xml" value="0.25" />
@@ -81,7 +83,7 @@
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/cusjzplayer_controller.xml" value="0.2791970802919708" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/fragment_main_character.xml" value="0.18" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/fragment_main_recommend.xml" value="0.2" />
-        <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/fragment_main_user.xml" value="0.25" />
+        <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/fragment_main_user.xml" value="0.5" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/fragment_user_rv_bottom.xml" value="0.30103359173126615" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/fragment_user_rv_header.xml" value="0.2" />
         <entry key="..\:/WorkSpace/Git_WorkSpace/efunboxReader-android/efunboxReader-android-master/app/src/main/res/layout/lifecycle_exception.xml" value="0.2396593673965937" />

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -17,6 +17,7 @@
     <application
             android:name=".application.EApplication"
             android:allowBackup="true"
+            android:hardwareAccelerated="true"
             android:icon="${icon}"
             android:label="@string/app_name"
             android:roundIcon="${icon}"

+ 57 - 6
app/src/main/java/com/edufound/reader/activity/CommentActivity.java

@@ -1,11 +1,19 @@
 package com.edufound.reader.activity;
 
+import android.annotation.SuppressLint;
 import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
+import android.widget.RadioButton;
+import android.widget.Space;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import com.edufound.reader.R;
@@ -13,6 +21,8 @@ import com.edufound.reader.annotation.BindView;
 import com.edufound.reader.base.BaseMvpActivity;
 import com.edufound.reader.contract.CommentContract;
 import com.edufound.reader.presenter.CommentPresenter;
+import com.edufound.reader.util.Consts;
+import com.jakewharton.rxbinding4.view.RxView;
 import com.orhanobut.logger.Logger;
 
 import androidx.recyclerview.widget.RecyclerView;
@@ -23,7 +33,7 @@ public class CommentActivity extends BaseMvpActivity<CommentPresenter> implement
     Activity mActivity;
 
     @BindView(id = R.id.comment_touch_back)
-    FrameLayout mTouchBack;
+    Space mTouchBack;
 
     @BindView(id = R.id.comment_close_quick)
     ImageView mCloseKuaijie;
@@ -46,21 +56,24 @@ public class CommentActivity extends BaseMvpActivity<CommentPresenter> implement
     @BindView(id = R.id.comment_item_layout)
     RecyclerView mRecyclerView;
 
+    @BindView(id = R.id.comment_count)
+    TextView mCommentCount;
 
     @Override
     public int getLayoutId() {
         return R.layout.activity_comment;
     }
 
+    @SuppressLint("AutoDispose")
     @Override
     public void initView() {
         mActivity = this;
         mPresenter = new CommentPresenter();
         mPresenter.attachView(this);
-        addUiClickListener(mTouchBack, o -> {
-            Logger.e("123123123");
-            mActivity.finish();
-        });
+//        addUiClickListener(mTouchBack, o -> {
+//            Logger.e("123123123");
+//            mActivity.finish();
+//        });
         addUiClickListener(mBack, o -> {
             mActivity.finish();
         });
@@ -69,8 +82,24 @@ public class CommentActivity extends BaseMvpActivity<CommentPresenter> implement
         });
         addUiClickListener(mSendComment, o -> {
             Toast.makeText(getActivity(), "发送评论", Toast.LENGTH_SHORT).show();
+            if (!TextUtils.isEmpty(mCommentEdit.getText().toString().trim())) {
+                mPresenter.doPosts(mCommentEdit.getText().toString());
+            }
         });
-        mPresenter.initComment(mRecyclerView, mNoCommentLayout);
+        RxView.focusChanges(mCommentEdit).subscribe(hasFocus -> {
+            if (!hasFocus) {
+                InputMethodManager manager = ((InputMethodManager) Consts.getmApplicAtion().getSystemService(Context.INPUT_METHOD_SERVICE));
+                if (manager != null)
+                    manager.hideSoftInputFromWindow(mCommentEdit.getWindowToken(), 0);
+            }
+        });
+        Bundle params = getIntent().getBundleExtra("params_bundle");
+        String exampleId = params.getString("exampleId");
+        if (TextUtils.isEmpty(exampleId)) {
+            Logger.e("获取参数失败");
+        } else {
+            mPresenter.getAllComment(String.valueOf(exampleId), String.valueOf(1));
+        }
 
     }
 
@@ -113,4 +142,26 @@ public class CommentActivity extends BaseMvpActivity<CommentPresenter> implement
     public ViewGroup getRootView() {
         return findViewById(android.R.id.content);
     }
+
+    @Override
+    public void getCommentAllSuccess() {
+        mPresenter.initComment(mRecyclerView, mNoCommentLayout);
+    }
+
+    @Override
+    public void setMaxCommentCount(int count) {
+        mCommentCount.setText("评论 " + count);
+    }
+
+    @Override
+    public void editRequestFocus() {
+        mCommentEdit.requestFocus();
+        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+        imm.showSoftInput(mCommentEdit, InputMethodManager.SHOW_IMPLICIT);
+    }
+
+    @Override
+    public void moveRecyclearView(int scroll) {
+        mRecyclerView.smoothScrollToPosition(scroll);
+    }
 }

+ 30 - 2
app/src/main/java/com/edufound/reader/activity/MainActivity.java

@@ -13,9 +13,31 @@ import com.edufound.reader.base.BaseMvpActivity;
 import com.edufound.reader.contract.MainContract;
 import com.edufound.reader.popwindow.PopWindowUtil;
 import com.edufound.reader.presenter.MainPresenter;
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.DeviceUuidFactory;
+import com.edufound.reader.util.MMKVEncodeKey;
+import com.edufound.reader.util.MMKVUtil;
+import com.google.gson.Gson;
+import com.orhanobut.logger.Logger;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
 
 import cn.jzvd.Jzvd;
 import cn.jzvd.JzvdStd;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
 
 public class MainActivity extends BaseMvpActivity<MainPresenter> implements MainContract.View {
 
@@ -44,10 +66,11 @@ public class MainActivity extends BaseMvpActivity<MainPresenter> implements Main
                 mPresenter.onRadioChecked(radioGroup, id);
             }
         });
-        int defaultIndex = getIntent().getIntExtra("defaultIndex", 1);
-        ((RadioButton) mRadioGroupTab.getChildAt(defaultIndex)).setChecked(true);
+
+        mPresenter.userIsLogin();
         mPresenter.checkModelIsDebug();
 
+
     }
 
 
@@ -129,4 +152,9 @@ public class MainActivity extends BaseMvpActivity<MainPresenter> implements Main
     }
 
 
+    @Override
+    public void setCheckIndex() {
+        int defaultIndex = getIntent().getIntExtra("defaultIndex", 1);
+        ((RadioButton) mRadioGroupTab.getChildAt(defaultIndex)).setChecked(true);
+    }
 }

+ 2 - 1
app/src/main/java/com/edufound/reader/activity/MyCollectionActivity.java

@@ -35,10 +35,11 @@ public class MyCollectionActivity extends BaseMvpActivity<MyCollectionPresenter>
         mActivity = this;
         mPresenter = new MyCollectionPresenter();
         mPresenter.attachView(this);
-        mPresenter.initRecyclerView(mRecyclerView);
         addUiClickListener(mBack, o -> {
             mActivity.finish();
         });
+        mPresenter.initRecyclerView(mRecyclerView);
+        mPresenter.getFavoritesData(mRecyclerView);
     }
 
     @Override

+ 29 - 17
app/src/main/java/com/edufound/reader/activity/RecordActivity.java

@@ -48,9 +48,10 @@ public class RecordActivity extends BaseMvpActivity<RecordPresenter> implements
 
     @Override
     public void initView() {
+        mActivity = this;
         mPresenter = new RecordPresenter();
         mPresenter.attachView(this);
-        mActivity = this;
+        mPresenter.bindRecordServices();
         mPresenter.createVideoPlayer(mPlayerFrame);
 //        mPresenter.addVideoController(mPlayerFrame);
         mPresenter.initVideoPlayer(getIntent());
@@ -59,20 +60,9 @@ public class RecordActivity extends BaseMvpActivity<RecordPresenter> implements
         });
         addUiClickListener(mMikeIcon, o -> {
             if (isRecordNow) {
-                //正在朗读
-                mMikeAnim.stop();
-                mMikeAnim = null;
-                mMikeIcon.setBackgroundResource(R.drawable.to_record_icon_mike);
-                isRecordNow = false;
-                mRecordStatus.setText("开始朗读");
-                mPresenter.showRecordStatusWindow();
+                refRecordStatus();
             } else {
-                //没有朗读
-                mMikeIcon.setBackgroundResource(R.drawable.activity_record_start_anim);
-                mMikeAnim = (AnimationDrawable) mMikeIcon.getBackground();
-                mMikeAnim.start();
-                isRecordNow = true;
-                mRecordStatus.setText("配音中");
+                startRecordStatus();
             }
         });
         addUiClickListener(mDemonsFrame, o -> {
@@ -123,24 +113,46 @@ public class RecordActivity extends BaseMvpActivity<RecordPresenter> implements
 
     @Override
     protected void onDestroy() {
-        super.onDestroy();
         mPresenter.activityDestroy();
+        super.onDestroy();
     }
 
     @Override
     protected void onPause() {
-        super.onPause();
         mPresenter.activityPause();
+        super.onPause();
     }
 
     @Override
     protected void onResume() {
-        super.onResume();
         mPresenter.activityResume();
+        super.onResume();
     }
 
     @Override
     public ViewGroup getRootView() {
         return findViewById(android.R.id.content);
     }
+
+    @Override
+    public void refRecordStatus() {
+        //正在朗读
+        mMikeAnim.stop();
+        mMikeAnim = null;
+        mMikeIcon.setBackgroundResource(R.drawable.to_record_icon_mike);
+        isRecordNow = false;
+        mRecordStatus.setText("开始朗读");
+        mPresenter.stopRecord();
+    }
+
+    @Override
+    public void startRecordStatus() {
+        //没有朗读
+        mMikeIcon.setBackgroundResource(R.drawable.activity_record_start_anim);
+        mMikeAnim = (AnimationDrawable) mMikeIcon.getBackground();
+        mMikeAnim.start();
+        isRecordNow = true;
+        mRecordStatus.setText("配音中");
+        mPresenter.startRecord("不知道", "一二三四五六七");
+    }
 }

+ 120 - 0
app/src/main/java/com/edufound/reader/adapter/CommentItemAdapter.java

@@ -0,0 +1,120 @@
+package com.edufound.reader.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.edufound.reader.R;
+import com.edufound.reader.bean.CommentListReplyBean;
+import com.edufound.reader.util.GlideUtils;
+import com.edufound.reader.util.TimeUtil;
+import com.jakewharton.rxbinding4.view.RxView;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.functions.Consumer;
+import kotlin.Unit;
+
+public class CommentItemAdapter extends RecyclerView.Adapter<CommentItemHolder> {
+
+
+    private LayoutInflater mLayoutInflater;
+    private Context mContext;
+    private List<CommentListReplyBean> mListData;
+    private Consumer onClickReCommentNext;
+
+    public CommentItemAdapter(Context context, List<CommentListReplyBean> listData) {
+        mContext = context;
+        mLayoutInflater = LayoutInflater.from(context);
+        mListData = listData;
+
+
+    }
+
+
+    @NonNull
+    @Override
+    public CommentItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        return new CommentItemHolder(mLayoutInflater.inflate(R.layout.adapter_item_comment, parent, false));
+    }
+
+    public void setOnClickReCommentNext(Consumer onnext) {
+        onClickReCommentNext = onnext;
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull CommentItemHolder holder, int position) {
+        GlideUtils.loadCircleImage(mContext, mListData.get(position).getUser().getAvatar(), holder.mUserHead);
+        holder.mNickName.setText("昵称:" + mListData.get(position).getUser().getMobile());
+        holder.mCommentText.setText(mListData.get(position).getDetailDesc());
+        if (mListData.get(position).getGmtCreated() != null) {
+            holder.mItemTime.setText("" + TimeUtil.timeStamp2Date(Long.valueOf(mListData.get(position).getGmtCreated()), "MM-dd"));
+        }
+        if (mListData.get(position).getIsLike()) {
+            holder.mThumbStatus.setImageResource(R.drawable.adapter_item_comment_item_thumb_true);
+        }
+        if (onClickReCommentNext != null) {
+            RxView.clicks(holder.mReCommentLayout).throttleFirst(2, TimeUnit.SECONDS).subscribe(onClickReCommentNext);
+        }
+        holder.mThumbNum.setText(mListData.get(position).getLikeCount());
+        if (mListData.get(position).getReplyVOList() != null && mListData.get(position).getReplyVOList().size() > 0) {
+            for (CommentListReplyBean.ReplyVOList item : mListData.get(position).getReplyVOList()) {
+                //有回复
+                holder.mReLayout.removeAllViews();
+                View view = mLayoutInflater.inflate(R.layout.adapter_item_comment_relayout_item, null);
+                TextView name = view.findViewById(R.id.adapter_item_comment_item_relayout_name);
+                TextView comment = view.findViewById(R.id.adapter_item_comment_item_relayout_comment);
+                name.setText(item.getUser().getMobile() + ":");
+                comment.setText(item.getContent());
+                holder.mReLayout.addView(view);
+            }
+        } else {
+            holder.mReLayout.setVisibility(View.GONE);
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return mListData.size();
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        return position;
+    }
+}
+
+class CommentItemHolder extends RecyclerView.ViewHolder {
+
+    TextView mNickName;
+    TextView mCommentText;
+    LinearLayout mReLayout;
+    ImageView mUserHead;
+    LinearLayout mThumbLayout;
+    LinearLayout mReCommentLayout;
+    TextView mThumbNum;
+    ImageView mThumbStatus;
+    TextView mItemTime;
+
+    public CommentItemHolder(@NonNull View itemView) {
+        super(itemView);
+        mNickName = itemView.findViewById(R.id.adapter_item_comment_item_nickname);
+        mCommentText = itemView.findViewById(R.id.adapter_item_comment_item_comment);
+        mReLayout = itemView.findViewById(R.id.adapter_item_comment_item_relayout);
+        mUserHead = itemView.findViewById(R.id.adapter_item_comment_item_userhead);
+        mThumbLayout = itemView.findViewById(R.id.adapter_item_comment_item_comment_thumb_layout);
+        mThumbNum = mThumbLayout.findViewById(R.id.adapter_item_comment_item_comment_thumb_layout_thumbnum);
+        mThumbStatus = mThumbLayout.findViewById(R.id.adapter_item_comment_item_comment_thumb_layout_img_status);
+        mReCommentLayout = itemView.findViewById(R.id.adapter_item_comment_item_comment_recomment_layout);
+        mItemTime = itemView.findViewById(R.id.adapter_item_comment_item_time);
+    }
+}

+ 51 - 24
app/src/main/java/com/edufound/reader/adapter/SlideVideoAdapter.java

@@ -1,6 +1,6 @@
 package com.edufound.reader.adapter;
 
-import android.content.Context;
+import android.app.Activity;
 import android.graphics.Rect;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -9,19 +9,25 @@ import android.widget.CompoundButton;
 import android.widget.Switch;
 
 import com.edufound.reader.R;
-import com.edufound.reader.bean.SlideVideoBean;
+import com.edufound.reader.bean.CommentListBean;
+import com.edufound.reader.bean.HttpResultBean;
+import com.edufound.reader.bean.HttpResultDataListBean;
+import com.edufound.reader.bean.UserRecordBean;
 import com.edufound.reader.cusview.AutoPollRecyclerView;
 import com.edufound.reader.cusview.RvListJzvdStd;
-import com.edufound.reader.util.SizeUtils;
-import com.edufound.reader.videoutil.JZMediaIjk;
+import com.edufound.reader.util.Consts;
 import com.edufound.reader.util.GlideUtils;
+import com.edufound.reader.util.OkHttpClient;
+import com.edufound.reader.util.SizeUtils;
+import com.google.gson.reflect.TypeToken;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 import com.orhanobut.logger.Logger;
 
-import java.util.ArrayList;
+import java.io.IOException;
 import java.util.List;
 
 import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.DividerItemDecoration;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import cn.jzvd.JZDataSource;
@@ -29,10 +35,10 @@ import cn.jzvd.JzvdStd;
 
 public class SlideVideoAdapter extends RecyclerView.Adapter<VideoHolder> {
     private LayoutInflater mLayoutInflater;
-    private Context mContext;
-    private List<SlideVideoBean> mListData;
+    private Activity mContext;
+    private List<UserRecordBean> mListData;
 
-    public SlideVideoAdapter(Context context, @NonNull List<SlideVideoBean> data) {
+    public SlideVideoAdapter(Activity context, @NonNull List<UserRecordBean> data) {
         mContext = context;
         mLayoutInflater = LayoutInflater.from(context);
         this.mListData = data;
@@ -40,7 +46,7 @@ public class SlideVideoAdapter extends RecyclerView.Adapter<VideoHolder> {
     }
 
 
-    public void addMored(List<SlideVideoBean> listData) {
+    public void addMored(List<UserRecordBean> listData) {
         Logger.e("loadMore---" + listData.size());
         mListData.addAll(listData);
     }
@@ -54,9 +60,9 @@ public class SlideVideoAdapter extends RecyclerView.Adapter<VideoHolder> {
 
     @Override
     public void onBindViewHolder(@NonNull VideoHolder holder, int position) {
-        holder.mItemView.setTag(holder);
-        holder.mVideo.setUp(new JZDataSource(mListData.get(position).videoUrl), JzvdStd.SCREEN_FULLSCREEN, JZMediaIjk.class);
-        GlideUtils.loadImageSizeKipMemoryCache(mContext, "http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640", holder.mVideo.posterImageView);
+        holder.mVideo.setUp(new JZDataSource(mListData.get(position).getUserRead().getVideoPath()), JzvdStd.SCREEN_FULLSCREEN);
+        GlideUtils.loadImageSizeKipMemoryCache(mContext, mListData.get(position).getUserRead().getCoverImg(), holder.mVideo.posterImageView);
+        holder.initDanMu(mListData.get(position).getUserRead().getExampleId());
         holder.mVideo.startPreloading();
         holder.mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
@@ -75,6 +81,12 @@ public class SlideVideoAdapter extends RecyclerView.Adapter<VideoHolder> {
     }
 
     @Override
+    public void onViewDetachedFromWindow(@NonNull VideoHolder holder) {
+        super.onViewDetachedFromWindow(holder);
+        holder.mSwitch.setChecked(false);
+    }
+
+    @Override
     public int getItemCount() {
         return mListData.size();
     }
@@ -91,22 +103,17 @@ class VideoHolder extends RecyclerView.ViewHolder {
     public RvListJzvdStd mVideo;
     public AutoPollRecyclerView mMarqueen;
     public Switch mSwitch;
+    public Activity mContext;
 
-    public VideoHolder(Context context, @NonNull View itemView) {
+    public VideoHolder(Activity context, @NonNull View itemView) {
         super(itemView);
+        mContext = context;
         mItemView = itemView;
         mVideo = itemView.findViewById((R.id.slidevideo_video));
         mMarqueen = itemView.findViewById(R.id.slidevideo_video_marqueen);
         mSwitch = itemView.findViewById(R.id.slidevideo_video_switch);
         mSwitch.setChecked(false);
-        List<String> list = new ArrayList<>();
-        for (int i = 0; i < 30; ) {
-            list.add(" Item: " + ++i);
-        }
-        SlideVideoDanMarqueenAdapter adapter = new SlideVideoDanMarqueenAdapter(context, list);
-        mMarqueen.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
-        mMarqueen.addItemDecoration(new SpacesItemDecoration(SizeUtils.dp2px(context, 20)));
-        mMarqueen.setAdapter(adapter);
+
         if (mSwitch.isChecked()) {
             mMarqueen.setVisibility(View.VISIBLE);
             mMarqueen.start();
@@ -115,6 +122,27 @@ class VideoHolder extends RecyclerView.ViewHolder {
             mMarqueen.stop();
         }
     }
+
+    public void initDanMu(String exampleId) {
+        Logger.e("exampleId:" + exampleId);
+        OkHttpClient.doGetAsync(mContext, new HttpInfo.Builder().setUrl(Consts.getFinalApi() + "/posts/list").addParam("exampleId", exampleId).addParam("pageNo", String.valueOf(1)).addParam("pageSize", "1000"), new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                Logger.e("获取弹幕成功:" + info.getRetDetail());
+                HttpResultBean<HttpResultDataListBean<CommentListBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<CommentListBean>>>() {
+                }.getType());
+                SlideVideoDanMarqueenAdapter adapter = new SlideVideoDanMarqueenAdapter(mContext, bean.getData().getList());
+                mMarqueen.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
+                mMarqueen.addItemDecoration(new SpacesItemDecoration(SizeUtils.dp2px(mContext, 20)));
+                mMarqueen.setAdapter(adapter);
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("获取弹幕失败:" + info.getRetDetail());
+            }
+        });
+    }
 }
 
 class SpacesItemDecoration extends RecyclerView.ItemDecoration {
@@ -125,8 +153,7 @@ class SpacesItemDecoration extends RecyclerView.ItemDecoration {
     }
 
     @Override
-    public void getItemOffsets(Rect outRect, View view,
-                               RecyclerView parent, RecyclerView.State state) {
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
         outRect.left = space;
         outRect.right = space;
 //        outRect.bottom = space;

+ 4 - 4
app/src/main/java/com/edufound/reader/adapter/SlideVideoDanMarqueenAdapter.java

@@ -8,7 +8,7 @@ import android.view.ViewGroup;
 import android.widget.TextView;
 
 import com.edufound.reader.R;
-import com.edufound.reader.cusview.RvListJzvdStd;
+import com.edufound.reader.bean.CommentListBean;
 
 import java.util.List;
 
@@ -18,9 +18,9 @@ import androidx.recyclerview.widget.RecyclerView;
 public class SlideVideoDanMarqueenAdapter extends RecyclerView.Adapter<MarqueenHolder> {
     private LayoutInflater mLayoutInflater;
     private final Context mContext;
-    private final List<String> mData;
+    private List<CommentListBean> mData;
 
-    public SlideVideoDanMarqueenAdapter(Context context, List<String> list) {
+    public SlideVideoDanMarqueenAdapter(Context context, List<CommentListBean> list) {
         this.mContext = context;
         this.mData = list;
         mLayoutInflater = LayoutInflater.from(context);
@@ -34,7 +34,7 @@ public class SlideVideoDanMarqueenAdapter extends RecyclerView.Adapter<MarqueenH
     @Override
     public void onBindViewHolder(MarqueenHolder holder, int position) {
 //        String data = mData.get(position % mData.size());
-        holder.mMarqueenText.setText(mData.get(position % mData.size()));
+        holder.mMarqueenText.setText(mData.get(position % mData.size()).getDetailDesc() + "---" + mData.get(position % mData.size()).getColumnNames());
     }
 
     @Override

+ 97 - 0
app/src/main/java/com/edufound/reader/apiserver/UserApiServerImpl.java

@@ -0,0 +1,97 @@
+package com.edufound.reader.apiserver;
+
+import android.app.Activity;
+
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.OkHttpClient;
+import com.google.gson.Gson;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
+
+public class UserApiServerImpl implements userApiServer {
+    private String API = Consts.getFinalApi();
+
+
+    /**
+     * 用户是否登录
+     */
+    @Override
+    public void isLogin(Activity activity, String deviceCode, Callback callback) {
+        OkHttpClient.doGetAsync(activity, HttpInfo.Builder().setUrl(API + "/user/isLogin").addParam("deviceCode", deviceCode), callback);
+    }
+
+    /**
+     * 获取用户信息
+     */
+    @Override
+    public void getUserInfo(Activity activity, Callback callback) {
+        OkHttpClient.doGetAsync(activity, HttpInfo.Builder().setUrl(API + "/user"), callback);
+    }
+
+
+    /**
+     * 注册用户
+     */
+    @Override
+    public void registerUser(Activity activity, String userJson, Callback callback) {
+        OkHttpClient.doPostAsync(activity, HttpInfo.Builder().addParamJson(userJson).setUrl(API + "/user/register"), callback);
+    }
+
+    /**
+     * 手机号注册
+     */
+    @Override
+    public void registerMobile(Activity activity, String userJson, Callback callback) {
+        OkHttpClient.doPostAsync(activity, HttpInfo.Builder().addParamJson(userJson).setUrl(API + "/user/registerMobile"), callback);
+    }
+
+
+    /**
+     * 更新用户信息
+     */
+    @Override
+    public void updateUserInfo(Activity activity, String userJson, Callback callback) {
+        OkHttpClient.doPutAsync(activity, HttpInfo.Builder().addParamJson(userJson).setUrl(API + "/user"), callback);
+    }
+
+    /**
+     * 退出登录
+     */
+    @Override
+    public void exitLogin(Activity activity, String deviceCode, Callback callback) {
+        OkHttpClient.doDeleteAsync(activity, HttpInfo.Builder().addParam("deviceCode", deviceCode).setUrl(API + "/member"), callback);
+    }
+}
+
+
+interface userApiServer {
+    /**
+     * 用户是否登录
+     */
+    void isLogin(Activity activity, String deviceCode, Callback callback);
+
+    /*
+     * 获取用户信息
+     * */
+    void getUserInfo(Activity activity, Callback callback);
+
+    /*
+     * 注册用户
+     * */
+    void registerUser(Activity activity, String userJson, Callback callback);
+
+
+    void registerMobile(Activity activity, String userJson, Callback callback);
+
+    /*
+     * 更新用户信息
+     * */
+    void updateUserInfo(Activity activity, String userJson, Callback callback);
+
+
+    /**
+     * 退出登录
+     */
+    void exitLogin(Activity activity, String deviceCode, Callback callback);
+
+}

+ 60 - 39
app/src/main/java/com/edufound/reader/application/EApplication.java

@@ -5,30 +5,22 @@ import android.app.ActivityManager;
 import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.os.Bundle;
-import android.os.Environment;
 import android.os.Handler;
 import android.os.Looper;
-import android.os.Process;
 import android.widget.Toast;
 
-import com.edufound.reader.BuildConfig;
 import com.edufound.reader.R;
 import com.edufound.reader.support.CrashLog;
 import com.edufound.reader.support.DebugSafeModeTipActivity;
 import com.edufound.reader.support.DebugSafeModeUI;
 import com.edufound.reader.util.Cockroach;
 import com.edufound.reader.util.Consts;
-import com.edufound.reader.util.CrashHandler;
+import com.edufound.reader.util.DeviceUuidFactory;
 import com.edufound.reader.util.ExceptionHandler;
-import com.edufound.reader.util.HttpInterceptor;
-import com.okhttplib.OkHttpUtil;
-import com.okhttplib.annotation.CacheType;
-import com.okhttplib.annotation.Encoding;
-import com.okhttplib.cookie.PersistentCookieJar;
-import com.okhttplib.cookie.cache.SetCookieCache;
-import com.okhttplib.cookie.persistence.SharedPrefsCookiePersistor;
+import com.edufound.reader.util.OkHttpClient;
 import com.orhanobut.logger.AndroidLogAdapter;
 import com.orhanobut.logger.FormatStrategy;
 import com.orhanobut.logger.Logger;
@@ -39,12 +31,9 @@ import com.umeng.commonsdk.UMConfigure;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlPullParserFactory;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
-import okhttp3.Request;
-
 public class EApplication extends Application {
 
     private int activityAount = 0;
@@ -64,29 +53,10 @@ public class EApplication extends Application {
             initException();
 
             XmlPullParserFactory.newInstance().setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
-            //初始化OKHTTP
-            String downloadFileDir = Environment.getExternalStorageDirectory().getPath() + "/okHttp_download/";
-            String cacheDir = Environment.getExternalStorageDirectory().getPath() + "/okHttp_cache";
-            OkHttpUtil.init(getApplicationContext())
-                    .setConnectTimeout(15)//连接超时时间
-                    .setWriteTimeout(15)//写超时时间
-                    .setReadTimeout(15)//读超时时间
-                    .setMaxCacheSize(10 * 1024 * 1024)//缓存空间大小
-                    .setCacheType(CacheType.FORCE_NETWORK)//缓存类型
-                    .setHttpLogTAG("HttpLog")//设置请求日志标识
-                    .setIsGzip(false)//Gzip压缩,需要服务端支持
-                    .setShowHttpLog(true)//显示请求日志
-                    .setShowLifecycleLog(false)//显示Activity销毁日志
-                    .setRetryOnConnectionFailure(false)//失败后不自动重连
-                    .setCachedDir(new File(cacheDir))//设置缓存目录
-                    .setDownloadFileDir(downloadFileDir)//文件下载保存目录
-                    .setResponseEncoding(Encoding.UTF_8)//设置全局的服务器响应编码
-                    .setRequestEncoding(Encoding.UTF_8)//设置全局的请求参数编码
-//                    .setHttpsCertificate("12306.cer")//设置全局Https证书
-                    .addResultInterceptor(HttpInterceptor.ResultInterceptor)//请求结果拦截器
-                    .addExceptionInterceptor(HttpInterceptor.ExceptionInterceptor)//请求链路异常拦截器
-                    .setCookieJar(new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(getApplicationContext())))//持久化cookie
-                    .build();
+
+            //初始化OKhttp3
+            OkHttpClient.initOkHttpUtil(getApplicationContext());
+
             //初始化logger
             FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                     .showThreadInfo(false)  // 是否显示线程信息,默认为ture
@@ -97,11 +67,20 @@ public class EApplication extends Application {
                     .build();
             Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
             //初始化友盟
+            UMConfigure.preInit(this, getUmengAppKey(), getUmengChannel());
             UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "");
 //            UMConfigure.preInit(this,"");
             //初始化MMKV
             MMKV.initialize(this);
-
+            //初始化DeviceUuidFactory
+            if (DeviceUuidFactory.getUuid() == null) {
+                new DeviceUuidFactory(getApplicationContext());
+            }
+            Logger.e("deviceUUID:" + DeviceUuidFactory.getUuid().toString());
+            if (Consts.isIsDebug()) {
+                Consts.setUID("test");
+            }
+            Logger.e("Consts.uid:" + Consts.getUID());
             //初始化activity监听
 //            registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
         } catch (XmlPullParserException e) {
@@ -227,4 +206,46 @@ public class EApplication extends Application {
         });
 
     }
+
+    public String getUmengChannel() {
+        String channelName = null;
+        try {
+            PackageManager packageManager = getPackageManager();
+            if (packageManager != null) {
+                //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
+                ApplicationInfo applicationInfo = packageManager.
+                        getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
+                if (applicationInfo != null) {
+                    if (applicationInfo.metaData != null) {
+                        channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
+                        Consts.setUmengChannel(channelName);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return channelName;
+    }
+
+
+    public String getUmengAppKey() {
+        String appkey = null;
+        try {
+            PackageManager packageManager = getPackageManager();
+            if (packageManager != null) {
+                //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
+                ApplicationInfo applicationInfo = packageManager.
+                        getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
+                if (applicationInfo != null) {
+                    if (applicationInfo.metaData != null) {
+                        appkey = String.valueOf(applicationInfo.metaData.get("UMENG_APPKEY"));
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return appkey;
+    }
 }

+ 8 - 0
app/src/main/java/com/edufound/reader/base/BaseActivity.java

@@ -30,6 +30,7 @@ import com.edufound.reader.util.Consts;
 import com.edufound.reader.util.EfunboxUtil;
 import com.edufound.reader.util.LiuHaiScreenUtil;
 import com.edufound.reader.util.PermissionsUtil;
+import com.google.gson.Gson;
 import com.jakewharton.rxbinding4.view.RxView;
 
 import java.lang.reflect.Field;
@@ -50,6 +51,8 @@ public abstract class BaseActivity extends AppCompatActivity {
     HomeKeyEventReceiver mHomeReceiver;
     //登录广播action
     private final String LOGIN_SUCCESS_ACTION = "efunbox.login.success";
+    //Gson
+    Gson mGson;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -68,6 +71,7 @@ public abstract class BaseActivity extends AppCompatActivity {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
             LiuHaiScreenUtil.openFullScreenModel(this);
         }
+        mGson = new Gson();
         //获取录音权限
         PermissionsUtil.verifyAudioPermissions(this);
         if (Consts.getScreenSize() == null) {
@@ -240,5 +244,9 @@ public abstract class BaseActivity extends AppCompatActivity {
 //
     }
 
+    public Gson getGson() {
+        return mGson;
+    }
+
 
 }

+ 4 - 0
app/src/main/java/com/edufound/reader/base/BasePresenter.java

@@ -3,6 +3,9 @@ package com.edufound.reader.base;
 import android.app.Activity;
 
 import com.edufound.reader.annotation.BindView;
+import com.edufound.reader.bean.CommentListReplyBean;
+import com.edufound.reader.bean.HttpResultBean;
+import com.google.gson.reflect.TypeToken;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
@@ -38,4 +41,5 @@ public class BasePresenter<V extends BaseView> {
         return mView != null;
     }
 
+
 }

+ 151 - 0
app/src/main/java/com/edufound/reader/bean/CommentListBean.java

@@ -0,0 +1,151 @@
+package com.edufound.reader.bean;
+
+import java.util.List;
+
+public class CommentListBean {
+    private String columnId;
+    private String columnNames;
+    private String detailDesc;
+    private String feature;
+    private String gmtCreated;
+    private String gmtModified;
+    private String id;
+    private String isLike;
+    private String isTop;
+    private String likeCount;
+    private String replyCount;
+    private List<String> replyList;
+    private String status;
+    private String title;
+    private String user;
+    private String userId;
+
+    public void setColumnId(String columnId) {
+        this.columnId = columnId;
+    }
+
+    public String getColumnId() {
+        return columnId;
+    }
+
+    public void setColumnNames(String columnNames) {
+        this.columnNames = columnNames;
+    }
+
+    public String getColumnNames() {
+        return columnNames;
+    }
+
+    public void setDetailDesc(String detailDesc) {
+        this.detailDesc = detailDesc;
+    }
+
+    public String getDetailDesc() {
+        return detailDesc;
+    }
+
+    public void setFeature(String feature) {
+        this.feature = feature;
+    }
+
+    public String getFeature() {
+        return feature;
+    }
+
+    public void setGmtCreated(String gmtCreated) {
+        this.gmtCreated = gmtCreated;
+    }
+
+    public String getGmtCreated() {
+        return gmtCreated;
+    }
+
+    public void setGmtModified(String gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setIsLike(String isLike) {
+        this.isLike = isLike;
+    }
+
+    public String getIsLike() {
+        return isLike;
+    }
+
+    public void setIsTop(String isTop) {
+        this.isTop = isTop;
+    }
+
+    public String getIsTop() {
+        return isTop;
+    }
+
+    public void setLikeCount(String likeCount) {
+        this.likeCount = likeCount;
+    }
+
+    public String getLikeCount() {
+        return likeCount;
+    }
+
+    public void setReplyCount(String replyCount) {
+        this.replyCount = replyCount;
+    }
+
+    public String getReplyCount() {
+        return replyCount;
+    }
+
+    public void setReplyList(List<String> replyList) {
+        this.replyList = replyList;
+    }
+
+    public List<String> getReplyList() {
+        return replyList;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+}

+ 488 - 0
app/src/main/java/com/edufound/reader/bean/CommentListReplyBean.java

@@ -0,0 +1,488 @@
+package com.edufound.reader.bean;
+
+import java.util.List;
+
+public class CommentListReplyBean {
+    private String columnId;
+
+    private String columnNames;
+
+    private String detailDesc;
+
+    private String feature;
+
+    private String gmtCreated;
+
+    private String gmtModified;
+
+    private String id;
+
+    private boolean isLike;
+
+    private String isTop;
+
+    private String likeCount;
+
+    private PostsAttributeInfo postsAttributeInfo;
+
+    private String replyCount;
+
+    private List<ReplyList> replyList;
+
+    private List<ReplyVOList> replyVOList;
+
+    private String status;
+
+    private String title;
+
+    private User user;
+
+    private String userId;
+
+    public void setColumnId(String columnId) {
+        this.columnId = columnId;
+    }
+
+    public String getColumnId() {
+        return this.columnId;
+    }
+
+    public void setColumnNames(String columnNames) {
+        this.columnNames = columnNames;
+    }
+
+    public String getColumnNames() {
+        return this.columnNames;
+    }
+
+    public void setDetailDesc(String detailDesc) {
+        this.detailDesc = detailDesc;
+    }
+
+    public String getDetailDesc() {
+        return this.detailDesc;
+    }
+
+    public void setFeature(String feature) {
+        this.feature = feature;
+    }
+
+    public String getFeature() {
+        return this.feature;
+    }
+
+    public void setGmtCreated(String gmtCreated) {
+        this.gmtCreated = gmtCreated;
+    }
+
+    public String getGmtCreated() {
+        return this.gmtCreated;
+    }
+
+    public void setGmtModified(String gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getGmtModified() {
+        return this.gmtModified;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return this.id;
+    }
+
+    public void setIsLike(boolean isLike) {
+        this.isLike = isLike;
+    }
+
+    public boolean getIsLike() {
+        return this.isLike;
+    }
+
+    public void setIsTop(String isTop) {
+        this.isTop = isTop;
+    }
+
+    public String getIsTop() {
+        return this.isTop;
+    }
+
+    public void setLikeCount(String likeCount) {
+        this.likeCount = likeCount;
+    }
+
+    public String getLikeCount() {
+        return this.likeCount;
+    }
+
+    public void setPostsAttributeInfo(PostsAttributeInfo postsAttributeInfo) {
+        this.postsAttributeInfo = postsAttributeInfo;
+    }
+
+    public PostsAttributeInfo getPostsAttributeInfo() {
+        return this.postsAttributeInfo;
+    }
+
+    public void setReplyCount(String replyCount) {
+        this.replyCount = replyCount;
+    }
+
+    public String getReplyCount() {
+        return this.replyCount;
+    }
+
+    public void setReplyList(List<ReplyList> replyList) {
+        this.replyList = replyList;
+    }
+
+    public List<ReplyList> getReplyList() {
+        return this.replyList;
+    }
+
+    public void setReplyVOList(List<ReplyVOList> replyVOList) {
+        this.replyVOList = replyVOList;
+    }
+
+    public List<ReplyVOList> getReplyVOList() {
+        return this.replyVOList;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStatus() {
+        return this.status;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return this.title;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public User getUser() {
+        return this.user;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserId() {
+        return this.userId;
+    }
+
+
+    public class User {
+        private String avatar;
+
+        private String birthday;
+
+        private String channel;
+
+        private String eid;
+
+        private String extOpenId;
+
+        private String gender;
+
+        private String grade;
+
+        private String loginDay;
+
+        private String mobile;
+
+        private String nickName;
+
+        private String openId;
+
+        private String profession;
+
+        private String schoolCity;
+
+        private String schoolName;
+
+        private String schoolProvince;
+
+        private String statusEnum;
+
+        private String uid;
+
+        private String unionId;
+
+        private String wechatName;
+
+        public void setAvatar(String avatar) {
+            this.avatar = avatar;
+        }
+
+        public String getAvatar() {
+            return this.avatar;
+        }
+
+        public void setBirthday(String birthday) {
+            this.birthday = birthday;
+        }
+
+        public String getBirthday() {
+            return this.birthday;
+        }
+
+        public void setChannel(String channel) {
+            this.channel = channel;
+        }
+
+        public String getChannel() {
+            return this.channel;
+        }
+
+        public void setEid(String eid) {
+            this.eid = eid;
+        }
+
+        public String getEid() {
+            return this.eid;
+        }
+
+        public void setExtOpenId(String extOpenId) {
+            this.extOpenId = extOpenId;
+        }
+
+        public String getExtOpenId() {
+            return this.extOpenId;
+        }
+
+        public void setGender(String gender) {
+            this.gender = gender;
+        }
+
+        public String getGender() {
+            return this.gender;
+        }
+
+        public void setGrade(String grade) {
+            this.grade = grade;
+        }
+
+        public String getGrade() {
+            return this.grade;
+        }
+
+        public void setLoginDay(String loginDay) {
+            this.loginDay = loginDay;
+        }
+
+        public String getLoginDay() {
+            return this.loginDay;
+        }
+
+        public void setMobile(String mobile) {
+            this.mobile = mobile;
+        }
+
+        public String getMobile() {
+            return this.mobile;
+        }
+
+        public void setNickName(String nickName) {
+            this.nickName = nickName;
+        }
+
+        public String getNickName() {
+            return this.nickName;
+        }
+
+        public void setOpenId(String openId) {
+            this.openId = openId;
+        }
+
+        public String getOpenId() {
+            return this.openId;
+        }
+
+        public void setProfession(String profession) {
+            this.profession = profession;
+        }
+
+        public String getProfession() {
+            return this.profession;
+        }
+
+        public void setSchoolCity(String schoolCity) {
+            this.schoolCity = schoolCity;
+        }
+
+        public String getSchoolCity() {
+            return this.schoolCity;
+        }
+
+        public void setSchoolName(String schoolName) {
+            this.schoolName = schoolName;
+        }
+
+        public String getSchoolName() {
+            return this.schoolName;
+        }
+
+        public void setSchoolProvince(String schoolProvince) {
+            this.schoolProvince = schoolProvince;
+        }
+
+        public String getSchoolProvince() {
+            return this.schoolProvince;
+        }
+
+        public void setStatusEnum(String statusEnum) {
+            this.statusEnum = statusEnum;
+        }
+
+        public String getStatusEnum() {
+            return this.statusEnum;
+        }
+
+        public void setUid(String uid) {
+            this.uid = uid;
+        }
+
+        public String getUid() {
+            return this.uid;
+        }
+
+        public void setUnionId(String unionId) {
+            this.unionId = unionId;
+        }
+
+        public String getUnionId() {
+            return this.unionId;
+        }
+
+        public void setWechatName(String wechatName) {
+            this.wechatName = wechatName;
+        }
+
+        public String getWechatName() {
+            return this.wechatName;
+        }
+
+    }
+
+    public class ReplyList {
+    }
+
+    public class ReplyVOList {
+        private String content;
+
+        private String gmtCreated;
+
+        private String gmtModified;
+
+        private String id;
+
+        private String isRisky;
+
+        private String postsId;
+
+        private String status;
+
+        private User user;
+
+        private String userId;
+
+        private String userType;
+
+        public void setContent(String content) {
+            this.content = content;
+        }
+
+        public String getContent() {
+            return this.content;
+        }
+
+        public void setGmtCreated(String gmtCreated) {
+            this.gmtCreated = gmtCreated;
+        }
+
+        public String getGmtCreated() {
+            return this.gmtCreated;
+        }
+
+        public void setGmtModified(String gmtModified) {
+            this.gmtModified = gmtModified;
+        }
+
+        public String getGmtModified() {
+            return this.gmtModified;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public String getId() {
+            return this.id;
+        }
+
+        public void setIsRisky(String isRisky) {
+            this.isRisky = isRisky;
+        }
+
+        public String getIsRisky() {
+            return this.isRisky;
+        }
+
+        public void setPostsId(String postsId) {
+            this.postsId = postsId;
+        }
+
+        public String getPostsId() {
+            return this.postsId;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+
+        public String getStatus() {
+            return this.status;
+        }
+
+        public void setUser(User user) {
+            this.user = user;
+        }
+
+        public User getUser() {
+            return this.user;
+        }
+
+        public void setUserId(String userId) {
+            this.userId = userId;
+        }
+
+        public String getUserId() {
+            return this.userId;
+        }
+
+        public void setUserType(String userType) {
+            this.userType = userType;
+        }
+
+        public String getUserType() {
+            return this.userType;
+        }
+    }
+
+    public class PostsAttributeInfo {
+
+    }
+}

+ 132 - 0
app/src/main/java/com/edufound/reader/bean/FavoritesBean.java

@@ -0,0 +1,132 @@
+package com.edufound.reader.bean;
+
+public class FavoritesBean {
+
+    private String canceledTime;
+    private String channel;
+    private String exampleId;
+    private String favoritesType;
+    private String feature;
+    private String gmtCreated;
+    private String gmtModified;
+    private String iconImg;
+    private String id;
+    private String status;
+    private String summary;
+    private String targetCode;
+    private String title;
+    private String uid;
+
+    public void setCanceledTime(String canceledTime) {
+        this.canceledTime = canceledTime;
+    }
+
+    public String getCanceledTime() {
+        return canceledTime;
+    }
+
+    public void setChannel(String channel) {
+        this.channel = channel;
+    }
+
+    public String getChannel() {
+        return channel;
+    }
+
+    public void setExampleId(String exampleId) {
+        this.exampleId = exampleId;
+    }
+
+    public String getExampleId() {
+        return exampleId;
+    }
+
+    public void setFavoritesType(String favoritesType) {
+        this.favoritesType = favoritesType;
+    }
+
+    public String getFavoritesType() {
+        return favoritesType;
+    }
+
+    public void setFeature(String feature) {
+        this.feature = feature;
+    }
+
+    public String getFeature() {
+        return feature;
+    }
+
+    public void setGmtCreated(String gmtCreated) {
+        this.gmtCreated = gmtCreated;
+    }
+
+    public String getGmtCreated() {
+        return gmtCreated;
+    }
+
+    public void setGmtModified(String gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setIconImg(String iconImg) {
+        this.iconImg = iconImg;
+    }
+
+    public String getIconImg() {
+        return iconImg;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setSummary(String summary) {
+        this.summary = summary;
+    }
+
+    public String getSummary() {
+        return summary;
+    }
+
+    public void setTargetCode(String targetCode) {
+        this.targetCode = targetCode;
+    }
+
+    public String getTargetCode() {
+        return targetCode;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
+
+    public String getUid() {
+        return uid;
+    }
+
+}

+ 40 - 0
app/src/main/java/com/edufound/reader/bean/HttpResultBean.java

@@ -0,0 +1,40 @@
+package com.edufound.reader.bean;
+
+public class HttpResultBean<T> {
+    private int code;
+
+    private int count;
+
+    private T data;
+
+    private String message;
+
+    private boolean success;
+
+
+    public int getCode() {
+        return this.code;
+    }
+
+
+    public int getCount() {
+        return this.count;
+    }
+
+
+    public T getData() {
+        return this.data;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+
+    public boolean getSuccess() {
+        return this.success;
+    }
+}

+ 50 - 0
app/src/main/java/com/edufound/reader/bean/HttpResultDataListBean.java

@@ -0,0 +1,50 @@
+package com.edufound.reader.bean;
+
+import java.util.List;
+
+public class HttpResultDataListBean<T> {
+
+    private boolean hasNext;
+    private boolean hasPrevious;
+    private List<T> list;
+    private String pageNo;
+    private String pageSize;
+    private String start;
+    private String totalNo;
+    private String totalSize;
+
+    public boolean getHasNext() {
+        return hasNext;
+    }
+
+    public boolean getHasPrevious() {
+        return hasPrevious;
+    }
+
+
+    public List<T> getList() {
+        return list;
+    }
+
+    public String getPageNo() {
+        return pageNo;
+    }
+
+
+    public String getPageSize() {
+        return pageSize;
+    }
+
+    public String getStart() {
+        return start;
+    }
+
+
+    public String getTotalNo() {
+        return totalNo;
+    }
+
+    public String getTotalSize() {
+        return totalSize;
+    }
+}

+ 101 - 0
app/src/main/java/com/edufound/reader/bean/MyInfoBean.java

@@ -0,0 +1,101 @@
+package com.edufound.reader.bean;
+
+public class MyInfoBean{
+        private String commentAmount;
+
+        private int fansAmount;
+
+        private String favoritesAmount;
+
+        private int integralAmount;
+
+        private boolean like;
+
+        private int likeAmount;
+
+        private int playAmount;
+
+        private int readAmount;
+
+        private int unfinishedAmount;
+
+        private int unreadAmount;
+
+        private UserBean user;
+
+        private String walletAmount;
+
+        public void setCommentAmount(String commentAmount){
+            this.commentAmount = commentAmount;
+        }
+        public String getCommentAmount(){
+            return this.commentAmount;
+        }
+        public void setFansAmount(int fansAmount){
+            this.fansAmount = fansAmount;
+        }
+        public int getFansAmount(){
+            return this.fansAmount;
+        }
+        public void setFavoritesAmount(String favoritesAmount){
+            this.favoritesAmount = favoritesAmount;
+        }
+        public String getFavoritesAmount(){
+            return this.favoritesAmount;
+        }
+        public void setIntegralAmount(int integralAmount){
+            this.integralAmount = integralAmount;
+        }
+        public int getIntegralAmount(){
+            return this.integralAmount;
+        }
+        public void setLike(boolean like){
+            this.like = like;
+        }
+        public boolean getLike(){
+            return this.like;
+        }
+        public void setLikeAmount(int likeAmount){
+            this.likeAmount = likeAmount;
+        }
+        public int getLikeAmount(){
+            return this.likeAmount;
+        }
+        public void setPlayAmount(int playAmount){
+            this.playAmount = playAmount;
+        }
+        public int getPlayAmount(){
+            return this.playAmount;
+        }
+        public void setReadAmount(int readAmount){
+            this.readAmount = readAmount;
+        }
+        public int getReadAmount(){
+            return this.readAmount;
+        }
+        public void setUnfinishedAmount(int unfinishedAmount){
+            this.unfinishedAmount = unfinishedAmount;
+        }
+        public int getUnfinishedAmount(){
+            return this.unfinishedAmount;
+        }
+        public void setUnreadAmount(int unreadAmount){
+            this.unreadAmount = unreadAmount;
+        }
+        public int getUnreadAmount(){
+            return this.unreadAmount;
+        }
+        public void setUser(UserBean user){
+            this.user = user;
+        }
+        public UserBean getUser(){
+            return this.user;
+        }
+        public void setWalletAmount(String walletAmount){
+            this.walletAmount = walletAmount;
+        }
+        public String getWalletAmount(){
+            return this.walletAmount;
+        }
+
+}

+ 65 - 0
app/src/main/java/com/edufound/reader/bean/RecordResultBean.java

@@ -0,0 +1,65 @@
+package com.edufound.reader.bean;
+
+public class RecordResultBean {
+    int overall;
+    //速度
+    int speed;
+    //声调
+    int tone;
+    //完整度
+    int integrity;
+    //正确率
+    int accuracy;
+
+
+    public RecordResultBean() {
+    }
+
+    public RecordResultBean(int overall, int speed, int tone, int integrity, int accuracy) {
+        this.overall = overall;
+        this.speed = speed;
+        this.tone = tone;
+        this.integrity = integrity;
+        this.accuracy = accuracy;
+    }
+
+    public int getOverall() {
+        return overall;
+    }
+
+    public void setOverall(int overall) {
+        this.overall = overall;
+    }
+
+    public int getSpeed() {
+        return speed;
+    }
+
+    public void setSpeed(int speed) {
+        this.speed = speed;
+    }
+
+    public int getTone() {
+        return tone;
+    }
+
+    public void setTone(int tone) {
+        this.tone = tone;
+    }
+
+    public int getIntegrity() {
+        return integrity;
+    }
+
+    public void setIntegrity(int integrity) {
+        this.integrity = integrity;
+    }
+
+    public int getAccuracy() {
+        return accuracy;
+    }
+
+    public void setAccuracy(int accuracy) {
+        this.accuracy = accuracy;
+    }
+}

+ 0 - 6
app/src/main/java/com/edufound/reader/bean/SlideVideoBean.java

@@ -1,6 +0,0 @@
-package com.edufound.reader.bean;
-
-public class SlideVideoBean {
-    public String videoUrl;
-    public String videoTitle;
-}

+ 195 - 0
app/src/main/java/com/edufound/reader/bean/UserBean.java

@@ -0,0 +1,195 @@
+package com.edufound.reader.bean;
+
+public class UserBean {
+
+    private String avatar;
+
+    private String birthday;
+
+    private String channel;
+
+    private String eid;
+
+    private String extOpenId;
+
+    private String gender;
+
+    private String grade;
+
+    private String loginDay;
+
+    private String mobile;
+
+    private String nickName;
+
+    private String openId;
+
+    private String profession;
+
+    private String schoolCity;
+
+    private String schoolName;
+
+    private String schoolProvince;
+
+    private String statusEnum;
+
+    private String uid;
+
+    private String unionId;
+
+    private String wechatName;
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getAvatar() {
+        return this.avatar;
+    }
+
+    public void setBirthday(String birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getBirthday() {
+        return this.birthday;
+    }
+
+    public void setChannel(String channel) {
+        this.channel = channel;
+    }
+
+    public String getChannel() {
+        return this.channel;
+    }
+
+    public void setEid(String eid) {
+        this.eid = eid;
+    }
+
+    public String getEid() {
+        return this.eid;
+    }
+
+    public void setExtOpenId(String extOpenId) {
+        this.extOpenId = extOpenId;
+    }
+
+    public String getExtOpenId() {
+        return this.extOpenId;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    public String getGender() {
+        return this.gender;
+    }
+
+    public void setGrade(String grade) {
+        this.grade = grade;
+    }
+
+    public String getGrade() {
+        return this.grade;
+    }
+
+    public void setLoginDay(String loginDay) {
+        this.loginDay = loginDay;
+    }
+
+    public String getLoginDay() {
+        return this.loginDay;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getMobile() {
+        return this.mobile;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getNickName() {
+        return this.nickName;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public String getOpenId() {
+        return this.openId;
+    }
+
+    public void setProfession(String profession) {
+        this.profession = profession;
+    }
+
+    public String getProfession() {
+        return this.profession;
+    }
+
+    public void setSchoolCity(String schoolCity) {
+        this.schoolCity = schoolCity;
+    }
+
+    public String getSchoolCity() {
+        return this.schoolCity;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+
+    public String getSchoolName() {
+        return this.schoolName;
+    }
+
+    public void setSchoolProvince(String schoolProvince) {
+        this.schoolProvince = schoolProvince;
+    }
+
+    public String getSchoolProvince() {
+        return this.schoolProvince;
+    }
+
+    public void setStatusEnum(String statusEnum) {
+        this.statusEnum = statusEnum;
+    }
+
+    public String getStatusEnum() {
+        return this.statusEnum;
+    }
+
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
+
+    public String getUid() {
+        return this.uid;
+    }
+
+    public void setUnionId(String unionId) {
+        this.unionId = unionId;
+    }
+
+    public String getUnionId() {
+        return this.unionId;
+    }
+
+    public void setWechatName(String wechatName) {
+        this.wechatName = wechatName;
+    }
+
+    public String getWechatName() {
+        return this.wechatName;
+    }
+
+}

+ 0 - 60
app/src/main/java/com/edufound/reader/bean/UserInfoBean.java

@@ -1,60 +0,0 @@
-package com.edufound.reader.bean;
-
-public class UserInfoBean {
-
-    private String userHeadImg;
-    private String userPhone;
-    private String userName;
-    private String userGrade;
-    private String userFans;
-    private String userPlayCount;
-
-
-    public String getUserHeadImg() {
-        return userHeadImg;
-    }
-
-    public void setUserHeadImg(String userHeadImg) {
-        this.userHeadImg = userHeadImg;
-    }
-
-    public String getUserPhone() {
-        return userPhone;
-    }
-
-    public void setUserPhone(String userPhone) {
-        this.userPhone = userPhone;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getUserGrade() {
-        return userGrade;
-    }
-
-    public void setUserGrade(String userGrade) {
-        this.userGrade = userGrade;
-    }
-
-    public String getUserFans() {
-        return userFans;
-    }
-
-    public void setUserFans(String userFans) {
-        this.userFans = userFans;
-    }
-
-    public String getUserPlayCount() {
-        return userPlayCount;
-    }
-
-    public void setUserPlayCount(String userPlayCount) {
-        this.userPlayCount = userPlayCount;
-    }
-}

+ 227 - 0
app/src/main/java/com/edufound/reader/bean/UserRecordBean.java

@@ -0,0 +1,227 @@
+package com.edufound.reader.bean;
+
+public class UserRecordBean {
+    private boolean isFans;
+
+    private boolean isFavorites;
+
+    private boolean isLike;
+
+    private UserBean user;
+
+    private UserRead userRead;
+
+
+    public boolean getIsFans() {
+        return this.isFans;
+    }
+
+    public boolean getIsFavorites() {
+        return this.isFavorites;
+    }
+
+
+    public boolean getIsLike() {
+        return this.isLike;
+    }
+
+
+    public UserBean getUser() {
+        return this.user;
+    }
+
+    public UserRead getUserRead() {
+        return this.userRead;
+    }
+
+
+    public class UserRead {
+        private String audioPath;
+
+        private String channel;
+
+        private String commentAmount;
+
+        private String coverImg;
+
+        private String day;
+
+        private String exampleId;
+
+        private String favoritesAmount;
+
+        private String gmtCreated;
+
+        private String gmtModified;
+
+        private String grade;
+
+        private String iconImg;
+
+        private String id;
+
+        private String lessonText;
+
+        private String likeAmount;
+
+        private String originVideo;
+
+        private String playAmount;
+
+        private String score;
+
+        private String shareImg;
+
+        private String sort;
+
+        private String status;
+
+        private String summary;
+
+        private String tag;
+
+        private String title;
+
+        private String traceId;
+
+        private String type;
+
+        private String uid;
+
+        private String videoPath;
+
+
+        public String getAudioPath() {
+            return this.audioPath;
+        }
+
+
+        public String getChannel() {
+            return this.channel;
+        }
+
+
+        public String getCommentAmount() {
+            return this.commentAmount;
+        }
+
+
+        public String getCoverImg() {
+            return this.coverImg;
+        }
+
+
+        public String getDay() {
+            return this.day;
+        }
+
+
+        public String getExampleId() {
+            return this.exampleId;
+        }
+
+
+        public String getFavoritesAmount() {
+            return this.favoritesAmount;
+        }
+
+
+        public String getGmtCreated() {
+            return this.gmtCreated;
+        }
+
+
+        public String getGmtModified() {
+            return this.gmtModified;
+        }
+
+
+        public String getGrade() {
+            return this.grade;
+        }
+
+
+        public String getIconImg() {
+            return this.iconImg;
+        }
+
+
+        public String getId() {
+            return this.id;
+        }
+
+
+        public String getLessonText() {
+            return this.lessonText;
+        }
+
+
+        public String getLikeAmount() {
+            return this.likeAmount;
+        }
+
+
+        public String getOriginVideo() {
+            return this.originVideo;
+        }
+
+
+        public String getPlayAmount() {
+            return this.playAmount;
+        }
+
+
+        public String getScore() {
+            return this.score;
+        }
+
+
+        public String getShareImg() {
+            return this.shareImg;
+        }
+
+
+        public String getSort() {
+            return this.sort;
+        }
+
+
+        public String getStatus() {
+            return this.status;
+        }
+
+        public String getSummary() {
+            return this.summary;
+        }
+
+        public String getTag() {
+            return this.tag;
+        }
+
+
+        public String getTitle() {
+            return this.title;
+        }
+
+
+        public String getTraceId() {
+            return this.traceId;
+        }
+
+
+        public String getType() {
+            return this.type;
+        }
+
+
+        public String getUid() {
+            return this.uid;
+        }
+
+        public String getVideoPath() {
+            return this.videoPath;
+        }
+
+    }
+}
+

+ 5 - 0
app/src/main/java/com/edufound/reader/contract/CharacterFragmentContract.java

@@ -1,15 +1,19 @@
 package com.edufound.reader.contract;
 
+import android.app.Activity;
 import android.widget.GridLayout;
 import android.widget.HorizontalScrollView;
 import android.widget.Space;
 
 import com.edufound.reader.base.BaseView;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 
 import io.reactivex.rxjava3.functions.Consumer;
 
 public interface CharacterFragmentContract {
     interface Model {
+
     }
 
     interface View extends BaseView {
@@ -24,5 +28,6 @@ public interface CharacterFragmentContract {
         void initGridLayout(GridLayout gridLayout);
 
         void onDestory(GridLayout layout);
+
     }
 }

+ 18 - 0
app/src/main/java/com/edufound/reader/contract/CommentContract.java

@@ -1,19 +1,37 @@
 package com.edufound.reader.contract;
 
+import android.app.Activity;
 import android.widget.FrameLayout;
 
 import com.edufound.reader.base.BaseView;
+import com.okhttplib.callback.Callback;
 
 import androidx.recyclerview.widget.RecyclerView;
 
 public interface CommentContract {
     interface Model {
+        void getCommentAll(Activity activity, String exampleId, String pageIndex, Callback callback);
+
+        void doPosts(Activity activity, String json, Callback callback);
+
+
     }
 
     interface View extends BaseView {
+        void getCommentAllSuccess();
+
+        void setMaxCommentCount(int count);
+
+        void editRequestFocus();
+
+        void moveRecyclearView(int scroll);
     }
 
     interface Presenter {
         void initComment(RecyclerView rv, FrameLayout noCommentLayout);
+
+        void getAllComment(String exampleId, String pageIndex);
+
+        void doPosts(String comment);
     }
 }

+ 0 - 7
app/src/main/java/com/edufound/reader/contract/CrashDialogContract.java

@@ -11,13 +11,6 @@ public interface CrashDialogContract {
 
     interface Presenter {
 
-        void bindRecordServices();
-
-        void startRecord(String name, String refText);
-
-        void stopRecord();
-
-        void rePlayRecord();
 
         void activityDestory();
     }

+ 3 - 1
app/src/main/java/com/edufound/reader/contract/LoginAlertContract.java

@@ -1,15 +1,17 @@
 package com.edufound.reader.contract;
 
-import android.widget.FrameLayout;
+import android.app.Activity;
 import android.widget.TextView;
 
 import com.edufound.reader.base.BaseView;
+import com.okhttplib.callback.Callback;
 
 import androidx.appcompat.widget.AppCompatCheckBox;
 import androidx.constraintlayout.widget.ConstraintLayout;
 
 public interface LoginAlertContract {
     interface Model {
+        void getVCode(Activity activity, String phone, Callback callback);
     }
 
     interface View extends BaseView {

+ 14 - 1
app/src/main/java/com/edufound/reader/contract/MainContract.java

@@ -1,16 +1,23 @@
 package com.edufound.reader.contract;
 
+import android.app.Activity;
 import android.widget.RadioGroup;
 
 import com.edufound.reader.base.BaseView;
+import com.okhttplib.callback.Callback;
 
-import androidx.recyclerview.widget.RecyclerView;
+import org.json.JSONObject;
+
+import io.reactivex.rxjava3.core.Observable;
 
 public interface MainContract {
     interface Model {
     }
 
     interface View extends BaseView {
+
+        void setCheckIndex();
+
     }
 
     interface Presenter {
@@ -25,5 +32,11 @@ public interface MainContract {
         void activityResume();
 
         void checkModelIsDebug();
+
+        void showSelectGradeWindow();
+
+        void userIsLogin();
+
+        void registerMobile(String mobileNo);
     }
 }

+ 5 - 1
app/src/main/java/com/edufound/reader/contract/MyCollectionContract.java

@@ -1,13 +1,15 @@
 package com.edufound.reader.contract;
 
-import android.widget.RadioGroup;
+import android.app.Activity;
 
 import com.edufound.reader.base.BaseView;
+import com.okhttplib.callback.Callback;
 
 import androidx.recyclerview.widget.RecyclerView;
 
 public interface MyCollectionContract {
     interface Model {
+        void getFavorites(Activity activity, int pageIndex, Callback callback);
     }
 
     interface View extends BaseView {
@@ -15,5 +17,7 @@ public interface MyCollectionContract {
 
     interface Presenter {
         void initRecyclerView(RecyclerView rv);
+
+        void getFavoritesData(RecyclerView rv);
     }
 }

+ 13 - 6
app/src/main/java/com/edufound/reader/contract/MyTabFragmentContract.java

@@ -1,37 +1,44 @@
 package com.edufound.reader.contract;
 
-import android.view.View;
+import android.app.Activity;
 import android.widget.FrameLayout;
 import android.widget.GridLayout;
-import android.widget.GridView;
 
 import com.edufound.reader.base.BaseView;
-import com.edufound.reader.bean.UserInfoBean;
+import com.edufound.reader.bean.MyInfoBean;
+import com.edufound.reader.bean.UserRecordBean;
+import com.okhttplib.callback.Callback;
 
-import androidx.recyclerview.widget.RecyclerView;
 import io.reactivex.rxjava3.functions.Consumer;
 
 public interface MyTabFragmentContract {
     interface Model {
+        void getMyRecords(Activity activity, Callback callback);
 
+        void getMyInfo(Activity activity, Callback callback);
     }
 
     interface View extends BaseView {
         void addUiClick(android.view.View view, Consumer onNext);
 
-        void setUserInfo(UserInfoBean bean);
+        void setUserInfo(MyInfoBean bean);
+
+        void setRecordSize(int size);
 
         void loadMoreItem();
 
     }
 
     interface Presenter {
-        void initRecyclerView(RecyclerView rv);
 
         void initGridLayout(GridLayout gridLayout, FrameLayout norecordlayout);
 
         void onDestory(GridLayout layout);
 
+        void getMyRecords();
+
+        void getMyInfo();
+
 
     }
 }

+ 29 - 5
app/src/main/java/com/edufound/reader/contract/RecommendFragmentContract.java

@@ -1,31 +1,55 @@
 package com.edufound.reader.contract;
 
 import android.app.Activity;
-import android.view.View;
 
 import com.edufound.reader.base.BaseView;
-import com.edufound.reader.bean.SlideVideoBean;
+import com.edufound.reader.bean.UserRecordBean;
+import com.okhttplib.callback.Callback;
 
 import androidx.recyclerview.widget.RecyclerView;
 
 public interface RecommendFragmentContract {
     interface Model {
+        /**
+         * 获取推荐列表
+         */
+        void getRecommendList(Activity activity, String grade, int pageIndex, Callback callback);
+
+        /**
+         * 收藏/取消收藏
+         */
+        void doFavorites(Activity activity, String json, Callback callback);
+
+        /**
+         * 点赞
+         */
+        void doLick(Activity activity, String readId, Callback callback);
 
     }
 
     interface View extends BaseView {
-        void setTopStatus(SlideVideoBean bean);
+        void setTopStatus(UserRecordBean bean);
+
+        void setFavorites(boolean isfavorites);
+
+        void setLikes(String count);
     }
 
     interface Presenter {
         void initVideoList(RecyclerView rv, int type, int startPosition);
 
-
         Object getCurPlayVideo();
 
-
         void fragmentPause(RecyclerView rv);
 
         void fragmentResume(RecyclerView rv);
+
+        void getRecommendDataList();
+
+        void doFavorites(UserRecordBean.UserRead userRead);
+
+        void doLike(UserRecordBean.UserRead userRead);
+
+        void destory();
     }
 }

+ 13 - 1
app/src/main/java/com/edufound/reader/contract/RecordContract.java

@@ -4,6 +4,7 @@ import android.content.Intent;
 import android.widget.FrameLayout;
 
 import com.edufound.reader.base.BaseView;
+import com.edufound.reader.bean.RecordResultBean;
 
 import tv.danmaku.ijk.media.player.IMediaPlayer;
 
@@ -13,7 +14,9 @@ public interface RecordContract {
     }
 
     interface View extends BaseView {
+        void refRecordStatus();
 
+        void startRecordStatus();
     }
 
     interface Presenter {
@@ -58,6 +61,15 @@ public interface RecordContract {
 
         void activityResume();
 
-        void showRecordStatusWindow();
+        void showRecordStatusWindow(RecordResultBean bean);
+
+
+        void bindRecordServices();
+
+        void startRecord(String name, String refText);
+
+        void stopRecord();
+
+        void rePlayRecord();
     }
 }

+ 6 - 0
app/src/main/java/com/edufound/reader/contract/SafflowerContract.java

@@ -1,13 +1,17 @@
 package com.edufound.reader.contract;
 
+import android.app.Activity;
 import android.widget.LinearLayout;
 
 import com.edufound.reader.base.BaseView;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 
 import androidx.recyclerview.widget.RecyclerView;
 
 public interface SafflowerContract {
     interface Model {
+        void getTask(Activity activity, HttpInfo.Builder into, Callback callback);
     }
 
     interface View extends BaseView {
@@ -17,5 +21,7 @@ public interface SafflowerContract {
         void initSignLayout(LinearLayout layout);
 
         void initRecyclearView(RecyclerView recyclerView);
+
+        void getTaskData();
     }
 }

+ 1 - 1
app/src/main/java/com/edufound/reader/cusview/AutoPollRecyclerView.java

@@ -10,7 +10,7 @@ import androidx.recyclerview.widget.RecyclerView;
 import io.reactivex.rxjava3.annotations.Nullable;
 
 public class AutoPollRecyclerView extends RecyclerView {
-    private static final long TIME_AUTO_POLL = 16;
+    private static final long TIME_AUTO_POLL = 30;
     AutoPollTask autoPollTask;
     private boolean running; //标示是否正在自动轮询
     private boolean canRun;//标示是否可以自动轮询,可在不需要的是否置false

+ 29 - 2
app/src/main/java/com/edufound/reader/cusview/RvListJzvdStd.java

@@ -8,6 +8,7 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.graphics.Color;
+import android.media.AudioManager;
 import android.net.ConnectivityManager;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -195,6 +196,8 @@ public class RvListJzvdStd extends Jzvd {
         super.setUp(jzDataSource, screen, mediaInterfaceClass);
         titleTextView.setText(jzDataSource.title);
         setScreen(screen);
+
+
     }
 
     @Override
@@ -970,7 +973,15 @@ public class RvListJzvdStd extends Jzvd {
         if (screen == SCREEN_FULLSCREEN) {
             onStateAutoComplete();
         } else {
-            super.onCompletion();
+            Runtime.getRuntime().gc();
+            Log.i(TAG, "onAutoCompletion " + " [" + this.hashCode() + "] ");
+            cancelProgressTimer();
+            dismissBrightnessDialog();
+            dismissProgressDialog();
+            dismissVolumeDialog();
+            onStateAutoComplete();
+            mediaInterface.release();
+            JZUtils.scanForActivity(getContext()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
         }
         if (mCallBack != null) {
             mCallBack.onComplete();
@@ -980,9 +991,19 @@ public class RvListJzvdStd extends Jzvd {
 
     @Override
     public void reset() {
-        super.reset();
         cancelDismissControlViewTimer();
         unregisterWifiListener(getApplicationContext());
+        Log.i(TAG, "reset " + " [" + this.hashCode() + "] ");
+        cancelProgressTimer();
+        dismissBrightnessDialog();
+        dismissProgressDialog();
+        dismissVolumeDialog();
+        onStateNormal();
+        textureViewContainer.removeAllViews();
+        AudioManager mAudioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
+        mAudioManager.abandonAudioFocus(onAudioFocusChangeListener);
+        JZUtils.scanForActivity(getContext()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        if (mediaInterface != null) mediaInterface.release();
     }
 
     public void dissmissControlView() {
@@ -1017,6 +1038,12 @@ public class RvListJzvdStd extends Jzvd {
         }
     }
 
+    public void seekTo(int seek) {
+        if (mediaInterface != null) {
+            mediaInterface.seekTo(seek);
+        }
+    }
+
 
     public class DismissControlViewTimerTask extends TimerTask {
 

+ 1 - 1
app/src/main/java/com/edufound/reader/fragment/CharacterFragment.java

@@ -71,7 +71,7 @@ public class CharacterFragment extends BaseMvpFragment<CharacterFragmentPresente
             }
         });
 
-    
+
     }
 
     @Override

+ 23 - 28
app/src/main/java/com/edufound/reader/fragment/MyTabFragment.java

@@ -1,11 +1,9 @@
 package com.edufound.reader.fragment;
 
-import android.animation.LayoutTransition;
 import android.annotation.SuppressLint;
 import android.graphics.Rect;
 import android.os.Build;
 import android.os.Bundle;
-import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
@@ -22,35 +20,21 @@ import com.edufound.reader.activity.MessageActivity;
 import com.edufound.reader.activity.MyCollectionActivity;
 import com.edufound.reader.activity.MyFollowActivity;
 import com.edufound.reader.activity.PayActivity;
-import com.edufound.reader.activity.RecordActivity;
 import com.edufound.reader.activity.SafflowerActivity;
 import com.edufound.reader.activity.UserInfoSettingActivity;
 import com.edufound.reader.base.BaseMvpFragment;
-import com.edufound.reader.bean.UserInfoBean;
+import com.edufound.reader.bean.MyInfoBean;
+import com.edufound.reader.bean.UserRecordBean;
 import com.edufound.reader.contract.MyTabFragmentContract;
 import com.edufound.reader.presenter.MyTabFragmentPresenter;
 import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.EfunboxUtil;
 import com.edufound.reader.util.GlideUtils;
 import com.jakewharton.rxbinding4.view.RxView;
-import com.jakewharton.rxbinding4.view.RxViewGroup;
-import com.jakewharton.rxbinding4.view.ViewGroupHierarchyChangeEvent;
-import com.jakewharton.rxbinding4.view.ViewGroupHierarchyChildViewAddEvent;
-import com.jakewharton.rxbinding4.view.ViewGroupHierarchyChildViewRemoveEvent;
-import com.orhanobut.logger.Logger;
-import com.trello.rxlifecycle4.android.ActivityEvent;
-import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
-
-import java.util.concurrent.TimeUnit;
 
 import androidx.annotation.RequiresApi;
-import androidx.lifecycle.Lifecycle;
-import io.reactivex.rxjava3.annotations.NonNull;
-import io.reactivex.rxjava3.core.Observable;
-import io.reactivex.rxjava3.core.Observer;
 import io.reactivex.rxjava3.functions.Consumer;
 
-import static com.trello.rxlifecycle4.RxLifecycle.bindUntilEvent;
-
 public class MyTabFragment extends BaseMvpFragment<MyTabFragmentPresenter> implements MyTabFragmentContract.View {
 
 
@@ -71,9 +55,10 @@ public class MyTabFragment extends BaseMvpFragment<MyTabFragmentPresenter> imple
     FrameLayout mUserLayout;
     FrameLayout mHeadUserMessage;
     ImageView mHeadUserCustomerService;
+    TextView mRecordSize;
     Space mBottomView;
     Rect mScreenRect;
-    boolean isNeedLoad = false;
+    boolean isNeedLoad = true;
 
     @Override
     protected void initView(View view) {
@@ -82,6 +67,7 @@ public class MyTabFragment extends BaseMvpFragment<MyTabFragmentPresenter> imple
         mRootView = view;
         mScrollView = view.findViewById(R.id.fragment_main_user_scrollview);
         mBottomView = view.findViewById(R.id.fragment_main_user_bottomview);
+        mRecordSize = view.findViewById(R.id.fragment_main_user_myrecordsize);
         mScreenRect = new Rect(0, 0, Consts.getScreenSize()[0], Consts.getScreenSize()[1]);
         //初始化左侧header ui
         FrameLayout headlayout = view.findViewById(R.id.fragment_main_user_head_layout);
@@ -105,8 +91,9 @@ public class MyTabFragment extends BaseMvpFragment<MyTabFragmentPresenter> imple
         mUserLayout = view.findViewById(R.id.fragment_main_user_layout);
         mGridLayout = view.findViewById(R.id.fragment_my_recyclerview);
         mNoRecordLayout = view.findViewById(R.id.fragment_main_user_norecord);
-//        mPresenter.initRecyclerView(mRecyclerView);
         mPresenter.initGridLayout(mGridLayout, mNoRecordLayout);
+        mPresenter.getMyInfo();
+        mPresenter.getMyRecords();
     }
 
 
@@ -202,23 +189,31 @@ public class MyTabFragment extends BaseMvpFragment<MyTabFragmentPresenter> imple
     }
 
     @Override
-    public void setUserInfo(UserInfoBean bean) {
-        GlideUtils.loadCircleImage(getContext(), bean.getUserHeadImg(), mHeaderUserImg);
-        mHeadUserPhone.setText(bean.getUserPhone());
-        mHeadUserGrade.setText(bean.getUserGrade());
-        mHeadUserFans.setText(bean.getUserFans());
-        mHeadUserPlayCount.setText(bean.getUserPlayCount());
+    public void setUserInfo(MyInfoBean bean) {
+        GlideUtils.loadCircleImage(getContext(), bean.getUser().getAvatar(), mHeaderUserImg);
+        mHeadUserPhone.setText(bean.getUser().getMobile());
+        mHeadUserGrade.setText(EfunboxUtil.getCNGradeByEnum(bean.getUser().getGrade()));
+        mHeadUserFans.setText(String.valueOf(bean.getFansAmount()));
+        mHeadUserPlayCount.setText(String.valueOf(bean.getPlayAmount()));
+
+    }
+
+    @Override
+    public void setRecordSize(int size) {
+        mRecordSize.setText("我的作品:" + size);
     }
 
     @Override
     public void onDestroy() {
         super.onDestroy();
+        isNeedLoad = true;
         mPresenter.onDestory(mGridLayout);
     }
 
     @Override
     public void onDestroyView() {
         super.onDestroyView();
+        isNeedLoad = true;
         mPresenter.onDestory(mGridLayout);
     }
 
@@ -227,7 +222,7 @@ public class MyTabFragment extends BaseMvpFragment<MyTabFragmentPresenter> imple
         if (mBottomView.getLocalVisibleRect(mScreenRect) || mGridLayout.getChildCount() <= 2) {
             if (isNeedLoad) {
                 isNeedLoad = false;
-                mPresenter.initGridLayout(mGridLayout, mNoRecordLayout);
+                mPresenter.setGridData(mGridLayout, mNoRecordLayout);
             }
         } else {
             isNeedLoad = true;

+ 66 - 21
app/src/main/java/com/edufound/reader/fragment/RecommendFragment.java

@@ -10,15 +10,17 @@ import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.edufound.reader.R;
 import com.edufound.reader.activity.CommentActivity;
 import com.edufound.reader.activity.RecordActivity;
 import com.edufound.reader.base.BaseActivity;
 import com.edufound.reader.base.BaseMvpFragment;
-import com.edufound.reader.bean.SlideVideoBean;
+import com.edufound.reader.bean.UserRecordBean;
 import com.edufound.reader.contract.RecommendFragmentContract;
 import com.edufound.reader.presenter.RecommendFragmentPresenter;
+import com.edufound.reader.util.GlideUtils;
 import com.orhanobut.logger.Logger;
 
 import androidx.recyclerview.widget.RecyclerView;
@@ -117,21 +119,7 @@ public class RecommendFragment extends BaseMvpFragment<RecommendFragmentPresente
         addUiClickListener(mUserHeadLayout, o -> {
             Logger.e("点击了手机号旁边的头像");
         });
-        addUiClickListener(mCommentLayout, o -> {
-            Logger.e("点击了评论");
-            toNextActivity(CommentActivity.class);
-        });
-        addUiClickListener(mCollectionLayout, o -> {
-            Logger.e("点击了收藏");
-            ((ImageView) mCollectionLayout.findViewById(R.id.fragment_recommend_collection_icon)).setImageResource(R.drawable.fragment_recommend_collection_icon_s);
-            ((BaseActivity) getActivity()).showFollowCountAnim();
 
-        });
-        addUiClickListener(mThumbsLayout, o -> {
-            Logger.e("点击了点赞");
-            ((ImageView) mThumbsLayout.findViewById(R.id.fragment_recommend_thumbs_icon)).setImageResource(R.drawable.fragment_recommend_thumbs_up_s);
-            ((BaseActivity) getActivity()).showFollowCountAnim();
-        });
 
         if (hideBottom) {
             mVideoUp.setVisibility(View.GONE);
@@ -204,14 +192,71 @@ public class RecommendFragment extends BaseMvpFragment<RecommendFragmentPresente
     }
 
     @Override
-    public void setTopStatus(SlideVideoBean bean) {
+    public void setTopStatus(UserRecordBean bean) {
 
         //设置信息和点赞数等
-//         mUserHead;
-//         mUserPhone;
-//         mCommentCount;
-//         mCollentStatus;
-//         mThumbCount;
+        GlideUtils.loadImage(getActivity(), bean.getUser().getAvatar(), mUserHead);
+        mUserPhone.setText(bean.getUser().getMobile());
+        mCommentCount.setText(bean.getUserRead().getCommentAmount());
+        if (bean.getIsFavorites()) {
+            mCollentStatus.setText("已收藏");
+            ((ImageView) mCollectionLayout.findViewById(R.id.fragment_recommend_collection_icon)).setImageResource(R.drawable.fragment_recommend_collection_icon_s);
+        } else {
+            mCollentStatus.setText("未收藏");
+            ((ImageView) mCollectionLayout.findViewById(R.id.fragment_recommend_collection_icon)).setImageResource(R.drawable.fragment_recommend_collection_icon);
+        }
+        if (bean.getIsLike()) {
+            ((ImageView) mThumbsLayout.findViewById(R.id.fragment_recommend_thumbs_icon)).setImageResource(R.drawable.fragment_recommend_thumbs_up_s);
+        } else {
+            ((ImageView) mThumbsLayout.findViewById(R.id.fragment_recommend_thumbs_icon)).setImageResource(R.drawable.fragment_recommend_thumbs_up);
+        }
+        addUiClickListener(mCollectionLayout, o -> {
+            mPresenter.doFavorites(bean.getUserRead());
+        });
+        addUiClickListener(mThumbsLayout, o -> {
+            mPresenter.doLike(bean.getUserRead());
+        });
+        mThumbCount.setText(bean.getUserRead().getLikeAmount());
+        addUiClickListener(mCommentLayout, o -> {
+            Logger.e("点击了评论");
+            Bundle bundle = new Bundle();
+            bundle.putString("exampleId", bean.getUserRead().getExampleId());
+            toNextActivity(CommentActivity.class, bundle);
+        });
+
+
+    }
+
+    @Override
+    public void setFavorites(boolean isfavorites) {
+        if (isfavorites) {
+            mCollentStatus.setText("已收藏");
+            ((ImageView) mCollectionLayout.findViewById(R.id.fragment_recommend_collection_icon)).setImageResource(R.drawable.fragment_recommend_collection_icon_s);
+            ((BaseActivity) getActivity()).showFollowCountAnim();
+        } else {
+            mCollentStatus.setText("未收藏");
+            ((ImageView) mCollectionLayout.findViewById(R.id.fragment_recommend_collection_icon)).setImageResource(R.drawable.fragment_recommend_collection_icon);
+        }
+    }
 
+    @Override
+    public void setLikes(String count) {
+        if (!count.equals(mThumbCount.getText().toString())) {
+            ((ImageView) mThumbsLayout.findViewById(R.id.fragment_recommend_thumbs_icon)).setImageResource(R.drawable.fragment_recommend_thumbs_up_s);
+            ((BaseActivity) getActivity()).showFollowCountAnim();
+        }
+        mThumbCount.setText(count);
+    }
+
+    @Override
+    public void onDestroy() {
+        mPresenter.destory();
+        super.onDestroy();
+    }
+
+    @Override
+    public void onDestroyView() {
+        mPresenter.destory();
+        super.onDestroyView();
     }
 }

+ 3 - 0
app/src/main/java/com/edufound/reader/model/CharacterFragmentModel.java

@@ -1,7 +1,10 @@
 package com.edufound.reader.model;
 
 import com.edufound.reader.contract.CharacterFragmentContract;
+import com.edufound.reader.util.Consts;
 
 public class CharacterFragmentModel implements CharacterFragmentContract.Model {
     public static final int LOAD_GRID = 0x1231;
+    private String API = Consts.getFinalApi();
+
 }

+ 17 - 0
app/src/main/java/com/edufound/reader/model/CommentModel.java

@@ -1,6 +1,23 @@
 package com.edufound.reader.model;
 
+import android.app.Activity;
+
 import com.edufound.reader.contract.CommentContract;
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.OkHttpClient;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 
 public class CommentModel implements CommentContract.Model {
+    private final String API = Consts.getFinalApi();
+
+    @Override
+    public void getCommentAll(Activity activity, String exampleId, String pageIndex, Callback callback) {
+        OkHttpClient.doGetAsync(activity, new HttpInfo.Builder().setUrl(API + "/posts/reply").addParam("exampleId", exampleId).addParam("pageNo", pageIndex).addParam("pageSize", "100"), callback);
+    }
+
+    @Override
+    public void doPosts(Activity activity, String json, Callback callback) {
+        OkHttpClient.doPostAsync(activity, new HttpInfo.Builder().setUrl(API + "/posts").addParamJson(json), callback);
+    }
 }

+ 15 - 0
app/src/main/java/com/edufound/reader/model/LoginAlertModel.java

@@ -1,7 +1,22 @@
 package com.edufound.reader.model;
 
+import android.app.Activity;
+
 import com.edufound.reader.contract.LoginAlertContract;
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.OkHttpClient;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 
 public class LoginAlertModel implements LoginAlertContract.Model {
     public static final int CHANGE_VCODE_TEXT = 0x22021;
+
+    private String API = Consts.getFinalApi();
+
+    @Override
+    public void getVCode(Activity activity, String phone, Callback callback) {
+        ///member/verifyCode
+        OkHttpClient.doGetAsync(activity, HttpInfo.Builder().setUrl(API + "/member/verifyCode"), callback);
+
+    }
 }

+ 3 - 0
app/src/main/java/com/edufound/reader/model/MainModel.java

@@ -3,4 +3,7 @@ package com.edufound.reader.model;
 import com.edufound.reader.contract.MainContract;
 
 public class MainModel implements MainContract.Model {
+
+
+
 }

+ 13 - 0
app/src/main/java/com/edufound/reader/model/MyCollectionModel.java

@@ -1,6 +1,19 @@
 package com.edufound.reader.model;
 
+import android.app.Activity;
+
 import com.edufound.reader.contract.MyCollectionContract;
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.OkHttpClient;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 
 public class MyCollectionModel implements MyCollectionContract.Model {
+    private String API = Consts.getFinalApi();
+
+    @Override
+    public void getFavorites(Activity activity, int pageIndex,  Callback callback) {
+        OkHttpClient.doGetAsync(activity, HttpInfo.Builder().setUrl(API + "/favorites").addParam("pageNo", String.valueOf(pageIndex)).addParam("pageSize", "100"), callback);
+    }
+
 }

+ 2 - 2
app/src/main/java/com/edufound/reader/model/MyFollowModel.java

@@ -1,6 +1,6 @@
 package com.edufound.reader.model;
 
-import com.edufound.reader.contract.MyCollectionContract;
+import com.edufound.reader.contract.MyFollowContract;
 
-public class MyFollowModel implements MyCollectionContract.Model {
+public class MyFollowModel implements MyFollowContract.Model {
 }

+ 17 - 0
app/src/main/java/com/edufound/reader/model/MyTabFragmentModel.java

@@ -1,7 +1,24 @@
 package com.edufound.reader.model;
 
+import android.app.Activity;
+
 import com.edufound.reader.contract.MyTabFragmentContract;
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.OkHttpClient;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 
 public class MyTabFragmentModel implements MyTabFragmentContract.Model {
     public static final int LOAD_GRID = 0x1231;
+    private String API = Consts.getFinalApi();
+
+    @Override
+    public void getMyRecords(Activity activity, Callback callback) {
+        OkHttpClient.doGetAsync(activity, new HttpInfo.Builder().setUrl(API + "/userRead/my"), callback);
+    }
+
+    @Override
+    public void getMyInfo(Activity activity, Callback callback) {
+        OkHttpClient.doGetAsync(activity, new HttpInfo.Builder().setUrl(API + "/user/my"), callback);
+    }
 }

+ 28 - 0
app/src/main/java/com/edufound/reader/model/RecommendFragmentModel.java

@@ -1,6 +1,34 @@
 package com.edufound.reader.model;
 
+import android.app.Activity;
+
 import com.edufound.reader.contract.RecommendFragmentContract;
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.OkHttpClient;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
+
 
 public class RecommendFragmentModel implements RecommendFragmentContract.Model {
+
+    private String API = Consts.getFinalApi();
+
+
+    /**
+     * 获取推荐列表
+     */
+    @Override
+    public void getRecommendList(Activity activity, String grade, int pageIndex, Callback callback) {
+        OkHttpClient.doGetAsync(activity, new HttpInfo.Builder().setUrl(API + "/userRead/recommend").addParam("grade", grade).addParam("pageNo", String.valueOf(pageIndex)).addParam("pageSize", "100"), callback);
+    }
+
+    @Override
+    public void doFavorites(Activity activity, String json, Callback callback) {
+        OkHttpClient.doPostAsync(activity, new HttpInfo.Builder().setUrl(API + "/favorites").addParamJson(json), callback);
+    }
+
+    @Override
+    public void doLick(Activity activity, String readId, Callback callback) {
+        OkHttpClient.doGetAsync(activity, new HttpInfo.Builder().setUrl(API + "/userRead/like/" + readId + ""), callback);
+    }
 }

+ 12 - 0
app/src/main/java/com/edufound/reader/model/SafflowerModel.java

@@ -1,6 +1,18 @@
 package com.edufound.reader.model;
 
+import android.app.Activity;
+
 import com.edufound.reader.contract.SafflowerContract;
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.OkHttpClient;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 
 public class SafflowerModel implements SafflowerContract.Model {
+    private String API = Consts.getFinalApi();
+
+    @Override
+    public void getTask(Activity activity, HttpInfo.Builder into, Callback callback) {
+        OkHttpClient.doGetAsync(activity, HttpInfo.Builder().setUrl(API + "/task"), callback);
+    }
 }

+ 35 - 5
app/src/main/java/com/edufound/reader/popwindow/PopWindowUtil.java

@@ -11,6 +11,7 @@ import android.widget.PopupWindow;
 
 import com.edufound.reader.R;
 import com.edufound.reader.application.EApplication;
+import com.edufound.reader.bean.RecordResultBean;
 import com.edufound.reader.cusview.GridRadioGroup;
 import com.edufound.reader.listener.PopUtilClickListener;
 import com.edufound.reader.listener.PopupRecordStatusListener;
@@ -78,33 +79,62 @@ public class PopWindowUtil {
         FrameLayout btn_ok = dialog_view.findViewById(R.id.popupwindow_select_ok);
         GridRadioGroup gridRadioGroup = dialog_view.findViewById(R.id.popupwindow_select_grade_gridgroup);
         int id = 0;
+        final String[] checkText = {String.valueOf(id)};
         switch (checked) {
             case 0:
                 id = R.id.popupwindow_select_grade_one;
+                checkText[0] = "一年级";
                 break;
             case 1:
                 id = R.id.popupwindow_select_grade_two;
+                checkText[0] = "二年级";
                 break;
             case 2:
                 id = R.id.popupwindow_select_grade_three;
+                checkText[0] = "三年级";
                 break;
             case 3:
                 id = R.id.popupwindow_select_grade_four;
+                checkText[0] = "四年级";
                 break;
             case 4:
                 id = R.id.popupwindow_select_grade_pre;
+                checkText[0] = "学前";
                 break;
         }
-        gridRadioGroup.check(id);
-        final String[] checkText = {String.valueOf(id)};
+
+
         gridRadioGroup.setOnCheckedChangeListener(new GridRadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(GridRadioGroup group, int checkedId) {
                 Logger.e("checkedId:" + checkedId);
                 group.check(checkedId);
-                checkText[0] = String.valueOf(checkedId);
+                switch (checkedId) {
+                    case R.id.popupwindow_select_grade_one:
+                        //一年级
+                        checkText[0] = "一年级";
+                        break;
+                    case R.id.popupwindow_select_grade_two:
+                        checkText[0] = "二年级";
+                        //二年级
+                        break;
+                    case R.id.popupwindow_select_grade_three:
+                        checkText[0] = "三年级";
+                        //三年级
+                        break;
+                    case R.id.popupwindow_select_grade_four:
+                        checkText[0] = "四年级";
+                        //四年级
+                        break;
+                    case R.id.popupwindow_select_grade_pre:
+                        //学前
+                        checkText[0] = "学前";
+                        break;
+                }
+
             }
         });
+        gridRadioGroup.check(id);
         setClickListener(btn_ok, o -> {
             mPopupWindow.dismiss();
             listener.clickSubmit(checkText[0]);
@@ -177,7 +207,7 @@ public class PopWindowUtil {
     }
 
 
-    public static void showRecordStatusWindow(Context context, View parent, PopupRecordStatusListener listener) {
+    public static void showRecordStatusWindow(Context context, View parent, RecordResultBean bean, PopupRecordStatusListener listener) {
         initPresenter();
         if (checkWindowShoing()) {
             return;
@@ -197,7 +227,7 @@ public class PopWindowUtil {
         setClickListener(back, o -> {
             mPopupWindow.dismiss();
         });
-        mPresenter.initRecordStatusWindow(context, dialog_view, listener);
+        mPresenter.initRecordStatusWindow(context, dialog_view, bean, listener);
         mPopupWindow = new PopupWindow(dialog_view, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
         mPopupWindow.setFocusable(false);
         mPopupWindow.showAtLocation(parent, Gravity.CENTER, 0, 0);

+ 5 - 0
app/src/main/java/com/edufound/reader/presenter/CharacterFragmentPresenter.java

@@ -19,7 +19,11 @@ import com.edufound.reader.contract.CharacterFragmentContract;
 import com.edufound.reader.model.CharacterFragmentModel;
 import com.edufound.reader.util.GlideUtils;
 import com.edufound.reader.util.SizeUtils;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
+import com.orhanobut.logger.Logger;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -73,6 +77,7 @@ public class CharacterFragmentPresenter extends BasePresenter<CharacterFragmentC
     }
 
 
+
     private void setGridItemView(GridLayout gridLayout, int index) {
 
         if (mView == null) {

+ 131 - 1
app/src/main/java/com/edufound/reader/presenter/CommentPresenter.java

@@ -2,20 +2,41 @@ package com.edufound.reader.presenter;
 
 import android.view.View;
 import android.widget.FrameLayout;
+import android.widget.Toast;
 
+import com.edufound.reader.adapter.CommentItemAdapter;
+import com.edufound.reader.base.BaseActivity;
 import com.edufound.reader.base.BasePresenter;
+import com.edufound.reader.bean.CommentListBean;
+import com.edufound.reader.bean.CommentListReplyBean;
+import com.edufound.reader.bean.HttpResultBean;
+import com.edufound.reader.bean.HttpResultDataListBean;
+import com.edufound.reader.bean.UserBean;
 import com.edufound.reader.contract.CommentContract;
 import com.edufound.reader.model.CommentModel;
+import com.google.gson.reflect.TypeToken;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
+import com.orhanobut.logger.Logger;
 
+import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 public class CommentPresenter extends BasePresenter<CommentContract.View> implements CommentContract.Presenter {
 
 
     CommentModel mModel;
-    List<Object> mDataList;
+    List<CommentListReplyBean> mDataList;
+    CommentItemAdapter mCommentItemAdapter;
+    String exampleId = null;
+    int pageCommentIndex = 0;
+    int commentSize = 0;
+    boolean loadOver = false;
 
     public CommentPresenter() {
         mModel = new CommentModel();
@@ -28,5 +49,114 @@ public class CommentPresenter extends BasePresenter<CommentContract.View> implem
             rv.setVisibility(View.GONE);
             return;
         }
+        mCommentItemAdapter = new CommentItemAdapter(mView.getActivity(), mDataList);
+        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mView.getActivity());
+        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+        rv.setLayoutManager(linearLayoutManager);
+        rv.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
+            @Override
+            public void onChildViewAttachedToWindow(@androidx.annotation.NonNull View view) {
+                addMoreData(rv);
+            }
+
+            @Override
+            public void onChildViewDetachedFromWindow(@androidx.annotation.NonNull View view) {
+
+            }
+        });
+        rv.setAdapter(mCommentItemAdapter);
+        mCommentItemAdapter.setOnClickReCommentNext(o -> {
+            Toast.makeText(mView.getActivity(), "点击回复", Toast.LENGTH_SHORT).show();
+            mView.editRequestFocus();
+        });
+    }
+
+    @Override
+    public void getAllComment(String exampleId, String pageIndex) {
+        if (mDataList != null && mDataList.size() >= commentSize) {
+            loadOver = true;
+            Logger.e("commentSize:" + commentSize + "---mDataList.size():" + mDataList.size());
+            Toast.makeText(mView.getActivity(), "没有更多了", Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        this.exampleId = exampleId;
+        this.pageCommentIndex = Integer.valueOf(pageIndex);
+        mModel.getCommentAll(mView.getActivity(), exampleId, pageIndex, new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                Toast.makeText(mView.getActivity(), "获取评论成功", Toast.LENGTH_SHORT).show();
+                HttpResultBean<HttpResultDataListBean<CommentListReplyBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<CommentListReplyBean>>>() {
+                }.getType());
+                if (mDataList == null) {
+                    mDataList = bean.getData().getList();
+                    commentSize = Integer.valueOf(bean.getData().getTotalSize());
+                    mView.getCommentAllSuccess();
+                } else {
+                    mDataList.addAll(bean.getData().getList());
+                    mView.getRootView().post(new Runnable() {
+                        @Override
+                        public void run() {
+                            mCommentItemAdapter.notifyDataSetChanged();
+                        }
+                    });
+                }
+                pageCommentIndex++;
+                Logger.e("commentSize:" + commentSize + "---mDataList.size():" + mDataList.size());
+                mView.setMaxCommentCount(commentSize);
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("获取带分层评论失败:" + info.getRetDetail());
+            }
+        });
+    }
+
+    @Override
+    public void doPosts(String comment) {
+        Map<String, String> map = new HashMap<>();
+        map.put("detailDesc", comment);
+        map.put("columnId", exampleId);
+        mModel.doPosts(mView.getActivity(), ((BaseActivity) mView.getActivity()).getGson().toJson(map), new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                Logger.e("发送评论成功:" + info.getRetDetail());
+                HttpResultBean<CommentListReplyBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<CommentListReplyBean>>() {
+                }.getType());
+                mDataList.add(0, bean.getData());
+                mView.getRootView().post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mCommentItemAdapter.notifyDataSetChanged();
+                        mView.moveRecyclearView(0);
+                        mView.setMaxCommentCount(mDataList.size());
+                    }
+                });
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("发送评论失败:" + info.getRetDetail());
+            }
+        });
+    }
+
+    public void addMoreData(RecyclerView rv) {
+        //获取当前显示的View 的数据
+        int childCount = rv.getChildCount();
+        //获取最后一具 Item 对应的View
+        View childAt = rv.getChildAt(childCount - 1);
+        //获取当前军舰中显示的最后一个 Item 的位置  Postion
+        int childLayoutPosition = rv.getChildLayoutPosition(childAt);
+        //如果不是最后一个就向下滑动
+
+        if (childLayoutPosition < rv.getAdapter().getItemCount() - 2) {
+        } else {
+            if (loadOver) {
+                return;
+            }
+            getAllComment(this.exampleId, String.valueOf(this.pageCommentIndex));
+        }
     }
 }

+ 0 - 56
app/src/main/java/com/edufound/reader/presenter/CrashDialogPresenter.java

@@ -13,70 +13,14 @@ import com.edufound.reader.services.RecordServices;
 import com.orhanobut.logger.Logger;
 
 public class CrashDialogPresenter extends BasePresenter<CrashDialogContract.View> implements CrashDialogContract.Presenter {
-    RecordServices mRecordServices;
 
 
     public CrashDialogPresenter() {
     }
 
-    @Override
-    public void bindRecordServices() {
-        if (mRecordServices == null) {
-            Intent intent = new Intent();
-            intent.setClass(mView.getActivity(), RecordServices.class);
-            mView.getActivity().bindService(intent, recordServicesConn, Context.BIND_AUTO_CREATE);
-        }
-    }
-
-    @Override
-    public void startRecord(String name, String refText) {
-        mRecordServices.startRecord(mView.getActivity(), name, refText);
-    }
-
-    @Override
-    public void stopRecord() {
-        mRecordServices.stopRecord();
-    }
-
-    @Override
-    public void rePlayRecord() {
-        mRecordServices.replayRecord();
-    }
 
     @Override
     public void activityDestory() {
-        mRecordServices.unbindService(recordServicesConn);
-        if (mRecordServices != null) {
-            mView.getActivity().unbindService(recordServicesConn);
-        }
     }
 
-
-    private ServiceConnection recordServicesConn = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
-            mRecordServices = ((RecordServices.RecordServicesBind) iBinder).getService();
-            mRecordServices.setRecordCallBack(new RecordServices.RecordCallBack() {
-                @Override
-                public void onRecordStart() {
-                    Logger.e("录音开始");
-                }
-
-                @Override
-                public void onRecordStop(int type, String tokenId, EvalResult result) {
-                    Logger.e("录音停止");
-                }
-
-                @Override
-                public void onRecordCancel() {
-                    Logger.e("录音取消");
-                }
-            });
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName componentName) {
-            mRecordServices = null;
-        }
-    };
 }

+ 45 - 27
app/src/main/java/com/edufound/reader/presenter/LoginAlertPresenter.java

@@ -1,6 +1,5 @@
 package com.edufound.reader.presenter;
 
-import android.content.Context;
 import android.content.Intent;
 import android.graphics.Color;
 import android.os.Handler;
@@ -12,24 +11,29 @@ import android.text.TextUtils;
 import android.text.method.LinkMovementMethod;
 import android.text.style.ClickableSpan;
 import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.webkit.WebView;
 import android.widget.FrameLayout;
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.edufound.reader.R;
 import com.edufound.reader.activity.WebActivity;
+import com.edufound.reader.apiserver.UserApiServerImpl;
 import com.edufound.reader.base.BasePresenter;
 import com.edufound.reader.contract.LoginAlertContract;
 import com.edufound.reader.model.LoginAlertModel;
 import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.DeviceUuidFactory;
+import com.edufound.reader.util.EfunboxUtil;
+import com.google.gson.Gson;
 import com.jakewharton.rxbinding4.view.RxView;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 import com.orhanobut.logger.Logger;
 
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import io.reactivex.rxjava3.annotations.NonNull;
@@ -39,6 +43,7 @@ public class LoginAlertPresenter extends BasePresenter<LoginAlertContract.View>
 
 
     LoginAlertModel mModel;
+    UserApiServerImpl mUserApi;
     List<Integer> leftBrackets = new ArrayList<>();
     List<Integer> rightBrackets = new ArrayList<>();
     String mServiceText = "点击登录表示您已阅读并同意《用户隐私政策》和《服务协议》。";
@@ -47,6 +52,7 @@ public class LoginAlertPresenter extends BasePresenter<LoginAlertContract.View>
 
     public LoginAlertPresenter() {
         mModel = new LoginAlertModel();
+        mUserApi = new UserApiServerImpl();
     }
 
 
@@ -82,14 +88,27 @@ public class LoginAlertPresenter extends BasePresenter<LoginAlertContract.View>
 
     @Override
     public void getVCode(String phoneNum) {
-        if (isMobileNO(phoneNum)) {
+        if (EfunboxUtil.isMobileNO(phoneNum)) {
             //正常,获取验证码
-            getVCode = 9999;
+//            getVCode = 9999;
             ((FrameLayout) mView.getVCodeText().getParent()).setClickable(false);
             ((FrameLayout) mView.getVCodeText().getParent()).setEnabled(false);
 //            ((FrameLayout) mView.getVCodeText().getParent()).setBackgroundColor(mView.getActivity().getResources().getColor(R.color.translucent_background));
             mView.getVCodeText().setText(String.valueOf(mVCodeResCount));
             mLoginAlertHandler.sendEmptyMessageDelayed(LoginAlertModel.CHANGE_VCODE_TEXT, 1000);
+            mModel.getVCode(mView.getActivity(), phoneNum, new Callback() {
+                @Override
+                public void onSuccess(HttpInfo info) throws IOException {
+                    String result = info.getRetDetail();
+                    Logger.e("result:" + result);
+                    getVCode = 9999;
+                }
+
+                @Override
+                public void onFailure(HttpInfo info) throws IOException {
+
+                }
+            });
 
         } else {
             Toast.makeText(mView.getActivity(), "请输入正确的手机号", Toast.LENGTH_SHORT).show();
@@ -100,7 +119,7 @@ public class LoginAlertPresenter extends BasePresenter<LoginAlertContract.View>
     @Override
     public void Login(String phoneNum, String inputVCode) {
 
-        if (isMobileNO(phoneNum)) {
+        if (EfunboxUtil.isMobileNO(phoneNum)) {
             //手机号没有改过,正常。获取了验证码了,判断验证码
             if (TextUtils.isEmpty(inputVCode)) {
                 Toast.makeText(mView.getActivity(), "请输入验证码", Toast.LENGTH_SHORT).show();
@@ -113,6 +132,24 @@ public class LoginAlertPresenter extends BasePresenter<LoginAlertContract.View>
                 if (Integer.valueOf(inputVCode) == getVCode) {
                     //输入的和返回的是一样的
                     //请求接口,根据phoneNum,Integer.valueOf(inputVCode)
+                    Map<String, String> params = new HashMap<>();
+                    params.put("channel", Consts.getUmengChannel());
+                    params.put("deviceCode", DeviceUuidFactory.getUuid().toString());
+                    params.put("mobileNo", phoneNum);
+                    params.put("verifyCode", inputVCode);
+                    params.put("verify", "true");
+                    mUserApi.registerUser(mView.getActivity(), new Gson().toJson(params), new Callback() {
+                        @Override
+                        public void onSuccess(HttpInfo info) throws IOException {
+                            Logger.e("注册成功:" + info.getRetDetail());
+                        }
+
+                        @Override
+                        public void onFailure(HttpInfo info) throws IOException {
+                            Logger.e("注册失败:" + info.getRetDetail());
+                        }
+                    });
+
                 } else {
                     Toast.makeText(mView.getActivity(), "验证码输入错误", Toast.LENGTH_SHORT).show();
                 }
@@ -184,25 +221,6 @@ public class LoginAlertPresenter extends BasePresenter<LoginAlertContract.View>
     }
 
 
-    /**
-     * 判断字符串是否符合手机号码格式
-     * 移动号段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
-     * 联通号段: 130,131,132,145,155,156,170,171,175,176,185,186
-     * 电信号段: 133,149,153,170,173,177,180,181,189
-     *
-     * @param mobileNums
-     * @return 待检测的字符串
-     */
-    private boolean isMobileNO(String mobileNums) {
-        String telRegex = "^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8]))\\d{8}$";// "[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。
-        if (TextUtils.isEmpty(mobileNums)) {
-            return false;
-        } else {
-            return mobileNums.matches(telRegex);
-        }
-    }
-
-
     private void setClickListener(View view, Consumer onNext) {
         RxView.clicks(view).throttleFirst(2, TimeUnit.SECONDS).subscribe(onNext);
     }

+ 122 - 37
app/src/main/java/com/edufound/reader/presenter/MainPresenter.java

@@ -1,8 +1,10 @@
 package com.edufound.reader.presenter;
 
-import android.content.Intent;
 import android.graphics.Color;
+import android.text.TextUtils;
 import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.RadioButton;
 import android.widget.RadioGroup;
@@ -10,36 +12,50 @@ import android.widget.TextView;
 import android.widget.Toast;
 
 import com.edufound.reader.R;
-import com.edufound.reader.activity.LoginAlertActivity;
+import com.edufound.reader.apiserver.UserApiServerImpl;
+import com.edufound.reader.base.BaseActivity;
 import com.edufound.reader.base.BasePresenter;
+import com.edufound.reader.bean.HttpResultBean;
+import com.edufound.reader.bean.UserBean;
 import com.edufound.reader.contract.MainContract;
 import com.edufound.reader.fragment.CharacterFragment;
-import com.edufound.reader.fragment.RecommendFragment;
 import com.edufound.reader.fragment.MyTabFragment;
-import com.edufound.reader.listener.PopupRecordStatusListener;
-import com.edufound.reader.model.MainModel;
+import com.edufound.reader.fragment.RecommendFragment;
 import com.edufound.reader.listener.PopUtilClickListener;
+import com.edufound.reader.model.MainModel;
 import com.edufound.reader.popwindow.PopWindowUtil;
 import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.DeviceUuidFactory;
+import com.edufound.reader.util.EfunboxUtil;
+import com.edufound.reader.util.MMKVEncodeKey;
+import com.edufound.reader.util.MMKVUtil;
 import com.edufound.reader.util.SizeUtils;
+import com.google.gson.reflect.TypeToken;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 import com.orhanobut.logger.Logger;
 
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
 public class MainPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter {
     MainModel mModel;
+    UserApiServerImpl mUserApi;
     MyTabFragment mUserFragment;
     RecommendFragment mRecommendFragment;
     FragmentManager mFragmentManager;
     RecommendFragment mFollowFragment;
     CharacterFragment mCharacterFragment;
     int mRadioCheckIndex = 0;
-    boolean showSelectGrade = true;
 
     public MainPresenter(FragmentManager fragmentManager) {
         mModel = new MainModel();
+        mUserApi = new UserApiServerImpl();
         mFragmentManager = fragmentManager;
         mUserFragment = new MyTabFragment();
         mRecommendFragment = new RecommendFragment(0);
@@ -54,13 +70,13 @@ public class MainPresenter extends BasePresenter<MainContract.View> implements M
         switch (id) {
             case R.id.main_left_tab_layout_myinfo:
                 //我的
-                Logger.e("我的");
-//                if (checkLogin()) {
-//                    mRadioCheckIndex = 0;
-//                    changeFragmentLayout(mUserFragment);
-//                } else {
-//                    ((RadioButton) radioGroup.getChildAt(mRadioCheckIndex)).setChecked(true);
-//                }
+//                Logger.e("我的");
+                if (checkLogin()) {
+                    mRadioCheckIndex = 0;
+                    changeFragmentLayout(mUserFragment);
+                } else {
+                    ((RadioButton) radioGroup.getChildAt(mRadioCheckIndex)).setChecked(true);
+                }
                 changeFragmentLayout(mUserFragment);
                 break;
             case R.id.main_left_tab_layout_recommend:
@@ -69,26 +85,6 @@ public class MainPresenter extends BasePresenter<MainContract.View> implements M
                 ((RadioButton) radioGroup.getChildAt(mRadioCheckIndex)).setChecked(true);
                 Logger.e("推荐");
                 changeFragmentLayout(mRecommendFragment);
-                if (showSelectGrade) {
-                    radioGroup.postDelayed(new Runnable() {
-                        @Override
-                        public void run() {
-                            PopWindowUtil.showSelectGradeWindow(mView.getActivity(), mView.getRootView(), 0, new PopUtilClickListener() {
-                                @Override
-                                public void clickCancel() {
-
-                                }
-
-                                @Override
-                                public void clickSubmit(Object object) {
-                                    Toast.makeText(mView.getActivity(), "选择了:" + object.toString(), Toast.LENGTH_SHORT).show();
-                                }
-                            });
-                            showSelectGrade = false;
-                        }
-                    }, 500);
-
-                }
                 break;
             case R.id.main_left_tab_layout_follow:
                 //关注
@@ -119,13 +115,14 @@ public class MainPresenter extends BasePresenter<MainContract.View> implements M
     }
 
     boolean checkLogin() {
-        if (Consts.getmConstsUserBean() != null) {
+        if (!Consts.getUID().equals("test")) {
             //已登录
             return true;
         }
         //未登录,去登录
-        Intent tologin = new Intent(mView.getActivity(), LoginAlertActivity.class);
-        mView.getActivity().startActivity(tologin);
+//        Intent tologin = new Intent(mView.getActivity(), LoginAlertActivity.class);
+//        mView.getActivity().startActivity(tologin);
+        registerMobile("15810271411");
         return false;
     }
 
@@ -148,15 +145,103 @@ public class MainPresenter extends BasePresenter<MainContract.View> implements M
     public void checkModelIsDebug() {
         if (Consts.isIsDebug()) {
             TextView tv = new TextView(mView.getActivity());
-            tv.setLayoutParams(new FrameLayout.LayoutParams(SizeUtils.px2dp(mView.getActivity(), 300), SizeUtils.px2dp(mView.getActivity(), 100)));
+            tv.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, SizeUtils.px2dp(mView.getActivity(), 100)));
             tv.setTextSize(SizeUtils.px2dp(mView.getActivity(), 30));
             tv.setTextColor(Color.RED);
             tv.setBackgroundColor(mView.getActivity().getResources().getColor(R.color.translucent_background));
             tv.setText("当前在Debug模式下(->application->setIsDebug)");
+            tv.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    MMKVUtil.getInstance().clearAll();
+                }
+            });
             mView.getRootView().addView(tv);
         }
     }
 
+    @Override
+    public void showSelectGradeWindow() {
+        PopWindowUtil.showSelectGradeWindow(mView.getActivity(), mView.getRootView(), 0, new PopUtilClickListener() {
+            @Override
+            public void clickCancel() {
+
+            }
+
+            @Override
+            public void clickSubmit(Object object) {
+                Toast.makeText(mView.getActivity(), "选择了:" + EfunboxUtil.getEnumByCNGrade(object.toString()), Toast.LENGTH_SHORT).show();
+                MMKVUtil.getInstance().encode(MMKVEncodeKey.USER_GRADE, EfunboxUtil.getEnumByCNGrade(object.toString()));
+            }
+        });
+
+    }
+
+
+    @Override
+    public void userIsLogin() {
+        mUserApi.isLogin(mView.getActivity(), DeviceUuidFactory.getUuid(), new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                Logger.e("用户是否登录成功:" + info.getRetDetail());
+                HttpResultBean<UserBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserBean>>() {
+                }.getType());
+                Consts.setUID(bean.getData().getUid());
+                //用户是否登录,登录了,创建Consts的userbean
+                Consts.setmConstsUserBean(bean.getData());
+                mView.setCheckIndex();
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                if (TextUtils.isEmpty(MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE))) {
+                    //没有选择过年纪,选择年纪
+                    showSelectGradeWindow();
+                } else {
+                    //选择过年纪。无处理
+                }
+                mView.setCheckIndex();
+            }
+        });
+    }
+
+    @Override
+    public void registerMobile(String mobileNo) {
+        if (EfunboxUtil.isMobileNO(mobileNo)) {
+            Map<String, String> map = new HashMap<>();
+            map.put("deviceCode", DeviceUuidFactory.getUuid());
+            map.put("channel", Consts.getUmengChannel());
+            map.put("mobileNo", mobileNo);
+            if (MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE).equals("") || MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE) == null) {
+                //如果没有,默认给一年级
+                map.put("grade", "PRIMARY_FIRST_GRADE");
+            } else {
+                map.put("grade", MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE));
+            }
+            String json = ((BaseActivity) mView.getActivity()).getGson().toJson(map);
+            mUserApi.registerMobile(mView.getActivity(), json, new Callback() {
+                @Override
+                public void onSuccess(HttpInfo info) throws IOException {
+                    Logger.e("手机号注册成功:" + info.getRetDetail());
+                    HttpResultBean<UserBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserBean>>() {
+                    }.getType());
+                    Consts.setUID(bean.getData().getUid());
+                    //用户是否登录,登录了,创建Consts的userbean
+                    Consts.setmConstsUserBean(bean.getData());
+                }
+
+                @Override
+                public void onFailure(HttpInfo info) throws IOException {
+                    Logger.e("手机号注册失败:" + info.getRetDetail());
+                    Toast.makeText(mView.getActivity(), "注册失败", Toast.LENGTH_SHORT).show();
+                }
+            });
+        } else {
+            Toast.makeText(mView.getActivity(), "手机号不正确", Toast.LENGTH_SHORT).show();
+        }
+
+    }
+
 
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {

+ 30 - 9
app/src/main/java/com/edufound/reader/presenter/MyCollectionPresenter.java

@@ -7,9 +7,13 @@ import com.edufound.reader.adapter.MyCollectionItemAdapter;
 import com.edufound.reader.base.BasePresenter;
 import com.edufound.reader.contract.MyCollectionContract;
 import com.edufound.reader.listener.RecyclerItemClickListener;
+import com.edufound.reader.model.MyCollectionModel;
 import com.edufound.reader.util.SizeUtils;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 import com.orhanobut.logger.Logger;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -21,8 +25,10 @@ import io.reactivex.rxjava3.annotations.NonNull;
 public class MyCollectionPresenter extends BasePresenter<MyCollectionContract.View> implements MyCollectionContract.Presenter {
     List<Object> mDataList;
     MyCollectionItemAdapter myCollectionItemAdapter;
+    MyCollectionModel mModel;
 
     public MyCollectionPresenter() {
+        mModel = new MyCollectionModel();
         mDataList = new ArrayList<>();
         for (int i = 0; i < 30; i++) {
             mDataList.add("i=" + i);
@@ -59,6 +65,28 @@ public class MyCollectionPresenter extends BasePresenter<MyCollectionContract.Vi
         rv.setAdapter(myCollectionItemAdapter);
     }
 
+    @Override
+    public void getFavoritesData(RecyclerView rv) {
+        mModel.getFavorites(mView.getActivity(), 0, new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                Logger.e("获取收藏列表成功:" + info.getRetDetail());
+                myCollectionItemAdapter.addMored(mDataList);
+                rv.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        myCollectionItemAdapter.notifyDataSetChanged();
+                    }
+                });
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("获取收藏列表失败:" + info.getRetDetail());
+            }
+        });
+    }
+
     public void addMoreData(RecyclerView rv) {
         //获取当前显示的View 的数据
         int childCount = rv.getChildCount();
@@ -70,15 +98,8 @@ public class MyCollectionPresenter extends BasePresenter<MyCollectionContract.Vi
 
         if (childLayoutPosition < rv.getAdapter().getItemCount() - 2) {
         } else {
-            Logger.e("倒数第二个,添加数据");
-            mDataList.addAll(mDataList);
-            myCollectionItemAdapter.addMored(mDataList);
-            rv.post(new Runnable() {
-                @Override
-                public void run() {
-                    myCollectionItemAdapter.notifyDataSetChanged();
-                }
-            });
+            getFavoritesData(rv);
+
         }
     }
 }

+ 75 - 51
app/src/main/java/com/edufound/reader/presenter/MyTabFragmentPresenter.java

@@ -4,13 +4,11 @@ import android.animation.Animator;
 import android.animation.LayoutTransition;
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.Rect;
 import android.os.Handler;
 import android.os.Message;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.GridLayout;
 import android.widget.ImageView;
@@ -19,6 +17,9 @@ import android.widget.TextView;
 import com.edufound.reader.R;
 import com.edufound.reader.activity.SmallFullVideoActivity;
 import com.edufound.reader.base.BasePresenter;
+import com.edufound.reader.bean.HttpResultBean;
+import com.edufound.reader.bean.MyInfoBean;
+import com.edufound.reader.bean.UserRecordBean;
 import com.edufound.reader.contract.MyTabFragmentContract;
 import com.edufound.reader.listener.PopUtilClickListener;
 import com.edufound.reader.model.CharacterFragmentModel;
@@ -26,67 +27,30 @@ import com.edufound.reader.model.MyTabFragmentModel;
 import com.edufound.reader.popwindow.PopWindowUtil;
 import com.edufound.reader.util.GlideUtils;
 import com.edufound.reader.util.SizeUtils;
+import com.google.gson.reflect.TypeToken;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 import com.orhanobut.logger.Logger;
 
-import java.util.ArrayList;
+import java.io.IOException;
 import java.util.List;
 
-import androidx.recyclerview.widget.RecyclerView;
-
 public class MyTabFragmentPresenter extends BasePresenter<MyTabFragmentContract.View> implements MyTabFragmentContract.Presenter {
 
     MyTabFragmentModel mModel;
     Context mContext;
-    List<Object> mDataList;
+    List<UserRecordBean> mDataList;
     int mListStart = 0;
     int mListEnd = 6;
 
     public MyTabFragmentPresenter(Context context) {
         mContext = context;
         mModel = new MyTabFragmentModel();
-
-        mDataList = new ArrayList<>();
-        for (int i = 0; i < 35; i++) {
-            mDataList.add("i=" + i);
-        }
-    }
-
-    @Override
-    public void initRecyclerView(RecyclerView rv) {
-//
-//        List<Object> mDataList = new ArrayList<>();
-//        for (int i = 0; i < 30; i++) {
-//            mDataList.add("i=" + i);
-//        }
-//        RecordItemAdapter adapter = new RecordItemAdapter(mContext, mDataList);
-//        GridLayoutManager gridLayoutManager = new GridLayoutManager(mContext, 2);
-//        gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
-//        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
-//            @Override
-//            public int getSpanSize(int position) {
-//                return (adapter.isHeaderView(position) || adapter.isBottomView(position)) ? gridLayoutManager.getSpanCount() : 1;
-//            }
-//        });
-//        rv.addItemDecoration(new GridSpaceItemDecoration((adapter.getContentItemCount() / 2),
-//                SizeUtils.dp2px(mContext, 27),
-//                SizeUtils.dp2px(mContext, 27)));
-//        rv.setLayoutManager(gridLayoutManager);
-//
-//        Logger.e("adapter.getItemCount():" + adapter.getItemCount());
-//        rv.setNestedScrollingEnabled(false);
-//        rv.setAdapter(adapter);
-
-        //我的作品TextView原因,无法使用RecyclerView,但是代码和xml保留. src/fragmentUser里面
     }
 
 
     @Override
     public void initGridLayout(GridLayout gridLayout, FrameLayout norecordlayout) {
-        if (mDataList == null || mDataList.size() <= 0) {
-            norecordlayout.setVisibility(View.VISIBLE);
-            gridLayout.setVisibility(View.GONE);
-            return;
-        }
         if (gridLayout.getLayoutTransition() == null) {
             LayoutTransition transition = new LayoutTransition();
             transition.setDuration(200);
@@ -97,6 +61,15 @@ public class MyTabFragmentPresenter extends BasePresenter<MyTabFragmentContract.
             gridLayout.setLayoutTransition(transition);
         }
         gridLayout.setRowCount(2);
+
+    }
+
+    public void setGridData(GridLayout gridLayout, FrameLayout norecordlayout) {
+        if (mDataList == null || mDataList.size() <= 0) {
+            norecordlayout.setVisibility(View.VISIBLE);
+            gridLayout.setVisibility(View.GONE);
+            return;
+        }
         int timeCount = 0;
         for (int j = mListStart; j < mListEnd; j++) {
             timeCount++;
@@ -126,25 +99,77 @@ public class MyTabFragmentPresenter extends BasePresenter<MyTabFragmentContract.
         mView = null;
     }
 
+    @Override
+    public void getMyRecords() {
+        mModel.getMyRecords(mView.getActivity(), new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                HttpResultBean<List<UserRecordBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<List<UserRecordBean>>>() {
+                }.getType());
+                mDataList = bean.getData();
+                mView.loadMoreItem();
+                mView.setRecordSize(mDataList.size());
+
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("获取我的朗读列表错误:" + info.getRetDetail());
+            }
+        });
+    }
+
+    @Override
+    public void getMyInfo() {
+        mModel.getMyInfo(mView.getActivity(), new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                Logger.e("获取用户中心信息接口成功:" + info.getRetDetail());
+                HttpResultBean<MyInfoBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<MyInfoBean>>() {
+                }.getType());
+                mView.setUserInfo(bean.getData());
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+
+            }
+        });
+    }
+
 
     private void setGridItemView(GridLayout gridLayout, int index) {
 
         if (mView == null) {
             return;
         }
-
         View view = LayoutInflater.from(mContext).inflate(R.layout.adapter_item_record_user, null);
+        UserRecordBean.UserRead reader = mDataList.get(index).getUserRead();
         ImageView imgIcon = view.findViewById(R.id.adapter_item_record_user_icon);
         TextView name = view.findViewById(R.id.adapter_item_record_user_name);
         ImageView imgDel = view.findViewById(R.id.adapter_item_record_user_del);
         ImageView imgPriv = view.findViewById(R.id.adapter_item_record_user_priv);
+        TextView lookAmount = view.findViewById(R.id.adapter_item_record_user_look_num);
+        TextView likeAmount = view.findViewById(R.id.adapter_item_record_user_thumb_num);
+        TextView commentAmount = view.findViewById(R.id.adapter_item_record_user_comment_num);
+        TextView favoritesAmount = view.findViewById(R.id.adapter_item_record_user_start_num);
         FrameLayout checkLayout = view.findViewById(R.id.adapter_item_record_user_examine_layout);
-        GlideUtils.loadRoundCircleImage(mContext, "http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640", imgIcon, SizeUtils.dp2px(mContext, 20));
-        if (index < 10) {
-            //测试用
-            checkLayout.setVisibility(View.GONE);
-            imgPriv.setImageResource(R.drawable.adapter_item_record_pub);
+        GlideUtils.loadRoundCircleImage(mContext, reader.getCoverImg(), imgIcon, SizeUtils.dp2px(mContext, 20));
+        name.setText(reader.getTitle());
+        lookAmount.setText(reader.getPlayAmount());
+        likeAmount.setText(reader.getLikeAmount());
+        commentAmount.setText(reader.getCommentAmount());
+        favoritesAmount.setText(reader.getFavoritesAmount());
+        switch (reader.getStatus()) {
+            case "NORMAL":
+                checkLayout.setVisibility(View.GONE);
+                break;
         }
+//        if (index < 10) {
+//            //测试用
+//            checkLayout.setVisibility(View.GONE);
+//            imgPriv.setImageResource(R.drawable.adapter_item_record_pub);
+//        }
         mView.addUiClick(imgDel, o -> {
             PopWindowUtil.showRecordRemovedWindow(mContext, mView.getRootView(), new PopUtilClickListener() {
                 @Override
@@ -197,7 +222,6 @@ public class MyTabFragmentPresenter extends BasePresenter<MyTabFragmentContract.
                 return true;
             }
         });
-        name.setText("当前第:" + index + "个");
         GridLayout.LayoutParams params = new GridLayout.LayoutParams(new FrameLayout.LayoutParams(SizeUtils.dp2px(mContext, 415), SizeUtils.dp2px(mContext, 290)));
         params.setMargins(SizeUtils.dp2px(mContext, 10), 0, SizeUtils.dp2px(mContext, 20), SizeUtils.dp2px(mContext, 20));
         view.setLayoutParams(params);

+ 65 - 29
app/src/main/java/com/edufound/reader/presenter/PopWindowPresneter.java

@@ -1,5 +1,6 @@
 package com.edufound.reader.presenter;
 
+import android.animation.LayoutTransition;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Handler;
@@ -16,10 +17,13 @@ import com.edufound.reader.R;
 import com.edufound.reader.activity.MainActivity;
 import com.edufound.reader.adapter.PopupMyOrderAdapter;
 import com.edufound.reader.application.EApplication;
+import com.edufound.reader.bean.RecordResultBean;
 import com.edufound.reader.listener.PopupRecordStatusListener;
 import com.edufound.reader.model.PopWindowModelImpl;
 import com.edufound.reader.popwindow.PopWindowUtil;
+import com.orhanobut.logger.Logger;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -35,7 +39,7 @@ public class PopWindowPresneter {
         mModel = new PopWindowModelImpl();
     }
 
-    public void initRecordStatusWindow(Context context, View dialog_view, PopupRecordStatusListener listener) {
+    public void initRecordStatusWindow(Context context, View dialog_view, RecordResultBean bean, PopupRecordStatusListener listener) {
         FrameLayout mOverFrame = dialog_view.findViewById(R.id.popupwindow_record_status_over_frame);
         FrameLayout mUploadingFrame = dialog_view.findViewById(R.id.popupwindow_record_status_uploading_frame);
         FrameLayout mUploadingSuccessFrame = dialog_view.findViewById(R.id.popupwindow_record_status_uploading_success_frame);
@@ -43,20 +47,48 @@ public class PopWindowPresneter {
         LinearLayout startLayout = mOverFrame.findViewById(R.id.popupwindow_record_status_over_start_layout);
         FrameLayout mRePlay = mOverFrame.findViewById(R.id.popupwindow_record_status_over_replay);
         FrameLayout mUpload = mOverFrame.findViewById(R.id.popupwindow_record_status_over_upload);
+//        float a = bean.getOverall() / 100f;//百分制
+        int integrity = bean.getIntegrity();
+        int accuracy = bean.getAccuracy();
+        int speedd = bean.getSpeed();
+        int tone = bean.getTone();
+        int score = (int) ((integrity * 0.5) + (bean.getOverall() * 0.3) + (speedd * 0.1) + (tone * 0.1));
+        Logger.e("(integrity * 0.3):" + (integrity * 0.5));
+        Logger.e(" (bean.getOverall() * 0.5)" + (bean.getOverall() * 0.5));
+        Logger.e(" (speedd * 0.1):" + (speedd * 0.1));
+        Logger.e("(tone * 0.1):" + (tone * 0.1));
+        int startCount = 0;
+        if (score >= 0 && score < 20) {
+            //1个星星
+            startCount = 1;
+        } else if (score > 20 && score < 40) {
+            //2个星星
+            startCount = 2;
+        } else if (score > 40 && score < 60) {
+            //3个星星
+            startCount = 3;
+        } else if (score > 60 && score < 80) {
+            //4个星星
+            startCount = 4;
+        } else if (score > 80 && score <= 100) {
+            //5个星星
+            startCount = 5;
+        }
+        Logger.e("score:" + score);
         //先显示评测报告,处理测评报告逻辑
         {
             mOverFrame.setVisibility(View.VISIBLE);
             startLayout.removeAllViews();
             for (int i = 0; i < 5; i++) {
                 ImageView start = new ImageView(context);
-                start.setImageResource(R.drawable.popup_record_status_over_stars_false);
+                if (i < startCount) {
+                    start.setImageResource(R.drawable.popup_record_status_over_stars_true);
+                } else {
+                    start.setImageResource(R.drawable.popup_record_status_over_stars_false);
+                }
                 start.setLayoutParams(new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1));
                 startLayout.addView(start);
             }
-            int a = 10;
-            int b = 20;
-            int c = 30;
-            int d = 40;
             TextView completionText = mOverFrame.findViewById(R.id.popupwindow_record_status_over_completion_text);
             TextView correctrateText = mOverFrame.findViewById(R.id.popupwindow_record_status_over_correctrate_text);
             TextView speedText = mOverFrame.findViewById(R.id.popupwindow_record_status_over_speed_text);
@@ -64,7 +96,7 @@ public class PopWindowPresneter {
             completionText.post(new Runnable() {
                 @Override
                 public void run() {
-                    for (int completionPoint = 0; completionPoint < a; completionPoint++) {
+                    for (int completionPoint = 0; completionPoint < integrity; completionPoint++) {
                         Message msg = new Message();
                         msg.obj = completionText;
                         msg.arg1 = completionPoint + 1;
@@ -77,7 +109,7 @@ public class PopWindowPresneter {
             correctrateText.post(new Runnable() {
                 @Override
                 public void run() {
-                    for (int correctrate = 0; correctrate < b; correctrate++) {
+                    for (int correctrate = 0; correctrate < score; correctrate++) {
                         Message msg = new Message();
                         msg.obj = correctrateText;
                         msg.arg1 = correctrate + 1;
@@ -90,7 +122,7 @@ public class PopWindowPresneter {
             speedText.post(new Runnable() {
                 @Override
                 public void run() {
-                    for (int speed = 0; speed < c; speed++) {
+                    for (int speed = 0; speed < speedd; speed++) {
                         Message msg = new Message();
                         msg.obj = speedText;
                         msg.arg1 = speed + 1;
@@ -103,7 +135,7 @@ public class PopWindowPresneter {
             intonationText.post(new Runnable() {
                 @Override
                 public void run() {
-                    for (int intonation = 0; intonation < d; intonation++) {
+                    for (int intonation = 0; intonation < tone; intonation++) {
                         Message msg = new Message();
                         msg.obj = intonationText;
                         msg.arg1 = intonation + 1;
@@ -124,30 +156,34 @@ public class PopWindowPresneter {
             mRePlay.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View view) {
-//                    listener.clickReRecord();
-                    //上传成功逻辑
-                    {
-                        mUploadingSuccessFrame.setVisibility(View.VISIBLE);
-                        FrameLayout toLisMySelf = mUploadingSuccessFrame.findViewById(R.id.popup_record_status_upload_success_btn);
-                        toLisMySelf.setOnClickListener(new View.OnClickListener() {
-                            @Override
-                            public void onClick(View view) {
-                                PopWindowUtil.hidePopupWindow();
-                                Toast.makeText(context, "去听听(首页->我的tab)", Toast.LENGTH_SHORT).show();
-                                for (int i = 0; i < EApplication.mActivityList.size(); i++) {
-                                    EApplication.mActivityList.get(i).finish();
-                                }
-                                Intent intent = new Intent(context, MainActivity.class);
-                                intent.putExtra("defaultIndex", 0);
-                                context.startActivity(intent);
-                            }
-                        });
-                    }
+                    listener.clickReRecord();
+
                 }
             });
         }
 
 
+        //上传成功逻辑
+        //上传成功逻辑
+//        {
+//            mUploadingSuccessFrame.setVisibility(View.VISIBLE);
+//            FrameLayout toLisMySelf = mUploadingSuccessFrame.findViewById(R.id.popup_record_status_upload_success_btn);
+//            toLisMySelf.setOnClickListener(new View.OnClickListener() {
+//                @Override
+//                public void onClick(View view) {
+//                    PopWindowUtil.hidePopupWindow();
+//                    Toast.makeText(context, "去听听(首页->我的tab)", Toast.LENGTH_SHORT).show();
+//                    for (int i = 0; i < EApplication.mActivityList.size(); i++) {
+//                        EApplication.mActivityList.get(i).finish();
+//                    }
+//                    Intent intent = new Intent(context, MainActivity.class);
+//                    intent.putExtra("defaultIndex", 0);
+//                    context.startActivity(intent);
+//                }
+//            });
+//        }
+
+
         //失败逻辑
 //        {
 //            mUploadingErrorFrame.setVisibility(View.VISIBLE);

+ 120 - 32
app/src/main/java/com/edufound/reader/presenter/RecommendFragmentPresenter.java

@@ -2,29 +2,45 @@ package com.edufound.reader.presenter;
 
 import android.content.Context;
 import android.graphics.Outline;
+import android.text.TextUtils;
 import android.view.View;
 import android.view.ViewOutlineProvider;
-import android.widget.FrameLayout;
 import android.widget.Toast;
 
 import com.edufound.reader.R;
 import com.edufound.reader.adapter.SlideVideoAdapter;
+import com.edufound.reader.base.BaseActivity;
 import com.edufound.reader.base.BasePresenter;
-import com.edufound.reader.bean.SlideVideoBean;
+import com.edufound.reader.bean.FavoritesBean;
+import com.edufound.reader.bean.HttpResultBean;
+import com.edufound.reader.bean.HttpResultDataListBean;
+import com.edufound.reader.bean.UserBean;
+import com.edufound.reader.bean.UserRecordBean;
 import com.edufound.reader.contract.RecommendFragmentContract;
 import com.edufound.reader.cusview.RvListJzvdStd;
 import com.edufound.reader.model.RecommendFragmentModel;
+import com.edufound.reader.util.Consts;
+import com.edufound.reader.util.EfunboxUtil;
+import com.edufound.reader.util.MMKVEncodeKey;
+import com.edufound.reader.util.MMKVUtil;
 import com.edufound.reader.util.SizeUtils;
 import com.edufound.reader.videoutil.OnViewPagerListener;
 import com.edufound.reader.videoutil.ViewPagerLayoutManager;
+import com.google.gson.reflect.TypeToken;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
 import com.orhanobut.logger.Logger;
 
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.OrientationHelper;
 import androidx.recyclerview.widget.RecyclerView;
+import cn.jzvd.JZUtils;
 import cn.jzvd.Jzvd;
 
 public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentContract.View> implements RecommendFragmentContract.Presenter {
@@ -37,7 +53,7 @@ public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentC
     /*
      * 测试数据
      * */
-    List<SlideVideoBean> mDataList;
+    List<UserRecordBean> mDataList;
     SlideVideoAdapter mAdapter;
 
     public RecommendFragmentPresenter(Context context) {
@@ -47,18 +63,6 @@ public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentC
 
     @Override
     public void initVideoList(RecyclerView rv, int type, int startPosition) {
-//        FrameLayout frameLayout = (FrameLayout) rv.getParent();
-//        frameLayout.setOutlineProvider(new ViewOutlineProvider() {
-//            @Override
-//            public void getOutline(View view, Outline outline) {
-//                outline.setRoundRect(0,
-//                        0,
-//                        view.getWidth(),
-//                        view.getHeight(),
-//                        SizeUtils.px2dp(mContext, 40));
-//            }
-//        });
-//        frameLayout.setClipToOutline(true);
         rv.setOutlineProvider(new ViewOutlineProvider() {
             @Override
             public void getOutline(View view, Outline outline) {
@@ -74,6 +78,8 @@ public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentC
 
         if (type == 0) {
             //推荐的接口
+            initVideoDate(rv, startPosition);
+            getRecommendDataList();
         } else if (type == 1) {
             //关注的接口
         } else if (type == 2) {
@@ -82,33 +88,23 @@ public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentC
             //关注的人的
         }
 
-        /*
-         * 测试数据
-         * */
-        mDataList = new ArrayList<>();
-        for (int i = 0; i < startPosition + 5; i++) {
-            SlideVideoBean bean = new SlideVideoBean();
-            if (i % 2 == 0) {
-                bean.videoUrl = "http://reader-wx.ai160.com/vs2m-m3u8/reader/053/05303004/05303004038/05303004038.m3u8";
-                bean.videoTitle = "m3u8视频--如梦令";
-            } else {
-                bean.videoUrl = "https://reader-wx.ai160.com/reader/resource/video/1610961140479648.mp4";
-                bean.videoTitle = "https--MP4视频";
-            }
-            mDataList.add(bean);
-        }
+    }
+
 
+    public void initVideoDate(RecyclerView rv, int startPosition) {
 
         rv.setLayoutManager(new LinearLayoutManager(mView.getActivity()));
         rv.setNestedScrollingEnabled(false);
         mViewPagerLayoutManager = new ViewPagerLayoutManager(mView.getActivity(), OrientationHelper.VERTICAL);
         rv.setLayoutManager(mViewPagerLayoutManager);
+        mDataList = new ArrayList<>();
         mAdapter = new SlideVideoAdapter(mView.getActivity(), mDataList);
         rv.setAdapter(mAdapter);
         mViewPagerLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {
             @Override
             public void onInitComplete() {
                 //自动播放第一条
+                mView.setTopStatus(mDataList.get(0));
                 autoPlayVideo(rv);
             }
 
@@ -127,6 +123,7 @@ public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentC
 //                }
                 autoPlayVideo(rv);
                 mCurrentPosition = position;
+                mView.setTopStatus(mDataList.get(mCurrentPosition));
                 if (mCurrentPosition == 0) {
                     Toast.makeText(mContext, "已经是第一个了", Toast.LENGTH_SHORT).show();
                 }
@@ -175,6 +172,98 @@ public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentC
         }
     }
 
+    @Override
+    public void getRecommendDataList() {
+        if (TextUtils.isEmpty(MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE))) {
+            //如果是空的,就是没选择过年纪。然后给个默认的一年级
+            //PRESCHOOL,FIRST_GRADE,SECOND_GRADE,THIRD_GRADE,FOURTH_GRADE
+//            MMKVUtil.getInstance().encode(MMKVEncodeKey.USER_GRADE, "FIRST_GRADE");
+        }
+        String grade = MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE);
+        if (TextUtils.isEmpty(grade)) {
+            grade = EfunboxUtil.getEnumByCNGrade("一年级");
+        }
+        if (Consts.getmConstsUserBean() == null) {
+            grade = EfunboxUtil.getEnumByCNGrade("一年级");
+        }
+        mModel.getRecommendList(mView.getActivity(), grade, (mCurrentPosition / 100) + 1, new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+//                    Log.e("com.edufound.reader", "获取推荐列表成功:" + info.getRetDetail());
+                Logger.e("info.params:" + info.getParams());
+                HttpResultBean<HttpResultDataListBean<UserRecordBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<UserRecordBean>>>() {
+                }.getType());
+                if (mDataList == null) {
+                    mDataList = bean.getData().getList();
+                } else {
+                    mDataList.addAll(bean.getData().getList());
+                    mAdapter.addMored(mDataList);
+                }
+                mView.getRootView().post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mAdapter.notifyDataSetChanged();
+                    }
+                });
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("获取推荐列表失败:" + info.getRetDetail());
+            }
+        });
+    }
+
+    @Override
+    public void doFavorites(UserRecordBean.UserRead userRead) {
+        Map<String, String> map = new HashMap<>();
+        map.put("exampleId", userRead.getExampleId());
+        map.put("targetCode", userRead.getExampleId());
+        String json = ((BaseActivity) mView.getActivity()).getGson().toJson(map);
+        Logger.e("json:" + json);
+        mModel.doFavorites(mView.getActivity(), json, new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                Logger.e("收藏/取消收藏接口成功:" + info.getRetDetail());
+                HttpResultBean<FavoritesBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<FavoritesBean>>() {
+                }.getType());
+                if (bean.getData().getStatus().equals("DEL")) {
+                    mView.setFavorites(false);
+                } else if (bean.getData().getStatus().equals("NORMAL")) {
+                    mView.setFavorites(true);
+                }
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("收藏/取消收藏接口失败:" + info.getRetDetail());
+            }
+        });
+    }
+
+    @Override
+    public void doLike(UserRecordBean.UserRead userRead) {
+        mModel.doLick(mView.getActivity(), userRead.getId(), new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                HttpResultBean<String> bean = info.getRetDetail(new TypeToken<HttpResultBean<String>>() {
+                }.getType());
+                mView.setLikes(bean.getData());
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("failure---info.getRetDetail:" + info.getRetDetail());
+            }
+        });
+    }
+
+    @Override
+    public void destory() {
+        Jzvd.releaseAllVideos();
+        Jzvd.backPress();
+    }
+
     private void autoPlayVideo(RecyclerView rv) {
         if (rv == null || rv.getChildAt(0) == null) {
             return;
@@ -223,9 +312,8 @@ public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentC
         } else {
 //            Toast.makeText(this, "已滑动到底部了", Toast.LENGTH_LONG).show();
 //            CToast.makeText(mView.getActivity(), "滑动到最后一个啦", 3000).show();
-            Logger.e("倒数第二个,添加数据");
-            mAdapter.addMored(mDataList);
 
+            getRecommendDataList();
         }
     }
 

+ 113 - 28
app/src/main/java/com/edufound/reader/presenter/RecordPresenter.java

@@ -1,31 +1,51 @@
 package com.edufound.reader.presenter;
 
+import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
+import android.content.ServiceConnection;
 import android.media.MediaPlayer;
 import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.Toast;
 
+import com.chivox.aiengine.EvalResult;
+import com.edufound.reader.base.BaseActivity;
 import com.edufound.reader.base.BasePresenter;
+import com.edufound.reader.bean.RecordResultBean;
 import com.edufound.reader.contract.RecordContract;
 import com.edufound.reader.cusview.FullScreenVideoController;
 import com.edufound.reader.cusview.RvListJzvdStd;
 import com.edufound.reader.listener.PopupRecordStatusListener;
 import com.edufound.reader.model.RecordModel;
 import com.edufound.reader.popwindow.PopWindowUtil;
+import com.edufound.reader.services.RecordServices;
 import com.edufound.reader.videoutil.JZMediaIjk;
+import com.google.gson.JsonObject;
+import com.orhanobut.logger.Logger;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
 
 import cn.jzvd.JZDataSource;
 import cn.jzvd.Jzvd;
 import cn.jzvd.JzvdStd;
 
 public class RecordPresenter extends BasePresenter<RecordContract.View> implements RecordContract.Presenter {
+
+    RecordServices mRecordServices;
     RecordModel mModel;
     RvListJzvdStd mVideoView;
 
     public RecordPresenter() {
         this.mModel = new RecordModel();
+
     }
 
     @Override
@@ -106,10 +126,28 @@ public class RecordPresenter extends BasePresenter<RecordContract.View> implemen
     }
 
     @Override
+    public void startRecord(String name, String refText) {
+        mRecordServices.startRecord(mView.getActivity(), name, refText);
+    }
+
+    @Override
+    public void stopRecord() {
+        mRecordServices.stopRecord();
+    }
+
+    @Override
+    public void rePlayRecord() {
+        mRecordServices.replayRecord();
+    }
+
+
+    @Override
     public void activityDestroy() {
         mVideoView.pauseVideo();
         Jzvd.releaseAllVideos();
         mVideoView = null;
+        recordServicesConn = null;
+        mRecordServices = null;
     }
 
     @Override
@@ -123,12 +161,13 @@ public class RecordPresenter extends BasePresenter<RecordContract.View> implemen
     }
 
     @Override
-    public void showRecordStatusWindow() {
-        PopWindowUtil.showRecordStatusWindow(mView.getActivity(), mView.getRootView(), new PopupRecordStatusListener() {
+    public void showRecordStatusWindow(RecordResultBean bean) {
+        PopWindowUtil.showRecordStatusWindow(mView.getActivity(), mView.getRootView(), bean, new PopupRecordStatusListener() {
             @Override
             public void clickReRecord() {
                 Toast.makeText(mView.getActivity(), "重新录制", Toast.LENGTH_SHORT).show();
                 PopWindowUtil.hidePopupWindow();
+                mView.startRecordStatus();
             }
 
             @Override
@@ -138,35 +177,81 @@ public class RecordPresenter extends BasePresenter<RecordContract.View> implemen
         });
     }
 
+    @Override
+    public void bindRecordServices() {
+        if (mRecordServices == null) {
+            Intent intent = new Intent();
+            intent.setClass(mView.getActivity(), RecordServices.class);
+            mView.getActivity().bindService(intent, recordServicesConn, Context.BIND_AUTO_CREATE);
+        }
+    }
+
+
+    private ServiceConnection recordServicesConn = new ServiceConnection() {
+        @Override
+        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
+            mRecordServices = ((RecordServices.RecordServicesBind) iBinder).getService();
+            mRecordServices.setRecordCallBack(new RecordServices.RecordCallBack() {
+                @Override
+                public void onRecordStart() {
+                    Logger.e("录音开始");
+                }
+
+                @Override
+                public void onRecordResult(String tokenId, EvalResult result) {
+                    Logger.e("录音停止");
+                    Log.e("com.edufound.reader", "record-result:" + result);
+                    Log.e("com.edufound.reader", "record-result.text:" + result.text());
+                    try {
+                        JSONObject jsonObject = new JSONObject(result.text()).getJSONObject("result");
+                        //完全评分
+                        int overall = Integer.valueOf(jsonObject.getString("overall"));
+                        //速度
+                        int speed = Integer.valueOf(jsonObject.getJSONObject("fluency").getString("overall"));
+                        //声调
+                        int tone = Integer.valueOf(jsonObject.getString("tone"));
+                        //完整度
+                        int integrity = Integer.valueOf(jsonObject.getString("integrity"));
+                        //正确率
+                        int accuracy = Integer.valueOf(jsonObject.getString("accuracy"));
+                        mVideoView.post(new Runnable() {
+                            @Override
+                            public void run() {
+                                showRecordStatusWindow(new RecordResultBean(overall, speed, tone, integrity, accuracy));
+                            }
+                        });
+                    } catch (JSONException e) {
+                        e.printStackTrace();
+                    }
+
+
+                }
+
+                @Override
+                public void onRecordCancel() {
+                    Logger.e("录音取消");
+                }
+
+                @Override
+                public void onRecordError(String tokenId, EvalResult result) {
+                    Toast.makeText(mView.getActivity(), "录音失败:" + result.text(), Toast.LENGTH_SHORT).show();
+                }
+            });
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName componentName) {
+            if (mView != null) {
+                mRecordServices.unbindService(recordServicesConn);
+                mView.getActivity().unbindService(recordServicesConn);
+            }
+            mRecordServices = null;
+        }
+    };
+
 }
 
 
 
-/*
- * 使用方法
- * */
-//  mModel.login("", "").compose(RxScheduler.Obs_io_main()).to(mView.bindAutoDispose()).subscribe(new Observer<Object>() {
-//@Override
-//public void onSubscribe(@NonNull Disposable d) {
-//        //开始
-//        mView.showLoading();
-//        }
-//
-//@Override
-//public void onNext(@NonNull Object o) {
-//        //完成
-//
-//        }
-//
-//@Override
-//public void onError(@NonNull Throwable e) {
-//        //错误
-//        }
-//
-//@Override
-//public void onComplete() {
-//        //结束
-//        }
-//        });
 
 

+ 22 - 1
app/src/main/java/com/edufound/reader/presenter/SafflowerPresenter.java

@@ -7,13 +7,16 @@ import android.view.ViewGroup;
 import android.widget.LinearLayout;
 
 import com.edufound.reader.R;
-import com.edufound.reader.adapter.MessageItemAdapter;
 import com.edufound.reader.adapter.SafflowerItemAdapter;
 import com.edufound.reader.base.BasePresenter;
 import com.edufound.reader.contract.SafflowerContract;
 import com.edufound.reader.model.SafflowerModel;
 import com.edufound.reader.util.SizeUtils;
+import com.okhttplib.HttpInfo;
+import com.okhttplib.callback.Callback;
+import com.orhanobut.logger.Logger;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -57,4 +60,22 @@ public class SafflowerPresenter extends BasePresenter<SafflowerContract.View> im
         rv.setLayoutManager(gridLayoutManager);
         rv.setAdapter(mMessageItemAdapter);
     }
+
+    @Override
+    public void getTaskData() {
+        mModel.getTask(mView.getActivity(), new HttpInfo.Builder(), new Callback() {
+            @Override
+            public void onSuccess(HttpInfo info) throws IOException {
+                Logger.e("获取任务成功:" + info.getRetDetail());
+                Logger.e("uid:" + info.getHeads());
+            }
+
+            @Override
+            public void onFailure(HttpInfo info) throws IOException {
+                Logger.e("获取任务失败:" + info.getRetDetail());
+                Logger.e("uid:" + info.getHeads());
+            }
+        });
+    }
+
 }

+ 8 - 6
app/src/main/java/com/edufound/reader/services/RecordServices.java

@@ -132,7 +132,7 @@ public class RecordServices extends Service {
                 audio.put("sampleRate", 16000);
                 param.put("audio", audio);
                 JSONObject request = new JSONObject();
-                request.put("coreType", "cn.pred.raw");//评测内核,英文单词内核
+                request.put("coreType", "cn.pred.raw");
                 request.put("refText", refText);//评测文本
                 request.put("rank", 100); //评分分制
                 request.put("attachAudioUrl", 1); //是否返回音频url。1: 返回。0: 不返回。
@@ -151,12 +151,12 @@ public class RecordServices extends Service {
             RetValue ret = mAiengine.start(context, innerRecorder, tokenId, param, new EvalResultListener() {
                 @Override
                 public void onError(String s, EvalResult evalResult) {
-                    mRecordCallBack.onRecordStop(-1, tokenId.toString(), evalResult);
+                    mRecordCallBack.onRecordError(tokenId.toString(), evalResult);
                 }
 
                 @Override
-                public void onEvalResult(String s, EvalResult evalResult) {
-                    mRecordCallBack.onRecordStop(-0, tokenId.toString(), evalResult);
+                public void onEvalResult(String tokenid, EvalResult evalResult) {
+                    mRecordCallBack.onRecordResult(tokenid, evalResult);
                     recFilePath = evalResult.recFilePath();
                     Logger.e("recFilePath:" + recFilePath);
                 }
@@ -257,10 +257,12 @@ public class RecordServices extends Service {
     public interface RecordCallBack {
         void onRecordStart();
 
-        //type=0是成功 type=-1是失败
-        void onRecordStop(int type, String tokenId, EvalResult result);
+
+        void onRecordResult(String tokenId, EvalResult result);
 
         void onRecordCancel();
+
+        void onRecordError(String tokenId, EvalResult result);
     }
 
 }

+ 31 - 5
app/src/main/java/com/edufound/reader/util/Consts.java

@@ -2,21 +2,35 @@ package com.edufound.reader.util;
 
 import android.app.Application;
 
-import com.edufound.reader.bean.UserInfoBean;
+import com.edufound.reader.bean.UserBean;
 
 public class Consts {
     private static Application mApplicAtion;
 
     private static int[] screenSize;
 
-    private static UserInfoBean mConstsUserBean;
+    private static UserBean mConstsUserBean;
 
     private static boolean isDebug = false;
 
-
     private static String privService = "http://m-xyyf-web.ai160.com/res/protocol/private.htm";
+
     private static String agreementServices = "http://m-xyyf-web.ai160.com/res/protocol/service.htm";
 
+    private static final String FinalApiUrl = "http://reader-api.efunbox.cn";
+
+    private static String UMENG_CHANNEL = null;
+
+    private static String UID = "";
+
+    public static String getUID() {
+        return UID;
+    }
+
+    public static void setUID(String UID) {
+        Consts.UID = UID;
+    }
+
     public static Application getmApplicAtion() {
         return mApplicAtion;
     }
@@ -33,11 +47,11 @@ public class Consts {
         Consts.screenSize = screenSize;
     }
 
-    public static UserInfoBean getmConstsUserBean() {
+    public static UserBean getmConstsUserBean() {
         return mConstsUserBean;
     }
 
-    public static void setmConstsUserBean(UserInfoBean mConstsUserBean) {
+    public static void setmConstsUserBean(UserBean mConstsUserBean) {
         Consts.mConstsUserBean = mConstsUserBean;
     }
 
@@ -56,4 +70,16 @@ public class Consts {
     public static void setIsDebug(boolean isDebug) {
         Consts.isDebug = isDebug;
     }
+
+    public static String getFinalApi() {
+        return FinalApiUrl;
+    }
+
+    public static String getUmengChannel() {
+        return UMENG_CHANNEL;
+    }
+
+    public static void setUmengChannel(String umengChannel) {
+        UMENG_CHANNEL = umengChannel;
+    }
 }

+ 2 - 3
app/src/main/java/com/edufound/reader/util/DeviceUuidFactory.java

@@ -9,7 +9,6 @@ import java.io.UnsupportedEncodingException;
 import java.util.UUID;
 
 public class DeviceUuidFactory {
-    public static final String UUID_SPKEY = "uuid";
     protected static UUID uuid;
 
     public DeviceUuidFactory(Context context) {
@@ -45,10 +44,10 @@ public class DeviceUuidFactory {
     /**
      * @return UUID
      */
-    public static UUID getUuid() {
+    public static String getUuid() {
         if (uuid == null || uuid.equals("") || uuid.equals("null")) {
             return null;
         }
-        return uuid;
+        return uuid.toString();
     }
 }

+ 62 - 0
app/src/main/java/com/edufound/reader/util/EfunboxUtil.java

@@ -3,6 +3,7 @@ package com.edufound.reader.util;
 import android.app.Activity;
 import android.app.Application;
 import android.content.Context;
+import android.text.TextUtils;
 import android.util.DisplayMetrics;
 
 import com.orhanobut.logger.Logger;
@@ -43,4 +44,65 @@ public class EfunboxUtil {
         displayMetrics.densityDpi = Float.valueOf(displayMetrics.xdpi).intValue();
     }
 
+
+    /**
+     * 判断字符串是否符合手机号码格式
+     * 移动号段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
+     * 联通号段: 130,131,132,145,155,156,170,171,175,176,185,186
+     * 电信号段: 133,149,153,170,173,177,180,181,189
+     *
+     * @param mobileNums
+     * @return 待检测的字符串
+     */
+    public static boolean isMobileNO(String mobileNums) {
+        String telRegex = "^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8]))\\d{8}$";// "[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。
+        if (TextUtils.isEmpty(mobileNums)) {
+            return false;
+        } else {
+            return mobileNums.matches(telRegex);
+        }
+    }
+
+
+    /**
+     * 根据中文年纪选择换成后台枚举
+     */
+    public static String getEnumByCNGrade(String cnGrade) {
+//                PRESCHOOL("学前"),
+//                PRIMARY_FIRST_GRADE("小学一年级"),
+//                PRIMARY_SECOND_GRADE("小学二年级"),
+//                PRIMARY_THREE_GRADE("小学三年级"),
+//                PRIMARY_SENIOR_GRADE("小学四年级");
+        switch (cnGrade) {
+            case "一年级":
+                return "PRIMARY_FIRST_GRADE";
+            case "二年级":
+                return "PRIMARY_SECOND_GRADE";
+            case "三年级":
+                return "PRIMARY_THREE_GRADE";
+            case "四年级":
+                return "PRIMARY_SENIOR_GRADE";
+            case "学前":
+                return "PRESCHOOL";
+        }
+        return "undefinde";
+    }
+
+    public static String getCNGradeByEnum(String cnGrade) {
+        switch (cnGrade) {
+            case "PRIMARY_FIRST_GRADE":
+                return "一年级";
+            case "PRIMARY_SECOND_GRADE":
+                return "二年级";
+            case "PRIMARY_THREE_GRADE":
+                return "三年级";
+            case "PRIMARY_SENIOR_GRADE":
+                return "四年级";
+            case "PRESCHOOL":
+                return "学前";
+        }
+        return "undefinde";
+    }
+
+
 }

+ 5 - 0
app/src/main/java/com/edufound/reader/util/MMKVEncodeKey.java

@@ -0,0 +1,5 @@
+package com.edufound.reader.util;
+
+public class MMKVEncodeKey {
+    public static final String USER_GRADE = "user_grade";
+}

+ 25 - 21
app/src/main/java/com/edufound/reader/util/MMKVUtil.java

@@ -3,6 +3,7 @@ package com.edufound.reader.util;
 
 import android.os.Parcelable;
 
+import com.orhanobut.logger.Logger;
 import com.tencent.mmkv.MMKV;
 
 import java.util.Collections;
@@ -10,7 +11,7 @@ import java.util.Set;
 
 public class MMKVUtil {
 
-    private static MMKV mkv;
+    private MMKV mkv;
 
     private MMKVUtil() {
         mkv = MMKV.defaultMMKV();
@@ -31,7 +32,7 @@ public class MMKVUtil {
      * @param key
      * @param object
      */
-    public static void encode(String key, Object object) {
+    public void encode(String key, Object object) {
         if (object instanceof String) {
             mkv.encode(key, (String) object);
         } else if (object instanceof Integer) {
@@ -51,11 +52,11 @@ public class MMKVUtil {
         }
     }
 
-    public static void encodeSet(String key, Set<String> sets) {
+    public void encodeSet(String key, Set<String> sets) {
         mkv.encode(key, sets);
     }
 
-    public static void encodeParcelable(String key, Parcelable obj) {
+    public void encodeParcelable(String key, Parcelable obj) {
         mkv.encode(key, obj);
     }
 
@@ -66,7 +67,7 @@ public class MMKVUtil {
      * @param defaultObject
      * @return
      */
-    public static Object decode(String key, Object defaultObject) {
+    public Object decode(String key, Object defaultObject) {
         if (defaultObject instanceof String) {
             return mkv.decodeString(key, (String) defaultObject);
         } else if (defaultObject instanceof Integer) {
@@ -88,39 +89,39 @@ public class MMKVUtil {
     /**
      * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
      */
-    public static Integer decodeInt(String key) {
+    public Integer decodeInt(String key) {
         return mkv.decodeInt(key, 0);
     }
 
-    public static Double decodeDouble(String key) {
+    public Double decodeDouble(String key) {
         return mkv.decodeDouble(key, 0.00);
     }
 
-    public static Long decodeLong(String key) {
+    public Long decodeLong(String key) {
         return mkv.decodeLong(key, 0L);
     }
 
-    public static Boolean decodeBoolean(String key) {
+    public Boolean decodeBoolean(String key) {
         return mkv.decodeBool(key, false);
     }
 
-    public static Float decodeFloat(String key) {
+    public Float decodeFloat(String key) {
         return mkv.decodeFloat(key, 0F);
     }
 
-    public static byte[] decodeBytes(String key) {
+    public byte[] decodeBytes(String key) {
         return mkv.decodeBytes(key);
     }
 
-    public static String decodeString(String key) {
+    public String decodeString(String key) {
         return mkv.decodeString(key, "");
     }
 
-    public static Set<String> decodeStringSet(String key) {
+    public Set<String> decodeStringSet(String key) {
         return mkv.decodeStringSet(key, Collections.<String>emptySet());
     }
 
-    public static Parcelable decodeParcelable(String key, Class clz) {
+    public Parcelable decodeParcelable(String key, Class clz) {
         return mkv.decodeParcelable(key, clz);
     }
 
@@ -129,7 +130,7 @@ public class MMKVUtil {
      *
      * @param key
      */
-    public static void removeKey(String key) {
+    public void removeKey(String key) {
         mkv.removeValueForKey(key);
     }
 
@@ -138,14 +139,14 @@ public class MMKVUtil {
      *
      * @param key
      */
-    public static void removeKeys(String[] key) {
+    public void removeKeys(String[] key) {
         mkv.removeValuesForKeys(key);
     }
 
     /**
      * 获取全部key对
      */
-    public static String[] getAllKeys() {
+    public String[] getAllKeys() {
         return mkv.allKeys();
     }
 
@@ -155,7 +156,7 @@ public class MMKVUtil {
      * @param key
      * @return
      */
-    public static boolean hasKey(String key) {
+    public boolean hasKey(String key) {
         return mkv.containsKey(key);
     }
 
@@ -165,23 +166,26 @@ public class MMKVUtil {
      * @param key
      * @return
      */
-    public static boolean have(String key) {
+    public boolean have(String key) {
         return mkv.contains(key);
     }
 
     /**
      * 清除所有key
      */
-    public static void clearAll() {
+    public void clearAll() {
+        mkv.clearMemoryCache();
         mkv.clearAll();
+        mkv.clear();
     }
 
+
     /**
      * 获取操作对象
      *
      * @return
      */
-    public static MMKV getMkv() {
+    public MMKV getMkv() {
         return mkv;
     }
 

+ 69 - 0
app/src/main/java/com/edufound/reader/util/OkHttpClient.java

@@ -0,0 +1,69 @@
+package com.edufound.reader.util;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Environment;
+
+import com.okhttplib.HttpInfo;
+import com.okhttplib.OkHttpUtil;
+import com.okhttplib.annotation.CacheType;
+import com.okhttplib.annotation.Encoding;
+import com.okhttplib.callback.BaseCallback;
+import com.okhttplib.cookie.PersistentCookieJar;
+import com.okhttplib.cookie.cache.SetCookieCache;
+import com.okhttplib.cookie.persistence.SharedPrefsCookiePersistor;
+import com.orhanobut.logger.Logger;
+
+import java.io.File;
+
+public class OkHttpClient {
+    //初始化OKHTTP
+    private static String downloadFileDir = Environment.getExternalStorageDirectory().getPath() + "/okHttp_download/";
+    private static String cacheDir = Environment.getExternalStorageDirectory().getPath() + "/okHttp_cache";
+
+    public static void initOkHttpUtil(Context context) {
+        OkHttpUtil.init(context)
+                .setConnectTimeout(15)//连接超时时间
+                .setWriteTimeout(15)//写超时时间
+                .setReadTimeout(15)//读超时时间
+                .setMaxCacheSize(10 * 1024 * 1024)//缓存空间大小
+                .setCacheType(CacheType.FORCE_NETWORK)//缓存类型
+                .setHttpLogTAG("HttpLog")//设置请求日志标识
+                .setIsGzip(false)//Gzip压缩,需要服务端支持
+                .setShowHttpLog(true)//显示请求日志
+                .setShowLifecycleLog(false)//显示Activity销毁日志
+                .setRetryOnConnectionFailure(false)//失败后不自动重连
+                .setCachedDir(new File(cacheDir))//设置缓存目录
+                .setDownloadFileDir(downloadFileDir)//文件下载保存目录
+                .setResponseEncoding(Encoding.UTF_8)//设置全局的服务器响应编码
+                .setRequestEncoding(Encoding.UTF_8)//设置全局的请求参数编码
+//                    .setHttpsCertificate("12306.cer")//设置全局Https证书
+                .addResultInterceptor(HttpInterceptor.ResultInterceptor)//请求结果拦截器
+                .addExceptionInterceptor(HttpInterceptor.ExceptionInterceptor)//请求链路异常拦截器
+                .setCookieJar(new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context)))//持久化cookie
+                .build();
+    }
+
+    public static void doGetAsync(Activity activity, HttpInfo.Builder info, BaseCallback callback) {
+        Logger.e("postUid:" + Consts.getUID());
+        OkHttpUtil.getDefault(activity).doGetAsync(info.addHead("uid", Consts.getUID()).build(), callback);
+    }
+
+    public static void doPostAsync(Activity activity, HttpInfo.Builder info, BaseCallback callback) {
+        Logger.e("postUid:" + Consts.getUID());
+        OkHttpUtil.getDefault(activity).doPostAsync(info.addHead("uid", Consts.getUID()).build(), callback);
+    }
+
+    public static void doPutAsync(Activity activity, HttpInfo.Builder info, BaseCallback callback) {
+        Logger.e("postUid:" + Consts.getUID());
+        OkHttpUtil.getDefault(activity).doPutAsync(info.addHead("uid", Consts.getUID()).build(), callback);
+    }
+
+    public static void doDeleteAsync(Activity activity, HttpInfo.Builder info, BaseCallback callback) {
+        Logger.e("postUid:" + Consts.getUID());
+        OkHttpUtil.getDefault(activity).doDeleteAsync(info.addHead("uid", Consts.getUID()).build(), callback);
+    }
+}
+
+
+

+ 172 - 0
app/src/main/java/com/edufound/reader/util/TimeUtil.java

@@ -0,0 +1,172 @@
+package com.edufound.reader.util;
+
+import android.text.format.Time;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+public class TimeUtil {
+
+    /**
+     * 日期字符串转换Date实体
+     */
+    public static Date parseServerTime(String serverTime, String format) {
+        if (format == null || format.isEmpty()) {
+            format = "yyyy-MM-dd HH:mm:ss";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.CHINESE);
+        sdf.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
+        Date date = null;
+        try {
+            date = sdf.parse(serverTime);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return date;
+    }
+
+    /**
+     * 秒数转换成时分秒
+     */
+    public static String convertSecToTimeString(long lSeconds) {
+        long nHour = lSeconds / 3600;
+        long nMin = lSeconds % 3600;
+        long nSec = nMin % 60;
+        nMin = nMin / 60;
+
+        return String.format("%02d小时%02d分钟%02d秒", nHour, nMin, nSec);
+    }
+
+    /**
+     * Date对象获取时间字符串
+     */
+    public static String getDateStr(Date date, String format) {
+        if (format == null || format.isEmpty()) {
+            format = "yyyy-MM-dd HH:mm:ss";
+        }
+        SimpleDateFormat formatter = new SimpleDateFormat(format);
+        return formatter.format(date);
+    }
+
+
+    /**
+     * 时间戳转换日期格式字符串
+     */
+    public static String timeStamp2Date(long time, String format) {
+        if (format == null || format.isEmpty()) {
+            format = "yyyy-MM-dd HH:mm:ss";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        return sdf.format(new Date(time));
+    }
+
+
+    /**
+     * 日期格式字符串转换时间戳
+     */
+    public static String date2TimeStamp(String date, String format) {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat(format);
+            return String.valueOf(sdf.parse(date).getTime() / 1000);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+
+    /**
+     * 获取某个日期前后N天的日期
+     *
+     * @param beginDate
+     * @param distanceDay 前后几天 如获取前7天日期则传-7即可;如果后7天则传7
+     * @param format      日期格式,默认"yyyy-MM-dd"
+     * @return
+     */
+    public static String getOldDateByDay(Date beginDate, int distanceDay, String format) {
+        if (format == null || format.isEmpty()) {
+            format = "yyyy-MM-dd";
+        }
+        SimpleDateFormat dft = new SimpleDateFormat(format);
+        Calendar date = Calendar.getInstance();
+        date.setTime(beginDate);
+        date.set(Calendar.DATE, date.get(Calendar.DATE) + distanceDay);
+        Date endDate = null;
+        try {
+            endDate = dft.parse(dft.format(date.getTime()));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dft.format(endDate);
+    }
+
+    /**
+     * 获取前后几个月的日期
+     *
+     * @param beginDate
+     * @param distanceMonth
+     * @param format
+     * @return
+     */
+    public static String getOldDateByMonth(Date beginDate, int distanceMonth, String format) {
+        if (format == null || format.isEmpty()) {
+            format = "yyyy-MM-dd";
+        }
+        SimpleDateFormat dft = new SimpleDateFormat(format);
+        Calendar date = Calendar.getInstance();
+        date.setTime(beginDate);
+        date.set(Calendar.MONTH, date.get(Calendar.MONTH) + distanceMonth);
+        Date endDate = null;
+        try {
+            endDate = dft.parse(dft.format(date.getTime()));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dft.format(endDate);
+    }
+
+
+    /**
+     * 判断一个时间是否在某个时间范围内
+     */
+    public static boolean isCurrentInTimeScope(int deadlineHour, int deadlineMin) {
+        boolean result;
+        // 1000 * 60 * 60 * 24
+        final long aDayInMillis = 86400000;
+        final long currentTimeMillis = System.currentTimeMillis();
+        //截止时间
+        Time deadlineTime = new Time();
+        deadlineTime.set(currentTimeMillis);
+        deadlineTime.hour = deadlineHour;
+        deadlineTime.minute = deadlineMin;
+        //当前时间
+        Time startTime = new Time();
+        startTime.set(currentTimeMillis);
+        //当前时间推后20分钟
+        Date d = new Date(currentTimeMillis);
+        long myTime = (d.getTime() / 1000) + 20 * 60;
+        d.setTime(myTime * 1000);
+        Time endTime = new Time();
+        endTime.set(myTime);
+        if (!startTime.before(endTime)) {
+            // 跨天的特殊情况(比如22:00-8:00)
+            startTime.set(startTime.toMillis(true) - aDayInMillis);
+            result = !deadlineTime.before(startTime) && !deadlineTime.after(endTime);
+            // startTime <= deadlineTime <=endTime
+            Time startTimeInThisDay = new Time();
+            startTimeInThisDay.set(startTime.toMillis(true) + aDayInMillis);
+            if (!deadlineTime.before(startTimeInThisDay)) {
+                result = true;
+            }
+        } else {
+            // 普通情况(比如 8:00 - 14:00)
+            result = !deadlineTime.before(startTime) && !deadlineTime.after(endTime);
+            // startTime <= deadlineTime <=endTime
+        }
+        return result;
+    }
+
+}

BIN
app/src/main/res/drawable/adapter_item_comment_item_recomment.png


BIN
app/src/main/res/drawable/adapter_item_comment_item_thumb_false.png


BIN
app/src/main/res/drawable/adapter_item_comment_item_thumb_true.png


+ 4 - 2
app/src/main/res/layout/activity_comment.xml

@@ -3,13 +3,15 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:background="@color/translucent_background"
+        android:clickable="true"
+        android:focusableInTouchMode="true"
         android:orientation="horizontal">
 
-    <FrameLayout
+    <Space
             android:id="@+id/comment_touch_back"
             android:layout_width="0dp"
             android:layout_height="match_parent"
-            android:layout_weight="2"></FrameLayout>
+            android:layout_weight="2"></Space>
 
     <FrameLayout
             android:layout_width="0dp"

+ 136 - 0
app/src/main/res/layout/adapter_item_comment.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/white"
+        android:orientation="horizontal">
+
+    <FrameLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:paddingTop="30dp">
+
+        <ImageView
+                android:id="@+id/adapter_item_comment_item_userhead"
+                android:layout_width="96dp"
+                android:layout_height="96dp"
+                android:layout_gravity="top|right"
+                android:layout_marginTop="10dp"
+                android:layout_marginRight="10dp"
+                android:alpha="0.6"
+                android:scaleType="fitXY"
+                android:src="@color/translucent_background"></ImageView>
+    </FrameLayout>
+
+    <FrameLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="4">
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:padding="30dp">
+
+            <TextView
+                    android:id="@+id/adapter_item_comment_item_nickname"
+                    android:layout_width="match_parent"
+                    android:layout_height="41dp"
+                    android:alpha="0.8"
+                    android:gravity="center|left"
+                    android:text="昵称:喔喔奶糖"
+                    android:textColor="#000000"
+                    android:textSize="29dp"></TextView>
+
+            <TextView
+                    android:id="@+id/adapter_item_comment_item_comment"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:alpha="0.8"
+                    android:gravity="center|left"
+                    android:text="太棒啦,可以当播音主持啦。太棒啦,可以当播音主持啦。太棒啦"
+                    android:textColor="#000000"
+                    android:textSize="30dp"></TextView>
+
+            <Space
+                    android:layout_width="match_parent"
+                    android:layout_height="23dp"></Space>
+
+            <LinearLayout
+                    android:id="@+id/adapter_item_comment_item_relayout"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="20dp"
+                    android:background="#F7F7F7"
+                    android:orientation="vertical"
+                    android:padding="20dp"></LinearLayout>
+
+
+            <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="60dp"
+                    android:paddingTop="20dp"
+                    android:paddingRight="20dp">
+
+                <TextView
+                        android:id="@+id/adapter_item_comment_item_time"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center|left"
+                        android:text="12-17 12:51"
+                        android:textSize="29dp"></TextView>
+
+                <LinearLayout
+                        android:id="@+id/adapter_item_comment_item_comment_thumb_layout"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_gravity="center"
+                        android:orientation="horizontal">
+
+                    <ImageView
+                            android:id="@+id/adapter_item_comment_item_comment_thumb_layout_img_status"
+                            android:layout_width="40dp"
+                            android:layout_height="40dp"
+                            android:layout_gravity="center"
+                            android:src="@drawable/adapter_item_comment_item_thumb_false"></ImageView>
+
+                    <TextView
+                            android:id="@+id/adapter_item_comment_item_comment_thumb_layout_thumbnum"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center"
+                            android:layout_marginLeft="10dp"
+                            android:layout_marginBottom="3dp"
+                            android:text="点赞数"
+                            android:textSize="29dp"></TextView>
+                </LinearLayout>
+
+                <LinearLayout
+                        android:id="@+id/adapter_item_comment_item_comment_recomment_layout"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center|right"
+                        android:orientation="horizontal">
+
+                    <ImageView
+                            android:layout_width="40dp"
+                            android:layout_height="40dp"
+                            android:layout_gravity="center"
+                            android:src="@drawable/adapter_item_comment_item_recomment"></ImageView>
+
+                    <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center"
+                            android:layout_marginLeft="10dp"
+                            android:layout_marginBottom="3dp"
+                            android:text="回复"
+                            android:textSize="29dp"></TextView>
+                </LinearLayout>
+            </FrameLayout>
+        </LinearLayout>
+
+    </FrameLayout>
+</LinearLayout>

+ 21 - 0
app/src/main/res/layout/adapter_item_comment_relayout_item.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+    <TextView
+            android:id="@+id/adapter_item_comment_item_relayout_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="蜡笔小新:"
+            android:textColor="#638AAC"
+            android:textSize="29dp"></TextView>
+
+    <TextView
+            android:id="@+id/adapter_item_comment_item_relayout_comment"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="我也要继续努力"
+            android:textSize="30dp"></TextView>
+</LinearLayout>

+ 5 - 4
app/src/main/res/layout/fragment_main_user.xml

@@ -79,7 +79,7 @@
                                             android:id="@+id/fragment_main_user_phonenum"
                                             android:layout_width="wrap_content"
                                             android:layout_height="48dp"
-                                            android:text="1581***1234"
+                                            android:text=""
                                             android:textColor="#272727"
                                             android:textSize="34dp"
                                             app:layout_constraintStart_toStartOf="parent"
@@ -90,7 +90,7 @@
                                             android:layout_width="wrap_content"
                                             android:layout_height="48dp"
                                             android:layout_marginBottom="80dp"
-                                            android:text="三年级"
+                                            android:text=""
                                             android:textColor="#272727"
                                             android:textSize="34dp"
                                             app:layout_constraintBottom_toBottomOf="parent"
@@ -143,7 +143,7 @@
                                                 android:layout_width="wrap_content"
                                                 android:layout_height="match_parent"
                                                 android:gravity="center"
-                                                android:text="76"
+                                                android:text=""
                                                 android:textSize="28dp"></TextView>
                                     </LinearLayout>
 
@@ -184,7 +184,7 @@
                                                 android:layout_width="wrap_content"
                                                 android:layout_height="match_parent"
                                                 android:gravity="center"
-                                                android:text="2345"
+                                                android:text=""
                                                 android:textSize="28dp"></TextView>
                                     </LinearLayout>
                                 </androidx.constraintlayout.widget.ConstraintLayout>
@@ -286,6 +286,7 @@
                     android:showDividers="middle">
 
                 <TextView
+                        android:id="@+id/fragment_main_user_myrecordsize"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:gravity="center|left"

+ 4 - 4
app/src/main/res/layout/popupwindow_record_status.xml

@@ -95,7 +95,7 @@
                                 android:layout_width="130dp"
                                 android:layout_height="match_parent"
                                 android:gravity="center|left"
-                                android:text="100/100"
+                                android:text="0/100"
                                 android:textColor="#AB722D"
                                 android:textSize="34dp"></TextView>
                     </LinearLayout>
@@ -125,7 +125,7 @@
                                 android:layout_width="130dp"
                                 android:layout_height="match_parent"
                                 android:gravity="center|left"
-                                android:text="100/100"
+                                android:text="0/100"
                                 android:textColor="#AB722D"
                                 android:textSize="34dp"></TextView>
                     </LinearLayout>
@@ -156,7 +156,7 @@
                                 android:layout_width="130dp"
                                 android:layout_height="match_parent"
                                 android:gravity="center|left"
-                                android:text="100/100"
+                                android:text="0/100"
                                 android:textColor="#AB722D"
                                 android:textSize="34dp"></TextView>
                     </LinearLayout>
@@ -186,7 +186,7 @@
                                 android:layout_width="130dp"
                                 android:layout_height="match_parent"
                                 android:gravity="center|left"
-                                android:text="100/100"
+                                android:text="0/100"
                                 android:textColor="#AB722D"
                                 android:textSize="34dp"></TextView>
                     </LinearLayout>