package me.ele.amigo.utils.component;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.util.Log;
import java.util.List;
import me.ele.amigo.utils.ArrayUtil;
public class ServiceFinder extends ComponentFinder {
private static final String TAG = ServiceFinder.class.getSimpleName();
private static ServiceInfo[] sHostServices;
public static ServiceInfo[] getAppServices(Context context) {
if (sHostServices == null) {
try {
PackageManager pm = context.getPackageManager();
PackageInfo info = pm.getPackageInfo(context.getPackageName(), PackageManager
.GET_SERVICES);
sHostServices = info.services;
if (sHostServices == null) {
sHostServices = new ServiceInfo[0];
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
return sHostServices;
}
public static boolean newServiceExistsInPatch(Context context) {
parsePackage(context);
getAppServices(context);
for (int i = sServices.size() - 1; i >= 0; i--) {
if (isNew(sServices.get(i).serviceInfo)) {
return true;
}
}
return false;
}
public static ServiceInfo resolveNewServiceInfo(Context context, Intent intent) {
parsePackage(context);
getAppServices(context);
for (Service service : sServices) {
if (!isNew(service.serviceInfo)) {
continue;
}
List<IntentFilter> intentFilters = service.filters;
if (intentFilters != null && intentFilters.size() > 0) {
for (IntentFilter intentFilter : intentFilters) {
if (intentFilter.match(context.getContentResolver(), intent,
true, "") >= 0) {
return service.serviceInfo;
}
}
} else {
ComponentName componentName = intent.getComponent();
if (componentName != null && service.serviceInfo.name.equals(componentName
.getClassName())) {
return service.serviceInfo;
}
}
}
return null;
}
private static boolean isNew(ServiceInfo serviceInfo) {
// diff metadata ??
for (int i = ArrayUtil.length(sHostServices) - 1; i >= 0; i--) {
if (serviceInfo.name.equals(sHostServices[i].name)) {
return false;
}
}
return true;
}
}