code: package com.lody.virtual.client.hook.proxies.location;
  
  import android.content.Context;
  import android.os.Build;
  import android.text.TextUtils;
  
  import com.lody.virtual.client.hook.base.BinderInvocationProxy;
  import com.lody.virtual.client.hook.base.Inject;
  import com.lody.virtual.client.hook.base.LogInvocation;
  import com.lody.virtual.client.hook.base.ReplaceLastPkgMethodProxy;
  import com.lody.virtual.client.stub.VASettings;
  
  import java.lang.reflect.Method;
  
  import mirror.android.location.ILocationManager;
  
  /**
   * @author Lody
   * @see android.location.LocationManager
   */
  @LogInvocation(LogInvocation.Condition.ALWAYS)
  @Inject(MethodProxies.class)
  public class LocationManagerStub extends BinderInvocationProxy {
      public LocationManagerStub() {
          super(ILocationManager.Stub.asInterface, Context.LOCATION_SERVICE);
      }
  
      @Override
      protected void onBindMethods() {
          super.onBindMethods();
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              addMethodProxy(new ReplaceLastPkgMethodProxy("addTestProvider"));
              addMethodProxy(new ReplaceLastPkgMethodProxy("removeTestProvider"));
              addMethodProxy(new ReplaceLastPkgMethodProxy("setTestProviderLocation"));
              addMethodProxy(new ReplaceLastPkgMethodProxy("clearTestProviderLocation"));
              addMethodProxy(new ReplaceLastPkgMethodProxy("setTestProviderEnabled"));
              addMethodProxy(new ReplaceLastPkgMethodProxy("clearTestProviderEnabled"));
              addMethodProxy(new ReplaceLastPkgMethodProxy("setTestProviderStatus"));
              addMethodProxy(new ReplaceLastPkgMethodProxy("clearTestProviderStatus"));
          }
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("addGpsMeasurementsListener", true));
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("addGpsNavigationMessageListener", true));
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("removeGpsMeasurementListener", 0));
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("removeGpsNavigationMessageListener", 0));
          }
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("requestGeofence", 0));
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("removeGeofence", 0));
          }
  
          if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) {
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("addProximityAlert", 0));
          }
  
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("addNmeaListener", 0));
              addMethodProxy(new FakeReplaceLastPkgMethodProxy("removeNmeaListener", 0));
          }
      }
  
      private static class FakeReplaceLastPkgMethodProxy extends ReplaceLastPkgMethodProxy {
          private Object mDefValue;
  
          private FakeReplaceLastPkgMethodProxy(String name, Object def) {
              super(name);
              mDefValue = def;
          }
  
          @Override
          public Object call(Object who, Method method, Object... args) throws Throwable {
              if (isFakeLocationEnable()) {
                  return mDefValue;
              }
              return super.call(who, method, args);
          }
      }
  }
  