package com.vaguehope.onosendai.util;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.content.Context;
import android.net.Uri;
import android.support.v4.content.FileProvider;
public final class FileHelper {
private static final Random RANDOM = new Random();
private FileHelper () {
throw new AssertionError();
}
/**
* This file will not already exist.
*/
public static File newFileInDir(final File dir, final String nameHint) {
final String name = makeSafeName(nameHint);
File f = new File(dir, name);
if (!f.exists()) return f;
final int x = name.lastIndexOf(".");
final String baseName = x > 0 ? name.substring(0, x) : name;
final String ext = x > 0 ? name.substring(x) : ""; // With '.'.
while (true) {
f = new File(dir, baseName + "." + RANDOM.nextInt(100000) + ext);
if (!f.exists()) return f;
}
}
public static String makeSafeName (final String name) {
return name.replaceAll("[^a-zA-Z0-9\\.-]+", "_");
}
public static ArrayList<Uri> filesToProvidedUris (final Context context, final List<File> files) {
final ArrayList<Uri> uris = new ArrayList<Uri>();
for (final File file : files) {
uris.add(FileProvider.getUriForFile(context, "com.vaguehope.onosendai.fileprovider", file));
}
return uris;
}
/**
* Returns null if can not determine.
*/
public static String nameFromPath (final String path) {
if (StringHelper.isEmpty(path)) return null;
final String cleanedPath = path
.replaceFirst("^https?://", "")
.replaceFirst("//+", "")
.replaceFirst("^/", "")
.replaceFirst("/$", "");
if (StringHelper.isEmpty(cleanedPath)) return null;
return makeSafeName(cleanedPath);
}
public static void touchFile (final File f, final long graceMillis) throws IOException {
if (!f.exists()) f.createNewFile();
final long now = System.currentTimeMillis();
final long lastModified = f.lastModified();
if (lastModified != 0) {
if (now - lastModified > graceMillis && !f.setLastModified(now)) {
throw new IOException(String.format("Failed to update last modified date for '%s'.", f.getAbsolutePath()));
}
}
else {
throw new IOException(String.format("Failed to read last modified date for '%s'.", f.getAbsolutePath()));
}
}
}