am ada85905: Fix AppCompat action bar theming.
* commit 'ada8590547348b77d8cbd56abdb8fadb3e72c015': Fix AppCompat action bar theming.
This commit is contained in:
@@ -35,6 +35,8 @@ import android.util.AttributeSet;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
|
import static com.android.layoutlib.bridge.android.BridgeContext.getBaseContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom implementation of {@link LayoutInflater} to handle custom views.
|
* 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) {
|
protected BridgeInflater(LayoutInflater original, Context newContext) {
|
||||||
super(original, 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
|
@Override
|
||||||
public View inflate(int resource, ViewGroup root) {
|
public View inflate(int resource, ViewGroup root) {
|
||||||
Context context = getContext();
|
Context context = getContext();
|
||||||
while (context instanceof ContextThemeWrapper) {
|
context = getBaseContext(context);
|
||||||
context = ((ContextThemeWrapper) context).getBaseContext();
|
|
||||||
}
|
|
||||||
if (context instanceof BridgeContext) {
|
if (context instanceof BridgeContext) {
|
||||||
BridgeContext bridgeContext = (BridgeContext)context;
|
BridgeContext bridgeContext = (BridgeContext)context;
|
||||||
|
|
||||||
@@ -217,9 +222,7 @@ public final class BridgeInflater extends LayoutInflater {
|
|||||||
|
|
||||||
private void setupViewInContext(View view, AttributeSet attrs) {
|
private void setupViewInContext(View view, AttributeSet attrs) {
|
||||||
Context context = getContext();
|
Context context = getContext();
|
||||||
while (context instanceof ContextThemeWrapper) {
|
context = getBaseContext(context);
|
||||||
context = ((ContextThemeWrapper) context).getBaseContext();
|
|
||||||
}
|
|
||||||
if (context instanceof BridgeContext) {
|
if (context instanceof BridgeContext) {
|
||||||
BridgeContext bc = (BridgeContext) context;
|
BridgeContext bc = (BridgeContext) context;
|
||||||
// get the view key
|
// get the view key
|
||||||
|
|||||||
@@ -48,9 +48,7 @@ public class MenuInflater_Delegate {
|
|||||||
AttributeSet attrs) {
|
AttributeSet attrs) {
|
||||||
if (menuItem instanceof BridgeMenuItemImpl) {
|
if (menuItem instanceof BridgeMenuItemImpl) {
|
||||||
Context context = thisInflater.getContext();
|
Context context = thisInflater.getContext();
|
||||||
while (context instanceof ContextThemeWrapper) {
|
context = BridgeContext.getBaseContext(context);
|
||||||
context = ((ContextThemeWrapper) context).getBaseContext();
|
|
||||||
}
|
|
||||||
if (context instanceof BridgeContext) {
|
if (context instanceof BridgeContext) {
|
||||||
Object viewKey = BridgeInflater.getViewKeyFromParser(
|
Object viewKey = BridgeInflater.getViewKeyFromParser(
|
||||||
attrs, ((BridgeContext) context), null, false);
|
attrs, ((BridgeContext) context), null, false);
|
||||||
|
|||||||
@@ -122,9 +122,7 @@ public class ViewGroup_Delegate {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private static DisplayMetrics getMetrics(View view) {
|
private static DisplayMetrics getMetrics(View view) {
|
||||||
Context context = view.getContext();
|
Context context = view.getContext();
|
||||||
while (context instanceof ContextThemeWrapper) {
|
context = BridgeContext.getBaseContext(context);
|
||||||
context = ((ContextThemeWrapper) context).getBaseContext();
|
|
||||||
}
|
|
||||||
if (context instanceof BridgeContext) {
|
if (context instanceof BridgeContext) {
|
||||||
return ((BridgeContext) context).getMetrics();
|
return ((BridgeContext) context).getMetrics();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ package com.android.internal.view.menu;
|
|||||||
import com.android.layoutlib.bridge.android.BridgeContext;
|
import com.android.layoutlib.bridge.android.BridgeContext;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.view.ContextThemeWrapper;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -42,9 +41,7 @@ public class BridgeMenuItemImpl extends MenuItemImpl {
|
|||||||
CharSequence title, int showAsAction) {
|
CharSequence title, int showAsAction) {
|
||||||
super(menu, group, id, categoryOrder, ordering, title, showAsAction);
|
super(menu, group, id, categoryOrder, ordering, title, showAsAction);
|
||||||
Context context = menu.getContext();
|
Context context = menu.getContext();
|
||||||
while (context instanceof ContextThemeWrapper) {
|
context = BridgeContext.getBaseContext(context);
|
||||||
context = ((ContextThemeWrapper) context).getBaseContext();
|
|
||||||
}
|
|
||||||
if (context instanceof BridgeContext) {
|
if (context instanceof BridgeContext) {
|
||||||
mContext = ((BridgeContext) context);
|
mContext = ((BridgeContext) context);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.ContextWrapper;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.IntentSender;
|
import android.content.IntentSender;
|
||||||
@@ -924,6 +925,13 @@ public final class BridgeContext extends Context {
|
|||||||
return defValue;
|
return defValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Context getBaseContext(Context context) {
|
||||||
|
while (context instanceof ContextWrapper) {
|
||||||
|
context = ((ContextWrapper) context).getBaseContext();
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
//------------ NOT OVERRIDEN --------------------
|
//------------ NOT OVERRIDEN --------------------
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -21,11 +21,15 @@ import com.android.annotations.Nullable;
|
|||||||
import com.android.ide.common.rendering.api.RenderResources;
|
import com.android.ide.common.rendering.api.RenderResources;
|
||||||
import com.android.ide.common.rendering.api.ResourceValue;
|
import com.android.ide.common.rendering.api.ResourceValue;
|
||||||
import com.android.ide.common.rendering.api.SessionParams;
|
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.android.BridgeContext;
|
||||||
import com.android.layoutlib.bridge.impl.ResourceHelper;
|
import com.android.layoutlib.bridge.impl.ResourceHelper;
|
||||||
import com.android.resources.ResourceType;
|
import com.android.resources.ResourceType;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.view.ContextThemeWrapper;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
@@ -84,6 +88,27 @@ public class AppCompatActionBar extends BridgeActionBar {
|
|||||||
"abc_screen_toolbar");
|
"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
|
@Override
|
||||||
protected void setTitle(CharSequence title) {
|
protected void setTitle(CharSequence title) {
|
||||||
if (title != null && mWindowDecorActionBar != null) {
|
if (title != null && mWindowDecorActionBar != null) {
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ public abstract class BridgeActionBar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Inflate action bar layout.
|
// 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 abstract ResourceValue getLayoutResource(BridgeContext context);
|
||||||
|
|
||||||
|
protected LayoutInflater getInflater(BridgeContext context) {
|
||||||
|
return LayoutInflater.from(context);
|
||||||
|
}
|
||||||
|
|
||||||
protected void setContentRoot(@NonNull FrameLayout contentRoot) {
|
protected void setContentRoot(@NonNull FrameLayout contentRoot) {
|
||||||
mContentRoot = contentRoot;
|
mContentRoot = contentRoot;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user