Bug 687267 - Initial support for Flash on Honeycomb r=bgirard,vlad,jgilbert
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
#include "mozilla/dom/ScreenOrientation.h"
|
||||
#include "nsIDOMWindowUtils.h"
|
||||
#include "nsIDOMClientRect.h"
|
||||
#include "StrongPointer.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define ALOG_BRIDGE(args...) ALOG(args)
|
||||
@@ -49,6 +50,15 @@ AndroidBridge *AndroidBridge::sBridge = 0;
|
||||
static PRUintn sJavaEnvThreadIndex = 0;
|
||||
static void JavaThreadDetachFunc(void *arg);
|
||||
|
||||
// This is a dummy class that can be used in the template for android::sp
|
||||
class AndroidRefable {
|
||||
void incStrong(void* thing) { }
|
||||
void decStrong(void* thing) { }
|
||||
};
|
||||
|
||||
// This isn't in AndroidBridge.h because including StrongPointer.h there is gross
|
||||
static android::sp<AndroidRefable> (*android_SurfaceTexture_getNativeWindow)(JNIEnv* env, jobject surfaceTexture) = nsnull;
|
||||
|
||||
AndroidBridge *
|
||||
AndroidBridge::ConstructBridge(JNIEnv *jEnv,
|
||||
jclass jGeckoAppShellClass)
|
||||
@@ -178,11 +188,10 @@ AndroidBridge::Init(JNIEnv *jEnv,
|
||||
|
||||
jSurfaceClass = (jclass) jEnv->NewGlobalRef(jEnv->FindClass("android/view/Surface"));
|
||||
|
||||
PRInt32 apiVersion = 0;
|
||||
if (!GetStaticIntField("android/os/Build$VERSION", "SDK_INT", &apiVersion, jEnv))
|
||||
if (!GetStaticIntField("android/os/Build$VERSION", "SDK_INT", &mAPIVersion, jEnv))
|
||||
ALOG_BRIDGE("Failed to find API version");
|
||||
|
||||
if (apiVersion <= 8 /* Froyo */)
|
||||
if (mAPIVersion <= 8 /* Froyo */)
|
||||
jSurfacePointerField = jEnv->GetFieldID(jSurfaceClass, "mSurface", "I");
|
||||
else /* not Froyo */
|
||||
jSurfacePointerField = jEnv->GetFieldID(jSurfaceClass, "mNativeSurface", "I");
|
||||
@@ -190,6 +199,8 @@ AndroidBridge::Init(JNIEnv *jEnv,
|
||||
jNotifyWakeLockChanged = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "notifyWakeLockChanged", "(Ljava/lang/String;Ljava/lang/String;)V");
|
||||
|
||||
jGetGfxInfoData = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getGfxInfoData", "()Ljava/lang/String;");
|
||||
jRegisterSurfaceTextureFrameListener = jEnv->GetStaticMethodID(jGeckoAppShellClass, "registerSurfaceTextureFrameListener", "(Landroid/graphics/SurfaceTexture;I)V");
|
||||
jUnregisterSurfaceTextureFrameListener = jEnv->GetStaticMethodID(jGeckoAppShellClass, "unregisterSurfaceTextureFrameListener", "(Landroid/graphics/SurfaceTexture;)V");
|
||||
|
||||
#ifdef MOZ_JAVA_COMPOSITOR
|
||||
jPumpMessageLoop = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "pumpMessageLoop", "()V");
|
||||
@@ -197,11 +208,6 @@ AndroidBridge::Init(JNIEnv *jEnv,
|
||||
jAddPluginView = jEnv->GetStaticMethodID(jGeckoAppShellClass, "addPluginView", "(Landroid/view/View;IIIIZ)V");
|
||||
jRemovePluginView = jEnv->GetStaticMethodID(jGeckoAppShellClass, "removePluginView", "(Landroid/view/View;Z)V");
|
||||
|
||||
jCreateSurface = jEnv->GetStaticMethodID(jGeckoAppShellClass, "createSurface", "()Landroid/view/Surface;");
|
||||
jShowSurface = jEnv->GetStaticMethodID(jGeckoAppShellClass, "showSurface", "(Landroid/view/Surface;IIIIZZ)V");
|
||||
jHideSurface = jEnv->GetStaticMethodID(jGeckoAppShellClass, "hideSurface", "(Landroid/view/Surface;)V");
|
||||
jDestroySurface = jEnv->GetStaticMethodID(jGeckoAppShellClass, "destroySurface", "(Landroid/view/Surface;)V");
|
||||
|
||||
jLayerView = (jclass) jEnv->NewGlobalRef(jEnv->FindClass("org/mozilla/gecko/gfx/LayerView"));
|
||||
|
||||
AndroidGLController::Init(jEnv);
|
||||
@@ -1396,11 +1402,20 @@ AndroidBridge::OpenGraphicsLibraries()
|
||||
ANativeWindow_lock = (int (*)(void*, void*, void*)) dlsym(handle, "ANativeWindow_lock");
|
||||
ANativeWindow_unlockAndPost = (int (*)(void*))dlsym(handle, "ANativeWindow_unlockAndPost");
|
||||
|
||||
// This is only available in Honeycomb and ICS. It was removed in Jelly Bean
|
||||
ANativeWindow_fromSurfaceTexture = (void* (*)(JNIEnv*, jobject))dlsym(handle, "ANativeWindow_fromSurfaceTexture");
|
||||
|
||||
mHasNativeWindowAccess = ANativeWindow_fromSurface && ANativeWindow_release && ANativeWindow_lock && ANativeWindow_unlockAndPost;
|
||||
|
||||
ALOG_BRIDGE("Successfully opened libandroid.so, have native window access? %d", mHasNativeWindowAccess);
|
||||
}
|
||||
|
||||
// We need one symbol from here on Jelly Bean
|
||||
handle = dlopen("libandroid_runtime.so", RTLD_LAZY | RTLD_LOCAL);
|
||||
if (handle) {
|
||||
android_SurfaceTexture_getNativeWindow = (android::sp<AndroidRefable> (*)(JNIEnv*, jobject))dlsym(handle, "_ZN7android38android_SurfaceTexture_getNativeWindowEP7_JNIEnvP8_jobject");
|
||||
}
|
||||
|
||||
if (mHasNativeWindowAccess)
|
||||
return;
|
||||
|
||||
@@ -1939,10 +1954,11 @@ AndroidBridge::AcquireNativeWindow(JNIEnv* aEnv, jobject aSurface)
|
||||
|
||||
if (mHasNativeWindowAccess)
|
||||
return ANativeWindow_fromSurface(aEnv, aSurface);
|
||||
else if (mHasNativeWindowFallback)
|
||||
|
||||
if (mHasNativeWindowFallback)
|
||||
return GetNativeSurface(aEnv, aSurface);
|
||||
else
|
||||
return nsnull;
|
||||
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1958,6 +1974,31 @@ AndroidBridge::ReleaseNativeWindow(void *window)
|
||||
// have nothing to do here. We should probably ref it.
|
||||
}
|
||||
|
||||
void*
|
||||
AndroidBridge::AcquireNativeWindowFromSurfaceTexture(JNIEnv* aEnv, jobject aSurfaceTexture)
|
||||
{
|
||||
OpenGraphicsLibraries();
|
||||
|
||||
if (mHasNativeWindowAccess && ANativeWindow_fromSurfaceTexture)
|
||||
return ANativeWindow_fromSurfaceTexture(aEnv, aSurfaceTexture);
|
||||
|
||||
if (mHasNativeWindowAccess && android_SurfaceTexture_getNativeWindow) {
|
||||
android::sp<AndroidRefable> window = android_SurfaceTexture_getNativeWindow(aEnv, aSurfaceTexture);
|
||||
return window.get();
|
||||
}
|
||||
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::ReleaseNativeWindowForSurfaceTexture(void *window)
|
||||
{
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
// FIXME: we don't ref the pointer we get, so nothing to do currently. We should ref it.
|
||||
}
|
||||
|
||||
bool
|
||||
AndroidBridge::SetNativeWindowFormat(void *window, int width, int height, int format)
|
||||
{
|
||||
@@ -2190,75 +2231,6 @@ extern "C" {
|
||||
}
|
||||
}
|
||||
|
||||
jobject
|
||||
AndroidBridge::CreateSurface()
|
||||
{
|
||||
#ifndef MOZ_JAVA_COMPOSITOR
|
||||
return NULL;
|
||||
#else
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env)
|
||||
return nsnull;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env);
|
||||
|
||||
jobject surface = env->CallStaticObjectMethod(mGeckoAppShellClass, jCreateSurface);
|
||||
if (jniFrame.CheckForException())
|
||||
return nsnull;
|
||||
|
||||
if (surface)
|
||||
surface = env->NewGlobalRef(surface);
|
||||
|
||||
return surface;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::DestroySurface(jobject surface)
|
||||
{
|
||||
#ifdef MOZ_JAVA_COMPOSITOR
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env);
|
||||
|
||||
env->CallStaticVoidMethod(mGeckoAppShellClass, jDestroySurface, surface);
|
||||
env->DeleteGlobalRef(surface);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::ShowSurface(jobject surface, const gfxRect& aRect, bool aInverted, bool aBlend)
|
||||
{
|
||||
#ifdef MOZ_JAVA_COMPOSITOR
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 0);
|
||||
|
||||
env->CallStaticVoidMethod(mGeckoAppShellClass, jShowSurface, surface,
|
||||
(int)aRect.x, (int)aRect.y,
|
||||
(int)aRect.width, (int)aRect.height,
|
||||
aInverted, aBlend);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::HideSurface(jobject surface)
|
||||
{
|
||||
#ifdef MOZ_JAVA_COMPOSITOR
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 0);
|
||||
|
||||
env->CallStaticVoidMethod(mGeckoAppShellClass, jHideSurface, surface);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint32_t
|
||||
AndroidBridge::GetScreenOrientation()
|
||||
{
|
||||
@@ -2358,6 +2330,38 @@ AndroidBridge::NotifyWakeLockChanged(const nsAString& topic, const nsAString& st
|
||||
env->CallStaticVoidMethod(mGeckoAppShellClass, jNotifyWakeLockChanged, jstrTopic, jstrState);
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::ScheduleComposite()
|
||||
{
|
||||
#if MOZ_JAVA_COMPOSITOR
|
||||
nsWindow::ScheduleComposite();
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::RegisterSurfaceTextureFrameListener(jobject surfaceTexture, int id)
|
||||
{
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env);
|
||||
|
||||
env->CallStaticVoidMethod(mGeckoAppShellClass, jRegisterSurfaceTextureFrameListener, surfaceTexture, id);
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::UnregisterSurfaceTextureFrameListener(jobject surfaceTexture)
|
||||
{
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env);
|
||||
|
||||
env->CallStaticVoidMethod(mGeckoAppShellClass, jUnregisterSurfaceTextureFrameListener, surfaceTexture);
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::GetGfxInfoData(nsACString& aRet)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user