package com.android.customization.model; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.Log; import androidx.annotation.ColorInt; public abstract class ResourcesApkProvider { private static final String TAG = "ResourcesApkProvider"; protected final Context mContext; protected final String mStubPackageName; protected final Resources mStubApkResources; public ResourcesApkProvider(Context context, String stubPackageName) { mContext = context; mStubPackageName = stubPackageName; if (TextUtils.isEmpty(mStubPackageName)) { mStubApkResources = null; } else { Resources apkResources = null; try { PackageManager pm = mContext.getPackageManager(); ApplicationInfo stubAppInfo = pm.getApplicationInfo(mStubPackageName, PackageManager.GET_META_DATA | PackageManager.MATCH_SYSTEM_ONLY); if (stubAppInfo != null) { apkResources = pm.getResourcesForApplication(stubAppInfo); } } catch (NameNotFoundException e) { Log.w(TAG, String.format("Stub APK for %s not found.", mStubPackageName)); } finally { mStubApkResources = apkResources; } } } protected String[] getItemsFromStub(String arrayName) { int themesListResId = mStubApkResources.getIdentifier(arrayName, "array", mStubPackageName); return mStubApkResources.getStringArray(themesListResId); } protected String getItemStringFromStub(String prefix, String itemName) { int resourceId = mStubApkResources.getIdentifier(String.format("%s%s", prefix, itemName), "string", mStubPackageName); return mStubApkResources.getString(resourceId); } protected Drawable getItemDrawableFromStub(String prefix, String itemName) { int resourceId = mStubApkResources.getIdentifier(String.format("%s%s", prefix, itemName), "drawable", mStubPackageName); return mStubApkResources.getDrawable(resourceId, null); } @ColorInt protected int getItemColorFromStub(String prefix, String itemName) { int resourceId = mStubApkResources.getIdentifier(String.format("%s%s", prefix, itemName), "color", mStubPackageName); return mStubApkResources.getColor(resourceId, null); } public boolean isAvailable() { return mStubApkResources != null; } }