Browse Source

增加老师端和学生端课件缓存

Pq 1 năm trước cách đây
mục cha
commit
c516d79f21

+ 230 - 0
BaseLibrary/src/main/java/com/cooleshow/base/bean/CoursewareInfoBean.java

@@ -0,0 +1,230 @@
+package com.cooleshow.base.bean;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2023/1/11.
+ */
+public class CoursewareInfoBean {
+
+    /**
+     * lessonCoursewareId : 0
+     * lessonDurationSecond : 0
+     * createTime :
+     * lessonTargetDesc :
+     * lessonOrder : 0
+     * lessonTrainingName :
+     * knowledgePointList : [{"materialList":[{"knowledgePointId":0,"name":"","updateTime":"","adviseStudyTimeSecond":0,"id":0,"sn":"","type":"","content":"","courseTypeCode":""}],"name":"","id":0}]
+     * name :
+     * updateTime :
+     * id : 0
+     * lessonTrainingId : 0
+     * knowledgePointIds :
+     */
+
+    private String courseScheduleId;
+    private String coursewareDetailName;
+    private String lessonCoursewareDetailId;
+    private String lessonCoursewareId;
+    private boolean unlock;
+    private String useNum;
+    private int hasCache;
+    private List<KnowledgePointListBean> knowledgePointList;
+
+    public String getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(String courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getCoursewareDetailName() {
+        return coursewareDetailName;
+    }
+
+    public void setCoursewareDetailName(String coursewareDetailName) {
+        this.coursewareDetailName = coursewareDetailName;
+    }
+
+    public boolean getUnlock() {
+        return unlock;
+    }
+
+    public void setUnlock(boolean unlock) {
+        this.unlock = unlock;
+    }
+
+    public String getUseNum() {
+        return useNum;
+    }
+
+    public void setUseNum(String useNum) {
+        this.useNum = useNum;
+    }
+
+    public String getLessonCoursewareDetailId() {
+        return lessonCoursewareDetailId;
+    }
+
+    public void setLessonCoursewareDetailId(String lessonCoursewareDetailId) {
+        this.lessonCoursewareDetailId = lessonCoursewareDetailId;
+    }
+
+    public int getHasCache() {
+        return hasCache;
+    }
+
+    public void setHasCache(int hasCache) {
+        this.hasCache = hasCache;
+    }
+
+    public String getLessonCoursewareId() {
+        return lessonCoursewareId;
+    }
+
+    public void setLessonCoursewareId(String lessonCoursewareId) {
+        this.lessonCoursewareId = lessonCoursewareId;
+    }
+
+
+    public List<KnowledgePointListBean> getKnowledgePointList() {
+        return knowledgePointList;
+    }
+
+    public void setKnowledgePointList(List<KnowledgePointListBean> knowledgePointList) {
+        this.knowledgePointList = knowledgePointList;
+    }
+
+    public static class KnowledgePointListBean {
+        /**
+         * materialList : [{"knowledgePointId":0,"name":"","updateTime":"","adviseStudyTimeSecond":0,"id":0,"sn":"","type":"","content":"","courseTypeCode":""}]
+         * name :
+         * id : 0
+         */
+
+        private String name;
+        private String id;
+        private List<MaterialListBean> materialList;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public List<MaterialListBean> getMaterialList() {
+            return materialList;
+        }
+
+        public void setMaterialList(List<MaterialListBean> materialList) {
+            this.materialList = materialList;
+        }
+
+        public static class MaterialListBean {
+            /**
+             * knowledgePointId : 0
+             * name :
+             * updateTime :
+             * adviseStudyTimeSecond : 0
+             * id : 0
+             * sn :
+             * type :
+             * content :
+             * courseTypeCode :
+             */
+
+            private String knowledgePointId;
+            private String name;
+            private String updateTime;
+            private String adviseStudyTimeSecond;
+            private String id;
+            private String sn;
+            private String type;
+            private String content;
+            private String courseTypeCode;
+
+            public String getKnowledgePointId() {
+                return knowledgePointId;
+            }
+
+            public void setKnowledgePointId(String knowledgePointId) {
+                this.knowledgePointId = knowledgePointId;
+            }
+
+            public String getName() {
+                return name;
+            }
+
+            public void setName(String name) {
+                this.name = name;
+            }
+
+            public String getUpdateTime() {
+                return updateTime;
+            }
+
+            public void setUpdateTime(String updateTime) {
+                this.updateTime = updateTime;
+            }
+
+            public String getAdviseStudyTimeSecond() {
+                return adviseStudyTimeSecond;
+            }
+
+            public void setAdviseStudyTimeSecond(String adviseStudyTimeSecond) {
+                this.adviseStudyTimeSecond = adviseStudyTimeSecond;
+            }
+
+            public String getId() {
+                return id;
+            }
+
+            public void setId(String id) {
+                this.id = id;
+            }
+
+            public String getSn() {
+                return sn;
+            }
+
+            public void setSn(String sn) {
+                this.sn = sn;
+            }
+
+            public String getType() {
+                return type;
+            }
+
+            public void setType(String type) {
+                this.type = type;
+            }
+
+            public String getContent() {
+                return content;
+            }
+
+            public void setContent(String content) {
+                this.content = content;
+            }
+
+            public String getCourseTypeCode() {
+                return courseTypeCode;
+            }
+
+            public void setCourseTypeCode(String courseTypeCode) {
+                this.courseTypeCode = courseTypeCode;
+            }
+        }
+    }
+}

+ 11 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/WebApi.java

@@ -28,4 +28,15 @@ public class WebApi {
     public static final String API_COURSE_LOADING = "courseLoading";
     public static final String API_CLOUD_LOADING = "cloudLoading";
     //打开音频合成相关页面
+
+    //打开app指定页面
+    public static final String OPEN_APP_PAGE = "open_app_page";
+
+    public static final String CHECK_COURSEWARE_CACHE = "checkCoursewareCache";
+
+    public static final String GET_COURSE_FILE_PATH = "getCourseFilePath";
+    //下载
+    public static final String DOWNLOAD_COURSEWARE_TO_CACHE = "downloadCoursewareToCache";
+
+    public static final String CANCEL_DOWNLOAD_COURSEWARE = "cancelDownloadCourseware";
 }

+ 39 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/FileUtils.java

@@ -1591,6 +1591,20 @@ public final class FileUtils {
         }
     }
 
+    public static String getCacheDir2(Context context, String directory) {
+        String fileDir;
+        try {
+            File file = new File(context.getCacheDir() + File.separator + directory);
+            if (!file.exists()) {
+                file.mkdirs();
+            }
+            fileDir = file.getAbsolutePath();
+            return fileDir;
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
     /**
      * 判断SD卡上的文件是否存在
      */
@@ -2022,4 +2036,29 @@ public final class FileUtils {
         File file = new File(path);
         deleteFile(file);
     }
+
+    /**
+     * 获取文件后缀类型根据url
+     * @param url
+     * @return
+     */
+    public static String getFileTypeFromUrl(String url) {
+        try {
+            URL url1 =new URL(url);
+            String path = url1.getPath();
+            if (path.contains("?")) {
+                String[] split = path.split("\\?");
+                path = split[0];
+            }
+            int lastDot = path.lastIndexOf(".");
+            if (lastDot < 0) {
+                return "";
+            }
+            String type = path.substring(lastDot + 1).toLowerCase();
+            return type;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
 }

+ 44 - 17
BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/DownloadHelper.java

@@ -3,6 +3,9 @@ package com.cooleshow.base.utils.helper;
 import android.util.Log;
 
 import com.cooleshow.base.bean.DownloadTaskBean;
+import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.UiUtils;
 import com.liulishuo.filedownloader.BaseDownloadTask;
 import com.liulishuo.filedownloader.FileDownloadListener;
 import com.liulishuo.filedownloader.FileDownloadQueueSet;
@@ -21,9 +24,11 @@ public class DownloadHelper {
     public static final int DOWNLOAD_STATUS_CALLBACK_ING = 1;//下载中
     public static final int DOWNLOAD_STATUS_CALLBACK_COMPLETE = 2;//下载完成
     public static final int DOWNLOAD_STATUS_CALLBACK_ERROR = 3;//下载错误
+
+    public static final int DOWNLOAD_STATUS_CALLBACK_CANCEL = 4;//取消下载
     public static final String TAG = "DownloadHelper";
     private volatile static DownloadHelper instance;
-    private HashMap<String, ArrayList<Integer>> downloadIds;
+    private HashMap<String, ArrayList<String>> downloadIds;
     private OnEventListener mEventListener;
 
     private DownloadHelper() {
@@ -50,14 +55,25 @@ public class DownloadHelper {
             return;
         }
         this.mEventListener = onEventListener;
+        if (getDownloadTaskInfos().size() != 0) {
+            UiUtils.postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    ToastUtil.getInstance().showShort("当前已有课件资源下载中");
+                }
+            }, 0);
+            return;
+        }
         final List<BaseDownloadTask> tasks = new ArrayList<>();
-        final ArrayList<Integer> taskIds = new ArrayList<>();
-        Log.i("qwa","downloadUrls:"+downloadUrls.size());
+        final ArrayList<String> taskIds = new ArrayList<>();
+        Log.i("qwa", "downloadUrls:" + downloadUrls.size());
         for (int i = 0; i < downloadUrls.size(); i++) {
             DownloadTaskBean downloadTaskBean = downloadUrls.get(i);
             BaseDownloadTask task1 = FileDownloader.getImpl().create(downloadTaskBean.getUrl()).setPath(downloadTaskBean.getSavePath(), false);
             tasks.add(task1);
-            taskIds.add(task1.getId());
+            String tag = task1.getId() + "_" + i;
+            task1.setTag(tag);
+            taskIds.add(tag);
         }
         getDownloadTaskInfos().put(idKey, taskIds);
         start_multi(tasks);
@@ -109,19 +125,19 @@ public class DownloadHelper {
                 }
                 Log.d(TAG, "progress taskId:" + task.getId() + ",fileName:" + task.getFilename() + ",soFarBytes:" + soFarBytes + ",totalBytes:" + totalBytes + ",percent:" + soFarBytes * 1.0 / totalBytes + ",speed:" + task.getSpeed());
 
-                HashMap<String, ArrayList<Integer>> downloadTaskInfos = getDownloadTaskInfos();
+                HashMap<String, ArrayList<String>> downloadTaskInfos = getDownloadTaskInfos();
                 Iterator<String> iterator = downloadTaskInfos.keySet().iterator();
-                Log.i("progress", "downloadTaskInfos:" + downloadTaskInfos.size());
+                LOG.i("progress", "downloadTaskInfos:" + downloadTaskInfos.size());
                 while (iterator.hasNext()) {
                     String key = iterator.next();
-                    ArrayList<Integer> integers = downloadTaskInfos.get(key);
-                    Log.i("progress", "integers size:" + integers.size());
+                    ArrayList<String> integers = downloadTaskInfos.get(key);
+                    LOG.i("progress", "integers size:" + integers.size());
                     float maxProgress = 100f / integers.size();
-                    Log.i("maxProgress", "maxProgress:" + maxProgress);
-                    int id = task.getId();
-                    Log.i("progress", "taskId:" + id);
+                    LOG.i("maxProgress", "maxProgress:" + maxProgress);
+                    String id = (String) task.getTag();
+                    LOG.i("progress", "taskId:" + id);
                     int i = integers.indexOf(id);
-                    Log.i("progress", "integers indexof:" + i);
+                    LOG.i("progress", "integers indexof:" + i);
                     if (i != -1) {
                         float value = maxProgress * (soFarBytes * 1.0f / totalBytes);
                         int progress = (int) (maxProgress * (i) + value);
@@ -139,12 +155,12 @@ public class DownloadHelper {
                     return;
                 }
                 Log.d(TAG, "blockComplete taskId:" + task.getId() + ",filePath:" + task.getPath() + ",fileName:" + task.getFilename() + ",speed:" + task.getSpeed() + ",isReuse:" + task.reuse());
-                HashMap<String, ArrayList<Integer>> downloadTaskInfos = getDownloadTaskInfos();
+                HashMap<String, ArrayList<String>> downloadTaskInfos = getDownloadTaskInfos();
                 Iterator<String> iterator = downloadTaskInfos.keySet().iterator();
                 Log.i("blockComplete", "downloadTaskInfos:" + downloadTaskInfos.size());
                 while (iterator.hasNext()) {
                     String key = iterator.next();
-                    ArrayList<Integer> integers = downloadTaskInfos.get(key);
+                    ArrayList<String> integers = downloadTaskInfos.get(key);
                     Log.i("blockComplete", "integers size:" + integers.size());
                     StringBuilder stringBuilder = new StringBuilder();
                     for (int i = 0; i < integers.size(); i++) {
@@ -152,7 +168,7 @@ public class DownloadHelper {
                     }
                     Log.i("blockComplete", "integers:" + stringBuilder);
                     float totalProgress = 100f;
-                    int id = task.getId();
+                    String id = (String) task.getTag();
                     Log.i("blockComplete", "taskId:" + id);
                     int i = integers.indexOf(id);
                     Log.i("blockComplete", "integers indexof:" + i);
@@ -192,6 +208,15 @@ public class DownloadHelper {
                     return;
                 }
                 Log.d(TAG, "paused taskId:" + task.getId() + ",soFarBytes:" + soFarBytes + ",totalBytes:" + totalBytes + ",percent:" + soFarBytes * 1.0 / totalBytes);
+                Log.d(TAG, "paused taskId:" + task.getId() + ",soFarBytes:" + soFarBytes + ",totalBytes:" + totalBytes + ",percent:" + soFarBytes * 1.0 / totalBytes);
+                if (mEventListener != null) {
+                    HashMap<String, ArrayList<String>> downloadTaskInfos = getDownloadTaskInfos();
+                    Iterator<String> iterator = downloadTaskInfos.keySet().iterator();
+                    while (iterator.hasNext()) {
+                        mEventListener.downloadCancel(iterator.next());
+                    }
+                }
+                getDownloadTaskInfos().clear();
             }
 
             @Override
@@ -200,7 +225,7 @@ public class DownloadHelper {
                     return;
                 }
                 if (mEventListener != null) {
-                    HashMap<String, ArrayList<Integer>> downloadTaskInfos = getDownloadTaskInfos();
+                    HashMap<String, ArrayList<String>> downloadTaskInfos = getDownloadTaskInfos();
                     Iterator<String> iterator = downloadTaskInfos.keySet().iterator();
                     while (iterator.hasNext()) {
                         mEventListener.downloadError(iterator.next());
@@ -225,7 +250,7 @@ public class DownloadHelper {
         this.mEventListener = onEventListener;
     }
 
-    public HashMap<String, ArrayList<Integer>> getDownloadTaskInfos() {
+    public HashMap<String, ArrayList<String>> getDownloadTaskInfos() {
         if (downloadIds == null) {
             downloadIds = new HashMap<>();
         }
@@ -237,6 +262,8 @@ public class DownloadHelper {
 
         void downloadError(String id);
 
+        void downloadCancel(String id);
+
         void onComplete(String filePath);
     }
 }

+ 225 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/WebLoadFileHelper.java

@@ -0,0 +1,225 @@
+package com.cooleshow.base.utils.helper;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.cooleshow.base.bean.CoursewareInfoBean;
+import com.cooleshow.base.bean.DownloadTaskBean;
+import com.cooleshow.base.utils.FileUtils;
+import com.cooleshow.base.utils.GsonUtils;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.base.utils.Utils;
+import com.google.gson.reflect.TypeToken;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2023/1/10.
+ */
+public class WebLoadFileHelper {
+    public static final String TAG = "WebLoadFileHelper";
+    public static final String CUSTOM_FILE_SCHEME = "customscheme://";
+
+    private WebLoadFileHelper() {
+    }
+
+    public void pauseAll(){
+        DownloadHelper.getInstance().stop();
+    }
+
+    private static final class WebLoadFileHelperHolder {
+        private static final WebLoadFileHelper INSTANCE = new WebLoadFileHelper();
+    }
+
+    public static final WebLoadFileHelper getInstance() {
+        return WebLoadFileHelperHolder.INSTANCE;
+    }
+
+    /**
+     * |获取文件缓存路径并拼接自定义协议
+     *
+     * @param jsonObject
+     * @return
+     */
+    public String checkCache(JSONObject jsonObject) {
+        JSONObject content = null;
+        try {
+            content = jsonObject.getJSONObject("content");
+            String url = content.optString("url");
+            String materialId = content.optString("materialId");
+            String localPath = content.optString("localPath");
+            String updateTime = content.optString("updateTime");
+            String type = content.optString("type");
+            String fileTypeFromUrl = FileUtils.getFileTypeFromUrl(url);
+            if (TextUtils.isEmpty(fileTypeFromUrl)) {
+                return "";
+            }
+            String path = getPath(fileTypeFromUrl, materialId, updateTime);
+            File file = new File(path);
+            if (!file.exists()) {
+                return "";
+            }
+            return CUSTOM_FILE_SCHEME + file.getAbsolutePath();
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    public JSONObject checkCacheStatus(JSONObject jsonObject) {
+        JSONObject content = null;
+        try {
+            content = jsonObject.getJSONObject("content");
+            JSONArray jsonArray = content.optJSONArray("data");
+            Type type = new TypeToken<List<CoursewareInfoBean>>() {
+            }.getType();
+            List<CoursewareInfoBean> coursewareInfoBeans = GsonUtils.fromJson(jsonArray.toString(), type);
+            JSONArray jsonArray1 = new JSONArray();
+            for (int i = 0; i < coursewareInfoBeans.size(); i++) {
+                CoursewareInfoBean coursewareInfoBean = coursewareInfoBeans.get(i);
+                boolean cacheResult = checkChild(coursewareInfoBean);
+                coursewareInfoBean.setHasCache(cacheResult ? 1 : 0);
+                Log.i(TAG, "cache:" + coursewareInfoBean.getCoursewareDetailName() + cacheResult);
+                String s = GsonUtils.toJson(coursewareInfoBean);
+                JSONObject jsonObject1 = new JSONObject(s);
+                jsonArray1.put(jsonObject1);
+            }
+            content.put("data", jsonArray1);
+            return jsonObject;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return jsonObject;
+    }
+
+    private boolean checkChild(CoursewareInfoBean coursewareInfoBean) {
+        if (coursewareInfoBean == null || coursewareInfoBean.getKnowledgePointList() == null) {
+            return false;
+        }
+        List<CoursewareInfoBean.KnowledgePointListBean> knowledgePointList = coursewareInfoBean.getKnowledgePointList();
+        for (int j = 0; j < knowledgePointList.size(); j++) {
+            CoursewareInfoBean.KnowledgePointListBean knowledgePointListBean = knowledgePointList.get(j);
+            List<CoursewareInfoBean.KnowledgePointListBean.MaterialListBean> materialList = knowledgePointListBean.getMaterialList();
+            if (materialList == null || materialList.size() == 0) {
+                return false;
+            }
+            for (int k = 0; k < materialList.size(); k++) {
+                CoursewareInfoBean.KnowledgePointListBean.MaterialListBean materialListBean = materialList.get(k);
+                if (materialListBean == null) {
+                    continue;
+                }
+                if (TextUtils.equals(materialListBean.getType(), "VIDEO") || TextUtils.equals(materialListBean.getType(), "IMG")) {
+                    String fileTypeFromUrl = FileUtils.getFileTypeFromUrl(materialListBean.getContent());
+                    if (TextUtils.isEmpty(fileTypeFromUrl)) {
+                        continue;
+                    }
+                    String path = getPath(fileTypeFromUrl, materialListBean.getId(), materialListBean.getUpdateTime());
+                    if (!checkFileExist(path)) {
+                        return false;
+                    }
+                } else {
+                    continue;
+                }
+            }
+        }
+        Log.i(TAG, "cache true:" + coursewareInfoBean.getLessonCoursewareDetailId());
+        return true;
+    }
+
+    private boolean checkFileExist(String path) {
+        boolean fileExist = FileUtils.isFileExist(path);
+        return fileExist;
+    }
+
+    public void toDownload(String dataJson, DownloadHelper.OnEventListener onEventListener) {
+        try {
+            CoursewareInfoBean data = GsonUtils.fromJson(dataJson, CoursewareInfoBean.class);
+            List<CoursewareInfoBean.KnowledgePointListBean> knowledgePointList = data.getKnowledgePointList();
+            if (knowledgePointList == null || knowledgePointList.size() == 0) {
+                onEventListener.downloadError(data.getLessonCoursewareDetailId());
+            }
+            ArrayList<DownloadTaskBean> downloadUrls = new ArrayList<>();
+            for (int i = 0; i < knowledgePointList.size(); i++) {
+                CoursewareInfoBean.KnowledgePointListBean knowledgePointListBean = knowledgePointList.get(i);
+                List<CoursewareInfoBean.KnowledgePointListBean.MaterialListBean> materialList = knowledgePointListBean.getMaterialList();
+                if (materialList != null) {
+                    for (int j = 0; j < materialList.size(); j++) {
+                        CoursewareInfoBean.KnowledgePointListBean.MaterialListBean materialListBean = materialList.get(j);
+                        String content = materialListBean.getContent();
+                        if (TextUtils.equals(materialListBean.getType(), "VIDEO") || TextUtils.equals(materialListBean.getType(), "IMG")) {
+                            DownloadTaskBean downloadTaskBean = new DownloadTaskBean();
+                            downloadTaskBean.setUrl(content);
+                            String fileTypeFromUrl = FileUtils.getFileTypeFromUrl(content);
+                            if (TextUtils.isEmpty(fileTypeFromUrl)) {
+                                continue;
+                            }
+                            String path = getPath(fileTypeFromUrl, materialListBean.getId(), materialListBean.getUpdateTime());
+                            downloadTaskBean.setSavePath(path);
+                            downloadUrls.add(downloadTaskBean);
+                        }
+                    }
+                }
+            }
+            Log.i(TAG, "开始下载:" + downloadUrls.size());
+            if (downloadUrls.size() > 0) {
+                DownloadHelper.getInstance().startDownload(data.getLessonCoursewareDetailId(), downloadUrls, onEventListener);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public InputStream parseFileRequest(String url) {
+        if (url.contains(CUSTOM_FILE_SCHEME)) {
+            try {
+                // 加载存储文件
+                String[] split = url.split(CUSTOM_FILE_SCHEME);
+                Log.i(TAG, "parseFile:" + split[1]);
+                String path = split[1];
+                File file = new File(path);
+                InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+                // 获取 mimeType
+                return inputStream;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    private String getPath(String fileType, String materialId, String updateTime) {
+        String material = FileUtils.getCacheDir2(Utils.getApp(), "material");
+        if (TextUtils.isEmpty(updateTime)) {
+            return "";
+        }
+        Date date = TimeUtils.string2Date(updateTime);
+        if (date == null) {
+            return "";
+        }
+        String fileName = materialId + "_" + date.getTime() + "." + fileType;
+        return material + File.separator + fileName;
+    }
+
+    public boolean clearCache() {
+        try {
+            String material = FileUtils.getCacheDir2(Utils.getApp(), "material");
+            FileUtils.deleteAllInDir(material);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+}

+ 149 - 4
student/src/main/java/com/cooleshow/student/ui/web/HtmlActivity.java

@@ -47,6 +47,7 @@ import com.alipay.sdk.app.PayTask;
 import com.cooleshow.base.BuildConfig;
 import com.cooleshow.base.bean.DownloadTaskBean;
 import com.cooleshow.base.bean.WxPayResult;
+import com.cooleshow.base.common.WebApi;
 import com.cooleshow.base.common.WebConstants;
 import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.constanst.StyleConfig;
@@ -76,6 +77,7 @@ import com.cooleshow.base.utils.helper.DownloadHelper;
 import com.cooleshow.base.utils.helper.GlideEngine;
 import com.cooleshow.base.utils.helper.PermissionTipHelper;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.utils.helper.WebLoadFileHelper;
 import com.cooleshow.base.utils.helper.upload.UploadHelper;
 import com.cooleshow.base.widgets.DialogUtil;
 import com.cooleshow.base.widgets.dialog.CommonConfirmDialog2;
@@ -164,6 +166,8 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
     private String mImageBase64;
     private boolean isNeedResetScreenOrientation = true;
     private boolean isResetOrientation = false;
+    private DownloadHelper.OnEventListener saveFileListener;
+
     private DownloadHelper.OnEventListener mEventListener;
 
     @Override
@@ -1010,13 +1014,13 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
             ArrayList<DownloadTaskBean> downloadTaskBeans = new ArrayList<>();
             downloadTaskBeans.add(downloadTaskBean);
             showLoading("保存中:0%");
-            DownloadHelper.getInstance().startDownload(key, downloadTaskBeans, getDownloadEventListener());
+            DownloadHelper.getInstance().startDownload(key, downloadTaskBeans, getSaveFileDownloadEventListener());
         }
     }
 
-    private DownloadHelper.OnEventListener getDownloadEventListener() {
-        if (mEventListener == null) {
-            mEventListener = new DownloadHelper.OnEventListener() {
+    private DownloadHelper.OnEventListener getSaveFileDownloadEventListener() {
+        if (saveFileListener == null) {
+            saveFileListener = new DownloadHelper.OnEventListener() {
                 @Override
                 public void onProgress(String id, int progress) {
                     Log.i("pq", "html Download:" + progress);
@@ -1044,6 +1048,11 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
                 }
 
                 @Override
+                public void downloadCancel(String id) {
+
+                }
+
+                @Override
                 public void onComplete(String filePath) {
                     Log.i("pq", "download onComplete:" + filePath);
                     if (webView != null) {
@@ -1066,6 +1075,58 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
                 }
             };
         }
+        return saveFileListener;
+    }
+
+    private DownloadHelper.OnEventListener getDownloadEventListener() {
+        if (mEventListener == null) {
+            mEventListener = new DownloadHelper.OnEventListener() {
+                @Override
+                public void onProgress(String id, int progress) {
+                    if (webView != null) {
+                        webView.post(new Runnable() {
+                            @Override
+                            public void run() {
+                                int downloadStatus = DownloadHelper.DOWNLOAD_STATUS_CALLBACK_ING;
+                                if (progress >= 100) {
+                                    downloadStatus = DownloadHelper.DOWNLOAD_STATUS_CALLBACK_COMPLETE;
+                                }
+                                sendDownloadCoursewareProgress(progress, id, downloadStatus);
+                            }
+                        });
+                    }
+                }
+
+                @Override
+                public void downloadError(String id) {
+                    if (webView != null) {
+                        webView.post(new Runnable() {
+                            @Override
+                            public void run() {
+                                sendDownloadCoursewareProgress(0, id, DownloadHelper.DOWNLOAD_STATUS_CALLBACK_ERROR);
+                            }
+                        });
+                    }
+                }
+
+                @Override
+                public void downloadCancel(String id) {
+                    if (webView != null) {
+                        webView.post(new Runnable() {
+                            @Override
+                            public void run() {
+                                sendDownloadCoursewareProgress(0, id, DownloadHelper.DOWNLOAD_STATUS_CALLBACK_CANCEL);
+                            }
+                        });
+                    }
+                }
+
+                @Override
+                public void onComplete(String id) {
+
+                }
+            };
+        }
         return mEventListener;
     }
 
@@ -1554,6 +1615,90 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
     }
 
     @Override
+    public void checkCoursewareCache(JSONObject jsonObject) {
+        String [] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
+        PermissionTipHelper.getInstance().showTipDialog(this,permissions);
+        new RxPermissions(this)
+                .request(permissions)
+                .subscribe(permission -> {
+                    PermissionTipHelper.getInstance().dismissDialog();
+                    if (permission) {
+                        JSONObject jsonObject1 = WebLoadFileHelper.getInstance().checkCacheStatus(jsonObject);
+                        onSendMessage(jsonObject1.toString());
+                        replaceDownloadCallBackIfOnDownloading();
+                    } else {
+                        onSendMessage(jsonObject.toString());
+                        UiUtils.showPermissionTipDialog(getSupportFragmentManager(), this, "提示", "缓存需要开启存储权限,去设置?");
+                    }
+                });
+    }
+
+    /**
+     * 一次只能下载一个,如果有任务则替换当前callback
+     */
+    private void replaceDownloadCallBackIfOnDownloading() {
+        int size = DownloadHelper.getInstance().getDownloadTaskInfos().size();
+        if (size != 0) {
+            DownloadHelper.getInstance().replaceCallBack(getDownloadEventListener());
+        }
+    }
+
+    @Override
+    public void downloadCourseware(String data) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        String [] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
+        PermissionTipHelper.getInstance().showTipDialog(this,permissions);
+        new RxPermissions(this)
+                .request(permissions)
+                .subscribe(permission -> {
+                    PermissionTipHelper.getInstance().dismissDialog();
+                    if (permission) {
+                        boolean isWifi = NetworkUtil.isWifiNetwork(HtmlActivity.this);
+                        if (isWifi) {
+                            WebLoadFileHelper.getInstance().toDownload(data, getDownloadEventListener());
+                        } else {
+                            showWifiTipDialog(data);
+                        }
+                    } else {
+                        UiUtils.showPermissionTipDialog(getSupportFragmentManager(), this, "提示", "下载需要开启存储权限,去设置?");
+                    }
+                });
+    }
+
+    private void showWifiTipDialog(String data) {
+        CommonConfirmDialog2 commonDialog2 = new CommonConfirmDialog2(this);
+        commonDialog2.show();
+        commonDialog2.setTitle("提示");
+        commonDialog2.setContent("当前非Wifi网络,确认下载?");
+        commonDialog2.setOnConfirmClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                commonDialog2.dismiss();
+                WebLoadFileHelper.getInstance().toDownload(data, getDownloadEventListener());
+            }
+        });
+    }
+
+    private void sendDownloadCoursewareProgress(int progress, String id, int downloadStatus) {
+        JSONObject jsonObject = new JSONObject();
+        JSONObject contentJson = new JSONObject();
+        try {
+            jsonObject.put("api", WebApi.DOWNLOAD_COURSEWARE_TO_CACHE);
+            contentJson.put("lessonCoursewareDetailId", id);
+            contentJson.put("progress", progress);
+            Log.i("pq", "下载lessonCoursewareDetailId:" + id);
+            Log.i("pq", "下载进度:" + progress);
+            contentJson.put("downloadStatus", downloadStatus);
+            jsonObject.put("content", contentJson);
+            onSendMessage(jsonObject.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_BACK) {
             if (webView.canGoBack()) {

+ 68 - 0
student/src/main/java/com/cooleshow/student/widgets/helper/JsInterfaceUtils.java

@@ -13,10 +13,14 @@ import android.view.WindowManager;
 import android.webkit.JavascriptInterface;
 
 import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.bean.RouteBean;
 import com.cooleshow.base.common.WebApi;
 import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.utils.GsonUtils;
+import com.cooleshow.base.utils.JumpUtils;
 import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.utils.helper.WebLoadFileHelper;
 import com.cooleshow.chatmodule.utils.helper.ChatHelper;
 import com.cooleshow.student.helper.EventHelper;
 import com.cooleshow.usercenter.constants.UserConstants;
@@ -313,6 +317,67 @@ public class JsInterfaceUtils extends Object {
                     }
                     return;
                 }
+
+                if (TextUtils.equals(WebApi.OPEN_APP_PAGE, api)) {
+                    JSONObject content = jsonObject.getJSONObject("content");
+                    RouteBean routeBean = GsonUtils.fromJson(content.toString(), RouteBean.class);
+                    JumpUtils.jump(routeBean);
+                    return;
+                }
+
+                if (TextUtils.equals(WebApi.CHECK_COURSEWARE_CACHE, api)) {
+                    if (onListener != null) {
+                        onListener.checkCoursewareCache(jsonObject);
+                    }
+                    return;
+                }
+
+                if (TextUtils.equals(WebApi.DOWNLOAD_COURSEWARE_TO_CACHE, api)) {
+                    //下载
+                    if (onListener != null) {
+                        JSONObject content = jsonObject.optJSONObject("content");
+                        JSONObject data = content.optJSONObject("data");
+                        if (data != null) {
+                            onListener.downloadCourseware(data.toString());
+                        }
+                    }
+                }
+
+                if (TextUtils.equals(WebApi.GET_COURSE_FILE_PATH, api)) {
+                    String cachePath = WebLoadFileHelper.getInstance().checkCache(jsonObject);
+                    if (onListener != null) {
+                        JSONObject content = jsonObject.getJSONObject("content");
+                        content.put("localPath", cachePath);
+                        onListener.onSendMessage(jsonObject.toString());
+                    }
+                    return;
+                }
+
+                if(TextUtils.equals(WebApi.CANCEL_DOWNLOAD_COURSEWARE,api)){
+                    WebLoadFileHelper.getInstance().pauseAll();
+                    return;
+                }
+
+                if (TextUtils.equals(WebApi.API_SET_CACHE, api)) {
+                    //获取用户信息
+                    JSONObject content = jsonObject.getJSONObject("content");
+                    String key = content.optString("key");
+                    String value = content.optString("value");
+                    UserHelper.setCustomCache(key, value);
+                    return;
+                }
+
+                if (TextUtils.equals(WebApi.API_GET_CACHE, api)) {
+                    //获取用户信息
+                    JSONObject content = jsonObject.getJSONObject("content");
+                    String key = content.optString("key");
+                    String customCache = UserHelper.getCustomCache(key);
+                    content.put("value", customCache);
+                    if (onListener != null) {
+                        onListener.onSendMessage(jsonObject.toString());
+                    }
+                    return;
+                }
             } catch (Exception e) {
             }
         });
@@ -423,6 +488,9 @@ public class JsInterfaceUtils extends Object {
 
         void videoCrop(JSONObject jsonObject);
 
+        void checkCoursewareCache(JSONObject jsonObject);
+
+        void downloadCourseware(String toString);
     }
 
 }

+ 152 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/web/HtmlActivity.java

@@ -47,6 +47,7 @@ import com.alipay.sdk.app.PayTask;
 import com.cooleshow.base.BuildConfig;
 import com.cooleshow.base.bean.DownloadTaskBean;
 import com.cooleshow.base.bean.WxPayResult;
+import com.cooleshow.base.common.WebApi;
 import com.cooleshow.base.common.WebConstants;
 import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.constanst.UploadConstants;
@@ -74,6 +75,7 @@ import com.cooleshow.base.utils.helper.DownloadHelper;
 import com.cooleshow.base.utils.helper.GlideEngine;
 import com.cooleshow.base.utils.helper.PermissionTipHelper;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.utils.helper.WebLoadFileHelper;
 import com.cooleshow.base.utils.helper.upload.UploadHelper;
 import com.cooleshow.base.widgets.DialogUtil;
 import com.cooleshow.base.widgets.dialog.CommonConfirmDialog2;
@@ -165,6 +167,7 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
     private boolean isNeedResetScreenOrientation = true;
     private boolean isResetOrientation = false;
     private DownloadHelper.OnEventListener mEventListener;
+    private DownloadHelper.OnEventListener saveFileListener;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -455,7 +458,7 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
             ArrayList<DownloadTaskBean> downloadTaskBeans = new ArrayList<>();
             downloadTaskBeans.add(downloadTaskBean);
             showLoading("保存中:0%");
-            DownloadHelper.getInstance().startDownload(key, downloadTaskBeans, getDownloadEventListener());
+            DownloadHelper.getInstance().startDownload(key, downloadTaskBeans, getSaveFileDownloadEventListener());
         }
     }
 
@@ -464,6 +467,58 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
             mEventListener = new DownloadHelper.OnEventListener() {
                 @Override
                 public void onProgress(String id, int progress) {
+                    if (webView != null) {
+                        webView.post(new Runnable() {
+                            @Override
+                            public void run() {
+                                int downloadStatus = DownloadHelper.DOWNLOAD_STATUS_CALLBACK_ING;
+                                if (progress >= 100) {
+                                    downloadStatus = DownloadHelper.DOWNLOAD_STATUS_CALLBACK_COMPLETE;
+                                }
+                                sendDownloadCoursewareProgress(progress, id, downloadStatus);
+                            }
+                        });
+                    }
+                }
+
+                @Override
+                public void downloadError(String id) {
+                    if (webView != null) {
+                        webView.post(new Runnable() {
+                            @Override
+                            public void run() {
+                                sendDownloadCoursewareProgress(0, id, DownloadHelper.DOWNLOAD_STATUS_CALLBACK_ERROR);
+                            }
+                        });
+                    }
+                }
+
+                @Override
+                public void downloadCancel(String id) {
+                    if (webView != null) {
+                        webView.post(new Runnable() {
+                            @Override
+                            public void run() {
+                                sendDownloadCoursewareProgress(0, id, DownloadHelper.DOWNLOAD_STATUS_CALLBACK_CANCEL);
+                            }
+                        });
+                    }
+                }
+
+                @Override
+                public void onComplete(String id) {
+
+                }
+            };
+        }
+        return mEventListener;
+    }
+
+    private DownloadHelper.OnEventListener getSaveFileDownloadEventListener() {
+        if (saveFileListener == null) {
+            saveFileListener = new DownloadHelper.OnEventListener() {
+                @Override
+                public void onProgress(String id, int progress) {
                     Log.i("pq", "html Download:" + progress);
                     if (webView != null) {
                         webView.post(new Runnable() {
@@ -489,6 +544,11 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
                 }
 
                 @Override
+                public void downloadCancel(String id) {
+
+                }
+
+                @Override
                 public void onComplete(String filePath) {
                     Log.i("pq", "download onComplete:" + filePath);
                     if (webView != null) {
@@ -511,7 +571,7 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
                 }
             };
         }
-        return mEventListener;
+        return saveFileListener;
     }
 
     @Override
@@ -1505,6 +1565,12 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
         if (null != webView) {
             webView.destroy();
         }
+        if (mEventListener != null) {
+            mEventListener = null;
+        }
+        if (saveFileListener != null) {
+            saveFileListener = null;
+        }
         EventBus.getDefault().unregister(this);
         if (UserHelper.isAgreePrivacy()) {
             UMShareAPI.get(HtmlActivity.this).release();
@@ -1560,6 +1626,90 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
     }
 
     @Override
+    public void checkCoursewareCache(JSONObject jsonObject) {
+        String [] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
+        PermissionTipHelper.getInstance().showTipDialog(this,permissions);
+        new RxPermissions(this)
+                .request(permissions)
+                .subscribe(permission -> {
+                    PermissionTipHelper.getInstance().dismissDialog();
+                    if (permission) {
+                        JSONObject jsonObject1 = WebLoadFileHelper.getInstance().checkCacheStatus(jsonObject);
+                        onSendMessage(jsonObject1.toString());
+                        replaceDownloadCallBackIfOnDownloading();
+                    } else {
+                        onSendMessage(jsonObject.toString());
+                        UiUtils.showPermissionTipDialog(getSupportFragmentManager(), this, "提示", "缓存需要开启存储权限,去设置?");
+                    }
+                });
+    }
+
+    /**
+     * 一次只能下载一个,如果有任务则替换当前callback
+     */
+    private void replaceDownloadCallBackIfOnDownloading() {
+        int size = DownloadHelper.getInstance().getDownloadTaskInfos().size();
+        if (size != 0) {
+            DownloadHelper.getInstance().replaceCallBack(getDownloadEventListener());
+        }
+    }
+
+    @Override
+    public void downloadCourseware(String data) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        String [] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
+        PermissionTipHelper.getInstance().showTipDialog(this,permissions);
+        new RxPermissions(this)
+                .request(permissions)
+                .subscribe(permission -> {
+                    PermissionTipHelper.getInstance().dismissDialog();
+                    if (permission) {
+                        boolean isWifi = NetworkUtil.isWifiNetwork(HtmlActivity.this);
+                        if (isWifi) {
+                            WebLoadFileHelper.getInstance().toDownload(data, getDownloadEventListener());
+                        } else {
+                            showWifiTipDialog(data);
+                        }
+                    } else {
+                        UiUtils.showPermissionTipDialog(getSupportFragmentManager(), this, "提示", "下载需要开启存储权限,去设置?");
+                    }
+                });
+    }
+
+    private void showWifiTipDialog(String data) {
+        CommonConfirmDialog2 commonDialog2 = new CommonConfirmDialog2(this);
+        commonDialog2.show();
+        commonDialog2.setTitle("提示");
+        commonDialog2.setContent("当前非Wifi网络,确认下载?");
+        commonDialog2.setOnConfirmClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                commonDialog2.dismiss();
+                WebLoadFileHelper.getInstance().toDownload(data, getDownloadEventListener());
+            }
+        });
+    }
+
+    private void sendDownloadCoursewareProgress(int progress, String id, int downloadStatus) {
+        JSONObject jsonObject = new JSONObject();
+        JSONObject contentJson = new JSONObject();
+        try {
+            jsonObject.put("api", WebApi.DOWNLOAD_COURSEWARE_TO_CACHE);
+            contentJson.put("lessonCoursewareDetailId", id);
+            contentJson.put("progress", progress);
+            Log.i("pq", "下载lessonCoursewareDetailId:" + id);
+            Log.i("pq", "下载进度:" + progress);
+            contentJson.put("downloadStatus", downloadStatus);
+            jsonObject.put("content", contentJson);
+            onSendMessage(jsonObject.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_BACK) {
             if (webView.canGoBack()) {

+ 70 - 0
teacher/src/main/java/com/cooleshow/teacher/widgets/helper/JsInterfaceUtils.java

@@ -12,11 +12,15 @@ import android.view.WindowManager;
 import android.webkit.JavascriptInterface;
 
 import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.bean.RouteBean;
 import com.cooleshow.base.common.WebApi;
 import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.utils.GsonUtils;
+import com.cooleshow.base.utils.JumpUtils;
 import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.utils.helper.WebLoadFileHelper;
 import com.cooleshow.chatmodule.utils.helper.ChatHelper;
 import com.cooleshow.teacher.helper.EventHelper;
 import com.cooleshow.usercenter.constants.UserConstants;
@@ -360,6 +364,67 @@ public class JsInterfaceUtils extends Object {
                     }
                     return;
                 }
+
+                if (TextUtils.equals(WebApi.OPEN_APP_PAGE, api)) {
+                    JSONObject content = jsonObject.getJSONObject("content");
+                    RouteBean routeBean = GsonUtils.fromJson(content.toString(), RouteBean.class);
+                    JumpUtils.jump(routeBean);
+                    return;
+                }
+
+                if (TextUtils.equals(WebApi.CHECK_COURSEWARE_CACHE, api)) {
+                    if (onListener != null) {
+                        onListener.checkCoursewareCache(jsonObject);
+                    }
+                    return;
+                }
+
+                if (TextUtils.equals(WebApi.DOWNLOAD_COURSEWARE_TO_CACHE, api)) {
+                    //下载
+                    if (onListener != null) {
+                        JSONObject content = jsonObject.optJSONObject("content");
+                        JSONObject data = content.optJSONObject("data");
+                        if (data != null) {
+                            onListener.downloadCourseware(data.toString());
+                        }
+                    }
+                }
+
+                if (TextUtils.equals(WebApi.GET_COURSE_FILE_PATH, api)) {
+                    String cachePath = WebLoadFileHelper.getInstance().checkCache(jsonObject);
+                    if (onListener != null) {
+                        JSONObject content = jsonObject.getJSONObject("content");
+                        content.put("localPath", cachePath);
+                        onListener.onSendMessage(jsonObject.toString());
+                    }
+                    return;
+                }
+
+                if(TextUtils.equals(WebApi.CANCEL_DOWNLOAD_COURSEWARE,api)){
+                    WebLoadFileHelper.getInstance().pauseAll();
+                    return;
+                }
+
+                if (TextUtils.equals(WebApi.API_SET_CACHE, api)) {
+                    //获取用户信息
+                    JSONObject content = jsonObject.getJSONObject("content");
+                    String key = content.optString("key");
+                    String value = content.optString("value");
+                    UserHelper.setCustomCache(key, value);
+                    return;
+                }
+
+                if (TextUtils.equals(WebApi.API_GET_CACHE, api)) {
+                    //获取用户信息
+                    JSONObject content = jsonObject.getJSONObject("content");
+                    String key = content.optString("key");
+                    String customCache = UserHelper.getCustomCache(key);
+                    content.put("value", customCache);
+                    if (onListener != null) {
+                        onListener.onSendMessage(jsonObject.toString());
+                    }
+                    return;
+                }
             } catch (Exception e) {
             }
         });
@@ -469,6 +534,11 @@ public class JsInterfaceUtils extends Object {
         void shareTripartite(JSONObject jsonObject);
 
         void videoCrop(JSONObject jsonObject);
+
+        void checkCoursewareCache(JSONObject jsonObject);
+
+        void downloadCourseware(String toString);
+
     }
 
 }