健保快易通 v3.0.20版本的 MD5 值为:50f985ecfe398d8420ccde2ab18eb069

以下内容为反编译后的 Ponto.java 源代码,内容仅作参考


package com.nhiApp.v1;

import android.content.Context;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.json.JSONException;
import org.json.JSONObject;
public class Ponto {
    public static final String TAG = "Ponto";
    private Map<String, RequestCallback> mCallbacks = new HashMap();
    private String mClassPackage;
    private WebView mWebView;

    public interface RequestCallback {
        void onError();

        void onSuccess();
    }

    public Ponto(WebView webView, String str) {
        StringBuilder sb = new StringBuilder();
        sb.append(str);
        sb.append(".");
        this.mClassPackage = sb.toString();
        this.mWebView = webView;
        webView.getSettings().setJavaScriptEnabled(true);
        this.mWebView.addJavascriptInterface(new PontoProtocol(), PontoProtocol.TAG);
    }

    public void invoke(String str, String str2, String str3, RequestCallback requestCallback) {
        String obj = UUID.randomUUID().toString();
        if (obj != null && requestCallback != null) {
            this.mCallbacks.put(obj, requestCallback);
        }
        StringBuilder sb = new StringBuilder();
        sb.append("javascript:Ponto.request('{");
        sb.append("\"target\": \"");
        sb.append(str);
        sb.append("\", ");
        sb.append("\"method\": \"");
        sb.append(str2);
        sb.append("\", ");
        sb.append("\"params\": ");
        sb.append(str3);
        sb.append(", ");
        sb.append("\"callbackId\": \"");
        sb.append(obj);
        sb.append("\"");
        sb.append("}');");
        this.mWebView.loadUrl(sb.toString());
    }

    class PontoProtocol {
        private static final String KEY_MESSAGE = "message";
        private static final String NULL_STRING = "null";
        private static final int RESPONSE_COMPLETE = 0;
        private static final int RESPONSE_ERROR = 1;
        public static final String TAG = "PontoProtocol";
        private static final String UNDEFINED_STRING = "undefined";

        private PontoProtocol() {
        }

        @JavascriptInterface
        public void request(String str, String str2, String str3, String str4, String str5, String str6) {
            JSONObject jSONObject = new JSONObject();
            int i = 1;
            try {
                StringBuilder sb = new StringBuilder();
                sb.append(Ponto.this.mClassPackage);
                sb.append(str2);
                Class<?> cls = Class.forName(sb.toString());
                Object newInstance = cls.getConstructor(Context.class).newInstance(Ponto.this.mWebView.getContext());
                if (str4 != null && !str4.equalsIgnoreCase(NULL_STRING)) {
                    cls.getDeclaredMethod(str3, String.class).invoke(newInstance, str4);
                } else {
                    cls.getDeclaredMethod(str3, new Class[0]).invoke(newInstance, new Object[0]);
                }
                i = 0;
            } catch (ClassNotFoundException e) {
                Log.e(TAG, "ClassNotFoundException while executing ponto request", e);
                jSONObject = getClassNotFoundParams(str2);
            } catch (IllegalAccessException e2) {
                Log.e(TAG, "IllegalAccessException while executing ponto request", e2);
            } catch (IllegalArgumentException e3) {
                Log.e(TAG, "IllegalArgumentException while executing ponto request", e3);
            } catch (InstantiationException e4) {
                Log.e(TAG, "InstantiationException while executing ponto request", e4);
            } catch (NoSuchMethodException e5) {
                Log.e(TAG, "NoSuchMethodException while executing ponto request", e5);
                jSONObject = getNoSuchMethodParams(str3);
            } catch (InvocationTargetException e6) {
                Log.e(TAG, "InvocationTargetException while executing ponto request", e6);
            }
            if (str5 == null || str5.equalsIgnoreCase(UNDEFINED_STRING)) {
                return;
            }
            javascriptCallback(str5, i, jSONObject.toString());
        }

        @JavascriptInterface
        public void response(String str, String str2, String str3) {
            int responeTypeFromParams = getResponeTypeFromParams(str3);
            if (str2 == null || str2.equalsIgnoreCase(UNDEFINED_STRING) || !Ponto.this.mCallbacks.containsKey(str2)) {
                return;
            }
            RequestCallback requestCallback = (RequestCallback) Ponto.this.mCallbacks.get(str2);
            if (responeTypeFromParams == 0) {
                requestCallback.onSuccess();
            } else {
                requestCallback.onError();
            }
            Ponto.this.mCallbacks.remove(str2);
        }

        private void javascriptCallback(final String str, final int i, final String str2) {
            Ponto.this.mWebView.post(new Runnable() {
                @Override
                public void run() {
                    StringBuilder sb = new StringBuilder();
                    sb.append("javascript:Ponto.response('{");
                    sb.append("\"type\": ");
                    sb.append(i);
                    sb.append(", ");
                    sb.append("\"params\": ");
                    sb.append(str2);
                    sb.append(", ");
                    sb.append("\"callbackId\": \"");
                    sb.append(str);
                    sb.append("\"");
                    sb.append("}');");
                    Ponto.this.mWebView.loadUrl(sb.toString());
                }
            });
        }

        private int getResponeTypeFromParams(String str) {
            try {
                return new JSONObject(str).optInt("type");
            } catch (JSONException e) {
                Log.e(TAG, "JSONException while parsing messaging data", e);
                return 1;
            }
        }

        private JSONObject getClassNotFoundParams(String str) {
            HashMap hashMap = new HashMap();
            hashMap.put("message", "Class not found");
            hashMap.put("className", str);
            return new JSONObject(hashMap);
        }

        private JSONObject getNoSuchMethodParams(String str) {
            HashMap hashMap = new HashMap();
            hashMap.put("message", "Method not found");
            hashMap.put("methodName", str);
            return new JSONObject(hashMap);
        }
    }
}