Merge "Fix z-order for webview surface control" into sc-dev am: 17410b668f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14414236 Change-Id: I7a7e0401dcd9b91ec3d38ad00ac9319aa5c1f644
This commit is contained in:
@@ -461,6 +461,9 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
protected final ViewFrameInfo mViewFrameInfo = new ViewFrameInfo();
|
protected final ViewFrameInfo mViewFrameInfo = new ViewFrameInfo();
|
||||||
private final InputEventAssigner mInputEventAssigner = new InputEventAssigner();
|
private final InputEventAssigner mInputEventAssigner = new InputEventAssigner();
|
||||||
|
|
||||||
|
// Set to true if mSurfaceControl is used for Webview Overlay
|
||||||
|
private boolean mIsForWebviewOverlay;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the Choreographer's FrameInfo object with the timing information for the current
|
* Update the Choreographer's FrameInfo object with the timing information for the current
|
||||||
* ViewRootImpl instance. Erase the data in the current ViewFrameInfo to prepare for the next
|
* ViewRootImpl instance. Erase the data in the current ViewFrameInfo to prepare for the next
|
||||||
@@ -1374,6 +1377,23 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
mAttachInfo.mThreadedRenderer.setASurfaceTransactionCallback(callback);
|
mAttachInfo.mThreadedRenderer.setASurfaceTransactionCallback(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a callback to be executed when Webview overlay needs a surface control.
|
||||||
|
* This callback will be executed on RenderThread worker thread, and released inside native code
|
||||||
|
* when CanvasContext is destroyed.
|
||||||
|
*/
|
||||||
|
private void addPrepareSurfaceControlForWebviewCallback() {
|
||||||
|
HardwareRenderer.PrepareSurfaceControlForWebviewCallback callback = () -> {
|
||||||
|
// make mSurfaceControl transparent, so child surface controls are visible
|
||||||
|
if (mIsForWebviewOverlay) return;
|
||||||
|
synchronized (ViewRootImpl.this) {
|
||||||
|
mIsForWebviewOverlay = true;
|
||||||
|
}
|
||||||
|
mTransaction.setOpaque(mSurfaceControl, false).apply();
|
||||||
|
};
|
||||||
|
mAttachInfo.mThreadedRenderer.setPrepareSurfaceControlForWebviewCallback(callback);
|
||||||
|
}
|
||||||
|
|
||||||
@UnsupportedAppUsage
|
@UnsupportedAppUsage
|
||||||
private void enableHardwareAcceleration(WindowManager.LayoutParams attrs) {
|
private void enableHardwareAcceleration(WindowManager.LayoutParams attrs) {
|
||||||
mAttachInfo.mHardwareAccelerated = false;
|
mAttachInfo.mHardwareAccelerated = false;
|
||||||
@@ -1418,6 +1438,7 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
if (mHardwareRendererObserver != null) {
|
if (mHardwareRendererObserver != null) {
|
||||||
mAttachInfo.mThreadedRenderer.addObserver(mHardwareRendererObserver);
|
mAttachInfo.mThreadedRenderer.addObserver(mHardwareRendererObserver);
|
||||||
}
|
}
|
||||||
|
addPrepareSurfaceControlForWebviewCallback();
|
||||||
addASurfaceTransactionCallback();
|
addASurfaceTransactionCallback();
|
||||||
mAttachInfo.mThreadedRenderer.setSurfaceControl(mSurfaceControl);
|
mAttachInfo.mThreadedRenderer.setSurfaceControl(mSurfaceControl);
|
||||||
}
|
}
|
||||||
@@ -7743,6 +7764,7 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mAttachInfo.mThreadedRenderer != null) {
|
if (mAttachInfo.mThreadedRenderer != null) {
|
||||||
|
addPrepareSurfaceControlForWebviewCallback();
|
||||||
addASurfaceTransactionCallback();
|
addASurfaceTransactionCallback();
|
||||||
mAttachInfo.mThreadedRenderer.setSurfaceControl(mSurfaceControl);
|
mAttachInfo.mThreadedRenderer.setSurfaceControl(mSurfaceControl);
|
||||||
}
|
}
|
||||||
@@ -7790,7 +7812,14 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
synchronized (this) {
|
||||||
|
if (mIsForWebviewOverlay) {
|
||||||
|
mIsSurfaceOpaque = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
mTransaction.setOpaque(mSurfaceControl, opaque).apply();
|
mTransaction.setOpaque(mSurfaceControl, opaque).apply();
|
||||||
|
}
|
||||||
|
|
||||||
mIsSurfaceOpaque = opaque;
|
mIsSurfaceOpaque = opaque;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -762,6 +762,16 @@ public class HardwareRenderer {
|
|||||||
nSetASurfaceTransactionCallback(mNativeProxy, callback);
|
nSetASurfaceTransactionCallback(mNativeProxy, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PrepareSurfaceControlForWebviewCallback mAPrepareSurfaceControlForWebviewCallback;
|
||||||
|
|
||||||
|
/** @hide */
|
||||||
|
public void setPrepareSurfaceControlForWebviewCallback(
|
||||||
|
PrepareSurfaceControlForWebviewCallback callback) {
|
||||||
|
// ensure callback is kept alive on the java side since weak ref is used in native code
|
||||||
|
mAPrepareSurfaceControlForWebviewCallback = callback;
|
||||||
|
nSetPrepareSurfaceControlForWebviewCallback(mNativeProxy, callback);
|
||||||
|
}
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
public void setFrameCallback(FrameDrawingCallback callback) {
|
public void setFrameCallback(FrameDrawingCallback callback) {
|
||||||
nSetFrameCallback(mNativeProxy, callback);
|
nSetFrameCallback(mNativeProxy, callback);
|
||||||
@@ -876,6 +886,19 @@ public class HardwareRenderer {
|
|||||||
session.close();
|
session.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface used to receive callbacks when Webview requests a surface control.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public interface PrepareSurfaceControlForWebviewCallback {
|
||||||
|
/**
|
||||||
|
* Invoked when Webview calls to get a surface control.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void prepare();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface used to receive callbacks when a transaction needs to be merged.
|
* Interface used to receive callbacks when a transaction needs to be merged.
|
||||||
*
|
*
|
||||||
@@ -1374,6 +1397,9 @@ public class HardwareRenderer {
|
|||||||
private static native void nSetASurfaceTransactionCallback(long nativeProxy,
|
private static native void nSetASurfaceTransactionCallback(long nativeProxy,
|
||||||
ASurfaceTransactionCallback callback);
|
ASurfaceTransactionCallback callback);
|
||||||
|
|
||||||
|
private static native void nSetPrepareSurfaceControlForWebviewCallback(long nativeProxy,
|
||||||
|
PrepareSurfaceControlForWebviewCallback callback);
|
||||||
|
|
||||||
private static native void nSetFrameCallback(long nativeProxy, FrameDrawingCallback callback);
|
private static native void nSetFrameCallback(long nativeProxy, FrameDrawingCallback callback);
|
||||||
|
|
||||||
private static native void nSetFrameCompleteCallback(long nativeProxy,
|
private static native void nSetFrameCompleteCallback(long nativeProxy,
|
||||||
|
|||||||
@@ -197,6 +197,8 @@ ASurfaceControl* WebViewFunctor::getSurfaceControl() {
|
|||||||
auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
|
auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
|
||||||
mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl");
|
mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl");
|
||||||
ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
|
ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
|
||||||
|
activeContext->prepareSurfaceControlForWebview();
|
||||||
|
funcs.transactionSetZOrderFunc(transaction, mSurfaceControl, -1);
|
||||||
funcs.transactionSetVisibilityFunc(transaction, mSurfaceControl,
|
funcs.transactionSetVisibilityFunc(transaction, mSurfaceControl,
|
||||||
ASURFACE_TRANSACTION_VISIBILITY_SHOW);
|
ASURFACE_TRANSACTION_VISIBILITY_SHOW);
|
||||||
funcs.transactionApplyFunc(transaction);
|
funcs.transactionApplyFunc(transaction);
|
||||||
|
|||||||
@@ -70,6 +70,10 @@ struct {
|
|||||||
jmethodID onMergeTransaction;
|
jmethodID onMergeTransaction;
|
||||||
} gASurfaceTransactionCallback;
|
} gASurfaceTransactionCallback;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
jmethodID prepare;
|
||||||
|
} gPrepareSurfaceControlForWebviewCallback;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
jmethodID onFrameDraw;
|
jmethodID onFrameDraw;
|
||||||
} gFrameDrawingCallback;
|
} gFrameDrawingCallback;
|
||||||
@@ -672,6 +676,28 @@ static void android_view_ThreadedRenderer_setASurfaceTransactionCallback(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void android_view_ThreadedRenderer_setPrepareSurfaceControlForWebviewCallback(
|
||||||
|
JNIEnv* env, jobject clazz, jlong proxyPtr, jobject callback) {
|
||||||
|
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
|
||||||
|
if (!callback) {
|
||||||
|
proxy->setPrepareSurfaceControlForWebviewCallback(nullptr);
|
||||||
|
} else {
|
||||||
|
JavaVM* vm = nullptr;
|
||||||
|
LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&vm) != JNI_OK, "Unable to get Java VM");
|
||||||
|
auto globalCallbackRef =
|
||||||
|
std::make_shared<JWeakGlobalRefHolder>(vm, callback);
|
||||||
|
proxy->setPrepareSurfaceControlForWebviewCallback([globalCallbackRef]() {
|
||||||
|
JNIEnv* env = getenv(globalCallbackRef->vm());
|
||||||
|
jobject localref = env->NewLocalRef(globalCallbackRef->ref());
|
||||||
|
if (CC_UNLIKELY(!localref)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
env->CallVoidMethod(localref, gPrepareSurfaceControlForWebviewCallback.prepare);
|
||||||
|
env->DeleteLocalRef(localref);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void android_view_ThreadedRenderer_setFrameCallback(JNIEnv* env,
|
static void android_view_ThreadedRenderer_setFrameCallback(JNIEnv* env,
|
||||||
jobject clazz, jlong proxyPtr, jobject frameCallback) {
|
jobject clazz, jlong proxyPtr, jobject frameCallback) {
|
||||||
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
|
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
|
||||||
@@ -970,6 +996,9 @@ static const JNINativeMethod gMethods[] = {
|
|||||||
{"nSetASurfaceTransactionCallback",
|
{"nSetASurfaceTransactionCallback",
|
||||||
"(JLandroid/graphics/HardwareRenderer$ASurfaceTransactionCallback;)V",
|
"(JLandroid/graphics/HardwareRenderer$ASurfaceTransactionCallback;)V",
|
||||||
(void*)android_view_ThreadedRenderer_setASurfaceTransactionCallback},
|
(void*)android_view_ThreadedRenderer_setASurfaceTransactionCallback},
|
||||||
|
{"nSetPrepareSurfaceControlForWebviewCallback",
|
||||||
|
"(JLandroid/graphics/HardwareRenderer$PrepareSurfaceControlForWebviewCallback;)V",
|
||||||
|
(void*)android_view_ThreadedRenderer_setPrepareSurfaceControlForWebviewCallback},
|
||||||
{"nSetFrameCallback", "(JLandroid/graphics/HardwareRenderer$FrameDrawingCallback;)V",
|
{"nSetFrameCallback", "(JLandroid/graphics/HardwareRenderer$FrameDrawingCallback;)V",
|
||||||
(void*)android_view_ThreadedRenderer_setFrameCallback},
|
(void*)android_view_ThreadedRenderer_setFrameCallback},
|
||||||
{"nSetFrameCompleteCallback",
|
{"nSetFrameCompleteCallback",
|
||||||
@@ -1037,6 +1066,11 @@ int register_android_view_ThreadedRenderer(JNIEnv* env) {
|
|||||||
gASurfaceTransactionCallback.onMergeTransaction =
|
gASurfaceTransactionCallback.onMergeTransaction =
|
||||||
GetMethodIDOrDie(env, aSurfaceTransactionCallbackClass, "onMergeTransaction", "(JJJ)V");
|
GetMethodIDOrDie(env, aSurfaceTransactionCallbackClass, "onMergeTransaction", "(JJJ)V");
|
||||||
|
|
||||||
|
jclass prepareSurfaceControlForWebviewCallbackClass = FindClassOrDie(
|
||||||
|
env, "android/graphics/HardwareRenderer$PrepareSurfaceControlForWebviewCallback");
|
||||||
|
gPrepareSurfaceControlForWebviewCallback.prepare =
|
||||||
|
GetMethodIDOrDie(env, prepareSurfaceControlForWebviewCallbackClass, "prepare", "()V");
|
||||||
|
|
||||||
jclass frameCallbackClass = FindClassOrDie(env,
|
jclass frameCallbackClass = FindClassOrDie(env,
|
||||||
"android/graphics/HardwareRenderer$FrameDrawingCallback");
|
"android/graphics/HardwareRenderer$FrameDrawingCallback");
|
||||||
gFrameDrawingCallback.onFrameDraw = GetMethodIDOrDie(env, frameCallbackClass,
|
gFrameDrawingCallback.onFrameDraw = GetMethodIDOrDie(env, frameCallbackClass,
|
||||||
|
|||||||
@@ -193,6 +193,7 @@ void CanvasContext::setSurfaceControl(ASurfaceControl* surfaceControl) {
|
|||||||
|
|
||||||
if (surfaceControl == nullptr) {
|
if (surfaceControl == nullptr) {
|
||||||
setASurfaceTransactionCallback(nullptr);
|
setASurfaceTransactionCallback(nullptr);
|
||||||
|
setPrepareSurfaceControlForWebviewCallback(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mSurfaceControl != nullptr) {
|
if (mSurfaceControl != nullptr) {
|
||||||
@@ -914,6 +915,12 @@ bool CanvasContext::mergeTransaction(ASurfaceTransaction* transaction, ASurfaceC
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CanvasContext::prepareSurfaceControlForWebview() {
|
||||||
|
if (mPrepareSurfaceControlForWebviewCallback) {
|
||||||
|
std::invoke(mPrepareSurfaceControlForWebviewCallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} /* namespace renderthread */
|
} /* namespace renderthread */
|
||||||
} /* namespace uirenderer */
|
} /* namespace uirenderer */
|
||||||
} /* namespace android */
|
} /* namespace android */
|
||||||
|
|||||||
@@ -212,6 +212,12 @@ public:
|
|||||||
|
|
||||||
bool mergeTransaction(ASurfaceTransaction* transaction, ASurfaceControl* control);
|
bool mergeTransaction(ASurfaceTransaction* transaction, ASurfaceControl* control);
|
||||||
|
|
||||||
|
void setPrepareSurfaceControlForWebviewCallback(const std::function<void()>& callback) {
|
||||||
|
mPrepareSurfaceControlForWebviewCallback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
void prepareSurfaceControlForWebview();
|
||||||
|
|
||||||
static CanvasContext* getActiveContext();
|
static CanvasContext* getActiveContext();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -312,6 +318,8 @@ private:
|
|||||||
bool mExpectSurfaceStats = false;
|
bool mExpectSurfaceStats = false;
|
||||||
|
|
||||||
std::function<void(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback;
|
std::function<void(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback;
|
||||||
|
std::function<void()> mPrepareSurfaceControlForWebviewCallback;
|
||||||
|
|
||||||
void cleanupResources();
|
void cleanupResources();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -319,6 +319,12 @@ void RenderProxy::setASurfaceTransactionCallback(
|
|||||||
[this, cb = callback]() { mContext->setASurfaceTransactionCallback(cb); });
|
[this, cb = callback]() { mContext->setASurfaceTransactionCallback(cb); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderProxy::setPrepareSurfaceControlForWebviewCallback(
|
||||||
|
const std::function<void()>& callback) {
|
||||||
|
mRenderThread.queue().post(
|
||||||
|
[this, cb = callback]() { mContext->setPrepareSurfaceControlForWebviewCallback(cb); });
|
||||||
|
}
|
||||||
|
|
||||||
void RenderProxy::setFrameCallback(std::function<void(int64_t)>&& callback) {
|
void RenderProxy::setFrameCallback(std::function<void(int64_t)>&& callback) {
|
||||||
mDrawFrameTask.setFrameCallback(std::move(callback));
|
mDrawFrameTask.setFrameCallback(std::move(callback));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ public:
|
|||||||
void setPictureCapturedCallback(const std::function<void(sk_sp<SkPicture>&&)>& callback);
|
void setPictureCapturedCallback(const std::function<void(sk_sp<SkPicture>&&)>& callback);
|
||||||
void setASurfaceTransactionCallback(
|
void setASurfaceTransactionCallback(
|
||||||
const std::function<void(int64_t, int64_t, int64_t)>& callback);
|
const std::function<void(int64_t, int64_t, int64_t)>& callback);
|
||||||
|
void setPrepareSurfaceControlForWebviewCallback(const std::function<void()>& callback);
|
||||||
void setFrameCallback(std::function<void(int64_t)>&& callback);
|
void setFrameCallback(std::function<void(int64_t)>&& callback);
|
||||||
void setFrameCompleteCallback(std::function<void(int64_t)>&& callback);
|
void setFrameCompleteCallback(std::function<void(int64_t)>&& callback);
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,10 @@ ASurfaceControlFunctions::ASurfaceControlFunctions() {
|
|||||||
(AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility");
|
(AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility");
|
||||||
LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr,
|
LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr,
|
||||||
"Failed to find required symbol ASurfaceTransaction_setVisibility!");
|
"Failed to find required symbol ASurfaceTransaction_setVisibility!");
|
||||||
|
|
||||||
|
transactionSetZOrderFunc = (AST_setZOrder)dlsym(handle_, "ASurfaceTransaction_setZOrder");
|
||||||
|
LOG_ALWAYS_FATAL_IF(transactionSetZOrderFunc == nullptr,
|
||||||
|
"Failed to find required symbol ASurfaceTransaction_setZOrder!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderThread::frameCallback(int64_t frameTimeNanos, void* data) {
|
void RenderThread::frameCallback(int64_t frameTimeNanos, void* data) {
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ typedef void (*AST_delete)(ASurfaceTransaction* transaction);
|
|||||||
typedef void (*AST_apply)(ASurfaceTransaction* transaction);
|
typedef void (*AST_apply)(ASurfaceTransaction* transaction);
|
||||||
typedef void (*AST_setVisibility)(ASurfaceTransaction* transaction,
|
typedef void (*AST_setVisibility)(ASurfaceTransaction* transaction,
|
||||||
ASurfaceControl* surface_control, int8_t visibility);
|
ASurfaceControl* surface_control, int8_t visibility);
|
||||||
|
typedef void (*AST_setZOrder)(ASurfaceTransaction* transaction, ASurfaceControl* surface_control,
|
||||||
|
int32_t z_order);
|
||||||
|
|
||||||
struct ASurfaceControlFunctions {
|
struct ASurfaceControlFunctions {
|
||||||
ASurfaceControlFunctions();
|
ASurfaceControlFunctions();
|
||||||
@@ -112,6 +114,7 @@ struct ASurfaceControlFunctions {
|
|||||||
AST_delete transactionDeleteFunc;
|
AST_delete transactionDeleteFunc;
|
||||||
AST_apply transactionApplyFunc;
|
AST_apply transactionApplyFunc;
|
||||||
AST_setVisibility transactionSetVisibilityFunc;
|
AST_setVisibility transactionSetVisibilityFunc;
|
||||||
|
AST_setZOrder transactionSetZOrderFunc;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ChoreographerSource;
|
class ChoreographerSource;
|
||||||
|
|||||||
Reference in New Issue
Block a user