Преглед на файлове

1.修改Android Apex CRM JS字符串转译。

Pen Li преди 7 години
родител
ревизия
3d735431ca

+ 120 - 0
ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/roundCornerImageView/RoundCornerImageView.java

@@ -0,0 +1,120 @@
+package com.usai.redant.rautils.roundCornerImageView;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+
+public class RoundCornerImageView extends android.support.v7.widget.AppCompatImageView {
+
+    private int roundCorner;
+
+    public RoundCornerImageView(Context context) {
+        this(context,null);
+    }
+
+    public RoundCornerImageView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs,0);
+    }
+
+    public RoundCornerImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+
+        init();
+    }
+
+    public void setRoundCorner(int roundCorner) {
+        this.roundCorner = roundCorner;
+
+        postInvalidate();
+    }
+
+    public int getRoundCorner() {
+        return roundCorner;
+    }
+
+    Paint mPaint;
+
+    private void init() {
+        mPaint = new Paint();
+        mPaint.setAntiAlias(true);
+        mPaint.setStyle(Paint.Style.FILL);
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+
+        // 可操作区域
+        int width = getWidth();
+        int height = getHeight();
+        RectF rect = new RectF(0,0,width,height);
+
+
+        // 原始图片
+        Drawable drawable = getDrawable();
+        Bitmap src = ((BitmapDrawable)drawable).getBitmap();
+
+        // 先缩放原图,适配View大小
+        Bitmap scaleSrc = scaleBitmap(src, width, height);
+
+        // 创建Mask
+        Bitmap mask=Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        Canvas maskCanvas=new Canvas(mask);
+        maskCanvas.drawRoundRect(rect,roundCorner,roundCorner,mPaint);
+
+        /**
+         *
+         * 产生新的layer。新layer相当于一个区域为传递的bounds的“新画布”,它关联一个bitmap(an offscreen bitmap,它是完全透明的),
+         * 之后的绘制操作都在此bitmap上执行。每个layer可以看做一个独立的画布,所有layer形成一个栈,栈底是初始的layer。
+         * 每次在栈顶产生的新layer,任何时候都在栈顶的layer上执行绘图,
+         * 调用restoreToCount()后栈顶layer出栈,其对应的bitmap的内容合并(进行像素的argb混合)到之前layer中。
+         *
+         * */
+//        int sc = canvas.saveLayer(rect,mPaint);
+
+        /**
+         *
+         * 根据saveLayer方法的文档介绍,可以去掉saveLayer()/restoreToCount()的调用,
+         * 只需要在onDraw()中开启硬件加速就可以实现相同的目标了,性能会更好
+         *
+         * */
+        setLayerType(LAYER_TYPE_HARDWARE, mPaint); // 开启硬件加速
+
+        canvas.drawBitmap(mask, 0, 0, mPaint);
+
+        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
+
+        canvas.drawBitmap(scaleSrc, 0, 0, mPaint);
+
+        mPaint.setXfermode(null);
+
+//        canvas.restoreToCount(sc);
+
+    }
+
+    private Bitmap scaleBitmap(Bitmap src, int width, int height) {
+
+        if (src == null || width <= 0 || height <= 0) {
+            return src;
+        }
+
+        Rect rct = new Rect(0,0,width,height);
+
+        Bitmap scaleSrc = Bitmap.createBitmap(width, height, src.getConfig());
+
+        Canvas scaleCanvas = new Canvas(scaleSrc);
+
+        scaleCanvas.drawBitmap(src,null,rct,mPaint);
+
+        return scaleSrc;
+    }
+
+}

+ 119 - 0
ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/utils/RAUtil.java

@@ -475,4 +475,123 @@ public class RAUtil {
         return null;
     }
 
+    /**
+     * JS Filter
+     * */
+
+    private static char ra_hexCharFromInt(int value) {
+        if (value <= 9) return (char)(value + 48);
+        return (char)((value - 10) + 97);
+    }
+
+    private static String ra_unicodeStringForChar(char ch) {
+
+        char uni[] = {
+                ra_hexCharFromInt((ch >> 12) & 0x0f),
+                ra_hexCharFromInt((ch >> 8) & 0x0f),
+                ra_hexCharFromInt((ch >> 4) & 0x0f),
+                ra_hexCharFromInt(ch & 0x0f),
+                0
+        };
+        return new String(uni);
+
+    }
+
+    public static String ra_stringByEscapingForJavascriptWithDelimiter(String string, char delimiter, boolean wrap) {
+
+        StringBuffer js = new StringBuffer();
+        if (wrap) {
+            js.append(delimiter);
+        }
+
+        int lastWritePosition = 0;
+        int skipped = 0;
+        int length = string.length();
+        char[] chars = new char[length];
+        char c;
+
+        string.getChars(0, length, chars,0);
+        String escapedValue;
+
+        for (int i = 0; i < length; i++)
+        {
+            c = chars[i];
+
+            switch (c)
+            {
+                case '\t':
+                    escapedValue = "\\t";
+                    break;
+                case '\n':
+                    escapedValue = "\\n";
+                    break;
+                case '\r':
+                    escapedValue = "\\r";
+                    break;
+                case '\f':
+                    escapedValue = "\\f";
+                    break;
+                case '\b':
+                    escapedValue = "\\b";
+                    break;
+                case '\\':
+                    escapedValue = "\\\\";
+                    break;
+                case 0x0085:
+                    escapedValue = "\\u0085";
+                    break;
+                case 0x2028:
+                    escapedValue = "\\u2028";
+                    break;
+                case 0x2029:
+                    escapedValue = "\\u2029";
+                    break;
+                case '\'':
+                    escapedValue = (delimiter == '\'') ? "\\'" : null;
+                    break;
+                case '"':
+                    escapedValue = (delimiter == '"') ? "\\\"" : null;
+                    break;
+                default:
+                    escapedValue = (c <= 0x001f) ? ra_unicodeStringForChar(c) : null;
+                    break;
+            }
+
+            if (escapedValue != null)
+            {
+                if (skipped > 0)
+                {
+                    js.append(string.substring(lastWritePosition, lastWritePosition + skipped));
+                    skipped = 0;
+                }
+
+                js.append(escapedValue);
+                lastWritePosition = i + 1;
+            }
+            else
+            {
+                skipped++;
+            }
+        }
+
+        if (skipped > 0)
+        {
+            if (lastWritePosition == 0)
+            {
+                js.append(string);
+            }
+            else
+            {
+                js.append(string.substring(lastWritePosition, lastWritePosition + skipped));
+            }
+        }
+
+        if (wrap)
+        {
+            js.append(delimiter);
+        }
+
+        return js.toString();
+    }
+
 }

+ 13 - 3
ApexDrivers/apexcrm/src/main/java/com/usai/apex/apexcrm/RAJSInterface.java

@@ -1,6 +1,8 @@
 package com.usai.apex.apexcrm;
 
 
+import com.usai.redant.rautils.utils.RAUtil;
+
 import org.json.JSONObject;
 
 public class RAJSInterface extends Object {
@@ -151,9 +153,11 @@ public class RAJSInterface extends Object {
 
         if (params != null && callerId != null && value != null) {
 
-            String caller = String.format("'%s'",callerId);
+//            String caller = String.format("'%s'",callerId);
+            String caller = RAUtil.ra_stringByEscapingForJavascriptWithDelimiter(callerId,'\'',true);
             if (value instanceof String) {
-                value = String.format("'%s'",value);
+//                value = String.format("'%s'",value);
+                value = RAUtil.ra_stringByEscapingForJavascriptWithDelimiter((String)value,'\'',true);
             }
             String callback = params.optString("callback");
             if (callback != null) {
@@ -168,7 +172,13 @@ public class RAJSInterface extends Object {
     public String webPageReturn(String returnId, Object value) {
 
         if (returnId != null && value != null) {
-            String js = String.format("document.getElementById(\"%s\").value = \"%s\";",returnId,value);
+
+            returnId = RAUtil.ra_stringByEscapingForJavascriptWithDelimiter(returnId,'\'',true);
+            value = RAUtil.ra_stringByEscapingForJavascriptWithDelimiter((String)value,'\'',true);
+
+            String js = String.format("document.getElementById(%s).value = %s;",returnId,value);
+
+//            String js = String.format("document.getElementById(\"%s\").value = \"%s\";",returnId,value);
             return js;
         }
 

+ 1 - 1
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/setting/SettingAdapter.java

@@ -11,7 +11,7 @@ import android.widget.Switch;
 import android.widget.TextView;
 
 import com.usai.redant.apexdrivers.R;
-import com.usai.redant.apexdrivers.roundCornerImageView.RoundCornerImageView;
+import com.usai.redant.rautils.roundCornerImageView.RoundCornerImageView;
 import com.usai.redant.apexdrivers.setting.model.AboutModel;
 import com.usai.redant.apexdrivers.setting.model.ActionModel;
 import com.usai.redant.apexdrivers.setting.model.BaseModel;

+ 1 - 1
ApexDrivers/apexdriverslib/src/main/res/layout/setting_about_cell.xml

@@ -12,7 +12,7 @@
         android:layout_height="wrap_content"
         >
 
-        <com.usai.redant.apexdrivers.roundCornerImageView.RoundCornerImageView
+        <com.usai.redant.rautils.roundCornerImageView.RoundCornerImageView
             android:id="@+id/setting_about_icon_view"
             android:layout_width="50dp"
             android:layout_height="50dp"