/* * Copyright (C) 2015 HouKx <hkx.aidream@gmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package androidx.pluginmgr; import java.util.ArrayList; import java.util.List; import android.app.Application; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.AssetManager; import android.content.res.Resources; /** * 插件Bean * * @author HouKangxi * */ public class PlugInfo { // // ================== FLELDS ================== private String id; private String filePath; private PackageInfo packageInfo; private List<ResolveInfo> activities = new ArrayList<ResolveInfo>(); private ResolveInfo mainActivity; private List<ResolveInfo> services; private List<ResolveInfo> receivers; private List<ResolveInfo> providers; // private transient PluginClassLoader classLoader; private transient Application application; private transient AssetManager assetManager; private transient Resources resources; // // private transient volatile String currentActivityClass; public String getPackageName() { return packageInfo.packageName; } // ================== FLAGS STARD ================== /** * 按下back键时是否 finish Activity */ private static final int FLAG_FinishActivityOnbackPressed = 1; /** * 是否调用父类的onBackPressed()方法 */ private static final int FLAG_INVOKE_SUPER_ONBACKPRESSED = 2; // ================== FLAGS END ================== /** * 按Back键时是否销毁Activity */ public boolean isFinishActivityOnbackPressed(ActivityInfo act) { if (act == null) { return false; } int flags = getFlags(act); return containsFlag(flags, FLAG_FinishActivityOnbackPressed); } public boolean isInvokeSuperOnbackPressed(ActivityInfo act) { if (act == null) { return true; } int flags = getFlags(act); if (flags == 0) { return true;// 默认true } return containsFlag(flags, FLAG_INVOKE_SUPER_ONBACKPRESSED); } public void setInvokeSuperOnbackPressed(ActivityInfo act, boolean invokeSuperOnbackPressed) { if (act == null) { return; } if (invokeSuperOnbackPressed) { setFlag(act, FLAG_INVOKE_SUPER_ONBACKPRESSED); } else { unsetFlag(act, FLAG_INVOKE_SUPER_ONBACKPRESSED); } } public void setFinishActivityOnbackPressed(ActivityInfo act, boolean finishOnbackPressed) { if (act == null) { return; } if (finishOnbackPressed) { setFlag(act, FLAG_FinishActivityOnbackPressed); } else { unsetFlag(act, FLAG_FinishActivityOnbackPressed); } } public ActivityInfo findActivityByClassName(String actName) { if (packageInfo.activities == null) { return null; } for (ActivityInfo act : packageInfo.activities) { if (act.name.equals(actName)) { return act; } } return null; } public ActivityInfo findActivityByAction(String action) { if (activities == null || activities.isEmpty()) { return null; } for (ResolveInfo act : activities) { if (act.filter != null && act.filter.hasAction(action)) { return act.activityInfo; } } return null; } public ActivityInfo findReceiverByClassName(String className) { if (packageInfo.receivers == null) { return null; } for (ActivityInfo receiver : packageInfo.receivers) { if (receiver.name.equals(className)) { return receiver; } } return null; } public ServiceInfo findServiceByClassName(String className) { if (packageInfo.services == null) { return null; } for (ServiceInfo service : packageInfo.services) { if (service.name.equals(className)) { return service; } } return null; } public ServiceInfo findServiceByAction(String action) { if (services == null || services.isEmpty()) { return null; } for (ResolveInfo ser : services) { if (ser.filter != null && ser.filter.hasAction(action)) { return ser.serviceInfo; } } return null; } public void addActivity(ResolveInfo activity) { activities.add(activity); if (mainActivity == null && activity.filter != null && activity.filter.hasAction(Intent.ACTION_MAIN) && activity.filter.hasCategory(Intent.CATEGORY_LAUNCHER)) { mainActivity = activity; } } public void addReceiver(ResolveInfo receiver) { if (receivers == null) { receivers = new ArrayList<ResolveInfo>(); } receivers.add(receiver); } public void addService(ResolveInfo service) { if (services == null) { services = new ArrayList<ResolveInfo>(); } services.add(service); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public PackageInfo getPackageInfo() { return packageInfo; } public void setPackageInfo(PackageInfo packageInfo) { this.packageInfo = packageInfo; } public PluginClassLoader getClassLoader() { return classLoader; } public void setClassLoader(PluginClassLoader classLoader) { this.classLoader = classLoader; } public Application getApplication() { return application; } public void setApplication(Application application) { this.application = application; } public AssetManager getAssetManager() { return assetManager; } public void setAssetManager(AssetManager assetManager) { this.assetManager = assetManager; } public Resources getResources() { return resources; } public void setResources(Resources resources) { this.resources = resources; } // public String getCurrentActivityClass() { // return currentActivityClass; // } // // public void setCurrentActivityClass(String currentActivityClass) { // this.currentActivityClass = currentActivityClass; // } public List<ResolveInfo> getActivities() { return activities; } public List<ResolveInfo> getServices() { return services; } public void setServices(List<ResolveInfo> services) { this.services = services; } public List<ResolveInfo> getProviders() { return providers; } public void setProviders(List<ResolveInfo> providers) { this.providers = providers; } public ResolveInfo getMainActivity() { return mainActivity; } public List<ResolveInfo> getReceivers() { return receivers; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PlugInfo other = (PlugInfo) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } @Override public String toString() { return super.toString() + "[ id=" + id + ", pkg=" + getPackageName() + " ]"; } private static synchronized int getFlags(ActivityInfo act) { return act.logo; } private static synchronized void setFlag(ActivityInfo act, int flag) { act.logo |= flag; } private static synchronized void unsetFlag(ActivityInfo act, int flag) { act.logo &= ~flag; } private static boolean containsFlag(int vFlags, int flag) { return (vFlags & flag) == flag; } }