/* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.common.util; import javax.annotation.Nullable; import java.io.File; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract; import android.provider.MediaStore; public class UriUtil { /** * http scheme for URIs */ public static final String HTTP_SCHEME = "http"; public static final String HTTPS_SCHEME = "https"; /** * File scheme for URIs */ public static final String LOCAL_FILE_SCHEME = "file"; /** * Content URI scheme for URIs */ public static final String LOCAL_CONTENT_SCHEME = "content"; /** * URI prefix (including scheme) for contact photos */ private static final String LOCAL_CONTACT_IMAGE_PREFIX = Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, "display_photo").getPath(); /** * Asset scheme for URIs */ public static final String LOCAL_ASSET_SCHEME = "asset"; /** * Resource scheme for URIs */ public static final String LOCAL_RESOURCE_SCHEME = "res"; /** * Resource scheme for fully qualified resources which might have a package name that is different * than the application one. This has the constant value of "android.resource". */ public static final String QUALIFIED_RESOURCE_SCHEME = ContentResolver.SCHEME_ANDROID_RESOURCE; /** * Data scheme for URIs */ public static final String DATA_SCHEME = "data"; /** * Check if uri represents network resource * * @param uri uri to check * @return true if uri's scheme is equal to "http" or "https" */ public static boolean isNetworkUri(@Nullable Uri uri) { final String scheme = getSchemeOrNull(uri); return HTTPS_SCHEME.equals(scheme) || HTTP_SCHEME.equals(scheme); } /** * Check if uri represents local file * * @param uri uri to check * @return true if uri's scheme is equal to "file" */ public static boolean isLocalFileUri(@Nullable Uri uri) { final String scheme = getSchemeOrNull(uri); return LOCAL_FILE_SCHEME.equals(scheme); } /** * Check if uri represents local content * * @param uri uri to check * @return true if uri's scheme is equal to "content" */ public static boolean isLocalContentUri(@Nullable Uri uri) { final String scheme = getSchemeOrNull(uri); return LOCAL_CONTENT_SCHEME.equals(scheme); } /** * Checks if the given URI is a general Contact URI, and not a specific display photo. * * @param uri the URI to check * @return true if the uri is a Contact URI, and is not already specifying a display photo. */ public static boolean isLocalContactUri(Uri uri) { return isLocalContentUri(uri) && ContactsContract.AUTHORITY.equals(uri.getAuthority()) && !uri.getPath().startsWith(LOCAL_CONTACT_IMAGE_PREFIX); } /** * Checks if the given URI is for a photo from the device's local media store. * * @param uri the URI to check * @return true if the URI points to a media store photo */ public static boolean isLocalCameraUri(Uri uri) { String uriString = uri.toString(); return uriString.startsWith(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString()) || uriString.startsWith(MediaStore.Images.Media.INTERNAL_CONTENT_URI.toString()); } /** * Check if uri represents local asset * * @param uri uri to check * @return true if uri's scheme is equal to "asset" */ public static boolean isLocalAssetUri(@Nullable Uri uri) { final String scheme = getSchemeOrNull(uri); return LOCAL_ASSET_SCHEME.equals(scheme); } /** * Check if uri represents local resource * * @param uri uri to check * @return true if uri's scheme is equal to {@link #LOCAL_RESOURCE_SCHEME} */ public static boolean isLocalResourceUri(@Nullable Uri uri) { final String scheme = getSchemeOrNull(uri); return LOCAL_RESOURCE_SCHEME.equals(scheme); } /** * Check if uri represents fully qualified resource URI. * * @param uri uri to check * @return true if uri's scheme is equal to {@link #QUALIFIED_RESOURCE_SCHEME} */ public static boolean isQualifiedResourceUri(@Nullable Uri uri) { final String scheme = getSchemeOrNull(uri); return QUALIFIED_RESOURCE_SCHEME.equals(scheme); } /** * Check if the uri is a data uri */ public static boolean isDataUri(@Nullable Uri uri) { return DATA_SCHEME.equals(getSchemeOrNull(uri)); } /** * @param uri uri to extract scheme from, possibly null * @return null if uri is null, result of uri.getScheme() otherwise */ @Nullable public static String getSchemeOrNull(@Nullable Uri uri) { return uri == null ? null : uri.getScheme(); } /** * A wrapper around {@link Uri#parse} that returns null if the input is null. * * @param uriAsString the uri as a string * @return the parsed Uri or null if the input was null */ public static Uri parseUriOrNull(@Nullable String uriAsString) { return uriAsString != null ? Uri.parse(uriAsString) : null; } /** * Get the path of a file from the Uri. * * @param contentResolver the content resolver which will query for the source file * @param srcUri The source uri * @return The Path for the file or null if doesn't exists */ @Nullable public static String getRealPathFromUri(ContentResolver contentResolver, final Uri srcUri) { String result = null; if (isLocalContentUri(srcUri)) { Cursor cursor = null; try { cursor = contentResolver.query(srcUri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); if (idx != -1) { result = cursor.getString(idx); } } } finally { if (cursor != null) { cursor.close(); } } } else if (isLocalFileUri(srcUri)) { result = srcUri.getPath(); } return result; } /** * Returns a URI for a given file using {@link Uri#fromFile(File)}. * * @param file a file with a valid path * @return the URI */ public static Uri getUriForFile(File file) { return Uri.fromFile(file); } /** * Return a URI for the given resource ID. * The returned URI consists of a {@link #LOCAL_RESOURCE_SCHEME} scheme and * the resource ID as path. * * @param resourceId the resource ID to use * @return the URI */ public static Uri getUriForResourceId(int resourceId) { return new Uri.Builder() .scheme(LOCAL_RESOURCE_SCHEME) .path(String.valueOf(resourceId)) .build(); } /** * Returns a URI for the given resource ID in the given package. Use this method only if you need * to specify a package name different to your application's main package. * * @param packageName a package name (e.g. com.facebook.myapp.plugin) * @param resourceId to resource ID to use * @return the URI */ public static Uri getUriForQualifiedResource(String packageName, int resourceId) { return new Uri.Builder() .scheme(QUALIFIED_RESOURCE_SCHEME) .authority(packageName) .path(String.valueOf(resourceId)) .build(); } }