content: package com.lody.virtual.server.secondary;
  
  import android.content.ComponentName;
  import android.os.Binder;
  import android.os.IBinder;
  import android.os.RemoteException;
  
  import com.lody.virtual.server.IBinderDelegateService;
  
  import java.util.HashMap;
  import java.util.Map;
  
  /**
   * @author Lody
   */
  
  public class BinderDelegateService extends IBinderDelegateService.Stub {
  
      private ComponentName name;
      private IBinder service;
  
      private interface ProxyBinderFactory {
          IBinder create(Binder binder);
      }
      private static final Map<String, ProxyBinderFactory> mFactories = new HashMap<>();
      static {
          mFactories.put("android.accounts.IAccountAuthenticator", new ProxyBinderFactory() {
              @Override
              public IBinder create(Binder binder) {
                  return new FakeIdentityBinder(binder);
              }
          });
      }
  
      public BinderDelegateService(ComponentName name, IBinder service) {
          this.name = name;
          if (service instanceof Binder) {
              Binder localService = (Binder) service;
              ProxyBinderFactory factory = mFactories.get(localService.getInterfaceDescriptor());
              if (factory != null) {
                  service = factory.create(localService);
              }
          }
          this.service = service;
      }
  
      @Override
      public ComponentName getComponent() throws RemoteException {
          return name;
      }
  
      @Override
      public IBinder getService() throws RemoteException {
          return service;
      }
  }
  