diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index d651df7c32..9214aabd90 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -511,10 +511,7 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc if (TextUtils.isEmpty(fname)) return uri; - File dir = new File(getFilesDir(), "shared"); - if (!dir.exists()) - dir.mkdir(); - + File dir = Helper.ensureExists(new File(getFilesDir(), "shared")); File file = new File(dir, fname); Log.i("Copying shared file to " + file); diff --git a/app/src/main/java/eu/faircode/email/ActivityEML.java b/app/src/main/java/eu/faircode/email/ActivityEML.java index 7ec434f4c6..e3e10580fd 100644 --- a/app/src/main/java/eu/faircode/email/ActivityEML.java +++ b/app/src/main/java/eu/faircode/email/ActivityEML.java @@ -182,10 +182,7 @@ public class ActivityEML extends ActivityBase { if (uri == null) throw new FileNotFoundException(); - File dir = new File(context.getFilesDir(), "shared"); - if (!dir.exists()) - dir.mkdir(); - + File dir = Helper.ensureExists(new File(context.getFilesDir(), "shared")); File file = new File(dir, "email.eml"); Helper.copy(context, uri, file); diff --git a/app/src/main/java/eu/faircode/email/AdapterCertificate.java b/app/src/main/java/eu/faircode/email/AdapterCertificate.java index c5bbb66eb9..6e7f949f46 100644 --- a/app/src/main/java/eu/faircode/email/AdapterCertificate.java +++ b/app/src/main/java/eu/faircode/email/AdapterCertificate.java @@ -132,10 +132,7 @@ public class AdapterCertificate extends RecyclerView.Adapter 1 && s <= edit.length() && edit.charAt(s - 1) == '\n' && edit.charAt(s - 2) != '\n' && - (s == edit.length() || edit.charAt(s) == '\n') ) + (s == edit.length() || edit.charAt(s) == '\n')) etBody.setSelection(s - 1, s - 1); Pair paragraph = StyleHelper.getParagraph(etBody); @@ -3112,9 +3112,7 @@ public class FragmentCompose extends FragmentBase { }); snackbar.show(); } else { - File dir = new File(context.getFilesDir(), "photo"); - if (!dir.exists()) - dir.mkdir(); + File dir = Helper.ensureExists(new File(context.getFilesDir(), "photo")); File file = new File(dir, working + ".jpg"); try { photoURI = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, file); @@ -3410,9 +3408,7 @@ public class FragmentCompose extends FragmentBase { throw new IllegalArgumentException(context.getString(R.string.title_from_missing)); // Create files - File tmp = new File(context.getFilesDir(), "encryption"); - if (!tmp.exists()) - tmp.mkdir(); + File tmp = Helper.ensureExists(new File(context.getFilesDir(), "encryption")); File input = new File(tmp, draft.id + "_" + session + ".pgp_input"); File output = new File(tmp, draft.id + "_" + session + ".pgp_output"); @@ -3759,9 +3755,7 @@ public class FragmentCompose extends FragmentBase { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean check_certificate = prefs.getBoolean("check_certificate", true); - File tmp = new File(context.getFilesDir(), "encryption"); - if (!tmp.exists()) - tmp.mkdir(); + File tmp = Helper.ensureExists(new File(context.getFilesDir(), "encryption")); DB db = DB.getInstance(context); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 832a40fd5c..3c51ced26e 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -8113,9 +8113,7 @@ public class FragmentMessages extends FragmentBase OutputStream out = null; boolean inline = false; - File tmp = new File(context.getFilesDir(), "encryption"); - if (!tmp.exists()) - tmp.mkdir(); + File tmp = Helper.ensureExists(new File(context.getFilesDir(), "encryption")); File plain = new File(tmp, message.id + ".pgp_out"); // Find encrypted data diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index c0c4ea2483..34caa376fb 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -1108,11 +1108,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc ? context.getExternalFilesDir(null) : context.getFilesDir()); - source = new File(source, "attachments"); - target = new File(target, "attachments"); - - source.mkdirs(); - target.mkdirs(); + source = Helper.ensureExists(new File(source, "attachments")); + target = Helper.ensureExists(new File(target, "attachments")); File[] attachments = source.listFiles(); if (attachments != null) diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index dc2e938126..30e687ec5f 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -149,10 +149,13 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Objects; import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; @@ -2224,6 +2227,22 @@ public class Helper { public static native void sync(); + private static final Map exists = new HashMap<>(); + + static File ensureExists(File dir) { + synchronized (exists) { + if (exists.containsKey(dir)) + return dir; + exists.put(dir, true); + } + + if (!dir.exists()) + if (!dir.mkdirs()) + Log.e("Cannot create directory=" + dir); + + return dir; + } + static String sanitizeFilename(String name) { if (name == null) return null; diff --git a/app/src/main/java/eu/faircode/email/ImageHelper.java b/app/src/main/java/eu/faircode/email/ImageHelper.java index 72c3aeeba6..948b93237b 100644 --- a/app/src/main/java/eu/faircode/email/ImageHelper.java +++ b/app/src/main/java/eu/faircode/email/ImageHelper.java @@ -804,9 +804,7 @@ class ImageHelper { @NonNull static File getCacheFile(Context context, long id, String source, String extension) { - File dir = new File(context.getFilesDir(), "images"); - if (!dir.exists()) - dir.mkdir(); + File dir = Helper.ensureExists(new File(context.getFilesDir(), "images")); return new File(dir, id + "_" + Math.abs(source.hashCode()) + extension); }