MyWebChromeClient.java 7.42 KB
package com.polysoft.nafmii.webview;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;

import com.polysoft.nafmii.fragment.WebViewFragment;
import com.tencent.smtt.export.external.interfaces.ConsoleMessage;
import com.tencent.smtt.export.external.interfaces.IX5WebChromeClient;
import com.tencent.smtt.export.external.interfaces.JsResult;
import com.tencent.smtt.sdk.ValueCallback;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebView;

import java.util.concurrent.atomic.AtomicBoolean;

public class MyWebChromeClient extends WebChromeClient {
    private final WebviewLoadListener listener;
    private AtomicBoolean mIsLoadFinish = new AtomicBoolean();
    private boolean mIsFinish = false;
    private Activity activity;

    /**
     * 视频全屏参数
     */
    protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    private View customView;
    private FrameLayout fullscreenContainer;
    private IX5WebChromeClient.CustomViewCallback customViewCallback;
    private WebView webView;
    private int systemVisbility;

    public MyWebChromeClient(WebViewFragment webViewFragment) {
        this.listener = webViewFragment;
        this.activity = webViewFragment.getActivity();
        this.webView = webViewFragment.getWebview().getWebview();
    }

    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }

    @Override
    public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback customViewCallback) {
        if (this.activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
            this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
//        super.onShowCustomView(view, customViewCallback);
        showCustomView(view, customViewCallback);
    }

    @Override
    public void onHideCustomView() {
        if (this.activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
            this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
//        super.onHideCustomView();
        hideCustomView();
    }


    /**
     * 视频播放全屏
     **/
    private void showCustomView(View view, IX5WebChromeClient.CustomViewCallback callback) {
        // if a view already exists then immediately terminate the new one
        if (customView != null) {
            callback.onCustomViewHidden();
            return;
        }

        View decorView = this.activity.getWindow().getDecorView();
        this.systemVisbility = decorView.getSystemUiVisibility();
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE);
        if (decorView instanceof FrameLayout) {
            FrameLayout decor = (FrameLayout) decorView;
            fullscreenContainer = new FullscreenHolder(this.activity);
            fullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
            decor.addView(fullscreenContainer, COVER_SCREEN_PARAMS);
            customView = view;
            setStatusBarVisibility(false);
            customViewCallback = callback;
            webView.setVisibility(View.GONE);
        }

//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
//                    | View.SYSTEM_UI_FLAG_FULLSCREEN
//                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
//                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
//                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
//        } else {
//            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
//                    | View.SYSTEM_UI_FLAG_FULLSCREEN
//                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
//                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
//        }
    }

    /**
     * 隐藏视频全屏
     */
    private void hideCustomView() {
        if (customView == null) {
            return;
        }
        View decorView = this.activity.getWindow().getDecorView();
        decorView.setSystemUiVisibility(systemVisbility);
        if (decorView instanceof FrameLayout) {
            FrameLayout decor = (FrameLayout) decorView;
            decor.removeView(fullscreenContainer);
            fullscreenContainer = null;
            customView = null;
            setStatusBarVisibility(true);
            customViewCallback.onCustomViewHidden();
            webView.setVisibility(View.VISIBLE);
        }
    }

    /**
     * 全屏容器界面
     */
    static class FullscreenHolder extends FrameLayout {

        public FullscreenHolder(Context ctx) {
            super(ctx);
            setBackgroundColor(ctx.getResources().getColor(android.R.color.black));
        }

        @Override
        public boolean onTouchEvent(MotionEvent evt) {
            return true;
        }
    }

    private void setStatusBarVisibility(boolean visible) {
        int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
        this.activity.getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }


    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        if (null != this.listener) {
            if (newProgress == 100) {
                if (!mIsFinish) {
                    this.mIsFinish = true;
                    this.listener.onWebviewLoad(WebviewLoadListener.TYPE_FINISH, null);
                    return;
                }
            }
            this.listener.onWebviewLoad(WebviewLoadListener.TYPE_PROGRESS, newProgress);
        }
        super.onProgressChanged(view, newProgress);
    }

    /**
     * 16(Android 4.1.2) <= API <= 20(Android 4.4W.2)回调此方法
     */
    public void openFileChooser(final ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
        if (null == this.listener) {
            return;
        }

        this.listener.onShowFileChooser((ValueCallback<Uri[]>) value -> {
            for (Uri uri : value) {
                uploadMsg.onReceiveValue(uri);
            }
        }, new String[]{acceptType}, TextUtils.isEmpty(capture));
    }

    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        if (null == this.listener) {
            return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
        }

        String[] acceptTypes = fileChooserParams.getAcceptTypes();
        boolean captureEnabled = fileChooserParams.isCaptureEnabled();
        this.listener.onShowFileChooser(filePathCallback, acceptTypes, captureEnabled);
        return true;
    }


    @Override
    public void onCloseWindow(WebView window) {
        super.onCloseWindow(window);
    }

    @Override
    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
        return super.onConsoleMessage(consoleMessage);
    }
}