62 lines
3.2 KiB
Java
62 lines
3.2 KiB
Java
package androidx.fragment.app;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.collection.SimpleArrayMap;
|
|
import androidx.fragment.app.Fragment;
|
|
import c.d.b.a.a;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
public class FragmentFactory {
|
|
private static final SimpleArrayMap<ClassLoader, SimpleArrayMap<String, Class<?>>> sClassCacheMap = new SimpleArrayMap<>();
|
|
|
|
public static boolean isFragmentClass(@NonNull ClassLoader classLoader, @NonNull String str) {
|
|
try {
|
|
return Fragment.class.isAssignableFrom(loadClass(classLoader, str));
|
|
} catch (ClassNotFoundException unused) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@NonNull
|
|
private static Class<?> loadClass(@NonNull ClassLoader classLoader, @NonNull String str) throws ClassNotFoundException {
|
|
SimpleArrayMap<ClassLoader, SimpleArrayMap<String, Class<?>>> simpleArrayMap = sClassCacheMap;
|
|
SimpleArrayMap<String, Class<?>> simpleArrayMap2 = simpleArrayMap.get(classLoader);
|
|
if (simpleArrayMap2 == null) {
|
|
simpleArrayMap2 = new SimpleArrayMap<>();
|
|
simpleArrayMap.put(classLoader, simpleArrayMap2);
|
|
}
|
|
Class<?> cls = simpleArrayMap2.get(str);
|
|
if (cls != null) {
|
|
return cls;
|
|
}
|
|
Class<?> cls2 = Class.forName(str, false, classLoader);
|
|
simpleArrayMap2.put(str, cls2);
|
|
return cls2;
|
|
}
|
|
|
|
/* JADX DEBUG: Type inference failed for r3v3. Raw type applied. Possible types: java.lang.Class<?>, java.lang.Class<? extends androidx.fragment.app.Fragment> */
|
|
@NonNull
|
|
public static Class<? extends Fragment> loadFragmentClass(@NonNull ClassLoader classLoader, @NonNull String str) {
|
|
try {
|
|
return loadClass(classLoader, str);
|
|
} catch (ClassNotFoundException e) {
|
|
throw new Fragment.InstantiationException(a.t("Unable to instantiate fragment ", str, ": make sure class name exists"), e);
|
|
} catch (ClassCastException e2) {
|
|
throw new Fragment.InstantiationException(a.t("Unable to instantiate fragment ", str, ": make sure class is a valid subclass of Fragment"), e2);
|
|
}
|
|
}
|
|
|
|
@NonNull
|
|
public Fragment instantiate(@NonNull ClassLoader classLoader, @NonNull String str) {
|
|
try {
|
|
return (Fragment) loadFragmentClass(classLoader, str).getConstructor(new Class[0]).newInstance(new Object[0]);
|
|
} catch (InstantiationException e) {
|
|
throw new Fragment.InstantiationException(a.t("Unable to instantiate fragment ", str, ": make sure class name exists, is public, and has an empty constructor that is public"), e);
|
|
} catch (IllegalAccessException e2) {
|
|
throw new Fragment.InstantiationException(a.t("Unable to instantiate fragment ", str, ": make sure class name exists, is public, and has an empty constructor that is public"), e2);
|
|
} catch (NoSuchMethodException e3) {
|
|
throw new Fragment.InstantiationException(a.t("Unable to instantiate fragment ", str, ": could not find Fragment constructor"), e3);
|
|
} catch (InvocationTargetException e4) {
|
|
throw new Fragment.InstantiationException(a.t("Unable to instantiate fragment ", str, ": calling Fragment constructor caused an exception"), e4);
|
|
}
|
|
}
|
|
}
|