package com.gh4a.utils; import android.util.Log; import android.webkit.MimeTypeMap; import com.gh4a.Gh4Application; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; public class FileUtils { private static final List<String> MARKDOWN_EXTS = Arrays.asList( "markdown", "md", "mdown", "mkdn", "mkd" ); private static final HashMap<String, String> MIME_TYPE_OVERRIDES = new HashMap<>(); static { // .ts can be both a TypeScript file and a MPEG2 transport stream file. As the former is the // more likely case for us and the framework returns the latter, override to assume a text file. MIME_TYPE_OVERRIDES.put("ts", "text/x-typescript"); } public static boolean save(File file, InputStream inputStream) { OutputStream out = null; try { out = new FileOutputStream(file); int read; byte[] bytes = new byte[1024]; while ((read = inputStream.read(bytes)) != -1) { out.write(bytes, 0, read); } return true; } catch (IOException e) { Log.e(Gh4Application.LOG_TAG, e.getMessage(), e); } finally { try { if (inputStream != null) { inputStream.close(); } if (out != null) { out.flush(); out.close(); } } catch (IOException e) { Log.e(Gh4Application.LOG_TAG, e.getMessage(), e); } } return false; } public static String getFileExtension(String filename) { int mid = filename.lastIndexOf("."); if (mid == -1) { return ""; } return filename.substring(mid + 1, filename.length()); } public static String getFileName(String path) { if (StringUtils.isBlank(path)) { return ""; } int mid = path.lastIndexOf("/"); if (mid == -1) { return path; } return path.substring(mid + 1, path.length()); } public static boolean isImage(String filename) { String mime = getMimeTypeFor(filename); return mime != null && mime.startsWith("image/"); } public static boolean isBinaryFormat(String filename) { String mime = getMimeTypeFor(filename); return mime != null && !mime.startsWith("text/") // cover cases like application/xhtml+xml or image/svg+xml && !mime.endsWith("+xml"); } public static boolean isMarkdown(String filename) { return isExtensionIn(filename, MARKDOWN_EXTS); } public static String getMimeTypeFor(String filename) { String extension = filename == null ? null : getFileExtension(filename); if (StringUtils.isBlank(extension)) { return null; } if (MIME_TYPE_OVERRIDES.containsKey(extension)) { return MIME_TYPE_OVERRIDES.get(extension); } return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } private static boolean isExtensionIn(String filename, List<String> extensions) { String extension = filename == null ? null : getFileExtension(filename); if (StringUtils.isBlank(extension)) { return false; } return extensions.contains(extension.toLowerCase(Locale.US)); } }