| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package com.taobao.weex.performance; |
| |
| 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; |
| |
| /** |
| * @author zhongcang |
| * @date 2019/5/30 |
| */ |
| public class WhiteScreenUtils { |
| |
| public static boolean doWhiteScreenCheck() { |
| IWXConfigAdapter configAdapter = WXSDKManager.getInstance().getWxConfigAdapter(); |
| if (null == configAdapter) { |
| return false; |
| } |
| double randomValue = Math.random() * 100; |
| double max = 100; |
| try { |
| String configValue = configAdapter.getConfig("wxapm", "new_ws_sampling", "100"); |
| max = Double.valueOf(configValue); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| return randomValue < max; |
| } |
| |
| public static boolean isWhiteScreen(WXSDKInstance instance) { |
| if (null == instance) { |
| return false; |
| } |
| View v = instance.getContainerView(); |
| if (!(v instanceof ViewGroup)) { |
| return false; |
| } |
| |
| if (!WXViewUtils.isViewVisible(v) || !checkParentVisible(v.getParent())){ |
| return false; |
| } |
| if (isInWhiteList(instance)){ |
| return false; |
| } |
| return !hasLeafViewOrSizeIgnore(v,3); |
| } |
| |
| private static boolean isInWhiteList(WXSDKInstance instance){ |
| IWXConfigAdapter configAdapter = WXSDKManager.getInstance().getWxConfigAdapter(); |
| if (null == configAdapter){ |
| return false; |
| } |
| String whiteList = configAdapter.getConfig("wxapm","ws_white_list",null); |
| if (TextUtils.isEmpty(whiteList)){ |
| return false; |
| } |
| try { |
| String[] urlList = whiteList.split(";"); |
| for (String whiteUrl : urlList){ |
| if (instance.getBundleUrl() != null && instance.getBundleUrl().contains(whiteUrl)){ |
| return true; |
| } |
| } |
| }catch (Exception e){ |
| e.printStackTrace(); |
| } |
| |
| 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)) { |
| return true; |
| } |
| |
| if (checkDeep > 0){ |
| if ( v.getHeight() < 10 || v.getWidth() < 10) { |
| return true; |
| } |
| checkDeep--; |
| } |
| |
| ViewGroup group = (ViewGroup)v; |
| for (int i = 0; i < group.getChildCount(); i++) { |
| View child = group.getChildAt(i); |
| boolean res = hasLeafViewOrSizeIgnore(child,checkDeep); |
| if (res) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * get instance viewTree && component tree msg |
| */ |
| public static String takeViewTreeSnapShot(WXSDKInstance instance) { |
| if (null == instance) { |
| return "nullInstance"; |
| } |
| View v = instance.getContainerView(); |
| JSONObject root = geViewDetailTreeMsg(v); |
| if (null != root) { |
| return root.toString(); |
| } |
| return ""; |
| } |
| |
| private static JSONObject geViewDetailTreeMsg(View view) { |
| if (null == view) { |
| return null; |
| } |
| JSONObject node = new JSONObject(); |
| try { |
| node.put("width", view.getWidth()); |
| node.put("height", view.getHeight()); |
| int[] location = new int[2]; |
| location[0] = -1; |
| location[1] = -1; |
| view.getLocationOnScreen(location); |
| node.put("x", location[0]); |
| node.put("y", location[1]); |
| |
| if (view instanceof ViewGroup) { |
| node.put("type", view.getClass().getSimpleName()); |
| ViewGroup group = (ViewGroup)view; |
| for (int i = 0; i < group.getChildCount(); i++) { |
| node.put("child_"+i, geViewDetailTreeMsg(group.getChildAt(i))); |
| } |
| } else { |
| node.put("type", view.getClass().getSimpleName()); |
| } |
| |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| return node; |
| } |
| } |