/** * @param uri the file uri * @return file represented by uri, or null if it can't be resolved */ @Nullable private File getFileForUri(@NonNull Uri uri) { if (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) || !authority.equals(uri.getAuthority())) { return null; } final List<String> segments = new ArrayList<>(uri.getPathSegments()); if (segments.size() < 2) return null; final String dir = segments.remove(0).toUpperCase(); try { final Directory directory = Directory.valueOf(dir); //noinspection ConstantConditions return directory.getFile(getContext(), TextUtils.join(File.separator, segments)); } catch (IllegalArgumentException e) { return null; } }
@NonNull @Override public File getFile(@NonNull Context context, @NonNull String fileName) { return (fileName.startsWith("/") ? Directory.ROOT : Directory.FILES).getFile(context, fileName); } },
/** * Get an uri for this content provider for the given file * * @param context a context * @param directory the directory, to with the path is relative * @param relativePath the file path * @return the uri */ @SuppressWarnings("WeakerAccess") @NonNull public static Uri getUriForFile(@NonNull Context context, @NonNull Directory directory, @NonNull String relativePath) { final Uri.Builder builder = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(getAuthority(context)) .appendPath(directory.name().toLowerCase()); for (String segment : relativePath.split(Pattern.quote(File.separator))) { if (segment.length() > 0) { builder.appendPath(segment); } } return builder.build(); }
@Override void collect(@NonNull ReportField reportField, @NonNull Context context, @NonNull CoreConfiguration config, @NonNull ReportBuilder reportBuilder, @NonNull CrashReportData target) throws IOException { target.put(ReportField.APPLICATION_LOG, new StreamReader(config.applicationLogFileDir().getFile(context, config.applicationLogFile())) .setLimit(config.applicationLogFileLines()).read()); } }