package com.limpoxe.fairy.manager;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import com.limpoxe.fairy.content.PluginDescriptor;
import com.limpoxe.fairy.core.FairyGlobal;
import com.limpoxe.fairy.util.LogUtil;
import java.util.ArrayList;
import java.util.Collection;
/**
* Created by cailiming on 16/3/11.
*
* 利用ContentProvider实现同步跨进程调用
*
*/
public class PluginManagerProvider extends ContentProvider {
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";
private PluginManagerImpl manager;
private PluginCallback changeListener;
public static Uri buildUri() {
if (CONTENT_URI == null) {
CONTENT_URI = Uri.parse("content://"+ FairyGlobal.getApplication().getPackageName() + ".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) {
LogUtil.v("callingPackage = ", getCallingPackage());
}
LogUtil.d("跨进程调用统计"
+ "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)) {
int code = manager.remove(arg);
bundle.putInt(REMOVE_RESULT, code);
changeListener.onRemove(arg, code);
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"),
extras.getString("packageName"),
extras.getString("themeId"),
extras.getInt("orientation", ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)));
return bundle;
} else if (ACTION_UNBIND_ACTIVITY.equals(method)) {
PluginStubBinding.unBindLaunchModeStubActivity(arg, extras.getString("className"));
} else if (ACTION_BIND_SERVICE.equals(method)) {
bundle.putString(BIND_SERVICE_RESULT, PluginStubBinding.bindStubService(arg));
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(arg));
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;
}
}