diff --git a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java index 7e4ff69833157..7ca4c476673e8 100644 --- a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java +++ b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java @@ -35,6 +35,8 @@ import android.util.AttributeSet; import java.io.File; +import static com.android.layoutlib.bridge.android.BridgeContext.getBaseContext; + /** * Custom implementation of {@link LayoutInflater} to handle custom views. */ @@ -56,7 +58,12 @@ public final class BridgeInflater extends LayoutInflater { protected BridgeInflater(LayoutInflater original, Context newContext) { super(original, newContext); - mProjectCallback = null; + newContext = getBaseContext(newContext); + if (newContext instanceof BridgeContext) { + mProjectCallback = ((BridgeContext) newContext).getProjectCallback(); + } else { + mProjectCallback = null; + } } /** @@ -151,9 +158,7 @@ public final class BridgeInflater extends LayoutInflater { @Override public View inflate(int resource, ViewGroup root) { Context context = getContext(); - while (context instanceof ContextThemeWrapper) { - context = ((ContextThemeWrapper) context).getBaseContext(); - } + context = getBaseContext(context); if (context instanceof BridgeContext) { BridgeContext bridgeContext = (BridgeContext)context; @@ -217,9 +222,7 @@ public final class BridgeInflater extends LayoutInflater { private void setupViewInContext(View view, AttributeSet attrs) { Context context = getContext(); - while (context instanceof ContextThemeWrapper) { - context = ((ContextThemeWrapper) context).getBaseContext(); - } + context = getBaseContext(context); if (context instanceof BridgeContext) { BridgeContext bc = (BridgeContext) context; // get the view key diff --git a/tools/layoutlib/bridge/src/android/view/MenuInflater_Delegate.java b/tools/layoutlib/bridge/src/android/view/MenuInflater_Delegate.java index dafc96b1e5345..08a97d6479385 100644 --- a/tools/layoutlib/bridge/src/android/view/MenuInflater_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/MenuInflater_Delegate.java @@ -48,9 +48,7 @@ public class MenuInflater_Delegate { AttributeSet attrs) { if (menuItem instanceof BridgeMenuItemImpl) { Context context = thisInflater.getContext(); - while (context instanceof ContextThemeWrapper) { - context = ((ContextThemeWrapper) context).getBaseContext(); - } + context = BridgeContext.getBaseContext(context); if (context instanceof BridgeContext) { Object viewKey = BridgeInflater.getViewKeyFromParser( attrs, ((BridgeContext) context), null, false); diff --git a/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java b/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java index 391504682c72d..82ae1df33583b 100644 --- a/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java @@ -122,9 +122,7 @@ public class ViewGroup_Delegate { @NonNull private static DisplayMetrics getMetrics(View view) { Context context = view.getContext(); - while (context instanceof ContextThemeWrapper) { - context = ((ContextThemeWrapper) context).getBaseContext(); - } + context = BridgeContext.getBaseContext(context); if (context instanceof BridgeContext) { return ((BridgeContext) context).getMetrics(); } diff --git a/tools/layoutlib/bridge/src/com/android/internal/view/menu/BridgeMenuItemImpl.java b/tools/layoutlib/bridge/src/com/android/internal/view/menu/BridgeMenuItemImpl.java index 8d1d0c16cb9a4..bb95c4e353982 100644 --- a/tools/layoutlib/bridge/src/com/android/internal/view/menu/BridgeMenuItemImpl.java +++ b/tools/layoutlib/bridge/src/com/android/internal/view/menu/BridgeMenuItemImpl.java @@ -19,7 +19,6 @@ package com.android.internal.view.menu; import com.android.layoutlib.bridge.android.BridgeContext; import android.content.Context; -import android.view.ContextThemeWrapper; import android.view.View; /** @@ -42,9 +41,7 @@ public class BridgeMenuItemImpl extends MenuItemImpl { CharSequence title, int showAsAction) { super(menu, group, id, categoryOrder, ordering, title, showAsAction); Context context = menu.getContext(); - while (context instanceof ContextThemeWrapper) { - context = ((ContextThemeWrapper) context).getBaseContext(); - } + context = BridgeContext.getBaseContext(context); if (context instanceof BridgeContext) { mContext = ((BridgeContext) context); } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index 7c86f755c176c..ef7b85b49fe9e 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -40,6 +40,7 @@ import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; +import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; @@ -924,6 +925,13 @@ public final class BridgeContext extends Context { return defValue; } + public static Context getBaseContext(Context context) { + while (context instanceof ContextWrapper) { + context = ((ContextWrapper) context).getBaseContext(); + } + return context; + } + //------------ NOT OVERRIDEN -------------------- @Override diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java index f54815e544c47..ee57067007d16 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java @@ -21,11 +21,15 @@ import com.android.annotations.Nullable; import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.SessionParams; +import com.android.ide.common.rendering.api.StyleResourceValue; import com.android.layoutlib.bridge.android.BridgeContext; import com.android.layoutlib.bridge.impl.ResourceHelper; import com.android.resources.ResourceType; +import android.content.Context; import android.graphics.drawable.Drawable; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -84,6 +88,27 @@ public class AppCompatActionBar extends BridgeActionBar { "abc_screen_toolbar"); } + @Override + protected LayoutInflater getInflater(BridgeContext context) { + // Other than the resource resolution part, the code has been taken from the support + // library. see code from line 269 onwards in + // https://android.googlesource.com/platform/frameworks/support/+/android-5.1.0_r1/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateBase.java + Context themedContext = context; + RenderResources resources = context.getRenderResources(); + ResourceValue actionBarTheme = resources.findItemInTheme("actionBarTheme", false); + if (actionBarTheme != null) { + // resolve it, if needed. + actionBarTheme = resources.resolveResValue(actionBarTheme); + } + if (actionBarTheme instanceof StyleResourceValue) { + int styleId = context.getDynamicIdByStyle(((StyleResourceValue) actionBarTheme)); + if (styleId != 0) { + themedContext = new ContextThemeWrapper(context, styleId); + } + } + return LayoutInflater.from(themedContext); + } + @Override protected void setTitle(CharSequence title) { if (title != null && mWindowDecorActionBar != null) { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/BridgeActionBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/BridgeActionBar.java index c25db358bf1dd..2a83ea165ab05 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/BridgeActionBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/BridgeActionBar.java @@ -81,7 +81,7 @@ public abstract class BridgeActionBar { } // Inflate action bar layout. - mDecorContent = LayoutInflater.from(context).inflate(layoutId, mEnclosingLayout, true); + mDecorContent = getInflater(context).inflate(layoutId, mEnclosingLayout, true); } @@ -92,6 +92,10 @@ public abstract class BridgeActionBar { */ protected abstract ResourceValue getLayoutResource(BridgeContext context); + protected LayoutInflater getInflater(BridgeContext context) { + return LayoutInflater.from(context); + } + protected void setContentRoot(@NonNull FrameLayout contentRoot) { mContentRoot = contentRoot; }