NativeApi.java 15.3 KB
package com.polysoft.nafmii.webview;

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

import androidx.fragment.app.FragmentManager;

import com.alibaba.fastjson.JSONArray;
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.bean.UpdateVersion;
import com.polysoft.nafmii.broadcast.PhotosReceiver;
import com.polysoft.nafmii.broadcast.Receiver;
import com.polysoft.nafmii.broadcast.WechatReceiver;
import com.polysoft.nafmii.database.ObjectBox;
import com.polysoft.nafmii.database.entity.DataEntity;
import com.polysoft.nafmii.enums.DatabaseEnum;
import com.polysoft.nafmii.fragment.dialog.DownloadDialog;
import com.polysoft.nafmii.fragment.dialog.FingerprintDialog;
import com.polysoft.nafmii.jpush.JPushMgr;
import com.polysoft.nafmii.utils.BitmapUtils;
import com.polysoft.nafmii.utils.CtxUtils;
import com.polysoft.nafmii.utils.FileUtils;
import com.polysoft.nafmii.utils.IntentUtils;
import com.polysoft.nafmii.utils.PermissionUtils;
import com.polysoft.nafmii.utils.StatusBarUtils;
import com.polysoft.nafmii.utils.UpdateUtils;
import com.polysoft.nafmii.wechat.QQApi;
import com.polysoft.nafmii.wechat.ShareBean;
import com.polysoft.nafmii.wechat.WechatApi;
import com.whaty.nafmii.activity.HomeActivity;
import com.whaty.nafmii.activity.OutsideWebviewActivity;

import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class NativeApi {
    private final WebviewHandler handler;
    private final Activity mActivity;

    public NativeApi(WebviewHandler handler) {
        this.handler = handler;
        this.mActivity = handler.getFragment().getActivity();
    }

    @JavascriptInterface
    public void nativeAppInfo(String params) {
        new JsInterfaceHandler(handler).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));
            dataMap.put("module", handler.getFragment().getTag());
            js.success(dataMap);
        });
    }

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

    @JavascriptInterface
    public void nativeLogin(String params) {
        new JsInterfaceHandler(handler).parse(params, (data, js) -> {
            String type = data.getString("type");
            if ("1".equals(type)) { // 指纹人脸
                this.mActivity.runOnUiThread(() -> FingerprintDialog.show(handler.getFragmentManager(), result -> {
                    js.callJs(result);
                }));
            } else if ("2".equals(type)) { // 微信
                final Receiver<Result> receiver = WechatReceiver.getInstance(mActivity);
                receiver.register();
                receiver.addDefaultListener((action, login) -> {
                    js.callJs(login);
                    receiver.addDefaultListener(null);
                });
                this.mActivity.runOnUiThread(() -> {
                    WechatApi instance = WechatApi.getInstance(this.mActivity);
                    instance.login();
                });
            }
        });
    }

    @JavascriptInterface
    public void nativeTextZoom(String params) {
        new JsInterfaceHandler(handler).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(handler).parse(params, (data, js) -> {
            ShareBean bean = TypeUtils.castToJavaBean(data, ShareBean.class);
            if (TextUtils.isEmpty(bean.getTitle())) {
                bean.setTitle(" ");
            }
            if ("2".equals(bean.getScene())) { // 分享到QQ
                QQApi instance = QQApi.getInstance();
                mActivity.runOnUiThread(() -> {
                    instance.share(mActivity, bean, new QQApi.JSShareCallback(js));
                });
            } else {
                WechatApi instance = WechatApi.getInstance(mActivity);
                if (!instance.isWXAppInstalled()) {
                    js.callJs(Result.fail("未安装应用"));
                }
                final Receiver<Result> shareReceiver = WechatReceiver.getInstance(mActivity);
                shareReceiver.register();
                shareReceiver.addDefaultListener((action, share) -> {
                    js.callJs(share);
                    shareReceiver.addDefaultListener(null);
                });

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

    @JavascriptInterface
    public void nativeBackIntercept(String param) {
        new JsInterfaceHandler(handler).parse(param, (data, js) -> {
            Boolean value = data.getBoolean("value");
            handler.setBackIntercept(null == value ? false : value);
            js.success(null);
        });
    }

    @JavascriptInterface
    public void nativeDatabase(String param) {
        new JsInterfaceHandler(handler).parse(param, (data, js) -> {
            String type = data.getString("type");
            JSONArray datas = data.getJSONArray("datas");
            List<DataEntity> list = new ArrayList<>();
            for (int i = 0; i < datas.size(); i++) {
                JSONObject item = datas.getJSONObject(i);
                String key = item.getString("name");
                Object valueObj = item.get("value");
                list.add(new DataEntity(key, null == valueObj ? null : valueObj.toString()));
            }
            DataEntity[] arrays = list.toArray(new DataEntity[]{});
            if (DatabaseEnum.GET.name.equals(type)) {
                List<DataEntity> findList = ObjectBox.findList(arrays);
                List<Map<String, Object>> result = new ArrayList<>();
                for (DataEntity entity : findList) {
                    Map<String, Object> item = new HashMap<>();
                    item.put("name", entity.getName());
                    item.put("value", JSONObject.parse(entity.getValue()));
                    result.add(item);
                }
                js.success(result);
                return;
            }
            if (DatabaseEnum.SAVE.name.equals(type)) {
                ObjectBox.put(arrays);
            } else if (DatabaseEnum.DELETE.name.equals(type)) {
                ObjectBox.delete(arrays);
            }
            js.success(null);
        });
    }

    @JavascriptInterface
    public void nativeRegisterPush(String params) {
        new JsInterfaceHandler(handler).parse(params, (data, js) -> {
            String alias = data.getString("alias");
            String alias1 = JPushMgr.getAlias();
            if (!TextUtils.isEmpty(alias) && !alias.equals(alias1)) {
                JPushMgr.setAlias(alias);
            }
            js.success(null);
        });
    }

    @JavascriptInterface
    public void nativeUnRegisterPush(String params) {
        new JsInterfaceHandler(handler).parse(params, (data, js) -> {
            JPushMgr.deleteAlias();
            js.success(null);
        });
    }

    @JavascriptInterface
    public void nativeEventMessage(String params) {
        new JsInterfaceHandler(handler).parse(params, (data, js) -> {
            this.mActivity.runOnUiThread(() -> {
                handler.sendEventMessage(data.toJSONString());
            });
            js.success(null);
        });
    }

    @JavascriptInterface
    public void nativeDownload(String params) {
        new JsInterfaceHandler(handler).parse(params, (data, js) -> {
            String name = data.getString("name");
            String url = data.getString("url");
            if (TextUtils.isEmpty(url)) {
                js.fail("下载地址错误");
                return;
            }
            final String finalUrl = URLDecoder.decode(url);
            String newName = FileUtils.getFileName(name);
            if (!TextUtils.isEmpty(newName)) {
                name = newName;
            } else {
                name = FileUtils.getUrlFileName(url);
            }
            final String fileName = name;
            this.mActivity.runOnUiThread(() -> {
                FragmentManager manager = this.handler.getFragmentManager();
                DownloadDialog.show(manager, finalUrl, fileName);
            });
            js.success(null);
        });
    }


    @JavascriptInterface
    public void nativeCamera(String params) {
        new JsInterfaceHandler(handler).parse(params, (data, js) -> {
            String permissions[] = {Manifest.permission.CAMERA};
            if (PermissionUtils.checkAndRequestMorePermissions(this.mActivity, permissions)) {
                this.photosReceiverListener(js);
                Intent intent = IntentUtils.openCamera(this.mActivity);
                handler.getFragment().startActivityForResult(intent, IntentUtils.ACTIVITY_CODE_CAMERA);
            }
        });
    }

    @JavascriptInterface
    public void nativeAlbum(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 nativeOpenUrl(String param) {
        new JsInterfaceHandler(handler).parse(param, (data, js) -> {
            mActivity.runOnUiThread(() -> {
                String type = data.getString("type");
                if ("1".equals(type)) {
                    Intent intent = new Intent();
                    intent.setAction("android.intent.action.VIEW");
                    String linkUrl = data.getString("linkUrl");
                    linkUrl = URLDecoder.decode(linkUrl);
                    Uri content_url = Uri.parse(linkUrl);
                    intent.setData(content_url);
                    mActivity.startActivity(intent);
                } else {
                    Intent intent = new Intent(mActivity, OutsideWebviewActivity.class);
                    intent.putExtra("data", data.toJSONString());
                    mActivity.startActivity(intent);
                }
                js.success(null);
            });
        });
    }

    @JavascriptInterface
    public void nativeUpdate(String param) {
        new JsInterfaceHandler(handler).parse(param, (data, js) -> {
            String type = data.getString("type");
            if ("3".equals(type)) {
                UpdateVersion update = data.getObject("update", UpdateVersion.class);
                String res = UpdateUtils.checkVersion(handler.getFragmentManager(), update);
                if (!TextUtils.isEmpty(res)) {
                    js.callJs(Result.fail(res));
                    return;
                }
            } else {
                String version = data.getString("version");
                if (TextUtils.isEmpty(version)) {
                    js.callJs(Result.fail("参数错误"));
                    return;
                }
                if ("2".equals(type)) { // 检测版本APP h5版本
                    UpdateUtils.checkVersion(handler.getFragmentManager(), version);
                } else if ("1".equals(type)) { // 检测h5版本
                    UpdateUtils.checkH5Version(version);
                }
            }
            js.success(null);
        });
    }


    @JavascriptInterface
    public void closePage(String param) {
        new JsInterfaceHandler(handler).parse(param, (data, js) -> {
            if (!(mActivity instanceof HomeActivity)) {
                mActivity.runOnUiThread(() -> mActivity.finish());
                js.success(null);
            }
        });
    }


//    @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, "");
//            }
//        });
//    }
//


    private void photosReceiverListener(JsInterfaceHandler.JsInterface js) {
        final Receiver<String> instance = PhotosReceiver.getInstance(this.mActivity);
        instance.register();
        instance.addDefaultListener((action, data) -> {
            try {
                String base64 = BitmapUtils.bitmap2base64(data);
                if (!TextUtils.isEmpty(base64)) {
                    String imgBase64 = "data:image/jpg;base64," + base64;
                    js.success(imgBase64);
                } else {
                    js.success("");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            instance.addDefaultListener(null);
        });
    }

}