WebPresentation.java 9.13 KB
package com.studymachine.www.ui.presentation;

import static com.blankj.utilcode.util.CacheDoubleStaticUtils.getString;
import static com.hjq.http.EasyUtils.post;

import android.app.Activity;
import android.app.Application;
import android.app.Presentation;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Message;
import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner;
import androidx.recyclerview.widget.RecyclerView;

import com.hjq.bar.TitleBar;
import com.hjq.base.BaseDialog;
import com.hjq.http.EasyHttp;
import com.hjq.http.listener.HttpCallback;
import com.hjq.http.listener.OnHttpListener;
import com.studymachine.www.R;
import com.studymachine.www.action.TitleBarAction;
import com.studymachine.www.aop.CheckNet;
import com.studymachine.www.app.AppPresentation;
import com.studymachine.www.app.ModeHandler;
import com.studymachine.www.domain.AiDTO;
import com.studymachine.www.enumtype.TopicEnum;
import com.studymachine.www.event.SwfEvent;
import com.studymachine.www.http.api.PointDetailApi;
import com.studymachine.www.http.glide.GlideApp;
import com.studymachine.www.http.model.HttpData;
import com.studymachine.www.js.MainJavaScriptInterface;
import com.studymachine.www.manager.ActivityManager;
import com.studymachine.www.manager.ControllerView;
import com.studymachine.www.manager.EventBusManager;
import com.studymachine.www.ui.activity.AiDetailActivity;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

import com.studymachine.www.action.StatusAction;
import com.studymachine.www.ui.dialog.ConfirmDialog;
import com.studymachine.www.widget.StatusLayout;
import com.studymachine.www.widget.X5WebView;
import com.tencent.smtt.sdk.ValueCallback;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;

import timber.log.Timber;

public class WebPresentation extends AppPresentation implements StatusAction {
    private static final String INTENT_KEY_IN_POINT_ID = "pointId";
    private StatusLayout mStatusLayout;
    private X5WebView mX5WebView;
    private ImageView mIvBack, mImgView;
    private String mPointId;
    public PointDetailApi.Bean<AiDTO> mPointDetail;
    private int aiIndex = 0;
    private FrameLayout mControllerFrame;
    private ControllerView controllerView;
    private FrameLayout mControllerBid;
    private ImageView imageView;

    public WebPresentation(Context outerContext, Display display) {
        super(outerContext, display);
    }

    public WebPresentation(Context outerContext, Display display, String mPointId, PointDetailApi.Bean<AiDTO> mPointDetail) {
        super(outerContext, display);
        this.mPointId = mPointId;
        this.mPointDetail = mPointDetail;
    }
    public X5WebView getmX5WebView(){
        return this.mX5WebView;
    }
    public WebPresentation(Context outerContext, Display display, int theme) {
        super(outerContext, display, theme);
    }

    @Override
    public int getLayout() {
        return R.layout.ai_detail_activity;
    }

    public void initData() {
        final ModeHandler handler = new ModeHandler(this);
        mImgView = findViewById(R.id.loadview);
        mStatusLayout = findViewById(R.id.hl_browser_hint);
        mIvBack = findViewById(R.id.iv_back);
        mX5WebView = findViewById(R.id.wv_browser_view);
        MainJavaScriptInterface mainJavaScriptInterface = new MainJavaScriptInterface(getOwnerActivity(), mX5WebView,handler);
        mX5WebView.addJavascriptInterface(mainJavaScriptInterface, "studyMachine");
        String currentDateTimeString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).format(new Date());
        mainJavaScriptInterface.setTime(currentDateTimeString);
        GlideApp.with(getContext())
                .asGif()
                .load(R.drawable.common_load)
                .into(mImgView);
//        showLoading();
        mX5WebView.setWebViewClient(new AppBrowserViewClient());
        mX5WebView.setWebChromeClient(new AppBrowserChromeClient());
        mX5WebView.loadUrl(mPointDetail.isFinish() ? mPointDetail.getScene().getArbitrarilyUrl() : mPointDetail.getScene().getSequenceUrl());
        mIvBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
                getOwnerActivity().finish();
            }
        });
        handler.sendEmptyMessage(0);
//        Runnable task = new Runnable() {
//            public void run() {
//                mX5WebView.evaluateJavascript("javascript:answerExist()", new ValueCallback<String>() {
//                    @Override
//                    public void onReceiveValue(String s) {
//                        try {
//                            mode = Integer.valueOf(s);
//                        } catch (Exception e) {
//                            mode = 1;
//                        }
//
//                    }
//                });
//
//                handler.sendEmptyMessage(mode);//设置循环时间,此处是5秒
//                handler.postDelayed(this, 1000);
//                //需要执行的代码
//            }
//        };
//
//        handler.post(task);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventBus(SwfEvent swfEvent) {
        Timber.d("改变背景");
        mX5WebView.evaluateJavascript("javascript:swfSwitchBg()", (s) -> {
        });
    }

    @Override
    public void onLeftClick(View view) {
        dismiss();
        getOwnerActivity().finish();
    }

    public void showConfirmDialog() {

        if (mPointDetail == null || mPointDetail.isFinish() || aiIndex == mPointDetail.getItems().size() - 1) {
            getOwnerActivity().finish();
            return;
        }
        new ConfirmDialog.Builder(getContext())
                .setTitle("课程尚未结束,如果退出将不记录本讲已学内容。\n" + "确定要退出吗?")
                .setCancelText("坚持退出")
                .setConfirmText("继续学习")
                .setListener(new ConfirmDialog.OnListener() {
                    @Override
                    public void onConfirm(BaseDialog dialog) {
                    }

                    @Override
                    public void onCancel(BaseDialog dialog) {
                        getOwnerActivity().finish();
                    }
                })
                .show();
    }


    private class AppBrowserViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView webView, String url) {
            Timber.tag("网页UrlLoading").d(url);
            return super.shouldOverrideUrlLoading(webView, url);
        }

        /**
         * 重新加载当前页
         */
        @CheckNet
        private void reload() {
            mX5WebView.reload();
        }

        /**
         * 网页加载错误时回调,这个方法会在 onPageFinished 之前调用
         */
        @Override
        public void onReceivedError(WebView webView, int i, String s, String s1) {
            // 这里为什么要用延迟呢?因为加载出错之后会先调用 onReceivedError 再调用 onPageFinished
            post(() -> showError(listener -> reload()));
        }

        /**
         * 开始加载网页
         */
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
        }

        /**
         * 完成加载网页
         */
        @Override
        public void onPageFinished(WebView view, String url) {
//            showComplete();
            mImgView.setVisibility(View.GONE);
        }
    }

    private class AppBrowserChromeClient extends WebChromeClient {

        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            Timber.tag("网页").d("look");
            return false;
        }

        /**
         * 收到网页标题
         */
        @Override
        public void onReceivedTitle(WebView view, String title) {
            if (title == null) {
                return;
            }
            setTitle(title);
        }

        @Override
        public void onReceivedIcon(WebView view, Bitmap icon) {
            if (icon == null) {
                return;
            }
            setRightIcon(new BitmapDrawable(getResources(), icon));
        }

        /**
         * 收到加载进度变化
         */
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
        }
    }
}