Fix for issue 9656 - custom xml attributes in Android Libraries. do not merge.

Added support for predefined namespace http://schemas.android.com/apk/res/auto
that aapt tool recognizes and treats as namespace with package name
taken from current application's AndroidManifest.xml, //manifest/package attribute.

Signed-off-by: inazaruk <ievgenii.nazaruk@gmail.com>

(cherry picked from commit e348909c19)

Change-Id: I4bff836c42a309bac36e5d1ce1899131b3c4c194
This commit is contained in:
inazaruk
2011-05-22 15:09:06 -07:00
committed by Xavier Ducrohet
parent 566328a2a5
commit eed8d0b3af

View File

@@ -21,6 +21,7 @@
const char* const RESOURCES_ROOT_NAMESPACE = "http://schemas.android.com/apk/res/"; const char* const RESOURCES_ROOT_NAMESPACE = "http://schemas.android.com/apk/res/";
const char* const RESOURCES_ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android"; const char* const RESOURCES_ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android";
const char* const RESOURCES_AUTO_PACKAGE_NAMESPACE = "http://schemas.android.com/apk/res/auto";
const char* const RESOURCES_ROOT_PRV_NAMESPACE = "http://schemas.android.com/apk/prv/res/"; const char* const RESOURCES_ROOT_PRV_NAMESPACE = "http://schemas.android.com/apk/prv/res/";
const char* const XLIFF_XMLNS = "urn:oasis:names:tc:xliff:document:1.2"; const char* const XLIFF_XMLNS = "urn:oasis:names:tc:xliff:document:1.2";
@@ -44,16 +45,21 @@ bool isWhitespace(const char16_t* str)
} }
static const String16 RESOURCES_PREFIX(RESOURCES_ROOT_NAMESPACE); static const String16 RESOURCES_PREFIX(RESOURCES_ROOT_NAMESPACE);
static const String16 RESOURCES_PREFIX_AUTO_PACKAGE(RESOURCES_AUTO_PACKAGE_NAMESPACE);
static const String16 RESOURCES_PRV_PREFIX(RESOURCES_ROOT_PRV_NAMESPACE); static const String16 RESOURCES_PRV_PREFIX(RESOURCES_ROOT_PRV_NAMESPACE);
static const String16 RESOURCES_TOOLS_NAMESPACE("http://schemas.android.com/tools"); static const String16 RESOURCES_TOOLS_NAMESPACE("http://schemas.android.com/tools");
String16 getNamespaceResourcePackage(String16 namespaceUri, bool* outIsPublic) String16 getNamespaceResourcePackage(String16 appPackage, String16 namespaceUri, bool* outIsPublic)
{ {
//printf("%s starts with %s?\n", String8(namespaceUri).string(), //printf("%s starts with %s?\n", String8(namespaceUri).string(),
// String8(RESOURCES_PREFIX).string()); // String8(RESOURCES_PREFIX).string());
size_t prefixSize; size_t prefixSize;
bool isPublic = true; bool isPublic = true;
if (namespaceUri.startsWith(RESOURCES_PREFIX)) { if(namespaceUri.startsWith(RESOURCES_PREFIX_AUTO_PACKAGE)) {
NOISY(printf("Using default application package: %s -> %s\n", String8(namespaceUri).string(), String8(appPackage).string()));
isPublic = true;
return appPackage;
} else if (namespaceUri.startsWith(RESOURCES_PREFIX)) {
prefixSize = RESOURCES_PREFIX.size(); prefixSize = RESOURCES_PREFIX.size();
} else if (namespaceUri.startsWith(RESOURCES_PRV_PREFIX)) { } else if (namespaceUri.startsWith(RESOURCES_PRV_PREFIX)) {
isPublic = false; isPublic = false;
@@ -926,7 +932,7 @@ status_t XMLNode::assignResourceIds(const sp<AaptAssets>& assets,
const attribute_entry& e = mAttributes.itemAt(i); const attribute_entry& e = mAttributes.itemAt(i);
if (e.ns.size() <= 0) continue; if (e.ns.size() <= 0) continue;
bool nsIsPublic; bool nsIsPublic;
String16 pkg(getNamespaceResourcePackage(e.ns, &nsIsPublic)); String16 pkg(getNamespaceResourcePackage(String16(assets->getPackage()), e.ns, &nsIsPublic));
NOISY(printf("Elem %s %s=\"%s\": namespace(%s) %s ===> %s\n", NOISY(printf("Elem %s %s=\"%s\": namespace(%s) %s ===> %s\n",
String8(getElementName()).string(), String8(getElementName()).string(),
String8(e.name).string(), String8(e.name).string(),