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

Commit 7087225c authored by Clark Scheff's avatar Clark Scheff
Browse files

CM11 Themes: Use package name from AndroidManifest

It is possible for an apk to have a different package
name for the resources than what is defined in the
AndroidManifest.xml of the apk.  Using the resource's
package name for the base package name causes themed
resources to not be properly loaded.

Instead of returning the resource package name we return
the apps package name from AssetManager.

A good example of this is Trebuchet.  The system sees
it as com.cyanogenmod.trebuchet but it's resources use
com.android.launcher3.

Change-Id: Id57e68b27b3c7509e3358a7fd12ae73a03dd6cdf
parent f271f533
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -962,6 +962,11 @@ public final class AssetManager {
     */
    public native final String getBasePackageName(int index);

    /**
     * {@hide}
     */
    public native final String getBaseResourcePackageName(int index);

    /**
     * {@hide}
     */
+14 −0
Original line number Diff line number Diff line
@@ -1840,6 +1840,18 @@ static jstring android_content_AssetManager_getBasePackageName(JNIEnv* env, jobj
        return JNI_FALSE;
    }

    String16 packageName(am->getBasePackageName(index));
    return env->NewString((const jchar*)packageName.string(), packageName.size());
}

static jstring android_content_AssetManager_getBaseResourcePackageName(JNIEnv* env, jobject clazz,
                                                                       jint index)
{
    AssetManager* am = assetManagerForJavaObject(env, clazz);
    if (am == NULL) {
        return JNI_FALSE;
    }

    String16 packageName(am->getResources().getBasePackageName(index));
    return env->NewString((const jchar*)packageName.string(), packageName.size());
}
@@ -1893,6 +1905,8 @@ static JNINativeMethod gAssetManagerMethods[] = {
        (void*) android_content_AssetManager_getBasePackageCount },
    { "getBasePackageName", "(I)Ljava/lang/String;",
        (void*) android_content_AssetManager_getBasePackageName },
    { "getBaseResourcePackageName", "(I)Ljava/lang/String;",
        (void*) android_content_AssetManager_getBaseResourcePackageName },
    { "getBasePackageId", "(I)I",
        (void*) android_content_AssetManager_getBasePackageId },
    { "addIconPath",   "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I",
+5 −0
Original line number Diff line number Diff line
@@ -243,6 +243,8 @@ public:
        Vector<String8>& targets, Vector<String8>& overlays,
        uint32_t** outData, size_t* outSize);

    String8 getBasePackageName(int index);

private:
    struct asset_path
    {
@@ -393,6 +395,9 @@ private:
    mutable ResTable* mResources;
    ResTable_config* mConfig;

    String8 mBasePackageName;
    int32_t mBasePackageIndex;

    /*
     * Cached data for "loose" files.  This lets us avoid poking at the
     * filesystem when searching for loose assets.  Each entry is the
+16 −1
Original line number Diff line number Diff line
@@ -174,7 +174,8 @@ int32_t AssetManager::getGlobalCount()
AssetManager::AssetManager(CacheMode cacheMode)
    : mLocale(NULL), mVendor(NULL),
      mResources(NULL), mConfig(new ResTable_config),
      mCacheMode(cacheMode), mCacheValid(false)
      mCacheMode(cacheMode), mCacheValid(false),
      mBasePackageIndex(-1)
{
    int count = android_atomic_inc(&gCount)+1;
    //ALOGI("Creating AssetManager %p #%d\n", this, count);
@@ -464,6 +465,20 @@ String8 AssetManager::getPkgName(const char *apkPath) {
        return pkgName;
    }

/**
 * Returns the base package name as defined in the AndroidManifest.xml
 */
String8 AssetManager::getBasePackageName(int index)
{
    if (index >= mAssetPaths.size()) return String8::empty();

    if (mBasePackageName.isEmpty() || mBasePackageIndex != index) {
        mBasePackageName = getPkgName(mAssetPaths[index].path.string());
        mBasePackageIndex = index;
    }
    return mBasePackageName;
}

String8 AssetManager::getOverlayResPath(const char* targetApkPath, const char* overlayApkPath)
{
    //Remove leading '/'