Fix issue with KitKat picture saves.

Fixes #10153
fork-5.53.8
Alex Hart 2020-11-02 16:28:51 -04:00 zatwierdzone przez Alan Evans
rodzic ed17701a0a
commit a264d10685
2 zmienionych plików z 35 dodań i 23 usunięć

Wyświetl plik

@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.util;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface.OnClickListener;
@ -28,6 +29,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ref.WeakReference;
import java.text.SimpleDateFormat;
import java.util.Objects;
public class SaveAttachmentTask extends ProgressDialogAsyncTask<SaveAttachmentTask.Attachment, Void, Pair<Integer, String>> {
private static final String TAG = SaveAttachmentTask.class.getSimpleName();
@ -87,7 +89,7 @@ public class SaveAttachmentTask extends ProgressDialogAsyncTask<SaveAttachmentTa
private @Nullable String saveAttachment(Context context, Attachment attachment) throws IOException
{
String contentType = MediaUtil.getCorrectedMimeType(attachment.contentType);
String contentType = Objects.requireNonNull(MediaUtil.getCorrectedMimeType(attachment.contentType));
String fileName = attachment.fileName;
if (fileName == null) fileName = generateOutputFileName(contentType, attachment.date);
@ -102,13 +104,13 @@ public class SaveAttachmentTask extends ProgressDialogAsyncTask<SaveAttachmentTa
return null;
}
if (outputUri.equals(StorageUtil.getLegacyDownloadUri())) {
if (Objects.equals(outputUri.getScheme(), ContentResolver.SCHEME_FILE)) {
try (OutputStream outputStream = new FileOutputStream(mediaUri.getPath())) {
Util.copy(inputStream, outputStream);
MediaScannerConnection.scanFile(context, new String[]{mediaUri.getPath()}, new String[]{contentType}, null);
}
} else {
try (OutputStream outputStream = context.getContentResolver().openOutputStream(mediaUri)) {
try (OutputStream outputStream = context.getContentResolver().openOutputStream(mediaUri, "w")) {
Util.copy(inputStream, outputStream);
}
}
@ -166,7 +168,7 @@ public class SaveAttachmentTask extends ProgressDialogAsyncTask<SaveAttachmentTa
contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);
}
if (Build.VERSION.SDK_INT <= 28 && outputUri.equals(StorageUtil.getLegacyDownloadUri())) {
if (Build.VERSION.SDK_INT <= 28 && Objects.equals(outputUri.getScheme(), ContentResolver.SCHEME_FILE)) {
File outputDirectory = new File(outputUri.getPath());
File outputFile = new File(outputDirectory, base + "." + extension);

Wyświetl plik

@ -17,9 +17,7 @@ import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.database.NoExternalStorageException;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.whispersystems.libsignal.util.guava.Optional;
import java.io.File;
import java.util.List;
@ -124,27 +122,39 @@ public class StorageUtil {
}
public static @NonNull Uri getVideoUri() {
return MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
}
public static @NonNull Uri getAudioUri() {
return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
public static @NonNull Uri getImageUri() {
return MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
public static @NonNull Uri getDownloadUri() {
if (Build.VERSION.SDK_INT > 28) {
return MediaStore.Downloads.EXTERNAL_CONTENT_URI;
if (Build.VERSION.SDK_INT < 21) {
return getLegacyUri(Environment.DIRECTORY_MOVIES);
} else {
return getLegacyDownloadUri();
return MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
}
}
public static @NonNull Uri getLegacyDownloadUri() {
return Uri.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
public static @NonNull Uri getAudioUri() {
if (Build.VERSION.SDK_INT < 21) {
return getLegacyUri(Environment.DIRECTORY_MUSIC);
} else {
return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
}
public static @NonNull Uri getImageUri() {
if (Build.VERSION.SDK_INT < 21) {
return getLegacyUri(Environment.DIRECTORY_PICTURES);
} else {
return MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
}
public static @NonNull Uri getDownloadUri() {
if (Build.VERSION.SDK_INT < 29) {
return getLegacyUri(Environment.DIRECTORY_DOWNLOADS);
} else {
return MediaStore.Downloads.EXTERNAL_CONTENT_URI;
}
}
public static @NonNull Uri getLegacyUri(@NonNull String directory) {
return Uri.fromFile(Environment.getExternalStoragePublicDirectory(directory));
}
public static @Nullable String getCleanFileName(@Nullable String fileName) {