code: package com.lody.virtual.client.ipc;
  
  import android.content.Context;
  import android.net.Uri;
  import android.os.Bundle;
  import android.os.Parcelable;
  
  import com.lody.virtual.client.core.VirtualCore;
  import com.lody.virtual.helper.compat.ContentProviderCompat;
  
  import java.io.Serializable;
  
  /**
   * @author Lody
   *
   */
  public class ProviderCall {
  
  	public static Bundle call(String authority, String methodName, String arg, Bundle bundle) {
  		return call(authority, VirtualCore.get().getContext(), methodName, arg, bundle);
  	}
  
  	public static Bundle call(String authority, Context context, String method, String arg, Bundle bundle) {
  		Uri uri = Uri.parse("content://" + authority);
  		return ContentProviderCompat.call(context, uri, method, arg, bundle);
  	}
  
  	public static final class Builder {
  
  		private Context context;
  
  		private Bundle bundle = new Bundle();
  
  		private String method;
  		private String auth;
  		private String arg;
  
  		public Builder(Context context, String auth) {
  			this.context = context;
  			this.auth = auth;
  		}
  
  		public Builder methodName(String name) {
  			this.method = name;
  			return this;
  		}
  
  		public Builder arg(String arg) {
  			this.arg = arg;
  			return this;
  		}
  
  		public Builder addArg(String key, Object value) {
  			if (value != null) {
  				 if (value instanceof Boolean) {
  					bundle.putBoolean(key, (Boolean) value);
  				} else if (value instanceof Integer) {
  					bundle.putInt(key, (Integer) value);
  				} else if (value instanceof String) {
  					bundle.putString(key, (String) value);
  				} else if (value instanceof Serializable) {
  					bundle.putSerializable(key, (Serializable) value);
  				} else if (value instanceof Bundle) {
  					bundle.putBundle(key, (Bundle) value);
  				} else if (value instanceof Parcelable) {
  					bundle.putParcelable(key, (Parcelable) value);
  				} else {
  					throw new IllegalArgumentException("Unknown type " + value.getClass() + " in Bundle.");
  				}
  			}
  			return this;
  		}
  
  		public Bundle call() {
  			return ProviderCall.call(auth, context, method, arg, bundle);
  		}
  
  	}
  
  }
  