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

Commit 904de2ec authored by Alan Viverette's avatar Alan Viverette
Browse files

Always force constructors accessible during inflation

We now correctly throw an IllegalAccessException for non-public accesses,
but we were relying on the old incorrect behavior during inflation. This
CL forces constructors to be accessible so that we emulate the old
behavior and don't crash.

Where we were already doing this, the CL moves the setAccessible() call
immediately after the getConstructor() call, since there's no point in
calling it multiple times.

Bug: 20810495
Change-Id: I63dfcb857e445f688080eea05e86ef22760ed49f
parent 5551aca2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2095,6 +2095,7 @@ public class Notification implements Parcelable

                try {
                    Constructor<? extends Style> constructor = styleClass.getConstructor();
                    constructor.setAccessible(true);
                    style = constructor.newInstance();
                    style.restoreFromExtras(extras);
                } catch (Throwable t) {
+1 −0
Original line number Diff line number Diff line
@@ -376,6 +376,7 @@ abstract class GenericInflater<T, P extends GenericInflater.Parent> {
                Class clazz = mContext.getClassLoader().loadClass(
                        prefix != null ? (prefix + name) : name);
                constructor = clazz.getConstructor(mConstructorSignature);
                constructor.setAccessible(true);
                sConstructorMap.put(name, constructor);
            }

+1 −1
Original line number Diff line number Diff line
@@ -211,10 +211,10 @@ public class TransitionInflater {
                            .asSubclass(expectedType);
                    if (c != null) {
                        constructor = c.getConstructor(sConstructorSignature);
                        constructor.setAccessible(true);
                        sConstructors.put(className, constructor);
                    }
                }
                constructor.setAccessible(true);
                return constructor.newInstance(mContext, attrs);
            }
        } catch (InstantiationException e) {
+1 −1
Original line number Diff line number Diff line
@@ -590,6 +590,7 @@ public abstract class LayoutInflater {
                    }
                }
                constructor = clazz.getConstructor(mConstructorSignature);
                constructor.setAccessible(true);
                sConstructorMap.put(name, constructor);
            } else {
                // If we have a filter, apply it to cached constructor
@@ -615,7 +616,6 @@ public abstract class LayoutInflater {
            Object[] args = mConstructorArgs;
            args[1] = attrs;

            constructor.setAccessible(true);
            final View view = constructor.newInstance(args);
            if (view instanceof ViewStub) {
                // Use the same context when inflating ViewStub later.
+1 −0
Original line number Diff line number Diff line
@@ -544,6 +544,7 @@ public class MenuInflater {
            try {
                Class<?> clazz = mContext.getClassLoader().loadClass(className);
                Constructor<?> constructor = clazz.getConstructor(constructorSignature);
                constructor.setAccessible(true);
                return (T) constructor.newInstance(arguments);
            } catch (Exception e) {
                Log.w(LOG_TAG, "Cannot instantiate class: " + className, e);