From edc45e9aba9147a2a5e71836978c1dce6bdb5f97 Mon Sep 17 00:00:00 2001 From: jules Date: Thu, 8 Nov 2012 15:53:50 +0000 Subject: [PATCH] Workaround for android's new file scanning behaviour when using the device as a USB drive. --- .../Builds/Android/src/com/juce/JuceDemo.java | 33 +++++++++++++++++++ .../native/java/JuceAppActivity.java | 33 +++++++++++++++++++ .../native/juce_android_JNIHelpers.h | 1 + .../juce_core/native/juce_posix_SharedCode.h | 7 ++++ 4 files changed, 74 insertions(+) diff --git a/extras/JuceDemo/Builds/Android/src/com/juce/JuceDemo.java b/extras/JuceDemo/Builds/Android/src/com/juce/JuceDemo.java index f1d3196b96..9c5fc3ee75 100644 --- a/extras/JuceDemo/Builds/Android/src/com/juce/JuceDemo.java +++ b/extras/JuceDemo/Builds/Android/src/com/juce/JuceDemo.java @@ -45,6 +45,8 @@ import java.net.URL; import java.net.HttpURLConnection; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; +import android.media.MediaScannerConnection; +import android.media.MediaScannerConnection.MediaScannerConnectionClient; //============================================================================== public final class JuceDemo extends Activity @@ -527,4 +529,35 @@ public final class JuceDemo extends Activity return isRegion ? locale.getDisplayCountry (java.util.Locale.US) : locale.getDisplayLanguage (java.util.Locale.US); } + + //============================================================================== + private final class SingleMediaScanner implements MediaScannerConnectionClient + { + public SingleMediaScanner (Context context, String filename) + { + file = filename; + msc = new MediaScannerConnection (context, this); + msc.connect(); + } + + @Override + public void onMediaScannerConnected() + { + msc.scanFile (file, null); + } + + @Override + public void onScanCompleted (String path, Uri uri) + { + msc.disconnect(); + } + + private MediaScannerConnection msc; + private String file; + } + + public final void scanFile (String filename) + { + new SingleMediaScanner (this, filename); + } } diff --git a/modules/juce_core/native/java/JuceAppActivity.java b/modules/juce_core/native/java/JuceAppActivity.java index be914d94db..277366f146 100644 --- a/modules/juce_core/native/java/JuceAppActivity.java +++ b/modules/juce_core/native/java/JuceAppActivity.java @@ -45,6 +45,8 @@ import java.net.URL; import java.net.HttpURLConnection; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; +import android.media.MediaScannerConnection; +import android.media.MediaScannerConnection.MediaScannerConnectionClient; //============================================================================== public final class JuceAppActivity extends Activity @@ -527,4 +529,35 @@ public final class JuceAppActivity extends Activity return isRegion ? locale.getDisplayCountry (java.util.Locale.US) : locale.getDisplayLanguage (java.util.Locale.US); } + + //============================================================================== + private final class SingleMediaScanner implements MediaScannerConnectionClient + { + public SingleMediaScanner (Context context, String filename) + { + file = filename; + msc = new MediaScannerConnection (context, this); + msc.connect(); + } + + @Override + public void onMediaScannerConnected() + { + msc.scanFile (file, null); + } + + @Override + public void onScanCompleted (String path, Uri uri) + { + msc.disconnect(); + } + + private MediaScannerConnection msc; + private String file; + } + + public final void scanFile (String filename) + { + new SingleMediaScanner (this, filename); + } } diff --git a/modules/juce_core/native/juce_android_JNIHelpers.h b/modules/juce_core/native/juce_android_JNIHelpers.h index 00f9c541fd..71240b025b 100644 --- a/modules/juce_core/native/juce_android_JNIHelpers.h +++ b/modules/juce_core/native/juce_android_JNIHelpers.h @@ -360,6 +360,7 @@ extern ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder; METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \ + METHOD (scanFile, "scanFile", "(Ljava/lang/String;)V") DECLARE_JNI_CLASS (JuceAppActivity, JUCE_ANDROID_ACTIVITY_CLASSPATH); #undef JNI_CLASS_MEMBERS diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h index 26639ec500..85bffbe899 100644 --- a/modules/juce_core/native/juce_posix_SharedCode.h +++ b/modules/juce_core/native/juce_posix_SharedCode.h @@ -512,8 +512,15 @@ int FileOutputStream::writeInternal (const void* const data, const int numBytes) void FileOutputStream::flushInternal() { if (fileHandle != 0) + { if (fsync (getFD (fileHandle)) == -1) status = getResultForErrno(); + + #if JUCE_ANDROID + const LocalRef t (javaString (file.getFullPathName())); + android.activity.callVoidMethod (JuceAppActivity.scanFile, t.get()); + #endif + } } Result FileOutputStream::truncate()