package com.lody.virtual.client.hook.patchs.location;
import android.content.Context;
import android.os.Build;
import android.text.TextUtils;
import com.lody.virtual.client.hook.base.PatchBinderDelegate;
import com.lody.virtual.client.hook.base.ReplaceLastPkgHook;
import java.lang.reflect.Method;
import mirror.android.location.ILocationManager;
import mirror.android.location.LocationRequestL;
/**
* @author Lody
*
* @see android.location.LocationManager
*/
public class LocationManagerPatch extends PatchBinderDelegate {
public LocationManagerPatch() {
super(ILocationManager.Stub.TYPE, Context.LOCATION_SERVICE);
}
private static class BaseHook extends ReplaceLastPkgHook {
public BaseHook(String name) {
super(name);
}
@Override
public Object call(Object who, Method method, Object... args) throws Throwable {
if (args.length > 0) {
Object request = args[0];
if (LocationRequestL.mHideFromAppOps != null) {
LocationRequestL.mHideFromAppOps.set(request, false);
}
if (LocationRequestL.mWorkSource != null) {
LocationRequestL.mWorkSource.set(request, null);
}
}
return super.call(who, method, args);
}
}
@Override
protected void onBindHooks() {
super.onBindHooks();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
addHook(new ReplaceLastPkgHook("addTestProvider"));
addHook(new ReplaceLastPkgHook("removeTestProvider"));
addHook(new ReplaceLastPkgHook("setTestProviderLocation"));
addHook(new ReplaceLastPkgHook("clearTestProviderLocation"));
addHook(new ReplaceLastPkgHook("setTestProviderEnabled"));
addHook(new ReplaceLastPkgHook("clearTestProviderEnabled"));
addHook(new ReplaceLastPkgHook("setTestProviderStatus"));
addHook(new ReplaceLastPkgHook("clearTestProviderStatus"));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
addHook(new ReplaceLastPkgHook("addGpsMeasurementsListener"));
addHook(new ReplaceLastPkgHook("addGpsNavigationMessageListener"));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
addHook(new ReplaceLastPkgHook("addGpsStatusListener"));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
addHook(new BaseHook("requestLocationUpdates"));
addHook(new ReplaceLastPkgHook("removeUpdates"));
addHook(new ReplaceLastPkgHook("requestGeofence"));
addHook(new ReplaceLastPkgHook("removeGeofence"));
addHook(new BaseHook("getLastLocation"));
}
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN
&& TextUtils.equals(Build.VERSION.RELEASE, "4.1.2")) {
addHook(new ReplaceLastPkgHook("requestLocationUpdates"));
addHook(new ReplaceLastPkgHook("requestLocationUpdatesPI"));
addHook(new ReplaceLastPkgHook("removeUpdates"));
addHook(new ReplaceLastPkgHook("removeUpdatesPI"));
addHook(new ReplaceLastPkgHook("addProximityAlert"));
addHook(new ReplaceLastPkgHook("getLastKnownLocation"));
}
}
}