package com.reactnative.ivpusic.imagepicker;

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.content.ContentUris;
import android.os.Environment;

public class RealPathUtil {
  public static String getRealPathFromURI(final Context context, final Uri uri) {

      final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

      // DocumentProvider
      if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
          // ExternalStorageProvider
          if (isExternalStorageDocument(uri)) {
              final String docId = DocumentsContract.getDocumentId(uri);
              final String[] split = docId.split(":");
              final String type = split[0];

              return Environment.getExternalStorageDirectory() + "/" + split[1];
          }
          // DownloadsProvider
          else if (isDownloadsDocument(uri)) {

              final String id = DocumentsContract.getDocumentId(uri);
              final Uri contentUri = ContentUris.withAppendedId(
                      Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

              return getDataColumn(context, contentUri, null, null);
          }
          // MediaProvider
          else if (isMediaDocument(uri)) {
              final String docId = DocumentsContract.getDocumentId(uri);
              final String[] split = docId.split(":");
              final String type = split[0];

              Uri contentUri = null;
              if ("image".equals(type)) {
                  contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
              } else if ("video".equals(type)) {
                  contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
              } else if ("audio".equals(type)) {
                  contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
              }

              final String selection = "_id=?";
              final String[] selectionArgs = new String[] {
                      split[1]
              };

              return getDataColumn(context, contentUri, selection, selectionArgs);
          }
      }
      // MediaStore (and general)
      else if ("content".equalsIgnoreCase(uri.getScheme())) {

          // Return the remote address
          if (isGooglePhotosUri(uri))
              return uri.getLastPathSegment();

          return getDataColumn(context, uri, null, null);
      }
      // File
      else if ("file".equalsIgnoreCase(uri.getScheme())) {
          return uri.getPath();
      }

      return null;
  }

  /**
   * Get the value of the data column for this Uri. This is useful for
   * MediaStore Uris, and other file-based ContentProviders.
   *
   * @param context The context.
   * @param uri The Uri to query.
   * @param selection (Optional) Filter used in the query.
   * @param selectionArgs (Optional) Selection arguments used in the query.
   * @return The value of the _data column, which is typically a file path.
   */
  public static String getDataColumn(Context context, Uri uri, String selection,
          String[] selectionArgs) {

      Cursor cursor = null;
      final String column = "_data";
      final String[] projection = {
              column
      };

      try {
          cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                  null);
          if (cursor != null && cursor.moveToFirst()) {
              final int index = cursor.getColumnIndexOrThrow(column);
              return cursor.getString(index);
          }
      } finally {
          if (cursor != null)
              cursor.close();
      }
      return null;
  }


  /**
   * @param uri The Uri to check.
   * @return Whether the Uri authority is ExternalStorageProvider.
   */
  public static boolean isExternalStorageDocument(Uri uri) {
      return "com.android.externalstorage.documents".equals(uri.getAuthority());
  }

  /**
   * @param uri The Uri to check.
   * @return Whether the Uri authority is DownloadsProvider.
   */
  public static boolean isDownloadsDocument(Uri uri) {
      return "com.android.providers.downloads.documents".equals(uri.getAuthority());
  }

  /**
   * @param uri The Uri to check.
   * @return Whether the Uri authority is MediaProvider.
   */
  public static boolean isMediaDocument(Uri uri) {
      return "com.android.providers.media.documents".equals(uri.getAuthority());
  }

  /**
   * @param uri The Uri to check.
   * @return Whether the Uri authority is Google Photos.
   */
  public static boolean isGooglePhotosUri(Uri uri) {
      return "com.google.android.apps.photos.content".equals(uri.getAuthority());
  }

}

@@ -297,16 +297,84 @@
 ronment;
+%0Aimport android.support.annotation.RequiresApi;%0Aimport java.io.File;
 %0A%0Apublic
@@ -910,32 +910,90 @@
 pe = split%5B0%5D;%0A%0A
+              if (%22primary%22.equalsIgnoreCase(type)) %7B%0A    
               re
@@ -1057,16 +1057,673 @@
 lit%5B1%5D;%0A
+              %7D else %7B%0A                final int splitIndex = docId.indexOf(':', 1);%0A                final String tag = docId.substring(0, splitIndex);%0A                final String path = docId.substring(splitIndex + 1);%0A%0A                String nonPrimaryVolume = getPathToNonPrimaryVolume(context, tag);%0A                if (nonPrimaryVolume != null) %7B%0A                    String result = nonPrimaryVolume + %22/%22 + path;%0A                    File file = new File(result);%0A                    if (file.exists() && file.canRead()) %7B%0A                        return result;%0A                    %7D%0A                    return null;%0A                %7D%0A              %7D%0A
         
@@ -5567,10 +5567,652 @@
 );%0A  %7D%0A%0A
+  @RequiresApi(Build.VERSION_CODES.KITKAT)%0A  public static String getPathToNonPrimaryVolume(Context context, String tag) %7B%0A      File%5B%5D volumes = context.getExternalCacheDirs();%0A      if (volumes != null) %7B%0A          for (File volume : volumes) %7B%0A              if (volume != null) %7B%0A                  String path = volume.getAbsolutePath();%0A                  if (path != null) %7B%0A                      int index = path.indexOf(tag);%0A                      if (index != -1) %7B%0A                          return path.substring(0, index) + tag;%0A                      %7D%0A                  %7D%0A              %7D%0A          %7D%0A      %7D%0A      return null;%0A  %7D%0A%0A
 %7D%0A

Fix resolving external storage paths