JsToJavaInterface.java 7.8 KB
package com.polysoft.nafmii.webview;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.text.TextUtils;
import android.webkit.JavascriptInterface;

import androidx.fragment.app.Fragment;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.util.TypeUtils;
import com.polysoft.nafmii.bean.MenuBean;
import com.polysoft.nafmii.bean.Result;
import com.polysoft.nafmii.broadcast.Receiver;
import com.polysoft.nafmii.broadcast.ShareReceiver;
import com.polysoft.nafmii.utils.CtxUtils;
import com.polysoft.nafmii.utils.StatusBarUtils;
import com.polysoft.nafmii.wechat.ShareBean;
import com.polysoft.nafmii.wechat.WechatApi;

import java.util.HashMap;
import java.util.Map;

public class JsToJavaInterface {
    private final Activity mActivity;
    private final JavaToJsinterface javaTojs;
    private Fragment mFragment;
    WebviewHandler handler;

    public JsToJavaInterface(Activity activity, JavaToJsinterface javaTojs) {
        this.mActivity = activity;
        this.javaTojs = javaTojs;
    }

    public JsToJavaInterface(WebviewHandler handler, Fragment fragment, JavaToJsinterface javaTojs) {
        this(fragment.getActivity(), javaTojs);
        this.mFragment = fragment;
        this.handler = handler;
    }

    @JavascriptInterface
    public void nativeAppInfo(String params) {
        new JsInterfaceHandler(mActivity, javaTojs).parse(params, (data, js) -> {
            final Map<String, Object> dataMap = new HashMap<>();
            PackageInfo packageInfo = CtxUtils.getPackageInfo();
            dataMap.put("versionCode", packageInfo.versionCode);
            dataMap.put("versionName", packageInfo.versionName);
            dataMap.put("statusBarHeight", StatusBarUtils.getStatusBarHeight(mActivity));
            js.success(dataMap);
        });
    }

    @JavascriptInterface
    public void nativeMenu(String params) {
        new JsInterfaceHandler(mActivity, javaTojs).parse(params, (data, js) -> {
            MenuBean bean = TypeUtils.castToJavaBean(data, MenuBean.class);
            mActivity.runOnUiThread(() -> handler.setButtomMenu(bean));
        });
    }

    @JavascriptInterface
    public void nativeLogin(String params) {
        new JsInterfaceHandler(mActivity, javaTojs).parse(params, (data, js) -> {

        });
    }

    @JavascriptInterface
    public void nativeTextZoom(String params) {
        new JsInterfaceHandler(mActivity, javaTojs).parse(params, (data, js) -> {
            mActivity.runOnUiThread(() -> {
                int value = data.getIntValue("value");
                handler.setTextZoom(value);
                js.callJs(Result.success(null));
            });
        });
    }


    @JavascriptInterface
    public void nativeShare(String params) {
        new JsInterfaceHandler(mActivity, javaTojs).parse(params, (data, js) -> {
            WechatApi instance = WechatApi.getInstance(mActivity);
            if (!instance.isWXAppInstalled()) {
                js.callJs(Result.fail("未安装应用"));
            }
            final Receiver<Result> shareReceiver = ShareReceiver.getInstance(mActivity);
            shareReceiver.addDefaultListener((action, share) -> {
                js.callJs(share);
                shareReceiver.addDefaultListener(null);
            });

            mActivity.runOnUiThread(() -> instance.share(mActivity, TypeUtils.castToJavaBean(data, ShareBean.class)));
        });
    }

    @JavascriptInterface
    public void nativeCamera(String params) {
        new JsInterfaceHandler(mActivity, javaTojs).parse(params, new JsInterfaceHandler.JsHandle() {
            @Override
            public void handle(JSONObject data, JsInterfaceHandler.JsInterface js) {

            }
        });
        String permissions[] = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA,
        };
//        if (PermissionUtils.checkPermissions(this.mActivity, permissions)) {
//            this.photosReceiverListener(jsMethodName);
//            Intent intent = IntentUtils.openCamera(this.mActivity);
//            this.mFragment.startActivityForResult(intent, IntentUtils.ACTIVITY_CODE_CAMERA);
//        }
    }
//
//    @JavascriptInterface
//    public void callNativeAlbum(String params) {
//        final JSONObject json = JSONObject.parseObject(params);
//        final String jsMethodName = json.getString("jsMethodName");
//        final JSONObject data = json.getJSONObject("data");
//
//        String permissions[] = {
//                Manifest.permission.WRITE_EXTERNAL_STORAGE,
//                Manifest.permission.READ_EXTERNAL_STORAGE,
//        };
//        if (PermissionUtils.checkPermissions(this.mActivity, permissions)) {
//            this.photosReceiverListener(jsMethodName);
//            Intent intent = IntentUtils.openAlbum(this.mActivity);
//            this.mFragment.startActivityForResult(intent, IntentUtils.ACTIVITY_CODE_ALBUM);
//        }
//    }
//
//    @JavascriptInterface
//    public void callNativeUpdate(String params) {
//        final JSONObject json = JSONObject.parseObject(params);
//        final String jsMethodName = json.getString("jsMethodName");
//        final JSONObject data = json.getJSONObject("data");
//        final String downloadUrl = data.getString("url");
//        final String version = data.getString("version");
//
//        if (!TextUtils.isEmpty(version)) {
//            PackageInfo packageInfo = UITools.getVersionInfo(this.mActivity);
//            int localVersion = packageInfo.versionCode;
//            double updateVersion = Double.parseDouble(version);
//            if (updateVersion <= localVersion) {
//                return;
//            }
//        }
//        this.mActivity.runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
//                UITools.showMustUpdataDialog(downloadUrl, mActivity);
//            }
//        });
//    }
//
//    @JavascriptInterface
//    public void callNativeMobile(String params) {
//        final JSONObject json = JSONObject.parseObject(params);
//        final String jsMethodName = json.getString("jsMethodName");
//        final JSONObject data = json.getJSONObject("data");
//        final String tel = data.getString("tel");
//
//        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + tel));
//        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//        this.mActivity.startActivity(intent);
//
//        if (TextUtils.isEmpty((jsMethodName))) {
//            return;
//        }
//
//        this.mActivity.runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
//                javaTojs.callJs(jsMethodName, "");
//            }
//        });
//    }
//
//    @JavascriptInterface
//    public void callNativeClearCache(String params) {
//        JSONObject json = TextUtils.isEmpty(params) ? new JSONObject() : JSONObject.parseObject(params);
//        final String jsMethodName = json.getString("jsMethodName");
//        this.mActivity.runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
//                WebViewCacheInterceptorInst.getInstance().clearCache();
//                if (!TextUtils.isEmpty(jsMethodName)) {
//                    javaTojs.callJs(jsMethodName, "");
//                }
//            }
//        });
//    }


    private void sendMessage2Js(String jsMethodName, String json) {
        if (TextUtils.isEmpty(jsMethodName)) {
            return;
        }

        if ("'main'".equals(Thread.currentThread().getName())) {
            javaTojs.callJs(jsMethodName, json);
            return;
        }
        this.mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                javaTojs.callJs(jsMethodName, json);
            }
        });
    }
}