Skip to content

Commit 2f565fc

Browse files
committed
Update PackageManager And Theme Selector
1 parent 7e6e6dc commit 2f565fc

File tree

5 files changed

+56
-21
lines changed

5 files changed

+56
-21
lines changed

PluginCore/src/com/plugin/core/PluginInjector.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ static void injectActivityContext(Activity activity) {
153153
if (!TextUtils.isEmpty(fragmentContainer.pluginId())) {
154154

155155
pd = PluginLoader.getPluginDescriptorByPluginId(fragmentContainer.pluginId());
156-
pluginContext = PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), activity.getBaseContext());
156+
pluginContext = PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), activity.getBaseContext(), 0);
157157

158158
} else if (!TextUtils.isEmpty(fragmentContainer.fragmentId())) {
159159
String classId = null;
@@ -169,7 +169,7 @@ static void injectActivityContext(Activity activity) {
169169
Class clazz = PluginLoader.loadPluginFragmentClassById(classId);
170170

171171
pd = PluginLoader.getPluginDescriptorByClassName(clazz.getName());
172-
pluginContext = PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), activity.getBaseContext());
172+
pluginContext = PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), activity.getBaseContext(), 0);
173173

174174
} else {
175175
return;
@@ -182,7 +182,7 @@ static void injectActivityContext(Activity activity) {
182182
} else {
183183
//是打开插件中的activity
184184
pd = PluginLoader.getPluginDescriptorByClassName(activity.getClass().getName());
185-
pluginContext = PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), activity.getBaseContext());
185+
pluginContext = PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), activity.getBaseContext(), 0);
186186

187187
//获取插件Application对象
188188
Application pluginApp = pd.getPluginApplication();
@@ -324,7 +324,9 @@ static void resetWindowConfig(final Context pluginContext, final PluginDescripto
324324

325325
PluginDescriptor pd = PluginLoader.getPluginDescriptorByClassName(serviceName);
326326

327-
RefInvoker.setFieldObject(service, ContextWrapper.class.getName(), "mBase", PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), service.getBaseContext()));
327+
RefInvoker.setFieldObject(service, ContextWrapper.class.getName(), "mBase",
328+
PluginLoader.getNewPluginComponentContext(pd.getPluginContext(),
329+
service.getBaseContext(), pd.getApplicationTheme()));
328330

329331
if (pd.getPluginApplication() != null) {
330332
RefInvoker.setFieldObject(service, Service.class.getName(), "mApplication", pd.getPluginApplication());
@@ -346,6 +348,7 @@ private static int getPluginTheme(ActivityInfo activityInfo, PluginActivityInfo
346348
pluginAppTheme = pd.getApplicationTheme();
347349
}
348350
if (pluginAppTheme == 0) {
351+
//If the activity defines a theme, that is used; else, the application theme is used.
349352
pluginAppTheme = activityInfo.getThemeResource();
350353
}
351354
return pluginAppTheme;

PluginCore/src/com/plugin/core/PluginLoader.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ public static Context getDefaultPluginContext(String pluginId) {
416416
* @param base 由系统创建的Context。 其实际类型应该是ContextImpl
417417
* @return
418418
*/
419-
/*package*/ static Context getNewPluginComponentContext(Context pluginContext, Context base) {
419+
/*package*/ static Context getNewPluginComponentContext(Context pluginContext, Context base, int theme) {
420420
Context newContext = null;
421421
if (pluginContext != null) {
422422
newContext = PluginCreator.createPluginContext(((PluginContextTheme) pluginContext).getPluginDescriptor(),
@@ -428,22 +428,23 @@ public static Context getDefaultPluginContext(String pluginId) {
428428
}
429429

430430
public static Context getNewPluginApplicationContext(Class clazz) {
431-
432-
return newDefaultAppContext(getDefaultPluginContext(clazz));
431+
PluginDescriptor pluginDescriptor = getPluginDescriptorByClassName(clazz.getName());
432+
return newDefaultAppContext(pluginDescriptor);
433433
}
434434

435435
public static Context getNewPluginApplicationContext(String pluginId) {
436-
437-
return newDefaultAppContext(getDefaultPluginContext(pluginId));
436+
PluginDescriptor pluginDescriptor = getPluginDescriptorByPluginId(pluginId);
437+
return newDefaultAppContext(pluginDescriptor);
438438
}
439439

440-
private static Context newDefaultAppContext(Context source) {
440+
private static Context newDefaultAppContext(PluginDescriptor pluginDescriptor) {
441441
Context newContext = null;
442-
if (source != null) {
443-
newContext = PluginCreator.createPluginContext(((PluginContextTheme) source).getPluginDescriptor(),
444-
sApplication, source.getResources(),
445-
(DexClassLoader) source.getClassLoader());
446-
newContext.setTheme(sApplication.getApplicationContext().getApplicationInfo().theme);
442+
if (pluginDescriptor != null && pluginDescriptor.getPluginContext() != null) {
443+
Context originContext = pluginDescriptor.getPluginContext();
444+
newContext = PluginCreator.createPluginContext(((PluginContextTheme) originContext).getPluginDescriptor(),
445+
sApplication, originContext.getResources(),
446+
(DexClassLoader) originContext.getClassLoader());
447+
newContext.setTheme(pluginDescriptor.getApplicationTheme());
447448
}
448449
return newContext;
449450
}

PluginCore/src/com/plugin/core/PluginThemeHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public static void applyPluginTheme(Activity activity, String pluginId, int them
7373

7474
//注入插件上下文和主题
7575
Context defaultContext = pd.getPluginContext();
76-
Context pluginContext = PluginLoader.getNewPluginComponentContext(defaultContext, ((PluginBaseContextWrapper)activity.getBaseContext()).getBaseContext());
76+
Context pluginContext = PluginLoader.getNewPluginComponentContext(defaultContext, ((PluginBaseContextWrapper)activity.getBaseContext()).getBaseContext(), 0);
7777
PluginInjector.resetActivityContext(pluginContext, activity, themeResId);
7878

7979
}

PluginCore/src/com/plugin/core/PluginViewCreator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private View createView(Context Context, String pluginId, String name, Attribute
6868
if (baseContext instanceof PluginContextTheme) {
6969
baseContext = ((PluginContextTheme) baseContext).getBaseContext();
7070
}
71-
Context pluginViewContext = PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), baseContext);
71+
Context pluginViewContext = PluginLoader.getNewPluginComponentContext(pd.getPluginContext(), baseContext, pd.getApplicationTheme());
7272
Class<? extends View> clazz = pluginViewContext.getClassLoader()
7373
.loadClass(name).asSubclass(View.class);
7474

PluginCore/src/com/plugin/core/systemservice/AndroidAppIPackageManager.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public static void installProxy(PackageManager manager) {
5555
sMethods.put("getProviderInfo", new getProviderInfo());
5656
sMethods.put("queryIntentActivities", new queryIntentActivities());
5757
sMethods.put("queryIntentServices", new queryIntentServices());
58+
sMethods.put("resolveActivity", new resolveActivity());
59+
sMethods.put("resolveActivityAsUser", new resolveActivityAsUser());
5860
}
5961

6062
public static class getPackageInfo extends MethodDelegate {
@@ -157,7 +159,7 @@ public Object beforeInvoke(Object target, Method method, Object[] args) {
157159
String className = ((ComponentName)args[0]).getClassName();
158160
PluginDescriptor pluginDescriptor = PluginLoader.getPluginDescriptorByClassName(className);
159161
if (pluginDescriptor != null) {
160-
getServiceInfo(pluginDescriptor, className);
162+
return getServiceInfo(pluginDescriptor, className);
161163
}
162164

163165
return super.beforeInvoke(target, method, args);
@@ -180,7 +182,6 @@ public Object beforeInvoke(Object target, Method method, Object[] args) {
180182
providerInfo.enabled = true;
181183
providerInfo.exported = info.isExported();
182184
providerInfo.applicationInfo = getApplicationInfo(pluginDescriptor);
183-
providerInfo.metaData = getMeta(pluginDescriptor.getMetaData());
184185
providerInfo.authority = info.getAuthority();
185186
return providerInfo;
186187
}
@@ -237,6 +238,38 @@ public Object beforeInvoke(Object target, Method method, Object[] args) {
237238
}
238239
}
239240

241+
//public abstract ResolveInfo resolveActivity(Intent intent, int flags);
242+
public static class resolveActivity extends MethodDelegate {
243+
@Override
244+
public Object beforeInvoke(Object target, Method method, Object[] args) {
245+
LogUtil.e("beforeInvoke", method.getName());
246+
ArrayList<String> classNames = PluginLoader.matchPlugin((Intent) args[0], PluginDescriptor.ACTIVITY);
247+
if (classNames != null && classNames.size() > 0) {
248+
PluginDescriptor pluginDescriptor = PluginLoader.getPluginDescriptorByClassName(classNames.get(0));
249+
ResolveInfo info = new ResolveInfo();
250+
info.activityInfo = getActivityInfo(pluginDescriptor, classNames.get(0));
251+
return info;
252+
}
253+
return super.beforeInvoke(target, method, args);
254+
}
255+
}
256+
257+
//public abstract ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId);
258+
public static class resolveActivityAsUser extends MethodDelegate {
259+
@Override
260+
public Object beforeInvoke(Object target, Method method, Object[] args) {
261+
LogUtil.e("beforeInvoke", method.getName());
262+
ArrayList<String> classNames = PluginLoader.matchPlugin((Intent) args[0], PluginDescriptor.ACTIVITY);
263+
if (classNames != null && classNames.size() > 0) {
264+
PluginDescriptor pluginDescriptor = PluginLoader.getPluginDescriptorByClassName(classNames.get(0));
265+
ResolveInfo info = new ResolveInfo();
266+
info.activityInfo = getActivityInfo(pluginDescriptor, classNames.get(0));
267+
return info;
268+
}
269+
return super.beforeInvoke(target, method, args);
270+
}
271+
}
272+
240273
private static Bundle getMeta(HashMap<String, String> map) {
241274
//TODO 可以缓存起来
242275
Bundle meta = new Bundle();
@@ -279,7 +312,6 @@ private static ActivityInfo getActivityInfo(PluginDescriptor pluginDescriptor, S
279312
activityInfo.exported = false;
280313
activityInfo.applicationInfo = getApplicationInfo(pluginDescriptor);
281314
activityInfo.taskAffinity = null;//需要时再加上
282-
activityInfo.metaData = getMeta(pluginDescriptor.getMetaData());
283315

284316
if (pluginDescriptor.getType(className) == PluginDescriptor.ACTIVITY) {
285317
PluginActivityInfo detail = pluginDescriptor.getActivityInfos().get(className);
@@ -301,7 +333,6 @@ private static ServiceInfo getServiceInfo(PluginDescriptor pluginDescriptor, Str
301333
serviceInfo.enabled = true;
302334
serviceInfo.exported = false;
303335
serviceInfo.applicationInfo = getApplicationInfo(pluginDescriptor);
304-
serviceInfo.metaData = getMeta(pluginDescriptor.getMetaData());
305336
return serviceInfo;
306337
}
307338

0 commit comments

Comments
 (0)