package mil.nga.dice.report; import android.content.Context; import android.net.Uri; import android.os.Environment; import java.io.File; import java.io.FileFilter; import java.util.Arrays; import java.util.Collections; import java.util.Set; import java.util.TreeSet; import mil.nga.dice.DICEConstants; /** * Report utilities */ public class ReportUtils { public static final String DELETE_FILE_PREFIX = ".deleting."; private static final Set<String> supportedReportFileTypes; static { Set<String> types = new TreeSet<>(Arrays.asList(new String[]{ "zip", "application/zip", "pdf", "application/pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx" })); supportedReportFileTypes = Collections.unmodifiableSet(types); } /** * Get the base report directory * * @return report directories */ public static File getReportDirectory() { return new File(Environment.getExternalStorageDirectory(), DICEConstants.DICE_REPORT_DIRECTORY); } /** * Get the report directories * * @return report directories */ public static File[] getReportDirectories(final Context context) { File reportDirectory = getReportDirectory(); File[] reportDirectories = getReportDirectories(context, reportDirectory); return reportDirectories; } /** * Get the report directories from the provided base report directory * * @param reportDirectory * @return report directories */ public static File[] getReportDirectories(final Context context, File reportDirectory) { File[] existingReports = reportDirectory.listFiles(new FileFilter() { @Override public boolean accept(File path) { return !path.getName().startsWith(DELETE_FILE_PREFIX) && (uriCouldBeReport(context, Uri.fromFile(path)) || pathIsHtmlContentRoot(path)); } }); return existingReports; } private static boolean pathIsHtmlContentRoot(File path) { if (!path.isDirectory()) { return false; } File index = new File(path, "index.html"); return index.exists(); } public static boolean uriCouldBeReport(Context context, Uri uri) { String ext = extensionOfFile(uri.getPath()).toLowerCase(); if (supportedReportFileTypes.contains(ext)) { return true; } String mimeType = context.getContentResolver().getType(uri); if (mimeType != null) { return supportedReportFileTypes.contains(mimeType); } return false; } /** * Get the extension of the file * @param path path * @return extension */ public static String extensionOfFile(String path) { int dot = path.lastIndexOf('.'); if (dot < 0 || dot > path.length() - 2) { return ""; } return path.substring(dot + 1); } /** * Get the local report path * @param path full path * @return local path */ public static String localReportPath(File path){ String reportFile = getReportDirectory().getAbsolutePath() + File.separator; String localPath = path.getAbsolutePath(); if(localPath.startsWith(reportFile)){ localPath = localPath.substring(reportFile.length()); } return localPath; } }