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

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

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.broadcast.Receiver;
import com.polysoft.nafmii.broadcast.ShareReceiver;
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.FingerprintDialog;
import com.polysoft.nafmii.jpush.JPushMgr;
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.WechatApi;
import com.whaty.nafmii.activity.OutsideWebviewActivity;

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));
            js.success(dataMap);
        });
    }

    @JavascriptInterface
    public void nativeMenu(String params) {
        new JsInterfaceHandler(handler).parse(params, (data, js) -> {
            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)) { // 微信

            }
        });
    }

    @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) -> {
            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 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)) {
                js.success(ObjectBox.findList(arrays));
                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");
            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 nativeCamera(String params) {
        new JsInterfaceHandler(handler).parse(params, (data, js) -> {

        });
        String permissions[] = {Manifest.permission.CAMERA};
        if (PermissionUtils.checkAndRequestMorePermissions(this.mActivity, permissions)) {
            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(() -> {
                Intent intent = new Intent(mActivity, OutsideWebviewActivity.class);
                intent.putExtra("data", data.toJSONString());
                mActivity.startActivity(intent);
            });
        });
    }


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


}