From 8b9ce52b33a3665dfa1d64ee045e66d4d7e6d9c0 Mon Sep 17 00:00:00 2001 From: codefurture Date: Tue, 8 Jan 2019 15:22:13 +0800 Subject: [PATCH] [WEEX][Android] Support Downgrade To Full Page Root Instance (#1952) --- .../main/java/com/taobao/weex/WXSDKInstance.java | 13 +++++++++++++ .../java/com/taobao/weex/common/WXInstanceWrap.java | 9 ++++++++- .../java/com/taobao/weex/ui/component/WXEmbed.java | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java index 36ca0bb56d..083dc90d55 100644 --- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java +++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java @@ -182,6 +182,8 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan private List mLayerOverFlowListeners; + private WXSDKInstance mParentInstance; + public List getLayerOverFlowListeners() { return mLayerOverFlowListeners; } @@ -1499,6 +1501,14 @@ public void run() { mWXPerformance.screenRenderTime = System.currentTimeMillis() - mRenderStartTime; } + public WXSDKInstance getParentInstance() { + return mParentInstance; + } + + public void setParentInstance(WXSDKInstance mParentInstance) { + this.mParentInstance = mParentInstance; + } + private void destroyView(View rootView) { try { if (rootView instanceof ViewGroup) { @@ -1522,6 +1532,9 @@ private void destroyView(View rootView) { public synchronized void destroy() { if(!isDestroy()) { + if(mParentInstance != null){ + mParentInstance = null; + } mApmForInstance.onEnd(); if(mRendered) { WXSDKManager.getInstance().destroyInstance(mInstanceId); diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXInstanceWrap.java b/android/sdk/src/main/java/com/taobao/weex/common/WXInstanceWrap.java index cbca430c87..46c6274fc4 100644 --- a/android/sdk/src/main/java/com/taobao/weex/common/WXInstanceWrap.java +++ b/android/sdk/src/main/java/com/taobao/weex/common/WXInstanceWrap.java @@ -18,6 +18,7 @@ */ package com.taobao.weex.common; +import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.JSMethod; /** @@ -28,7 +29,13 @@ public class WXInstanceWrap extends WXModule { @JSMethod public void error(String type, String code, String info) { if (mWXSDKInstance != null) { - mWXSDKInstance.onRenderError(type + "|" + code, info); + WXSDKInstance root = mWXSDKInstance; + if(info != null && info.contains("downgrade_to_root")){ + while (root.getParentInstance() != null){ + root = root.getParentInstance(); + } + } + root.onRenderError(type + "|" + code, info); } } } diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java index 81b4025d9b..b95c8a0338 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java @@ -338,7 +338,7 @@ private static final int getLevel(WXEmbed embed){ private WXSDKInstance createInstance() { WXSDKInstance sdkInstance = getInstance().createNestedInstance(this); - + sdkInstance.setParentInstance(getInstance()); boolean needsAdd = !getAttrs().containsKey("disableInstanceVisibleListener"); if(needsAdd){ //prevent switch off fire viewappear event twice getInstance().addOnInstanceVisibleListener(this);