parent
41c3e08925
commit
2b1ae43b7b
1 changed files with 20 additions and 38 deletions
|
@ -523,15 +523,11 @@ class MediaStoreImageProvider : ImageProvider() {
|
||||||
): FieldMap {
|
): FieldMap {
|
||||||
val oldFile = File(oldPath)
|
val oldFile = File(oldPath)
|
||||||
val newFile = File(oldFile.parent, newFileName)
|
val newFile = File(oldFile.parent, newFileName)
|
||||||
if (oldFile == newFile) {
|
return when {
|
||||||
// nothing to do
|
oldFile == newFile -> skippedFieldMap
|
||||||
return skippedFieldMap
|
StorageUtils.canEditByFile(activity, oldPath) -> renameSingleByFile(activity, mimeType, oldPath, newFile)
|
||||||
}
|
isMediaUriPermissionGranted(activity, oldMediaUri, mimeType) -> renameSingleByMediaStore(activity, mimeType, oldMediaUri, newFile)
|
||||||
|
else -> renameSingleByTreeDoc(activity, mimeType, oldMediaUri, oldPath, newFile)
|
||||||
return if (isMediaUriPermissionGranted(activity, oldMediaUri, mimeType)) {
|
|
||||||
renameSingleByMediaStore(activity, mimeType, oldMediaUri, newFile)
|
|
||||||
} else {
|
|
||||||
renameSingleByTreeDoc(activity, mimeType, oldMediaUri, oldPath, newFile)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,39 +576,25 @@ class MediaStoreImageProvider : ImageProvider() {
|
||||||
@Suppress("BlockingMethodInNonBlockingContext")
|
@Suppress("BlockingMethodInNonBlockingContext")
|
||||||
val renamed = StorageUtils.getDocumentFile(activity, oldPath, oldMediaUri)?.renameTo(newFile.name) ?: false
|
val renamed = StorageUtils.getDocumentFile(activity, oldPath, oldMediaUri)?.renameTo(newFile.name) ?: false
|
||||||
if (!renamed) {
|
if (!renamed) {
|
||||||
throw Exception("failed to rename entry at path=$oldPath")
|
throw Exception("failed to rename document at path=$oldPath")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Renaming may be successful and the file at the old path no longer exists
|
|
||||||
// but, in some situations, scanning the old path does not clear the Media Store entry.
|
|
||||||
// For higher chance of accurate obsolete item check, keep this order:
|
|
||||||
// 1) scan obsolete item,
|
|
||||||
// 2) scan current item,
|
|
||||||
// 3) check obsolete item in Media Store
|
|
||||||
|
|
||||||
scanObsoletePath(activity, oldPath, mimeType)
|
scanObsoletePath(activity, oldPath, mimeType)
|
||||||
val newFields = scanNewPath(activity, newFile.path, mimeType)
|
return scanNewPath(activity, newFile.path, mimeType)
|
||||||
|
|
||||||
if (hasEntry(activity, oldMediaUri)) {
|
|
||||||
Log.w(LOG_TAG, "renaming item at uri=$oldMediaUri to newFile=$newFile did not clear the MediaStore entry for obsolete path=$oldPath")
|
|
||||||
|
|
||||||
// On Android Q (emulator/Mi9TPro), the concept of owner package disrupts renaming and the Media Store keeps an obsolete entry,
|
|
||||||
// but we use legacy external storage, so at least we do not have to deal with a `RecoverableSecurityException`
|
|
||||||
// when deleting this obsolete entry which is not backed by a file anymore.
|
|
||||||
// On Android R (S10e), everything seems fine!
|
|
||||||
// On Android S (emulator), renaming always leaves an obsolete entry whatever the owner package,
|
|
||||||
// and we get a `RecoverableSecurityException` if we attempt to delete this obsolete entry,
|
|
||||||
// but the entry seems to be cleaned later automatically by the Media Store anyway.
|
|
||||||
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
|
|
||||||
try {
|
|
||||||
delete(activity, oldMediaUri, oldPath, mimeType)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Log.w(LOG_TAG, "failed to delete entry with path=$oldPath", e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return newFields
|
private suspend fun renameSingleByFile(
|
||||||
|
activity: Activity,
|
||||||
|
mimeType: String,
|
||||||
|
oldPath: String,
|
||||||
|
newFile: File
|
||||||
|
): FieldMap {
|
||||||
|
Log.d(LOG_TAG, "rename file at path=$oldPath")
|
||||||
|
val renamed = File(oldPath).renameTo(newFile)
|
||||||
|
if (!renamed) {
|
||||||
|
throw Exception("failed to rename file at path=$oldPath")
|
||||||
|
}
|
||||||
|
scanObsoletePath(activity, oldPath, mimeType)
|
||||||
|
return scanNewPath(activity, newFile.path, mimeType)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun scanPostMetadataEdit(context: Context, path: String, uri: Uri, mimeType: String, newFields: HashMap<String, Any?>, callback: ImageOpCallback) {
|
override fun scanPostMetadataEdit(context: Context, path: String, uri: Uri, mimeType: String, newFields: HashMap<String, Any?>, callback: ImageOpCallback) {
|
||||||
|
|
Loading…
Reference in a new issue