@Override public ActivityInfo getActivityInfo(ComponentName className, int flags) throws NameNotFoundException { String packageName = className.getPackageName(); AndroidManifest androidManifest = androidManifests.get(packageName); String activityName = className.getClassName(); ActivityData activityData = androidManifest.getActivityData(activityName); ActivityInfo activityInfo = new ActivityInfo(); activityInfo.packageName = packageName; activityInfo.name = activityName; if (activityData != null) { activityInfo.parentActivityName = activityData.getParentActivityName(); activityInfo.metaData = metaDataToBundle(activityData.getMetaData().getValueMap()); ResourceIndex resourceIndex = shadowsAdapter.getResourceLoader().getResourceIndex(); String themeRef; // Based on ShadowActivity if (activityData.getThemeRef() != null) { themeRef = activityData.getThemeRef(); } else { themeRef = androidManifest.getThemeRef(); } if (themeRef != null) { ResName style = ResName.qualifyResName(themeRef.replace("@", ""), packageName, "style"); activityInfo.theme = resourceIndex.getResourceId(style); } } activityInfo.applicationInfo = getApplicationInfo(packageName, flags); return activityInfo; }
public static void convertAndFill( Attribute attribute, TypedValue outValue, ResourceLoader resourceLoader, String qualifiers, AttrData attrData, boolean resolveRefs) { // short-circuit Android caching of loaded resources cuz our string positions don't remain // stable... outValue.assetCookie = getNextStringCookie(); // TODO: Handle resource and style references if (attribute.isStyleReference()) { return; } ResourceIndex resourceIndex = resourceLoader.getResourceIndex(); while (attribute.isResourceReference()) { ResName resName = attribute.getResourceReference(); Integer resourceId = resourceIndex.getResourceId(resName); if (resourceId == null) { throw new Resources.NotFoundException("unknown resource " + resName); } outValue.type = TypedValue.TYPE_REFERENCE; outValue.resourceId = resourceId; TypedResource dereferencedRef = resourceLoader.getValue(resName, qualifiers); if (dereferencedRef == null) { if (resName.type.equals("id")) { return; } else if (resName.type.equals("layout")) { return; // resourceId is good enough, right? } else if (resName.type.equals("dimen")) { return; } else if (resName.type.equals("transition")) { return; } else if (resName.type.equals("interpolator")) { return; } else if (resName.type.equals("menu")) { return; } else if (resName.type.equals("raw")) { return; } else if (DrawableResourceLoader.isStillHandledHere(resName)) { // wtf. color and drawable references reference are all kinds of stupid. DrawableNode drawableNode = resourceLoader.getDrawableNode(resName, qualifiers); if (drawableNode == null) { throw new Resources.NotFoundException("can't find file for " + resName); } else { outValue.type = TypedValue.TYPE_STRING; outValue.data = 0; outValue.assetCookie = getNextStringCookie(); outValue.string = drawableNode.getFsFile().getPath(); return; } } else { throw new RuntimeException("huh? " + resName); } } else { if (dereferencedRef.isFile()) { outValue.type = TypedValue.TYPE_STRING; outValue.data = 0; outValue.assetCookie = getNextStringCookie(); outValue.string = dereferencedRef.asString(); return; } else if (dereferencedRef.getData() instanceof String) { attribute = new Attribute(attribute.resName, dereferencedRef.asString(), resName.packageName); if (attribute.isResourceReference()) { continue; } if (resolveRefs) { getConverter(dereferencedRef.getResType()).fillTypedValue(attribute.value, outValue); return; } } } break; } if (attribute.isNull()) { outValue.type = TypedValue.TYPE_NULL; return; } String format = attrData.getFormat(); String[] types = format.split("\\|"); for (String type : types) { if ("reference".equals(type)) continue; // already handled above Converter converter = getConverterFor(attrData, type); if (converter != null) { if (converter.fillTypedValue(attribute.value, outValue)) { return; } } } }