1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
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;
}
}
|