/*
** DroidPlugin Project
**
** Copyright(c) 2015 Andy Zhang <zhangyong232@gmail.com>
**
** This file is part of DroidPlugin.
**
** DroidPlugin is free software: you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation, either
** version 3 of the License, or (at your option) any later version.
**
** DroidPlugin is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with DroidPlugin. If not, see <http://www.gnu.org/licenses/lgpl.txt>
**
**/
package com.morgoo.droidplugin.pm;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.text.TextUtils;
import com.morgoo.droidplugin.BuildConfig;
import com.morgoo.droidplugin.PluginManagerService;
import com.morgoo.droidplugin.reflect.MethodUtils;
import com.morgoo.helper.Log;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* 插件包管理服务的客户端实现。
* <p/>
* Code by Andy Zhang (zhangyong232@gmail.com) on 2015/2/11.
*/
public class PluginManager implements ServiceConnection {
public static final String ACTION_PACKAGE_ADDED = "com.morgoo.droidplugin.PACKAGE_ADDED";
public static final String ACTION_PACKAGE_REMOVED = "com.morgoo.droidplugin.PACKAGE_REMOVED";
public static final String ACTION_DROIDPLUGIN_INIT = "com.morgoo.droidplugin.ACTION_DROIDPLUGIN_INIT";
public static final String ACTION_MAINACTIVITY_ONCREATE = "com.morgoo.droidplugin.ACTION_MAINACTIVITY_ONCREATE";
public static final String ACTION_MAINACTIVITY_ONDESTORY = "com.morgoo.droidplugin.ACTION_MAINACTIVITY_ONDESTORY";
public static final String ACTION_SETTING = "com.morgoo.droidplugin.ACTION_SETTING";
public static final String ACTION_SHORTCUT_PROXY = "com.morgoo.droidplugin.ACTION_SHORTCUT_PROXY";
public static final String EXTRA_PID = "com.morgoo.droidplugin.EXTRA_PID";
public static final String EXTRA_PACKAGENAME = "com.morgoo.droidplugin.EXTRA_EXTRA_PACKAGENAME";
public static final String STUB_AUTHORITY_NAME = BuildConfig.AUTHORITY_NAME;
public static final String EXTRA_APP_PERSISTENT = "com.morgoo.droidplugin.EXTRA_APP_PERSISTENT";
public static final int INSTALL_FAILED_NO_REQUESTEDPERMISSION = -100001;
public static final int STUB_NO_ACTIVITY_MAX_NUM = 4;
private static final String TAG = PluginManager.class.getSimpleName();
private Context mHostContext;
private static PluginManager sInstance = null;
private List<WeakReference<ServiceConnection>> sServiceConnection = Collections.synchronizedList(new ArrayList<WeakReference<ServiceConnection>>(1));
@Override
public void onServiceConnected(final ComponentName componentName, final IBinder iBinder) {
mPluginManager = IPluginManager.Stub.asInterface(iBinder);
new Thread() {
@Override
public void run() {
try {
mPluginManager.waitForReady();
mPluginManager.registerApplicationCallback(new IApplicationCallback.Stub() {
@Override
public Bundle onCallback(Bundle extra) throws RemoteException {
return extra;
}
});
Iterator<WeakReference<ServiceConnection>> iterator = sServiceConnection.iterator();
while (iterator.hasNext()) {
WeakReference<ServiceConnection> wsc = iterator.next();
ServiceConnection sc = wsc != null ? wsc.get() : null;
if (sc != null) {
sc.onServiceConnected(componentName, iBinder);
} else {
iterator.remove();
}
}
mPluginManager.asBinder().linkToDeath(new IBinder.DeathRecipient() {
@Override
public void binderDied() {
onServiceDisconnected(componentName);
}
}, 0);
Log.i(TAG, "PluginManager ready!");
} catch (Throwable e) {
Log.e(TAG, "Lost the mPluginManager connect...", e);
} finally {
try {
synchronized (mWaitLock) {
mWaitLock.notifyAll();
}
} catch (Exception e) {
Log.i(TAG, "PluginManager notifyAll:" + e.getMessage());
}
}
}
}.start();
Log.i(TAG, "onServiceConnected connected OK!");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.i(TAG, "onServiceDisconnected disconnected!");
mPluginManager = null;
Iterator<WeakReference<ServiceConnection>> iterator = sServiceConnection.iterator();
while (iterator.hasNext()) {
WeakReference<ServiceConnection> wsc = iterator.next();
ServiceConnection sc = wsc != null ? wsc.get() : null;
if (sc != null) {
sc.onServiceDisconnected(componentName);
} else {
iterator.remove();
}
}
//服务连接断开,需要重新连接。
connectToService();
}
private Object mWaitLock = new Object();
public void waitForConnected() {
if (isConnected()) {
return;
} else {
try {
synchronized (mWaitLock) {
mWaitLock.wait();
}
} catch (InterruptedException e) {
Log.i(TAG, "waitForConnected:" + e.getMessage());
}
Log.i(TAG, "waitForConnected finish");
}
}
/**
* 提供超时设置的waitForConnected版本
*
* @param timeout,当超时时间大于0时超时设置生效
*/
public void waitForConnected(long timeout) {
if (timeout > 0) {
if (isConnected()) {
return;
} else {
try {
synchronized (mWaitLock) {
mWaitLock.wait(timeout);
}
} catch (InterruptedException e) {
Log.i(TAG, "waitForConnected:" + e.getMessage());
}
Log.i(TAG, "waitForConnected finish");
}
} else {
waitForConnected();
}
}
private IPluginManager mPluginManager;
public void connectToService() {
if (mPluginManager == null) {
try {
Intent intent = new Intent(mHostContext, PluginManagerService.class);
intent.setPackage(mHostContext.getPackageName());
mHostContext.startService(intent);
mHostContext.bindService(intent, this, Context.BIND_AUTO_CREATE);
} catch (Exception e) {
Log.e(TAG, "connectToService", e);
}
}
}
public void addServiceConnection(ServiceConnection sc) {
sServiceConnection.add(new WeakReference<ServiceConnection>(sc));
}
public void removeServiceConnection(ServiceConnection sc) {
Iterator<WeakReference<ServiceConnection>> iterator = sServiceConnection.iterator();
while (iterator.hasNext()) {
WeakReference<ServiceConnection> wsc = iterator.next();
if (wsc.get() == sc) {
iterator.remove();
}
}
}
public void init(Context hostContext) {
mHostContext = hostContext;
connectToService();
}
public Context getHostContext() {
return mHostContext;
}
public boolean isConnected() {
return mHostContext != null && mPluginManager != null;
}
public static PluginManager getInstance() {
if (sInstance == null) {
sInstance = new PluginManager();
}
return sInstance;
}
//////////////////////////
// API
//////////////////////////
public PackageInfo getPackageInfo(String packageName, int flags) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getPackageInfo(packageName, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getPackageInfo", e);
}
return null;
}
public boolean isPluginPackage(String packageName) throws RemoteException {
try {
if (mHostContext == null) {
return false;
}
if (TextUtils.equals(mHostContext.getPackageName(), packageName)) {
return false;
}
if (mPluginManager != null && packageName != null) {
return mPluginManager.isPluginPackage(packageName);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "isPluginPackage", e);
}
return false;
}
public boolean isPluginPackage(ComponentName className) throws RemoteException {
if (className == null) {
return false;
}
return isPluginPackage(className.getPackageName());
}
public ActivityInfo getActivityInfo(ComponentName className, int flags) throws NameNotFoundException, RemoteException {
try {
if (className == null) {
return null;
}
if (mPluginManager != null && className != null) {
return mPluginManager.getActivityInfo(className, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
Log.e(TAG, "getActivityInfo RemoteException", e);
} catch (Exception e) {
Log.e(TAG, "getActivityInfo", e);
}
return null;
}
public ActivityInfo getReceiverInfo(ComponentName className, int flags) throws NameNotFoundException, RemoteException {
if (className == null) {
return null;
}
try {
if (mPluginManager != null && className != null) {
return mPluginManager.getReceiverInfo(className, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getReceiverInfo", e);
}
return null;
}
public ServiceInfo getServiceInfo(ComponentName className, int flags) throws NameNotFoundException, RemoteException {
if (className == null) {
return null;
}
try {
if (mPluginManager != null && className != null) {
return mPluginManager.getServiceInfo(className, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getServiceInfo", e);
}
return null;
}
public ProviderInfo getProviderInfo(ComponentName className, int flags) throws NameNotFoundException, RemoteException {
if (className == null) {
return null;
}
try {
if (mPluginManager != null && className != null) {
return mPluginManager.getProviderInfo(className, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getProviderInfo", e);
}
return null;
}
public ResolveInfo resolveIntent(Intent intent, String resolvedType, int flags) throws RemoteException {
try {
if (mPluginManager != null && intent != null) {
return mPluginManager.resolveIntent(intent, resolvedType, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "resolveIntent", e);
}
return null;
}
public ResolveInfo resolveService(Intent intent, String resolvedType, Integer flags) throws RemoteException {
try {
if (mPluginManager != null && intent != null) {
return mPluginManager.resolveService(intent, resolvedType, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "resolveService", e);
}
return null;
}
public List<ResolveInfo> queryIntentActivities(Intent intent, String resolvedType, int flags) throws RemoteException {
try {
if (mPluginManager != null && intent != null) {
return mPluginManager.queryIntentActivities(intent, resolvedType, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
Log.e(TAG, "queryIntentActivities RemoteException", e);
} catch (Exception e) {
Log.e(TAG, "queryIntentActivities", e);
}
return null;
}
public List<ResolveInfo> queryIntentReceivers(Intent intent, String resolvedType, int flags) throws RemoteException {
try {
if (mPluginManager != null && intent != null) {
return mPluginManager.queryIntentReceivers(intent, resolvedType, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "queryIntentReceivers", e);
}
return null;
}
public List<ResolveInfo> queryIntentServices(Intent intent, String resolvedType, int flags) throws RemoteException {
try {
if (mPluginManager != null && intent != null) {
return mPluginManager.queryIntentServices(intent, resolvedType, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
Log.e(TAG, "queryIntentServices RemoteException", e);
} catch (Exception e) {
Log.e(TAG, "queryIntentServices", e);
}
return null;
}
public List<ResolveInfo> queryIntentContentProviders(Intent intent, String resolvedType, int flags) throws RemoteException {
try {
if (mPluginManager != null && intent != null) {
return mPluginManager.queryIntentContentProviders(intent, resolvedType, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "queryIntentContentProviders", e);
}
return null;
}
public List<PackageInfo> getInstalledPackages(int flags) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getInstalledPackages(flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
Log.e(TAG, "getInstalledPackages RemoteException", e);
} catch (Exception e) {
Log.e(TAG, "getInstalledPackages", e);
}
return null;
}
public List<ApplicationInfo> getInstalledApplications(int flags) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getInstalledApplications(flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getInstalledApplications", e);
}
return null;
}
public PermissionInfo getPermissionInfo(String name, int flags) throws RemoteException {
try {
if (mPluginManager != null && name != null) {
return mPluginManager.getPermissionInfo(name, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getPermissionInfo", e);
}
return null;
}
public List<PermissionInfo> queryPermissionsByGroup(String group, int flags) throws RemoteException {
try {
if (mPluginManager != null && group != null) {
return mPluginManager.queryPermissionsByGroup(group, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "queryPermissionsByGroup", e);
}
return null;
}
public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) throws RemoteException {
try {
if (mPluginManager != null && name != null) {
return mPluginManager.getPermissionGroupInfo(name, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getPermissionGroupInfo", e);
}
return null;
}
public List<PermissionGroupInfo> getAllPermissionGroups(int flags) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getAllPermissionGroups(flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getAllPermissionGroups", e);
}
return null;
}
public ProviderInfo resolveContentProvider(String name, Integer flags) throws RemoteException {
try {
if (mPluginManager != null && name != null) {
return mPluginManager.resolveContentProvider(name, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "resolveContentProvider", e);
}
return null;
}
public void deleteApplicationCacheFiles(String packageName, final Object observer/*android.content.pm.IPackageDataObserver*/) throws RemoteException {
try {
if (mPluginManager != null && packageName != null) {
mPluginManager.deleteApplicationCacheFiles(packageName, new com.morgoo.droidplugin.pm.IPackageDataObserver.Stub() {
@Override
public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
if (observer != null) {
try {
MethodUtils.invokeMethod(observer, "onRemoveCompleted", packageName, succeeded);
} catch (Exception e) {
RemoteException exception = new RemoteException();
exception.initCause(exception);
throw exception;
}
}
}
});
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "deleteApplicationCacheFiles", e);
}
}
public void clearApplicationUserData(String packageName, final Object observer/*android.content.pm.IPackageDataObserver*/) throws RemoteException {
try {
if (mPluginManager != null && packageName != null) {
mPluginManager.clearApplicationUserData(packageName, new com.morgoo.droidplugin.pm.IPackageDataObserver.Stub() {
@Override
public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
if (observer != null) {
try {
MethodUtils.invokeMethod(observer, "onRemoveCompleted", packageName, succeeded);
} catch (Exception e) {
RemoteException exception = new RemoteException();
exception.initCause(exception);
throw exception;
}
}
}
});
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "clearApplicationUserData", e);
}
}
public ApplicationInfo getApplicationInfo(String packageName, int flags) throws RemoteException {
try {
if (mPluginManager != null && packageName != null) {
return mPluginManager.getApplicationInfo(packageName, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
Log.e(TAG, "getApplicationInfo RemoteException", e);
} catch (Exception e) {
Log.e(TAG, "getApplicationInfo", e);
}
return null;
}
public ActivityInfo selectStubActivityInfo(ActivityInfo pluginInfo) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.selectStubActivityInfo(pluginInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "selectStubActivityInfo", e);
}
return null;
}
public ActivityInfo selectStubActivityInfo(Intent pluginInfo) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.selectStubActivityInfoByIntent(pluginInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "selectStubActivityInfo", e);
}
return null;
}
public ServiceInfo selectStubServiceInfo(ServiceInfo pluginInfo) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.selectStubServiceInfo(pluginInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "selectStubServiceInfo", e);
}
return null;
}
public ServiceInfo selectStubServiceInfo(Intent pluginInfo) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.selectStubServiceInfoByIntent(pluginInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "selectStubServiceInfo", e);
}
return null;
}
public ProviderInfo selectStubProviderInfo(String name) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.selectStubProviderInfo(name);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "selectStubProviderInfo", e);
}
return null;
}
public ActivityInfo resolveActivityInfo(Intent intent, int flags) throws RemoteException {
try {
if (mPluginManager != null) {
if (intent.getComponent() != null) {
return mPluginManager.getActivityInfo(intent.getComponent(), flags);
} else {
ResolveInfo resolveInfo = mPluginManager.resolveIntent(intent, intent.resolveTypeIfNeeded(mHostContext.getContentResolver()), flags);
if (resolveInfo != null && resolveInfo.activityInfo != null) {
return resolveInfo.activityInfo;
}
}
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
return null;
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "selectStubActivityInfo", e);
}
return null;
}
public ServiceInfo resolveServiceInfo(Intent intent, int flags) throws RemoteException {
try {
if (mPluginManager != null) {
if (intent.getComponent() != null) {
return mPluginManager.getServiceInfo(intent.getComponent(), flags);
} else {
ResolveInfo resolveInfo = mPluginManager.resolveIntent(intent, intent.resolveTypeIfNeeded(mHostContext.getContentResolver()), flags);
if (resolveInfo != null && resolveInfo.serviceInfo != null) {
return resolveInfo.serviceInfo;
}
}
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
return null;
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "resolveServiceInfo", e);
}
return null;
}
public void killBackgroundProcesses(String packageName) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.killBackgroundProcesses(packageName);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "killBackgroundProcesses", e);
}
}
public void forceStopPackage(String packageName) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.forceStopPackage(packageName);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "forceStopPackage", e);
}
}
public boolean killApplicationProcess(String packageName) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.killApplicationProcess(packageName);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "killApplicationProcess", e);
}
return false;
}
public List<ActivityInfo> getReceivers(String packageName, int flags) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getReceivers(packageName, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getReceivers", e);
}
return null;
}
public List<IntentFilter> getReceiverIntentFilter(ActivityInfo info) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getReceiverIntentFilter(info);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getReceiverIntentFilter", e);
}
return null;
}
public ServiceInfo getTargetServiceInfo(ServiceInfo info) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getTargetServiceInfo(info);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getTargetServiceInfo", e);
}
return null;
}
public int installPackage(String filepath, int flags) throws RemoteException {
try {
if (mPluginManager != null) {
int result = mPluginManager.installPackage(filepath, flags);
Log.w(TAG, String.format("%s install result %d", filepath, result));
return result;
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "forceStopPackage", e);
}
return -1;
}
public List<String> getPackageNameByPid(int pid) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getPackageNameByPid(pid);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "forceStopPackage", e);
}
return null;
}
public String getProcessNameByPid(int pid) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getProcessNameByPid(pid);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "forceStopPackage", e);
}
return null;
}
public void onActivityCreated(ActivityInfo stubInfo, ActivityInfo targetInfo) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.onActivityCreated(stubInfo, targetInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "onActivityCreated", e);
}
}
public void onActivityDestory(ActivityInfo stubInfo, ActivityInfo targetInfo) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.onActivityDestory(stubInfo, targetInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "onActivityDestory", e);
}
}
public void onServiceCreated(ServiceInfo stubInfo, ServiceInfo targetInfo) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.onServiceCreated(stubInfo, targetInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "onServiceCreated", e);
}
}
public void onServiceDestory(ServiceInfo stubInfo, ServiceInfo targetInfo) {
try {
if (mPluginManager != null) {
mPluginManager.onServiceDestory(stubInfo, targetInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (Exception e) {
Log.e(TAG, "onServiceDestory", e);
}
}
public void onProviderCreated(ProviderInfo stubInfo, ProviderInfo targetInfo) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.onProviderCreated(stubInfo, targetInfo);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "onProviderCreated", e);
}
}
public void reportMyProcessName(String stubProcessName, String targetProcessName, String targetPkg) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.reportMyProcessName(stubProcessName, targetProcessName, targetPkg);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "reportMyProcessName", e);
}
}
public void deletePackage(String packageName, int flags) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.deletePackage(packageName, flags);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "deletePackage", e);
}
}
public int checkSignatures(String pkg0, String pkg1) throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.checkSignatures(pkg0, pkg1);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
return PackageManager.SIGNATURE_NO_MATCH;
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "deletePackage", e);
return PackageManager.SIGNATURE_NO_MATCH;
}
}
public void onActivtyOnNewIntent(ActivityInfo stubInfo, ActivityInfo targetInfo, Intent intent) throws RemoteException {
try {
if (mPluginManager != null) {
mPluginManager.onActivtyOnNewIntent(stubInfo, targetInfo, intent);
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "onActivtyOnNewIntent", e);
}
}
public int getMyPid() throws RemoteException {
try {
if (mPluginManager != null) {
return mPluginManager.getMyPid();
} else {
Log.w(TAG, "Plugin Package Manager Service not be connect");
return -1;
}
} catch (RemoteException e) {
throw e;
} catch (Exception e) {
Log.e(TAG, "getMyPid", e);
return -1;
}
}
}