Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd923325 authored by Alan Viverette's avatar Alan Viverette
Browse files

Allow Views to specify a theme override

During inflation, any view with a theme attribute will wrap its context
with a theme override. Views inflated using a parent will inherit the
wrapped context.

BUG: 12178430
Change-Id: I3448e5174e94c19960a1e21df5bd6127d0d33c07
parent 23ab74de
Loading
Loading
Loading
Loading
+32 −9
Original line number Diff line number Diff line
@@ -91,6 +91,8 @@ public abstract class LayoutInflater {
    private static final String TAG_1995 = "blink";
    private static final String TAG_REQUEST_FOCUS = "requestFocus";

    private static final String ATTR_THEME = "theme";

    /**
     * Hook to allow clients of the LayoutInflater to restrict the set of Views that are allowed
     * to be inflated.
@@ -677,24 +679,45 @@ public abstract class LayoutInflater {
            name = attrs.getAttributeValue(null, "class");
        }

        // Apply a theme override, if necessary.
        final Context viewContext;
        final int themeResId = attrs.getAttributeResourceValue(null, ATTR_THEME, 0);
        if (themeResId != 0) {
            viewContext = new ContextThemeWrapper(mContext, themeResId);
        } else if (parent != null) {
            viewContext = parent.getContext();
        } else {
            viewContext = mContext;
        }

        if (DEBUG) System.out.println("******** Creating view: " + name);

        try {
            View view;
            if (mFactory2 != null) view = mFactory2.onCreateView(parent, name, mContext, attrs);
            else if (mFactory != null) view = mFactory.onCreateView(name, mContext, attrs);
            else view = null;
            if (mFactory2 != null) {
                view = mFactory2.onCreateView(parent, name, viewContext, attrs);
            } else if (mFactory != null) {
                view = mFactory.onCreateView(name, viewContext, attrs);
            } else {
                view = null;
            }

            if (view == null && mPrivateFactory != null) {
                view = mPrivateFactory.onCreateView(parent, name, mContext, attrs);
                view = mPrivateFactory.onCreateView(parent, name, viewContext, attrs);
            }

            if (view == null) {
                final Object lastContext = mConstructorArgs[0];
                mConstructorArgs[0] = viewContext;
                try {
                    if (-1 == name.indexOf('.')) {
                        view = onCreateView(parent, name, attrs);
                    } else {
                        view = createView(name, null, attrs);
                    }
                } finally {
                    mConstructorArgs[0] = lastContext;
                }
            }

            if (DEBUG) System.out.println("Created view is: " + view);