package com.lody.virtual.client.hook.providers;
import android.database.AbstractCursor;
import android.database.Cursor;
import com.lody.virtual.client.core.VirtualCore;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
/**
* @author Lody
*/
public class ExternalProviderHook extends ProviderHook {
private static Map<String, String> mapList = VirtualCore.get().ioRedirectDelegate.getContentReversedRedirect();
private static boolean mapInited = false;
public ExternalProviderHook(Object base) {
super(base);
}
@Override
public Cursor query(Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
return new ProxyCursor(super.query(method, args));
}
@Override
protected void processArgs(Method method, Object... args) {
if (args != null && args.length > 0 && args[0] instanceof String) {
String pkg = (String) args[0];
if (VirtualCore.get().isAppInstalled(pkg)) {
args[0] = VirtualCore.get().getHostPkg();
}
}
}
private class ProxyCursor extends AbstractCursor {
Cursor src;
ProxyCursor(Cursor src) {
if (!mapInited) {
if (VirtualCore.get().ioRedirectDelegate != null)
mapList = VirtualCore.get().ioRedirectDelegate.getContentReversedRedirect();
mapInited = true;
}
this.src = src;
}
@Override
public int getCount() {
return src.getCount();
}
@Override
public String[] getColumnNames() {
return src.getColumnNames();
}
@Override
public String getString(int column) {
String ret = src.getString(column);
if (src.getColumnName(column).equals("_data") && mapList != null) {
for (Map.Entry<String, String> entry : mapList.entrySet())
if (ret.startsWith(entry.getKey()))
return entry.getValue() + ret.substring(entry.getKey().length());
return ret;
}
return ret;
}
@Override
public short getShort(int column) {
return src.getShort(column);
}
@Override
public int getInt(int column) {
return src.getInt(column);
}
@Override
public long getLong(int column) {
return src.getLong(column);
}
@Override
public float getFloat(int column) {
return src.getFloat(column);
}
@Override
public double getDouble(int column) {
return src.getDouble(column);
}
@Override
public boolean isNull(int column) {
return src.isNull(column);
}
@Override
public int getType(int column) {
return src.getType(column);
}
@Override
public boolean onMove(int oldPosition, int newPosition) {
src.moveToPosition(newPosition);
return true;
}
}
}