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

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

import androidx.fragment.app.Fragment;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.polysoft.nafmii.broadcast.Receiver;
import com.polysoft.nafmii.broadcast.ReceiverListener;
import com.polysoft.nafmii.broadcast.ShareReceiver;
import com.polysoft.nafmii.utils.CtxUtils;
import com.polysoft.nafmii.utils.IntentUtils;
import com.polysoft.nafmii.utils.PermissionUtils;
import com.polysoft.nafmii.utils.StatusBarUtils;
import com.polysoft.nafmii.wechat.ShareBean;
import com.polysoft.nafmii.wechat.ShareResult;
import com.polysoft.nafmii.wechat.WechatApi;

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

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

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

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

    @JavascriptInterface
    public void nativeAppInfo(String params) {
        String jsMethodName = null;
        try {
            JSONObject json = JSONObject.parseObject(params);
            jsMethodName = json.getString("jsMethodName");

            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(this.mActivity));
            this.sendMessage2Js(jsMethodName, JSON.toJSONString(dataMap));
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    @JavascriptInterface
    public void nativeLogin(String params) {
        try{
            final JSONObject json = JSONObject.parseObject(params);
            final String jsMethodName = json.getString("jsMethodName");
            final String data = json.getString("data");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @JavascriptInterface
    public void nativeShare(String params) {
        final JSONObject json = JSONObject.parseObject(params);
        final String jsMethodName = json.getString("jsMethodName");
        this.mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                WechatApi instance = WechatApi.getInstance(mActivity);
                if (!instance.isWXAppInstalled()) {
                    String dataJson = JSON.toJSONString(ShareResult.shareFail("未安装应用"));
                    javaTojs.callJs(jsMethodName, dataJson);
                } else {
                    final Receiver<ShareResult> shareReceiver = ShareReceiver.getInstance(mActivity);
                    shareReceiver.addDefaultListener(new ReceiverListener<ShareResult>() {
                        @Override
                        public void onReceiverResult(String action, ShareResult data) {
                            javaTojs.callJs(jsMethodName, JSON.toJSONString(data));
                            shareReceiver.addDefaultListener(null);
                        }
                    });

                    instance.share(mActivity, json.getObject("data", ShareBean.class));
                }
            }
        });
    }

    @JavascriptInterface
    public void nativeCamera(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,
                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);
            }
        });
    }
}