Pārlūkot izejas kodu

1.使用liboffice预览文档

JaycePC 6 mēneši atpakaļ
vecāks
revīzija
6a850404a0

+ 2 - 1
app/.gitignore

@@ -1 +1,2 @@
-/build
+/build
+/release

+ 1 - 1
app/build.gradle

@@ -12,7 +12,7 @@ android {
         minSdkVersion 24
         targetSdkVersion 34
         versionCode 110
-        versionName "1.1.0-alpha"
+        versionName "1.1.1-alpha"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 

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

@@ -49,6 +49,9 @@
         <activity
             android:name=".ui.learn.LearnDetailWebActivity"
             android:exported="false" />
+        <activity
+            android:name=".ui.learn.LearnDetailLibOfficeActivity"
+            android:exported="false" />
 
         <receiver
             android:name=".broadcast.BootBroadcastReceiver"

+ 1 - 1
app/src/main/java/com/dlc/exam/ui/learn/CourseChapterActivity.kt

@@ -103,7 +103,7 @@ class CourseChapterActivity : BaseCountDownActivity<ActivityCourseChapterBinding
         }
         // WebView处理
         else {
-            intent.setClass(this, LearnDetailWebActivity::class.java)
+            intent.setClass(this, LearnDetailLibOfficeActivity::class.java)
         }
         startActivityForResult(intent, 100)
     }

+ 287 - 0
app/src/main/java/com/dlc/exam/ui/learn/LearnDetailLibOfficeActivity.java

@@ -0,0 +1,287 @@
+package com.dlc.exam.ui.learn;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.ConsoleMessage;
+import android.webkit.WebChromeClient;
+import android.webkit.WebResourceError;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.LinearLayout;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.blankj.utilcode.util.LogUtils;
+import com.dlc.exam.common.CommonUtils;
+import com.dlc.exam.databinding.ActivityLearnDetailWebBinding;
+import com.dlc.exam.ui.common.BaseCountDownActivity;
+import com.dlc.exam.ui.learn.test.ClassTestActivity;
+import com.dlc.exam.ui.widget.JsInterface;
+import com.rc.core.util.EscapeUnescape;
+import com.rc.httpcore.HttpConfig;
+import com.rc.httpcore.client.ApiRepository;
+import com.rc.httpcore.vo.request.ExamLearnReq;
+
+import io.reactivex.disposables.Disposable;
+import okhttp3.HttpUrl;
+
+public class LearnDetailLibOfficeActivity extends BaseCountDownActivity<ActivityLearnDetailWebBinding> implements View.OnClickListener {
+
+    private ActivityLearnDetailWebBinding binding;
+    private LearnChapterBean learnChapterBean;
+    private WebView webView;
+    private boolean learnCompleted = false;// 是否已完成学习
+    private long learnTimeSecond = 0L;
+
+    @NonNull
+    @Override
+    protected ActivityLearnDetailWebBinding createViewBinding() {
+        return ActivityLearnDetailWebBinding.inflate(LayoutInflater.from(this));
+    }
+
+    @Override
+    protected void initViews(@Nullable Bundle savedInstanceState) {
+        super.initViews(savedInstanceState);
+
+        binding = getViewBinding();
+        Intent getIntent = getIntent();
+        if (null != getIntent && getIntent.hasExtra("Chapter")) {
+            learnChapterBean = getIntent.getParcelableExtra("Chapter");
+            boolean relearn = getIntent.getBooleanExtra("relearn", false);
+            if (null == learnChapterBean) {
+                finish();
+                return;
+            }
+            binding.back.setOnClickListener(this);
+            binding.titleText.setText(learnChapterBean.title);
+            // 是否完成学习
+            binding.learnCompleted.setVisibility(relearn ? View.GONE : View.VISIBLE);
+            binding.learnCompleted.setOnClickListener(this);
+            // 初始化WebView
+            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+            webView = new WebView(getApplicationContext());
+            webView.setLayoutParams(params);
+            binding.mainLL.addView(webView);
+            WebView.setWebContentsDebuggingEnabled(true);
+            WebSettings webSettings = webView.getSettings();
+            webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+            webSettings.setSupportZoom(true);
+            webSettings.setLoadWithOverviewMode(true);
+            webSettings.setUseWideViewPort(true);
+            webSettings.setDomStorageEnabled(true);//DOM Storage
+            webSettings.setAllowFileAccessFromFileURLs(true);
+            webSettings.setAllowFileAccess(true);
+            webSettings.setAllowContentAccess(true);
+            webSettings.setAllowUniversalAccessFromFileURLs(true);
+            webSettings.setBuiltInZoomControls(true);
+            webSettings.setDefaultTextEncodingName("utf-8");
+            webSettings.setJavaScriptEnabled(true);//设置webview支持javascript脚本
+            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
+            webView.addJavascriptInterface(new JsInterface(), "Android");
+            webView.setWebChromeClient(webChromeClient);
+            webView.setWebViewClient(webViewClient);
+            webView.requestFocus();
+            // 富文本
+            if ("5".equals(learnChapterBean.type)) {
+                webView.loadDataWithBaseURL(null, EscapeUnescape.unescape(learnChapterBean.chapterData), "text/html", "utf-8", null);
+            } else {
+                String baseUrl = HttpConfig.Companion.getAPI_BASE_URL();
+                HttpUrl httpUrl = HttpUrl.get(baseUrl);
+                String libOfficeUrl = httpUrl.scheme() + "://" + httpUrl.host() + ":19999/";
+                String chapterData = learnChapterBean.chapterData;
+                if (!"http".startsWith(chapterData)) {
+                    chapterData = HttpConfig.Companion.getAPI_BASE_URL() + learnChapterBean.chapterData;
+                }
+                webView.loadUrl(libOfficeUrl + "file_to_images/" + chapterData);
+            }
+
+        } else {
+            finish();
+        }
+    }
+
+    private final WebViewClient webViewClient = new WebViewClient() {
+        @Override
+        public void onPageFinished(WebView view, String url) {
+            super.onPageFinished(view, url);
+            LogUtils.d("Jayce", url);
+        }
+
+        @Override
+        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
+            super.onReceivedError(view, request, error);
+
+            LogUtils.e("Jayce", error.getErrorCode(), error.getDescription());
+        }
+    };
+
+    private final WebChromeClient webChromeClient = new WebChromeClient() {
+        @Override
+        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
+            if (ConsoleMessage.MessageLevel.ERROR == consoleMessage.messageLevel()) {
+                LogUtils.e("Jayce", consoleMessage.message(), consoleMessage.lineNumber(), consoleMessage.sourceId());
+            } else {
+                if (consoleMessage.message().startsWith("status")) {
+                    String[] statusArray = consoleMessage.message().split(" ", -1);
+                    if (statusArray.length > 1) {
+                        String code = statusArray[1];
+                        if ("200".equals(code)) {
+                            startLearn();
+                        } else if ("400".equals(code)) {
+                            Toast.makeText(LearnDetailLibOfficeActivity.this, "无法预览", Toast.LENGTH_LONG).show();
+                            finish();
+                        }
+                    }
+                }
+                LogUtils.d("Jayce", consoleMessage.message(), consoleMessage.lineNumber(), consoleMessage.sourceId());
+            }
+            return true;
+        }
+
+        @Override
+        public void onProgressChanged(WebView view, int newProgress) {
+            super.onProgressChanged(view, newProgress);
+            LogUtils.d("Jayce", "加载进度:" + newProgress);
+        }
+
+        @Override
+        public void onCloseWindow(WebView window) {
+            super.onCloseWindow(window);
+            String js = "javascript:objPreviewerDestroy()";
+            webView.evaluateJavascript(js, value -> {
+                LogUtils.d("Jayce", value);
+            });
+        }
+    };
+
+    /**
+     * 完成学习
+     */
+    private void finishLearn() {
+        showLoading("保存中...", false);
+        ExamLearnReq examLearnReq = new ExamLearnReq();
+        examLearnReq.chapterId = learnChapterBean.chapterId;
+        examLearnReq.courseId = learnChapterBean.courseId;
+        Disposable disposable = ApiRepository.INSTANCE.examLearnFinish(examLearnReq).subscribe(learnBonusBean -> {
+            dismissLoading();
+            LogUtils.json("Jayce", learnBonusBean);
+            learnCompleted = true;
+            new LearnCompletedDialog(LearnDetailLibOfficeActivity.this, learnBonusBean, false, learnChapterBean.assessStatus, () -> {
+                binding.learnCompleted.setEnabled(false);
+                // 课后考核
+                if (learnChapterBean.assessStatus) {
+                    Intent intent = new Intent(LearnDetailLibOfficeActivity.this, ClassTestActivity.class);
+                    intent.putExtra("chapterId", learnChapterBean.chapterId);
+                    startActivity(intent);
+                    setResult(RESULT_OK);
+                }
+                finish();
+                return null;
+            }).show();
+        }, throwable -> {
+            dismissLoading();
+            throwable.printStackTrace();
+            showNetError(throwable);
+        });
+        addDisposable(disposable);
+    }
+
+    private Handler cdHandler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            super.handleMessage(msg);
+            learnTimeSecond++;
+            binding.learnDuration.setText("已学习时长:" + CommonUtils.INSTANCE.formatLearnTime(learnTimeSecond));
+            sendEmptyMessageDelayed(1, 1000);
+            if (learnTimeSecond >= learnChapterBean.duration) {
+                binding.learnCompleted.setEnabled(true);
+            }
+        }
+    };
+
+    private volatile boolean isStartLearn = false;
+
+    /**
+     * 开始学习
+     */
+    private void startLearn() {
+        if (!isStartLearn) {
+            showLoading("加载中...", false);
+            ExamLearnReq examLearnReq = new ExamLearnReq();
+            examLearnReq.chapterId = learnChapterBean.chapterId;
+            examLearnReq.courseId = learnChapterBean.courseId;
+            Disposable disposable = ApiRepository.INSTANCE.examLearnStart(examLearnReq).subscribe(aBoolean -> {
+                isStartLearn = true;
+                dismissLoading();
+                learnTimeSecond = 0L;
+                cdHandler.sendEmptyMessage(1);
+
+            }, throwable -> {
+                dismissLoading();
+                throwable.printStackTrace();
+                showNetError(throwable);
+            });
+            addDisposable(disposable);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        webView.onPause();
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        webView.onResume();
+        super.onResume();
+    }
+
+    @Override
+    protected void onDestroy() {
+        if (webView != null) {
+            webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
+            webView.clearHistory();
+            binding.mainLL.removeAllViewsInLayout();
+            webView.destroy();
+            webView = null;
+        }
+        cdHandler.removeMessages(1);
+        cdHandler.removeCallbacksAndMessages(null);
+        cdHandler = null;
+        super.onDestroy();
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (learnCompleted) {
+            setResult(RESULT_OK);
+        }
+        super.onBackPressed();
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == binding.back.getId()) {
+            onBackPressed();
+        }
+        // 完成学习
+        else if (v.getId() == binding.learnCompleted.getId()) {
+            learnTimeSecond = 0L;
+            cdHandler.removeMessages(1);
+            finishLearn();
+        }
+    }
+
+
+}

+ 3 - 0
app/src/main/java/com/dlc/exam/ui/learn/LearnDetailWebActivity.java

@@ -38,6 +38,9 @@ import org.greenrobot.eventbus.ThreadMode;
 
 import io.reactivex.disposables.Disposable;
 
+/**
+ * @deprecated 本地解析并展示文档  对设备要求过高
+ */
 public class LearnDetailWebActivity extends BaseCountDownActivity<ActivityLearnDetailWebBinding> implements View.OnClickListener {
 
     private ActivityLearnDetailWebBinding binding;