diff --git a/embedding/android/GeckoApp.java b/embedding/android/GeckoApp.java index f6f47e5a9e4..7c2fad4197b 100644 --- a/embedding/android/GeckoApp.java +++ b/embedding/android/GeckoApp.java @@ -684,8 +684,12 @@ abstract public class GeckoApp Intent.createChooser(intent, getString(R.string.choose_file)), FILE_PICKER_REQUEST); String filePickerResult = ""; + try { - filePickerResult = mFilePickerResult.take(); + while (null == (filePickerResult = mFilePickerResult.poll(1, TimeUnit.MILLISECONDS))) { + Log.i("GeckoApp", "processing events from showFilePicker "); + GeckoAppShell.processNextNativeEvent(); + } } catch (InterruptedException e) { Log.i(LOG_FILE_NAME, "showing file picker ", e); } diff --git a/embedding/android/GeckoAppShell.java b/embedding/android/GeckoAppShell.java index 13c8e2fd932..6cf86e196e0 100644 --- a/embedding/android/GeckoAppShell.java +++ b/embedding/android/GeckoAppShell.java @@ -119,6 +119,8 @@ public class GeckoAppShell public static native void onChangeNetworkLinkStatus(String status, String type); public static native void reportJavaCrash(String stack); + public static native void processNextNativeEvent(); + // A looper thread, accessed by GeckoAppShell.getHandler private static class LooperThread extends Thread { public SynchronousQueue mHandlerQueue = diff --git a/other-licenses/android/APKOpen.cpp b/other-licenses/android/APKOpen.cpp index 14de579f4f3..a13c7049fbd 100644 --- a/other-licenses/android/APKOpen.cpp +++ b/other-licenses/android/APKOpen.cpp @@ -233,6 +233,7 @@ Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one SHELL_WRAPPER0(nativeInit) SHELL_WRAPPER1(nativeRun, jstring) SHELL_WRAPPER1(notifyGeckoOfEvent, jobject) +SHELL_WRAPPER0(processNextNativeEvent) SHELL_WRAPPER1(setSurfaceView, jobject) SHELL_WRAPPER0(onResume) SHELL_WRAPPER0(onLowMemory) @@ -676,6 +677,7 @@ loadLibs(const char *apkName) GETFUNC(nativeInit); GETFUNC(nativeRun); GETFUNC(notifyGeckoOfEvent); + GETFUNC(processNextNativeEvent); GETFUNC(setSurfaceView); GETFUNC(onResume); GETFUNC(onLowMemory); diff --git a/widget/src/android/AndroidJNI.cpp b/widget/src/android/AndroidJNI.cpp index 869e651d55b..ec7c8cb3353 100644 --- a/widget/src/android/AndroidJNI.cpp +++ b/widget/src/android/AndroidJNI.cpp @@ -64,6 +64,7 @@ using namespace mozilla; extern "C" { NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_nativeInit(JNIEnv *, jclass); NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent(JNIEnv *, jclass, jobject event); + NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent(JNIEnv *, jclass); NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_setSurfaceView(JNIEnv *jenv, jclass, jobject sv); NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_onResume(JNIEnv *, jclass); NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_onLowMemory(JNIEnv *, jclass); @@ -92,6 +93,14 @@ Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent(JNIEnv *jenv, jclass jc, nsAppShell::gAppShell->PostEvent(new AndroidGeckoEvent(jenv, event)); } +NS_EXPORT void JNICALL +Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent(JNIEnv *jenv, jclass) +{ + // poke the appshell + if (nsAppShell::gAppShell) + nsAppShell::gAppShell->ProcessNextNativeEvent(PR_FALSE); +} + NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_setSurfaceView(JNIEnv *jenv, jclass, jobject obj) {