package com.tws.plugin.content; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import tws.component.log.TwsLog; import android.app.Application; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import com.tws.plugin.bridge.TwsPluginBridgeActivity; import com.tws.plugin.util.ResourceUtil; /** * <Pre> * @author yongchen * </Pre> */ public class PluginDescriptor implements Serializable { protected static final String TAG = "rick_Print:PluginDescriptor"; public static final int UNKOWN = 0; public static final int BROADCAST = 1; public static final int ACTIVITY = 2; public static final int SERVICE = 4; public static final int PROVIDER = 6; public static final int FRAGMENT = 8; public static final int FUNCTION = 9; public static final int APPLICATION = 10; private String packageName; private String platformBuildVersionCode; private String platformBuildVersionName; private String minSdkVersion; private String targetSdkVersion; private String version; private String description; private boolean isStandalone; private boolean isEnabled; private String applicationName; private int applicationIcon; private int applicationLogo; private int applicationTheme; /** * 定义在插件Manifest中的meta-data标签 */ private transient Bundle metaData; private HashMap<String, PluginProviderInfo> providerInfos = new HashMap<String, PluginProviderInfo>(); /** * key: fragment id, value: fragment class */ private HashMap<String, String> fragments = new HashMap<String, String>(); /** * key: localservice id, value: localservice class */ private HashMap<String, String> functions = new HashMap<String, String>(); /** * key: activity class name value: intentfilter list */ private HashMap<String, ArrayList<PluginIntentFilter>> activitys = new HashMap<String, ArrayList<PluginIntentFilter>>(); /** * key: activity class name value: activity info in Manifest */ private HashMap<String, PluginActivityInfo> activityInfos = new HashMap<String, PluginActivityInfo>(); /** * key: service class name value: intentfilter list */ private HashMap<String, ArrayList<PluginIntentFilter>> services = new HashMap<String, ArrayList<PluginIntentFilter>>(); private HashMap<String, String> serviceProcessInfos = new HashMap<String, String>(); /** * key: receiver class name value: intentfilter list */ private HashMap<String, ArrayList<PluginIntentFilter>> receivers = new HashMap<String, ArrayList<PluginIntentFilter>>(); private String installedPath; private String[] dependencies; private ArrayList<String> muliDexList; private ArrayList<DisplayConfig> displayConfigs = null; // =============getter and setter====================== // ////////////////////////////////////定制化配置////////////////////////////////////// // 个是可定制化的配置 1、依赖app 2、依赖插件 public ArrayList<String> dependOns = null; // ////////////////////////////////////定制化配置////////////////////////////////////// public String getPackageName() { return packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } public String getPlatformBuildVersionCode() { return platformBuildVersionCode; } public void setPlatformBuildVersionCode(String platformBuildVersionCode) { this.platformBuildVersionCode = platformBuildVersionCode; } public String getPlatformBuildVersionName() { return platformBuildVersionName; } public void setPlatformBuildVersionName(String platformBuildVersionName) { this.platformBuildVersionName = platformBuildVersionName; } public String getMinSdkVersion() { return minSdkVersion; } public void setMinSdkVersion(String minSdkVersion) { this.minSdkVersion = minSdkVersion; } public String getTargetSdkVersion() { return targetSdkVersion; } public void setTargetSdkVersion(String targetSdkVersion) { this.targetSdkVersion = targetSdkVersion; } public String getVersion() { return version; } public int getVersionCode() { if (TextUtils.isEmpty(version)) return 0; final String[] values = version.split(DisplayConfig.SEPARATOR_VER); return Integer.parseInt(values[0]); } public void setVersion(String version) { this.version = version; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public int getApplicationIcon() { return applicationIcon; } public void setApplicationIcon(int icon) { this.applicationIcon = icon; } public int getApplicationLogo() { return applicationLogo; } public void setApplicationLogo(int logo) { this.applicationLogo = logo; } public int getApplicationTheme() { return applicationTheme; } public void setApplicationTheme(int theme) { this.applicationTheme = theme; } public Bundle getMetaData() { if (metaData == null) { if (installedPath != null) { metaData = ResourceUtil.getApplicationMetaData(installedPath); if (metaData == null) { metaData = new Bundle(); } } } return metaData; } public HashMap<String, String> getFragments() { return fragments; } public void setfragments(HashMap<String, String> fragments) { this.fragments = fragments; } public HashMap<String, String> getFunctions() { return functions; } public void setFunctions(HashMap<String, String> functions) { this.functions = functions; } public HashMap<String, ArrayList<PluginIntentFilter>> getReceivers() { return receivers; } public void setReceivers(HashMap<String, ArrayList<PluginIntentFilter>> receivers) { this.receivers = receivers; } public HashMap<String, ArrayList<PluginIntentFilter>> getActivitys() { return activitys; } public void setActivitys(HashMap<String, ArrayList<PluginIntentFilter>> activitys) { this.activitys = activitys; } public HashMap<String, PluginActivityInfo> getActivityInfos() { return activityInfos; } public void setActivityInfos(HashMap<String, PluginActivityInfo> activityInfos) { this.activityInfos = activityInfos; } public HashMap<String, String> getServiceProcessInfos() { return serviceProcessInfos; } public void setServiceProcessInfos(HashMap<String, String> serviceProcessInfos) { this.serviceProcessInfos = serviceProcessInfos; } public HashMap<String, ArrayList<PluginIntentFilter>> getServices() { return services; } public void setServices(HashMap<String, ArrayList<PluginIntentFilter>> services) { this.services = services; } public String getInstalledPath() { return installedPath; } public void setInstalledPath(String installedPath) { this.installedPath = installedPath; } public String[] getDependencies() { return dependencies; } public void setDependencies(String[] dependencies) { this.dependencies = dependencies; } public ArrayList<DisplayConfig> getDisplayConfigs() { return displayConfigs; } public void setDisplayConfigs(ArrayList<DisplayConfig> displayConfigs) { this.displayConfigs = displayConfigs; } public List<String> getMuliDexList() { return muliDexList; } public void setMuliDexList(ArrayList<String> muliDexList) { this.muliDexList = muliDexList; } public ArrayList<String> getDependOns() { return dependOns; } public void setDependOns(ArrayList<String> dependOns) { this.dependOns = dependOns; } public String getApplicationName() { return applicationName; } public void setApplicationName(String applicationName) { this.applicationName = applicationName; } public boolean isEnabled() { return isEnabled; } public void setEnabled(boolean isEnabled) { this.isEnabled = isEnabled; } public boolean isStandalone() { return isStandalone; } public void setStandalone(boolean isStandalone) { this.isStandalone = isStandalone; } public HashMap<String, PluginProviderInfo> getProviderInfos() { return providerInfos; } public void setProviderInfos(HashMap<String, PluginProviderInfo> providerInfos) { this.providerInfos = providerInfos; } /** * 需要根据id查询的只有fragment * * @param clazzId * @return */ public String getPluginClassNameById(String clazzId) { String clazzName = getFragments().get(clazzId); if (clazzName == null) { TwsLog.d(TAG, "clazzName not found for classId:" + clazzId); } else { TwsLog.d(TAG, "clazzName found:" + clazzName); } return clazzName; } /** * 需要根据Id查询的只有fragment * * @param clazzId * @return */ public boolean containsFragment(String clazzId) { if (getFragments().containsKey(clazzId) && isEnabled()) { return true; } return false; } /** * 根据className查询 * * @param clazzName * @return */ public int matcheName(String clazzName) { if (getFragments().containsValue(clazzName) && isEnabled()) { return FRAGMENT; } else if (getActivitys().containsKey(clazzName) && isEnabled()) { return ACTIVITY; } else if (getReceivers().containsKey(clazzName) && isEnabled()) { return BROADCAST; } else if (getServices().containsKey(clazzName) && isEnabled()) { return SERVICE; } else if (getProviderInfos().containsKey(clazzName) && isEnabled()) { return PROVIDER; } else if (getApplicationName().equals(clazzName) && !clazzName.equals(Application.class.getName()) && isEnabled()) { return APPLICATION; } return UNKOWN; } /** * 获取class的类型: activity * * @return */ public int getType(String clazzName) { if (getFragments().containsValue(clazzName) && isEnabled()) { return FRAGMENT; } else if (getActivitys().containsKey(clazzName) && isEnabled()) { return ACTIVITY; } else if (getReceivers().containsKey(clazzName) && isEnabled()) { return BROADCAST; } else if (getServices().containsKey(clazzName) && isEnabled()) { return SERVICE; } else if (getProviderInfos().containsKey(clazzName) && isEnabled()) { return PROVIDER; } return UNKOWN; } public List<ComponentInfo> matchPlugin(Intent intent, int type) { List<ComponentInfo> result = null; String clazzName = null; // 如果是通过组件进行匹配的, 这里忽略了packageName if (intent.getComponent() != null && type == matcheName(intent.getComponent().getClassName()) && !TwsPluginBridgeActivity.class.getName().equals(intent.getComponent().getClassName())) { clazzName = intent.getComponent().getClassName(); result = new ArrayList<ComponentInfo>(1); //当前暂时就service支持配置多进程 String process = (type == SERVICE ? serviceProcessInfos.get(clazzName) : null); result.add(new ComponentInfo(clazzName, type, getPackageName(), process)); return result;// 暂时不考虑不同的插件中配置了相同名称的组件的问题,先到先得 } // 如果是通过IntentFilter进行匹配的 ArrayList<ComponentInfo> list = findClassNameByIntent(intent, type); if (list != null && list.size() > 0) { switch (type) { case PluginDescriptor.ACTIVITY: result = new ArrayList<ComponentInfo>(1); result.add(list.get(0)); return result;// 暂时不考虑多个Activity配置了相同的Intent的问题,先到先得 case PluginDescriptor.SERVICE: result = new ArrayList<ComponentInfo>(1); result.add(list.get(0)); return result;// service本身不支持多匹配,先到先得 case PluginDescriptor.BROADCAST: result = new ArrayList<ComponentInfo>(); result.addAll(list);// 暂时不考虑去重的问题 return result; default: break; } } return null; } private ArrayList<ComponentInfo> findClassNameByIntent(Intent intent, final int type) { final HashMap<String, ArrayList<PluginIntentFilter>> intentFilter; switch (type) { case ACTIVITY: intentFilter = getActivitys(); break; case SERVICE: intentFilter = getServices(); break; case BROADCAST: intentFilter = getReceivers(); break; default: intentFilter = null; break; } if (intentFilter != null) { ArrayList<ComponentInfo> targetComponentInfos = null; Iterator<Map.Entry<String, ArrayList<PluginIntentFilter>>> entry = intentFilter.entrySet().iterator(); while (entry.hasNext()) { Map.Entry<String, ArrayList<PluginIntentFilter>> item = entry.next(); Iterator<PluginIntentFilter> values = item.getValue().iterator(); while (values.hasNext()) { PluginIntentFilter filter = values.next(); int result = filter.match(intent.getAction(), intent.getType(), intent.getScheme(), intent.getData(), intent.getCategories()); if (result != PluginIntentFilter.NO_MATCH_ACTION && result != PluginIntentFilter.NO_MATCH_CATEGORY && result != PluginIntentFilter.NO_MATCH_DATA && result != PluginIntentFilter.NO_MATCH_TYPE && result != PluginIntentFilter.NO_MATCH_RESULT) { if (targetComponentInfos == null) { targetComponentInfos = new ArrayList<ComponentInfo>(); } //当前暂时就service支持配置多进程 String process = (type == SERVICE ? serviceProcessInfos.get(item.getKey()) : null); targetComponentInfos.add(new ComponentInfo(item.getKey(), type, getPackageName(), process)); break; } } } return targetComponentInfos; } return null; } }