package com.lody.virtual.server.pm;
import android.annotation.TargetApi;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.os.Build;
import com.lody.virtual.helper.compat.ObjectsCompat;
import com.lody.virtual.helper.utils.VLog;
import com.lody.virtual.server.pm.parser.PackageParserEx;
import com.lody.virtual.server.pm.parser.VPackage;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import static com.lody.virtual.server.pm.VPackageManagerService.TAG;
final class ProviderIntentResolver extends IntentResolver<VPackage.ProviderIntentInfo, ResolveInfo> {
private final HashMap<ComponentName, VPackage.ProviderComponent> mProviders = new HashMap<>();
private int mFlags;
public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, boolean defaultOnly, int userId) {
mFlags = defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0;
return super.queryIntent(intent, resolvedType, defaultOnly, userId);
}
public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, int flags, int userId) {
mFlags = flags;
return super.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId);
}
public List<ResolveInfo> queryIntentForPackage(Intent intent, String resolvedType, int flags,
ArrayList<VPackage.ProviderComponent> packageProviders, int userId) {
if (packageProviders == null) {
return null;
}
mFlags = flags;
final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0;
final int N = packageProviders.size();
ArrayList<VPackage.ProviderIntentInfo[]> listCut = new ArrayList<>(N);
ArrayList<VPackage.ProviderIntentInfo> intentFilters;
for (int i = 0; i < N; ++i) {
intentFilters = packageProviders.get(i).intents;
if (intentFilters != null && intentFilters.size() > 0) {
VPackage.ProviderIntentInfo[] array = new VPackage.ProviderIntentInfo[intentFilters
.size()];
intentFilters.toArray(array);
listCut.add(array);
}
}
return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId);
}
public final void addProvider(VPackage.ProviderComponent p) {
if (mProviders.containsKey(p.getComponentName())) {
VLog.w(TAG, "Provider " + p.getComponentName() + " already defined; ignoring");
return;
}
mProviders.put(p.getComponentName(), p);
final int NI = p.intents.size();
int j;
for (j = 0; j < NI; j++) {
VPackage.ProviderIntentInfo intent = p.intents.get(j);
addFilter(intent);
}
}
public final void removeProvider(VPackage.ProviderComponent p) {
mProviders.remove(p.getComponentName());
final int NI = p.intents.size();
int j;
for (j = 0; j < NI; j++) {
VPackage.ProviderIntentInfo intent = p.intents.get(j);
removeFilter(intent);
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
protected boolean allowFilterResult(VPackage.ProviderIntentInfo filter, List<ResolveInfo> dest) {
ProviderInfo filterPi = filter.provider.info;
for (int i = dest.size() - 1; i >= 0; i--) {
ProviderInfo destPi = dest.get(i).providerInfo;
if (ObjectsCompat.equals(destPi.name, filterPi.name)
&& ObjectsCompat.equals(destPi.packageName, filterPi.packageName)) {
return false;
}
}
return true;
}
@Override
protected VPackage.ProviderIntentInfo[] newArray(int size) {
return new VPackage.ProviderIntentInfo[size];
}
@Override
protected boolean isFilterStopped(VPackage.ProviderIntentInfo filter) {
return false;
}
@Override
protected boolean isPackageForFilter(String packageName, VPackage.ProviderIntentInfo info) {
return packageName.equals(info.provider.owner.packageName);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
protected ResolveInfo newResult(VPackage.ProviderIntentInfo filter, int match, int userId) {
final VPackage.ProviderComponent provider = filter.provider;
PackageSetting ps = (PackageSetting) provider.owner.mExtras;
ProviderInfo pi = PackageParserEx.generateProviderInfo(provider, mFlags, ps.readUserState(userId), userId);
if (pi == null) {
return null;
}
final ResolveInfo res = new ResolveInfo();
res.providerInfo = pi;
if ((mFlags & PackageManager.GET_RESOLVED_FILTER) != 0) {
res.filter = filter.filter;
}
res.priority = filter.filter.getPriority();
res.preferredOrder = provider.owner.mPreferredOrder;
res.match = match;
res.isDefault = filter.hasDefault;
res.labelRes = filter.labelRes;
res.nonLocalizedLabel = filter.nonLocalizedLabel;
res.icon = filter.icon;
return res;
}
@Override
protected void sortResults(List<ResolveInfo> results) {
Collections.sort(results, VPackageManagerService.sResolvePrioritySorter);
}
@Override
protected void dumpFilter(PrintWriter out, String prefix, VPackage.ProviderIntentInfo filter) {
}
@Override
protected Object filterToLabel(VPackage.ProviderIntentInfo filter) {
return filter.provider;
}
protected void dumpFilterLabel(PrintWriter out, String prefix, Object label, int count) {
}
}