Try different cache locations.

This commit is contained in:
Docile-Alligator 2025-10-06 17:18:09 -04:00
parent 482a2d189d
commit c11b0735b0
9 changed files with 77 additions and 22 deletions

View File

@ -386,10 +386,11 @@ public class ViewImageOrGifActivity extends AppCompatActivity implements SetAsWa
@Override @Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
if (getExternalCacheDir() != null) { File cacheDir = Utils.getCacheDir(ViewImageOrGifActivity.this);
if (cacheDir != null) {
Toast.makeText(ViewImageOrGifActivity.this, R.string.save_image_first, Toast.LENGTH_SHORT).show(); Toast.makeText(ViewImageOrGifActivity.this, R.string.save_image_first, Toast.LENGTH_SHORT).show();
SaveBitmapImageToFile.SaveBitmapImageToFile(mExecutor, handler, resource, SaveBitmapImageToFile.SaveBitmapImageToFile(mExecutor, handler, resource,
getExternalCacheDir().getPath(), mImageFileName, cacheDir.getPath(), mImageFileName,
new SaveBitmapImageToFile.SaveBitmapImageToFileListener() { new SaveBitmapImageToFile.SaveBitmapImageToFileListener() {
@Override @Override
public void saveSuccess(File imageFile) { public void saveSuccess(File imageFile) {
@ -432,8 +433,9 @@ public class ViewImageOrGifActivity extends AppCompatActivity implements SetAsWa
@Override @Override
public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) { public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
if (getExternalCacheDir() != null) { File cacheDir = Utils.getCacheDir(ViewImageOrGifActivity.this);
SaveGIFToFile.saveGifToFile(mExecutor, handler, resource, getExternalCacheDir().getPath(), mImageFileName, if (cacheDir != null) {
SaveGIFToFile.saveGifToFile(mExecutor, handler, resource, cacheDir.getPath(), mImageFileName,
new SaveGIFToFile.SaveGIFToFileListener() { new SaveGIFToFile.SaveGIFToFileListener() {
@Override @Override
public void saveSuccess(File imageFile) { public void saveSuccess(File imageFile) {

View File

@ -43,6 +43,7 @@ import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubred
import ml.docilealligator.infinityforreddit.subscribeduser.SubscribedUserData; import ml.docilealligator.infinityforreddit.subscribeduser.SubscribedUserData;
import ml.docilealligator.infinityforreddit.utils.CustomThemeSharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.CustomThemeSharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.utils.Utils;
public class BackupSettings { public class BackupSettings {
public static void backupSettings(Context context, Executor executor, Handler handler, public static void backupSettings(Context context, Executor executor, Handler handler,
@ -61,7 +62,13 @@ public class BackupSettings {
SharedPreferences postHistorySharedPreferences, SharedPreferences postHistorySharedPreferences,
BackupSettingsListener backupSettingsListener) { BackupSettingsListener backupSettingsListener) {
executor.execute(() -> { executor.execute(() -> {
String backupDir = context.getExternalCacheDir() + "/Backup/" + BuildConfig.VERSION_NAME; File cacheDir = Utils.getCacheDir(context);
if (cacheDir == null) {
handler.post(() -> backupSettingsListener.failed(context.getText(R.string.restore_settings_failed_cannot_get_cache_dir).toString()));
return;
}
String backupDir = cacheDir + "/Backup/" + BuildConfig.VERSION_NAME;
File backupDirFile = new File(backupDir); File backupDirFile = new File(backupDir);
if (new File(backupDir).exists()) { if (new File(backupDir).exists()) {
try { try {
@ -134,10 +141,10 @@ public class BackupSettings {
String commentFilterUsageJson = new Gson().toJson(commentFilterUsage); String commentFilterUsageJson = new Gson().toJson(commentFilterUsage);
boolean res19 = saveDatabaseTableToFile(commentFilterUsageJson, databaseDirFile.getAbsolutePath(), "/comment_filter_usage.json"); boolean res19 = saveDatabaseTableToFile(commentFilterUsageJson, databaseDirFile.getAbsolutePath(), "/comment_filter_usage.json");
boolean zipRes = zipAndMoveToDestinationDir(context, contentResolver, destinationDirUri); boolean zipRes = zipAndMoveToDestinationDir(context, cacheDir, contentResolver, destinationDirUri);
try { try {
FileUtils.deleteDirectory(new File(context.getExternalCacheDir() + "/Backup/")); FileUtils.deleteDirectory(new File(cacheDir + "/Backup/"));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -198,18 +205,18 @@ public class BackupSettings {
return true; return true;
} }
private static boolean zipAndMoveToDestinationDir(Context context, ContentResolver contentResolver, Uri destinationDirUri) { private static boolean zipAndMoveToDestinationDir(Context context, File cacheDir, ContentResolver contentResolver, Uri destinationDirUri) {
OutputStream outputStream = null; OutputStream outputStream = null;
boolean result = false; boolean result = false;
try { try {
String time = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date(System.currentTimeMillis())); String time = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date(System.currentTimeMillis()));
String fileName = "Infinity_For_Reddit_Settings_Backup_v" + BuildConfig.VERSION_NAME + "-" + BuildConfig.VERSION_CODE + "-" + time + ".zip"; String fileName = "Infinity_For_Reddit_Settings_Backup_v" + BuildConfig.VERSION_NAME + "-" + BuildConfig.VERSION_CODE + "-" + time + ".zip";
String filePath = context.getExternalCacheDir() + "/Backup/" + fileName; String filePath = cacheDir + "/Backup/" + fileName;
ZipFile zip = new ZipFile(filePath, "123321".toCharArray()); ZipFile zip = new ZipFile(filePath, "123321".toCharArray());
ZipParameters zipParameters = new ZipParameters(); ZipParameters zipParameters = new ZipParameters();
zipParameters.setEncryptFiles(true); zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES); zipParameters.setEncryptionMethod(EncryptionMethod.AES);
zip.addFolder(new File(context.getExternalCacheDir() + "/Backup/" + BuildConfig.VERSION_NAME + "/"), zipParameters); zip.addFolder(new File(cacheDir + "/Backup/" + BuildConfig.VERSION_NAME + "/"), zipParameters);
DocumentFile dir = DocumentFile.fromTreeUri(context, destinationDirUri); DocumentFile dir = DocumentFile.fromTreeUri(context, destinationDirUri);
if (dir == null) { if (dir == null) {

View File

@ -43,6 +43,7 @@ import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubred
import ml.docilealligator.infinityforreddit.subscribeduser.SubscribedUserData; import ml.docilealligator.infinityforreddit.subscribeduser.SubscribedUserData;
import ml.docilealligator.infinityforreddit.utils.CustomThemeSharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.CustomThemeSharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.utils.Utils;
public class RestoreSettings { public class RestoreSettings {
public static void restoreSettings(Context context, Executor executor, Handler handler, public static void restoreSettings(Context context, Executor executor, Handler handler,
@ -68,7 +69,12 @@ public class RestoreSettings {
return; return;
} }
String cachePath = context.getExternalCacheDir() + "/Restore/"; File cacheDir = Utils.getCacheDir(context);
if (cacheDir == null) {
handler.post(() -> restoreSettingsListener.failed(context.getString(R.string.restore_settings_failed_cannot_get_cache_dir)));
return;
}
String cachePath = cacheDir + "/Restore/";
if (new File(cachePath).exists()) { if (new File(cachePath).exists()) {
FileUtils.deleteDirectory(new File(cachePath)); FileUtils.deleteDirectory(new File(cachePath));
} }

View File

@ -235,9 +235,10 @@ public class ViewImgurImageFragment extends Fragment {
@Override @Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
if (activity.getExternalCacheDir() != null) { File cacheDir = Utils.getCacheDir(activity);
if (cacheDir != null) {
Toast.makeText(activity, R.string.save_image_first, Toast.LENGTH_SHORT).show(); Toast.makeText(activity, R.string.save_image_first, Toast.LENGTH_SHORT).show();
SaveBitmapImageToFile.SaveBitmapImageToFile(mExecutor, new Handler(), resource, activity.getExternalCacheDir().getPath(), SaveBitmapImageToFile.SaveBitmapImageToFile(mExecutor, new Handler(), resource, cacheDir.getPath(),
imgurMedia.getFileName(), imgurMedia.getFileName(),
new SaveBitmapImageToFile.SaveBitmapImageToFileListener() { new SaveBitmapImageToFile.SaveBitmapImageToFileListener() {
@Override @Override

View File

@ -405,9 +405,10 @@ public class ViewRedditGalleryImageOrGifFragment extends Fragment {
glide.asBitmap().load(media.hasFallback() ? media.fallbackUrl : media.url).into(new CustomTarget<Bitmap>() { glide.asBitmap().load(media.hasFallback() ? media.fallbackUrl : media.url).into(new CustomTarget<Bitmap>() {
@Override @Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
if (activity.getExternalCacheDir() != null) { File cacheDir = Utils.getCacheDir(activity);
if (cacheDir != null) {
Toast.makeText(activity, R.string.save_image_first, Toast.LENGTH_SHORT).show(); Toast.makeText(activity, R.string.save_image_first, Toast.LENGTH_SHORT).show();
SaveBitmapImageToFile.SaveBitmapImageToFile(mExecutor, handler, resource, activity.getExternalCacheDir().getPath(), SaveBitmapImageToFile.SaveBitmapImageToFile(mExecutor, handler, resource, cacheDir.getPath(),
media.fileName, media.fileName,
new SaveBitmapImageToFile.SaveBitmapImageToFileListener() { new SaveBitmapImageToFile.SaveBitmapImageToFileListener() {
@Override @Override
@ -451,8 +452,9 @@ public class ViewRedditGalleryImageOrGifFragment extends Fragment {
@Override @Override
public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) { public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
if (activity.getExternalCacheDir() != null) { File cacheDir = Utils.getCacheDir(activity);
SaveGIFToFile.saveGifToFile(mExecutor, handler, resource, activity.getExternalCacheDir().getPath(), media.fileName, if (cacheDir != null) {
SaveGIFToFile.saveGifToFile(mExecutor, handler, resource, cacheDir.getPath(), media.fileName,
new SaveGIFToFile.SaveGIFToFileListener() { new SaveGIFToFile.SaveGIFToFileListener() {
@Override @Override
public void saveSuccess(File imageFile) { public void saveSuccess(File imageFile) {

View File

@ -53,6 +53,7 @@ import ml.docilealligator.infinityforreddit.broadcastreceivers.DownloadedMediaDe
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.utils.NotificationUtils; import ml.docilealligator.infinityforreddit.utils.NotificationUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.utils.Utils;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
import retrofit2.Response; import retrofit2.Response;
@ -181,7 +182,7 @@ public class DownloadRedditVideoService extends JobService {
boolean separateDownloadFolder = sharedPreferences.getBoolean(SharedPreferencesUtils.SEPARATE_FOLDER_FOR_EACH_SUBREDDIT, false); boolean separateDownloadFolder = sharedPreferences.getBoolean(SharedPreferencesUtils.SEPARATE_FOLDER_FOR_EACH_SUBREDDIT, false);
File externalCacheDirectory = getExternalCacheDir(); File externalCacheDirectory = Utils.getCacheDir(this);
if (externalCacheDirectory != null) { if (externalCacheDirectory != null) {
String destinationFileName = fileNameWithoutExtension + ".mp4"; String destinationFileName = fileNameWithoutExtension + ".mp4";
String finalFileNameWithoutExtension = fileNameWithoutExtension; String finalFileNameWithoutExtension = fileNameWithoutExtension;

View File

@ -16,6 +16,7 @@ import android.os.PersistableBundle;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import androidx.core.app.NotificationChannelCompat; import androidx.core.app.NotificationChannelCompat;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationManagerCompat;
@ -62,6 +63,7 @@ import ml.docilealligator.infinityforreddit.post.SubmitPost;
import ml.docilealligator.infinityforreddit.utils.APIUtils; import ml.docilealligator.infinityforreddit.utils.APIUtils;
import ml.docilealligator.infinityforreddit.utils.JSONUtils; import ml.docilealligator.infinityforreddit.utils.JSONUtils;
import ml.docilealligator.infinityforreddit.utils.NotificationUtils; import ml.docilealligator.infinityforreddit.utils.NotificationUtils;
import ml.docilealligator.infinityforreddit.utils.Utils;
import okhttp3.ConnectionPool; import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import retrofit2.Response; import retrofit2.Response;
@ -291,6 +293,7 @@ public class SubmitPostService extends JobService {
.build(); .build();
} }
@WorkerThread
private void submitTextOrLinkPost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset, private void submitTextOrLinkPost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset,
Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount,
String subredditName, String title, String content, @Nullable String url, String subredditName, String title, String content, @Nullable String url,
@ -316,6 +319,7 @@ public class SubmitPostService extends JobService {
}); });
} }
@WorkerThread
private void submitCrosspost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset, private void submitCrosspost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset,
Executor executor, Handler handler, Retrofit newAuthenticatorOauthRetrofit, Executor executor, Handler handler, Retrofit newAuthenticatorOauthRetrofit,
Account selectedAccount, String subredditName, Account selectedAccount, String subredditName,
@ -340,6 +344,7 @@ public class SubmitPostService extends JobService {
}); });
} }
@WorkerThread
private void submitImagePost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset, private void submitImagePost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset,
Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, Uri mediaUri, Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, Uri mediaUri,
String subredditName, String title, String content, Flair flair, String subredditName, String title, String content, Flair flair,
@ -373,6 +378,7 @@ public class SubmitPostService extends JobService {
} }
} }
@WorkerThread
private void submitVideoPost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset, private void submitVideoPost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset,
Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, Uri mediaUri, Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, Uri mediaUri,
String subredditName, String title, String content, Flair flair, String subredditName, String title, String content, Flair flair,
@ -380,11 +386,16 @@ public class SubmitPostService extends JobService {
try { try {
InputStream in = getContentResolver().openInputStream(mediaUri); InputStream in = getContentResolver().openInputStream(mediaUri);
String type = getContentResolver().getType(mediaUri); String type = getContentResolver().getType(mediaUri);
File cacheDir = Utils.getCacheDir(this);
if (cacheDir == null) {
handler.post(() -> EventBus.getDefault().post(new SubmitVideoOrGifPostEvent(false, false, getString(R.string.submit_video_or_gif_post_failed_cannot_get_cache_directory))));
return;
}
String cacheFilePath; String cacheFilePath;
if (type != null && type.contains("gif")) { if (type != null && type.contains("gif")) {
cacheFilePath = getExternalCacheDir() + "/" + mediaUri.getLastPathSegment() + ".gif"; cacheFilePath = cacheDir + "/" + mediaUri.getLastPathSegment() + ".gif";
} else { } else {
cacheFilePath = getExternalCacheDir() + "/" + mediaUri.getLastPathSegment() + ".mp4"; cacheFilePath = cacheDir + "/" + mediaUri.getLastPathSegment() + ".mp4";
} }
copyFileToCache(in, cacheFilePath); copyFileToCache(in, cacheFilePath);
@ -431,6 +442,7 @@ public class SubmitPostService extends JobService {
} }
} }
@WorkerThread
private void submitGalleryPost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset, private void submitGalleryPost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset,
Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, String payload) { Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, String payload) {
try { try {
@ -468,6 +480,7 @@ public class SubmitPostService extends JobService {
} }
} }
@WorkerThread
private void submitPollPost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset, private void submitPollPost(JobParameters parameters, NotificationManagerCompat manager, int randomNotificationIdOffset,
Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, String payload) { Retrofit newAuthenticatorOauthRetrofit, Account selectedAccount, String payload) {
try { try {

View File

@ -41,6 +41,7 @@ import com.google.android.material.textfield.TextInputLayout;
import org.json.JSONException; import org.json.JSONException;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -53,8 +54,8 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import io.noties.markwon.core.spans.CustomTypefaceSpan; import io.noties.markwon.core.spans.CustomTypefaceSpan;
import ml.docilealligator.infinityforreddit.thing.MediaMetadata;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.thing.MediaMetadata;
import ml.docilealligator.infinityforreddit.thing.SortType; import ml.docilealligator.infinityforreddit.thing.SortType;
import ml.docilealligator.infinityforreddit.thing.UploadedImage; import ml.docilealligator.infinityforreddit.thing.UploadedImage;
import retrofit2.Retrofit; import retrofit2.Retrofit;
@ -510,4 +511,24 @@ public final class Utils {
public static <T> int fixIndexOutOfBoundsUsingPredetermined(T[] array, int index, int predeterminedIndex) { public static <T> int fixIndexOutOfBoundsUsingPredetermined(T[] array, int index, int predeterminedIndex) {
return index >= array.length ? predeterminedIndex : index; return index >= array.length ? predeterminedIndex : index;
} }
@Nullable
public static File getCacheDir(Context context) {
File cacheDir = context.getExternalCacheDir();
if (cacheDir != null) {
return cacheDir;
}
cacheDir = context.getCacheDir();
if (cacheDir != null) {
return cacheDir;
}
cacheDir = context.getExternalFilesDir(null);
if (cacheDir != null) {
return cacheDir;
}
return context.getFilesDir();
}
} }

View File

@ -53,7 +53,7 @@
<string name="action_download">Download</string> <string name="action_download">Download</string>
<string name="action_refresh">Refresh</string> <string name="action_refresh">Refresh</string>
<string name="action_add_comment">Add a comment</string> <string name="action_add_comment">Send comment</string>
<string name="action_save_post">Save post</string> <string name="action_save_post">Save post</string>
<string name="action_view_crosspost_parent">View crosspost parent</string> <string name="action_view_crosspost_parent">View crosspost parent</string>
<string name="action_search">Search</string> <string name="action_search">Search</string>
@ -250,6 +250,7 @@
<string name="no_camera_available">No camera app available</string> <string name="no_camera_available">No camera app available</string>
<string name="error_creating_temp_file">Error creating temp file</string> <string name="error_creating_temp_file">Error creating temp file</string>
<string name="submit_video_or_gif_post_failed_cannot_get_cache_directory">Unable to submit post: cannot access cache directory</string>
<string name="video_is_processing">Video is processing. Please wait.</string> <string name="video_is_processing">Video is processing. Please wait.</string>
<string name="image_is_processing">Image is processing. Please wait.</string> <string name="image_is_processing">Image is processing. Please wait.</string>
<string name="gif_is_processing">Gif is processing. Please wait.</string> <string name="gif_is_processing">Gif is processing. Please wait.</string>
@ -1232,6 +1233,7 @@
<string name="restore_settings_partially_failed">Some settings may not be restored successfully. Restart the app to see the changes.</string> <string name="restore_settings_partially_failed">Some settings may not be restored successfully. Restart the app to see the changes.</string>
<string name="restore_settings_failed_file_corrupted">Cannot restore settings. The file may be corrupted.</string> <string name="restore_settings_failed_file_corrupted">Cannot restore settings. The file may be corrupted.</string>
<string name="restore_settings_failed_cannot_get_file">Cannot access the file</string> <string name="restore_settings_failed_cannot_get_file">Cannot access the file</string>
<string name="restore_settings_failed_cannot_get_cache_dir">Cannot access cache directory</string>
<string name="suicide_prevention_quote">If you are looking for a sign not to kill yourself, this is it.\u2764</string> <string name="suicide_prevention_quote">If you are looking for a sign not to kill yourself, this is it.\u2764</string>
<string name="do_not_show_this_again">Don\'t show this again</string> <string name="do_not_show_this_again">Don\'t show this again</string>