content: package com.lody.virtual.helper.compat;
  
  import android.content.ContentProviderClient;
  import android.content.Context;
  import android.net.Uri;
  import android.os.Build;
  import android.os.Build.VERSION;
  import android.os.Bundle;
  import android.os.RemoteException;
  import android.os.SystemClock;
  
  /**
   * @author Lody
   */
  public class ContentProviderCompat {
  
      public static Bundle call(Context context, Uri uri, String method, String arg, Bundle extras) {
          if (VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
              return context.getContentResolver().call(uri, method, arg, extras);
          }
          ContentProviderClient client = crazyAcquireContentProvider(context, uri);
          Bundle res = null;
          try {
              res = client.call(method, arg, extras);
          } catch (RemoteException e) {
              e.printStackTrace();
          } finally {
              releaseQuietly(client);
          }
          return res;
      }
  
  
      private static ContentProviderClient acquireContentProviderClient(Context context, Uri uri) {
          if (VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
              return context.getContentResolver().acquireUnstableContentProviderClient(uri);
          }
          return context.getContentResolver().acquireContentProviderClient(uri);
      }
  
      public static ContentProviderClient crazyAcquireContentProvider(Context context, Uri uri) {
          ContentProviderClient client = acquireContentProviderClient(context, uri);
          if (client == null) {
              int retry = 0;
              while (retry < 5 && client == null) {
                  SystemClock.sleep(100);
                  retry++;
                  client = acquireContentProviderClient(context, uri);
              }
          }
          return client;
      }
  
      public static ContentProviderClient crazyAcquireContentProvider(Context context, String name) {
          ContentProviderClient client = acquireContentProviderClient(context, name);
          if (client == null) {
              int retry = 0;
              while (retry < 5 && client == null) {
                  SystemClock.sleep(100);
                  retry++;
                  client = acquireContentProviderClient(context, name);
              }
          }
          return client;
      }
  
      private static ContentProviderClient acquireContentProviderClient(Context context, String name) {
          if (VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
              return context.getContentResolver().acquireUnstableContentProviderClient(name);
          }
          return context.getContentResolver().acquireContentProviderClient(name);
      }
  
      public static void releaseQuietly(ContentProviderClient client) {
          if (client != null) {
              try {
                  if (VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                      client.close();
                  } else {
                      client.release();
                  }
              } catch (Exception ignored) {
              }
          }
      }
  }