package com.tws.plugin.manager; import java.util.ArrayList; import java.util.Collection; import tws.component.log.TwsLog; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; import com.tws.plugin.content.PluginDescriptor; /** * @author yongchen * * 利用ContentProvider实现同步跨进程调用 * * ContentProvider的相关操作应该放在installContentProvider之后执行, * 而installContentProvider是ActivityThread在调用application的attach之后 * ,onCreate之前执行 */ public class PluginManagerProvider extends ContentProvider { private static final String TAG = "rick_Print:PluginManagerProvider"; private static Uri CONTENT_URI; public static final String ACTION_INSTALL = "install"; public static final String INSTALL_RESULT = "install_result"; public static final String ACTION_REMOVE = "remove"; public static final String REMOVE_RESULT = "remove_result"; public static final String ACTION_REMOVE_ALL = "remove_all"; public static final String REMOVE_ALL_RESULT = "remove_all_result"; public static final String ACTION_QUERY_BY_ID = "query_by_id"; public static final String QUERY_BY_ID_RESULT = "query_by_id_result"; public static final String ACTION_QUERY_BY_CLASS_NAME = "query_by_class_name"; public static final String QUERY_BY_CLASS_NAME_RESULT = "query_by_class_name_result"; public static final String ACTION_QUERY_BY_FRAGMENT_ID = "query_by_fragment_id"; public static final String QUERY_BY_FRAGMENT_ID_RESULT = "query_by_fragment_id_result"; public static final String ACTION_QUERY_ALL = "query_all"; public static final String QUERY_ALL_RESULT = "query_all_result"; public static final String ACTION_BIND_ACTIVITY = "bind_activity"; public static final String BIND_ACTIVITY_RESULT = "bind_activity_result"; public static final String ACTION_UNBIND_ACTIVITY = "unbind_activity"; public static final String UNBIND_ACTIVITY_RESULT = "unbind_activity_result"; public static final String ACTION_BIND_SERVICE = "bind_service"; public static final String BIND_SERVICE_RESULT = "bind_service_result"; public static final String ACTION_GET_BINDED_SERVICE = "get_binded_service"; public static final String GET_BINDED_SERVICE_RESULT = "get_binded_service_result"; public static final String ACTION_UNBIND_SERVICE = "unbind_service"; public static final String UNBIND_SERVICE_RESULT = "unbind_service_result"; public static final String ACTION_BIND_RECEIVER = "bind_receiver"; public static final String BIND_RECEIVER_RESULT = "bind_receiver_result"; public static final String ACTION_IS_EXACT = "is_exact"; public static final String IS_EXACT_RESULT = "is_exact_result"; public static final String ACTION_IS_STUB = "is_stub"; public static final String IS_STUB_RESULT = "is_stub_result"; public static final String ACTION_DUMP_SERVICE_INFO = "dump_service_info"; public static final String DUMP_SERVICE_INFO_RESULT = "dump_service_info_result"; //process public static final String EXTRAS_BUNDLE_PROCESS = "extras_bundle_process"; private PluginManagerImpl manager; private PluginCallback changeListener; public static Uri buildUri() { if (CONTENT_URI == null) { CONTENT_URI = Uri.parse("content://com.tencent.tws.pluginhost.manager/call"); } return CONTENT_URI; } @Override public boolean onCreate() { manager = new PluginManagerImpl(); changeListener = new PluginCallbackImpl(); manager.loadInstalledPlugins(); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // doNothing return null; } @Override public String getType(Uri uri) { // doNothing return null; } @Override public Uri insert(Uri uri, ContentValues values) { // doNothing return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // doNothing return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // doNothing return 0; } @Override public Bundle call(String method, String arg, Bundle extras) { if (Build.VERSION.SDK_INT >= 19) { TwsLog.d(TAG, "callingPackage = " + getCallingPackage()); } TwsLog.d(TAG, "Thead id=" + Thread.currentThread().getId() + " name=" + Thread.currentThread().getName() + " method=" + method + ", arg=" + arg); Bundle bundle = new Bundle(); if (ACTION_INSTALL.equals(method)) { InstallResult result = manager.installPlugin(arg); bundle.putInt(INSTALL_RESULT, result.getResult()); changeListener.onInstall(result.getResult(), result.getPackageName(), result.getVersion(), arg); return bundle; } else if (ACTION_REMOVE.equals(method)) { boolean success = manager.remove(arg); bundle.putBoolean(REMOVE_RESULT, success); changeListener.onRemove(arg, success); return bundle; } else if (ACTION_REMOVE_ALL.equals(method)) { boolean success = manager.removeAll(); bundle.putBoolean(REMOVE_ALL_RESULT, success); changeListener.onRemoveAll(success); return bundle; } else if (ACTION_QUERY_BY_ID.equals(method)) { PluginDescriptor pluginDescriptor = manager.getPluginDescriptorByPluginId(arg); bundle.putSerializable(QUERY_BY_ID_RESULT, pluginDescriptor); return bundle; } else if (ACTION_QUERY_BY_CLASS_NAME.equals(method)) { PluginDescriptor pluginDescriptor = manager.getPluginDescriptorByClassName(arg); bundle.putSerializable(QUERY_BY_CLASS_NAME_RESULT, pluginDescriptor); return bundle; } else if (ACTION_QUERY_BY_FRAGMENT_ID.equals(method)) { PluginDescriptor pluginDescriptor = manager.getPluginDescriptorByFragmenetId(arg); bundle.putSerializable(QUERY_BY_FRAGMENT_ID_RESULT, pluginDescriptor); return bundle; } else if (ACTION_QUERY_ALL.equals(method)) { Collection<PluginDescriptor> pluginDescriptorList = manager.getPlugins(); ArrayList<PluginDescriptor> result = new ArrayList<PluginDescriptor>(pluginDescriptorList.size()); result.addAll(pluginDescriptorList); bundle.putSerializable(QUERY_ALL_RESULT, result); return bundle; } else if (ACTION_BIND_ACTIVITY.equals(method)) { bundle.putString(BIND_ACTIVITY_RESULT, PluginStubBinding.bindStubActivity(arg, extras.getInt("launchMode"))); return bundle; } else if (ACTION_UNBIND_ACTIVITY.equals(method)) { PluginStubBinding.unBindLaunchModeStubActivity(arg, extras.getString("className")); } else if (ACTION_BIND_SERVICE.equals(method)) { String process = extras != null ? extras.getString(EXTRAS_BUNDLE_PROCESS) : null; bundle.putString(BIND_SERVICE_RESULT, PluginStubBinding.bindStubService(arg, process)); return bundle; } else if (ACTION_GET_BINDED_SERVICE.equals(method)) { bundle.putString(GET_BINDED_SERVICE_RESULT, PluginStubBinding.getBindedPluginServiceName(arg)); return bundle; } else if (ACTION_UNBIND_SERVICE.equals(method)) { PluginStubBinding.unBindStubService(arg); } else if (ACTION_BIND_RECEIVER.equals(method)) { bundle.putString(BIND_RECEIVER_RESULT, PluginStubBinding.bindStubReceiver()); return bundle; } else if (ACTION_IS_EXACT.equals(method)) { bundle.putBoolean(IS_EXACT_RESULT, PluginStubBinding.isExact(arg, extras.getInt("type"))); return bundle; } else if (ACTION_IS_STUB.equals(method)) { bundle.putBoolean(IS_STUB_RESULT, PluginStubBinding.isStub(arg)); return bundle; } else if (ACTION_DUMP_SERVICE_INFO.equals(method)) { bundle.putString(DUMP_SERVICE_INFO_RESULT, PluginStubBinding.dumpServieInfo()); return bundle; } return null; } }