diff --git a/CHANGELOG.md b/CHANGELOG.md index 8284866..bb91280 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,6 @@ - Removed "Fake Camera" feature as it has not been supported since R. - Version displayed within the app has now been changed to also reflect the exact Git commit when the app is built. - File Shuttle no longer appends ".null" or ".bin" suffixes unnecessarily. This should make it work much better with file managers such as Material Files. -- File Shuttle now triggers media scanning much more robustly. Media files (pictures, videos, etc.) copied into the work profile should now show up much quicker in gallery apps. 1.8 === diff --git a/app/build.gradle b/app/build.gradle index 0f9c5d7..35ce379 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,11 +55,6 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - applicationVariants.all { variant -> - if (variant.name == "debug") { - variant.outputs.each { o -> o.versionCodeOverride = System.currentTimeSeconds() } - } - } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 diff --git a/app/src/main/java/net/typeblog/shelter/services/FileShuttleService.java b/app/src/main/java/net/typeblog/shelter/services/FileShuttleService.java index ff6355c..6eb419b 100644 --- a/app/src/main/java/net/typeblog/shelter/services/FileShuttleService.java +++ b/app/src/main/java/net/typeblog/shelter/services/FileShuttleService.java @@ -101,24 +101,10 @@ public class FileShuttleService extends Service { public ParcelFileDescriptor openFile(String path, String mode) { resetSuicideTask(); File f = new File(resolvePath(path)); - int numericMode = ParcelFileDescriptor.parseMode(mode); try { - if ((numericMode & ParcelFileDescriptor.MODE_WRITE_ONLY) != 0) { - // When the file is opened in writable mode, and the file is of a media - // type, we need to notify the media scanner of the update. - // Even though this is done as part of file creation as well, that scan - // might have failed because it happened before the writer was able to - // finish writing. - return ParcelFileDescriptor.open(f, numericMode, mHandler, (e) -> { - String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension( - Utility.getFileExtension(f.getAbsolutePath())); - notifyMediaScannerIfNecessary(f, mime); - }); - } else { - return ParcelFileDescriptor.open(f, numericMode); - } - } catch (IOException e) { + return ParcelFileDescriptor.open(f, ParcelFileDescriptor.parseMode(mode)); + } catch (FileNotFoundException e) { return null; } } @@ -152,6 +138,8 @@ public class FileShuttleService extends Service { DocumentsContract.Document.MIME_TYPE_DIR.equals(mimeType); boolean shouldAppendExtension = mimeType != null && !isDirectory && !mimeType.equals("application/octet-stream"); + boolean isMedia = + mimeType != null && (mimeType.startsWith("image/") || mimeType.startsWith("video/")); // Append extension for files if a MIME type is specified if (shouldAppendExtension) { @@ -171,7 +159,13 @@ public class FileShuttleService extends Service { return null; } - notifyMediaScannerIfNecessary(f, mimeType); + // Notify the media scanner to scan the file as needed + // This has to be done AFTER file creation + if (isMedia) { + Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + intent.setData(Uri.fromFile(f)); + sendBroadcast(intent); + } return f.getAbsolutePath(); } @@ -290,13 +284,14 @@ public class FileShuttleService extends Service { return null; } - + FileOutputStream os = new FileOutputStream(pair[1].getFileDescriptor()); // Send the bitmap into the pipe in another thread, so that we can return the // reading fd to the Documents UI before we finish sending the Bitmap. new Thread(() -> { - try (FileOutputStream os = new FileOutputStream(pair[1].getFileDescriptor())) { - bmp.compress(Bitmap.CompressFormat.PNG, 100, os); + bmp.compress(Bitmap.CompressFormat.PNG, 100, os); + try { os.flush(); + os.close(); } catch (IOException e) { // ... } @@ -305,14 +300,4 @@ public class FileShuttleService extends Service { return pair[0]; } - - private void notifyMediaScannerIfNecessary(File f, String mimeType) { - // Notify the media scanner to scan the file as needed - // This has to be done AFTER file creation - if (mimeType != null && (mimeType.startsWith("image/") || mimeType.startsWith("video/"))) { - Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); - intent.setData(Uri.fromFile(f)); - sendBroadcast(intent); - } - } }