diff --git a/android/sdk/src/main/java/com/taobao/weex/http/WXStreamModule.java b/android/sdk/src/main/java/com/taobao/weex/http/WXStreamModule.java index db47501432..3e8e9e5378 100644 --- a/android/sdk/src/main/java/com/taobao/weex/http/WXStreamModule.java +++ b/android/sdk/src/main/java/com/taobao/weex/http/WXStreamModule.java @@ -36,6 +36,7 @@ import com.taobao.weex.common.WXModule; import com.taobao.weex.common.WXRequest; import com.taobao.weex.common.WXResponse; +import com.taobao.weex.performance.WXStateRecord; import com.taobao.weex.utils.WXLogUtils; import java.io.UnsupportedEncodingException; import java.util.HashMap; @@ -130,7 +131,7 @@ public void fetch(JSONObject optionsObj , final JSCallback callback, JSCallback fetch(optionsObj, callback, progressCallback, mWXSDKInstance.getInstanceId(), mWXSDKInstance.getBundleUrl()); } - public void fetch(JSONObject optionsObj , final JSCallback callback, JSCallback progressCallback, String instanceId, String bundleURL){ + public void fetch(JSONObject optionsObj , final JSCallback callback, JSCallback progressCallback, final String instanceId, String bundleURL){ boolean invaildOption = optionsObj==null || optionsObj.getString("url")==null; if(invaildOption){ if(callback != null) { @@ -202,6 +203,7 @@ public void onResponse(WXResponse response, Map headers) { resp.put(STATUS_TEXT, Status.getStatusText(response.statusCode)); } resp.put("headers", headers); + WXStateRecord.getInstance().recordAction(instanceId,"stream response code:"+(null!= response?response.statusCode:"null")); callback.invoke(resp); } } diff --git a/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java b/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java index e2e1bd65c4..074088155b 100644 --- a/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java +++ b/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java @@ -20,9 +20,13 @@ package com.taobao.weex.performance; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; +import android.support.annotation.NonNull; import com.taobao.weex.bridge.WXBridgeManager; import com.taobao.weex.ui.IFComponentHolder; import com.taobao.weex.utils.WXUtils; @@ -103,13 +107,21 @@ public void onJSCCrash() { public Map getStateInfo() { Map stateInfo = new HashMap<>(5); - stateInfo.put("exceptionHistory", mExceptionHistory.toString()); - stateInfo.put("actionHistory", mActionHistory.toString()); - stateInfo.put("jsfmInitHistory", mJsfmInitHistory.toString()); - stateInfo.put("jscCrashHistory", mJscCrashHistory.toString()); - stateInfo.put("jscReloadHistory", mJscReloadHistory.toString()); - stateInfo.put("jsThreadWatch", mJsThradWatchHistory.toString()); stateInfo.put("reInitCount", String.valueOf(WXBridgeManager.reInitCount)); + + int size = mExceptionHistory.size()+mActionHistory.size()+mJsfmInitHistory.size() + +mJscCrashHistory.size()+mJscReloadHistory.size()+mJsThradWatchHistory.size(); + + List reportTimeLineInfo = new RecordList<>(size); + reportTimeLineInfo.addAll(mExceptionHistory); + reportTimeLineInfo.addAll(mActionHistory); + reportTimeLineInfo.addAll(mJsfmInitHistory); + reportTimeLineInfo.addAll(mJscCrashHistory); + reportTimeLineInfo.addAll(mJscReloadHistory); + reportTimeLineInfo.addAll(mJsThradWatchHistory); + Collections.sort(reportTimeLineInfo); + stateInfo.put("stateInfoList",reportTimeLineInfo.toString()); + return stateInfo; } @@ -140,7 +152,7 @@ public String toString() { } } - private static class Info { + private static class Info implements Comparable{ private long time; private String instanceId; private String msg; @@ -157,6 +169,14 @@ public String toString() { .append(instanceId).append(',').append(time).append(',').append(msg) .toString(); } + + @Override + public int compareTo(@NonNull Info next) { + if (this.time == next.time){ + return 0; + } + return this.time > next.time? 1:-1; + } } public void startJSThreadWatchDog(){ diff --git a/android/sdk/src/main/java/com/taobao/weex/performance/WhiteScreenUtils.java b/android/sdk/src/main/java/com/taobao/weex/performance/WhiteScreenUtils.java index fd92948103..6e7543e35b 100644 --- a/android/sdk/src/main/java/com/taobao/weex/performance/WhiteScreenUtils.java +++ b/android/sdk/src/main/java/com/taobao/weex/performance/WhiteScreenUtils.java @@ -21,12 +21,14 @@ import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; +import android.view.ViewParent; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.WXSDKManager; import com.taobao.weex.adapter.IWXConfigAdapter; import com.taobao.weex.ui.IFComponentHolder; import com.taobao.weex.ui.component.WXComponent; import com.taobao.weex.ui.component.WXVContainer; +import com.taobao.weex.utils.WXViewUtils; import org.json.JSONObject; /** @@ -59,6 +61,10 @@ public static boolean isWhiteScreen(WXSDKInstance instance) { if (!(v instanceof ViewGroup)) { return false; } + + if (!WXViewUtils.isViewVisible(v) || !checkParentVisible(v.getParent())){ + return false; + } if (isInWhiteList(instance)){ return false; } @@ -88,6 +94,19 @@ private static boolean isInWhiteList(WXSDKInstance instance){ return false; } + private static boolean checkParentVisible(ViewParent parent){ + //root view getParent is null + if (!(parent instanceof View)){ + return true; + } + View vp = (View)parent; + boolean visible = vp.getVisibility() == View.VISIBLE && vp.getAlpha()>0; + if (!visible){ + return false; + } + return checkParentVisible(vp.getParent()); + } + private static boolean hasLeafViewOrSizeIgnore(View v,int checkDeep) { if (!(v instanceof ViewGroup)) { diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java index 730e14af1c..e6c0ee7d96 100644 --- a/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java +++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java @@ -22,10 +22,14 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; import android.graphics.Path; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.os.Build; @@ -557,4 +561,38 @@ private static boolean clipCanvasIfBackgroundImageExist(@NonNull Widget widget, } return true; } + + public static boolean isViewVisible(View v) { + if (null == v){ + return false; + } + + boolean isAttachToWindow = Build.VERSION.SDK_INT >= VERSION_CODES.KITKAT + ?v.isAttachedToWindow() + :v.getWindowToken() != null; + + if (!isAttachToWindow){ + return false; + } + if (v.getVisibility() != View.VISIBLE || v.getAlpha()<=0){ + return false; + } + + Drawable bacDrawable = v.getBackground(); + if (null == bacDrawable){ + return true; + } + if (Build.VERSION.SDK_INT >= VERSION_CODES.KITKAT){ + return bacDrawable.getAlpha()>0; + } + //< 4.4 + if (bacDrawable instanceof ColorDrawable){ + int alpha = Color.alpha(((ColorDrawable) bacDrawable).getColor()); + return alpha >0; + }else if (bacDrawable instanceof BitmapDrawable){ + Paint paint = ((BitmapDrawable) bacDrawable).getPaint(); + return paint.getAlpha() > 0; + } + return true; + } }