窗口显示

Signed-off-by: dubj <dubingjian@huawei.com>
Change-Id: I66f45ac5df46655582470ad6cff09db375ea1d15
This commit is contained in:
dubj
2022-04-21 17:48:03 +08:00
parent e891940c28
commit a87ae9779f
11 changed files with 117 additions and 43 deletions
+1 -1
View File
@@ -52,7 +52,7 @@
"//foundation/windowmanager/dm:libdm",
"//foundation/windowmanager/dmserver:libdms",
"//foundation/windowmanager/extension/extension_connection:libwindow_extension_client",
"//foundation/windowmanager/extension/window_extension:libwindow_exteinsion",
"//foundation/windowmanager/extension/window_extension:libwindow_extension",
"//foundation/windowmanager/extension/window_extension:window_extension_module",
"//foundation/windowmanager/wm:libwm",
"//foundation/windowmanager/wmserver:libwms",
+1 -1
View File
@@ -44,7 +44,7 @@ ohos_shared_library("libwindow_extension_client") {
"//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager",
"//foundation/graphic/standard/rosen/modules/render_service_client:librender_service_client",
"//foundation/windowmanager/wm:libwm",
"//foundation/windowmanager/extension/window_extension:libwindow_exteinsion",
"//foundation/windowmanager/extension/window_extension:libwindow_extension",
"//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base:appexecfwk_base",
"//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler",
]
@@ -24,7 +24,7 @@ namespace Rosen {
class WindowExtensionClientStubImpl : public WindowExtensionClientStub {
public:
explicit WindowExtensionClientStubImpl(sptr<IWindowExtensionCallback>& componentCallback)
: componentCallback_(componentCallback) {};
: componentCallback_(componentCallback) {};
~WindowExtensionClientStubImpl() = default;
void OnWindowReady(std::shared_ptr<RSSurfaceNode>& surfaceNode) override;
@@ -73,7 +73,7 @@ void WindowExtensionClientProxy::OnKeyEvent(std::shared_ptr<MMI::KeyEvent>& keyE
return;
}
if (!keyEvent->WriteToParcel(data)) {
if (!keyEvent->WriteToParcel(data)) {
WLOGFE("write key event failed");
return;
}
@@ -31,8 +31,7 @@ namespace {
constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowExtensionConnection"};
}
class WindowExtensionConnection::Impl
: public AAFwk::AbilityConnectionStub {
class WindowExtensionConnection::Impl : public AAFwk::AbilityConnectionStub {
public:
Impl() = default;
~Impl() = default;
@@ -68,7 +67,8 @@ WindowExtensionConnection::WindowExtensionConnection()
{
}
WindowExtensionConnection::Impl::WindowExtensionClientRecipient::WindowExtensionClientRecipient(sptr<IWindowExtensionCallback> callback)
WindowExtensionConnection::Impl::WindowExtensionClientRecipient::WindowExtensionClientRecipient(
sptr<IWindowExtensionCallback> callback)
{
callback_ = callback;
}
@@ -93,7 +93,7 @@ void WindowExtensionConnection::Impl::WindowExtensionClientRecipient::OnRemoteDi
WLOGFI("Remote died");
}
void WindowExtensionConnection::Impl::ConnectExtension(const AppExecFwk::ElementName &element, Rect rect,
uint32_t uid, sptr<IWindowExtensionCallback>& callback)
uint32_t uid, sptr<IWindowExtensionCallback>& callback)
{
AAFwk::Want want;
want.SetElement(element);
@@ -140,7 +140,7 @@ void WindowExtensionConnection::Impl::RequestFocus()
}
void WindowExtensionConnection::Impl::OnAbilityConnectDone(const AppExecFwk::ElementName &element,
const sptr<IRemoteObject> &remoteObject, int resultCode)
const sptr<IRemoteObject> &remoteObject, int resultCode)
{
if (!remoteObject) {
WLOGFE("remote object is null");
@@ -178,7 +178,7 @@ void WindowExtensionConnection::Impl::OnAbilityDisconnectDone(const AppExecFwk::
// WindowExtensionConnection
void WindowExtensionConnection::ConnectExtension(const AppExecFwk::ElementName &element, Rect rect,
uint32_t uid, sptr<IWindowExtensionCallback>& callback)
uint32_t uid, sptr<IWindowExtensionCallback>& callback)
{
pImpl_->ConnectExtension(element, rect, uid, callback);
}
+11 -7
View File
@@ -13,7 +13,7 @@
import("//build/ohos.gni")
config("libwindow_exteinsion_private_config") {
config("libwindow_extension_private_config") {
visibility = [ ":*" ]
include_dirs = [
@@ -21,19 +21,21 @@ config("libwindow_exteinsion_private_config") {
"include/zidl",
"../extension_connection/include",
"../extension_connection/include/zidl",
"../../interfaces/kits/napi/window_runtime/window_napi",
"//foundation/aafwk/standard/frameworks/kits/ability/ability_runtime/include",
"//foundation/aafwk/standard/interfaces/innerkits/runtime/include",
]
}
config("libwindow_exteinsion_public_config") {
config("libwindow_extension_public_config") {
include_dirs = [
"../../interfaces/innerkits/wm",
"../../utils/include",
]
}
## Build libwindow_exteinsion.so
ohos_shared_library("libwindow_exteinsion") {
## Build libwindow_extension.so
ohos_shared_library("libwindow_extension") {
sources = [
"../extension_connection/src/window_extension_client_proxy.cpp",
"src/js_window_extension_context.cpp",
@@ -43,12 +45,13 @@ ohos_shared_library("libwindow_exteinsion") {
"src/window_extension.cpp",
]
configs = [ ":libwindow_exteinsion_private_config" ]
configs = [ ":libwindow_extension_private_config" ]
public_configs = [ ":libwindow_exteinsion_public_config" ]
public_configs = [ ":libwindow_extension_public_config" ]
deps = [
"//foundation/graphic/standard/rosen/modules/render_service_client:librender_service_client",
"//foundation/windowmanager/interfaces/kits/napi/window_runtime:window_native_kit",
"//foundation/windowmanager/wm:libwm",
"//foundation/windowmanager/utils:libwmutil",
]
@@ -63,6 +66,7 @@ ohos_shared_library("libwindow_exteinsion") {
"graphic_standard:surface",
"hilog_native:libhilog",
"input:libmmi-client",
"utils_base:utils",
]
part_name = "window_manager"
@@ -84,7 +88,7 @@ ohos_shared_library("window_extension_module") {
configs = [ ":window_extension_module_private_config" ]
deps = [
"//foundation/windowmanager/extension/window_extension:libwindow_exteinsion",
"//foundation/windowmanager/extension/window_extension:libwindow_extension",
]
external_deps = [
@@ -82,8 +82,9 @@ public:
virtual void OnStart(const AAFwk::Want &want) override;
private:
void GetSrcPath(std::string &srcPath);
NativeValue* CallJsMethod(const char* name, NativeValue* const* argv = nullptr, size_t argc = 0);
void OnWindowCreated();
//sptr<IWindowExtensionClient> extensionToken_; // TODO IWindowExtensionClient下沉到window_extension
AbilityRuntime::JsRuntime& jsRuntime_;
std::unique_ptr<NativeReference> jsObj_;
std::shared_ptr<NativeReference> shellContextRef_;
@@ -36,7 +36,9 @@ public:
virtual void RequestFocus() override;
virtual void ConnectToExtension(sptr<IWindowExtensionClient>& token) override;
std::shared_ptr<RSSurfaceNode> CreateWindow(Rect& rect);
sptr<Window> CreateWindow(Rect& rect, const std::shared_ptr<AbilityRuntime::Context>& context);
void DestroyWindow();
sptr<Window> GetWindow() const;
private:
sptr<IDispatchInputEventListener> dispatchInputEventListener_;
@@ -18,7 +18,9 @@
#include <native_engine/native_reference.h>
#include <native_engine/native_value.h>
#include <js_extension_context.h>
#include <js_runtime_utils.h>
#include "js_window.h"
#include "js_window_extension_context.h"
#include "window_extension_connection.h"
#include "window_manager_hilog.h"
@@ -115,11 +117,11 @@ void JsWindowExtension::Init(const std::shared_ptr<AbilityLocalRecord> &record,
void JsWindowExtension::GetSrcPath(std::string &srcPath)
{
if (!Extension::abilityInfo_) {
HILOG_ERROR("abilityInfo_ is nullptr");
WLOGFE("abilityInfo_ is nullptr");
return;
}
if (!Extension::abilityInfo_->isModuleJson) {
if (!Extension::abilityInfo_->isModuleJson) {
srcPath.append(Extension::abilityInfo_->package);
srcPath.append("/assets/js/");
if (!Extension::abilityInfo_->srcPath.empty()) {
@@ -142,10 +144,6 @@ sptr<IRemoteObject> JsWindowExtension::OnConnect(const AAFwk::Want &want)
WLOGFI("called.");
Extension::OnConnect(want);
ElementName elementName = want.GetElement(); // TODO 为何之前是GetElementName()
std::string windowName = elementName.GetBundleName();
stub_ = new(std::nothrow) WindowExtensionStubImpl(windowName);
if (!stub_) {
WLOGFE("stub is nullptr.");
return nullptr;
@@ -163,14 +161,84 @@ void JsWindowExtension::OnDisconnect(const AAFwk::Want &want)
void JsWindowExtension::OnStart(const AAFwk::Want &want)
{
Extension::OnStart(want);
ElementName elementName = want.GetElement(); // TODO 为何之前是GetElementName()
std::string windowName = elementName.GetBundleName();
stub_ = new(std::nothrow)WindowExtensionStubImpl(windowName);
WLOGFI("JsWindowExtension OnStart begin..");
Rect rect { want.GetIntParam(RECT_FORM_KEY_POS_X, 0),
want.GetIntParam(RECT_FORM_KEY_POS_Y, 0),
want.GetIntParam(RECT_FORM_KEY_WIDTH, 0),
want.GetIntParam(RECT_FORM_KEY_HEIGHT, 0) };
// stub_->CreateWindow(rect);
WLOGFI(" create window rect x =%{public}d y=%{public}d w=%{public}d h=%{public}d ",
rect.posX_, rect.posY_, rect.width_, rect.height_);
if (stub_ != nullptr) {
auto context = GetContext();
if (context == nullptr) {
WLOGFE("get context failed");
return;
}
sptr<Window> window = stub_->CreateWindow(rect, context);
if (window == nullptr) {
WLOGFE("create window failed");
return;
}
OnWindowCreated();
WLOGFI("ability context onWindowReady rect x =%{public}d y=%{public}d w=%{public}d h=%{public}d ",
rect.posX_, rect.posY_, rect.width_, rect.height_);
}
}
void JsWindowExtension::OnWindowCreated()
{
NativeEngine& engine = jsRuntime_.GetNativeEngine();
std::unique_ptr<AsyncTask::CompleteCallback> complete = std::make_unique<AsyncTask::CompleteCallback>(
[=] (NativeEngine &engine, AsyncTask &task, int32_t status) {
auto window = stub_->GetWindow();
if (window == nullptr) {
WLOGFE("get window failed");
return;
}
NativeValue* value = CreateJsWindowObject(engine, window, false);
if (value == nullptr) {
WLOGFE("Create js window failed");
return;
}
NativeValue* argv[] = { value };
CallJsMethod("onWindowReady", argv, ArraySize(argv));
}
);
NativeReference* callback = nullptr;
std::unique_ptr<AsyncTask::ExecuteCallback> execute = nullptr;
AsyncTask::Schedule(engine, std::make_unique<AsyncTask>(callback, std::move(execute), std::move(complete)));
}
NativeValue* JsWindowExtension::CallJsMethod(const char* name, NativeValue* const* argv, size_t argc)
{
WLOGFI("called (%{public}s), begin", name);
if (!jsObj_) {
WLOGFW("Not found ServiceExtension.js");
return nullptr;
}
HandleScope handleScope(jsRuntime_);
auto& nativeEngine = jsRuntime_.GetNativeEngine();
NativeValue* value = jsObj_->Get();
NativeObject* obj = ConvertNativeValueTo<NativeObject>(value);
if (obj == nullptr) {
WLOGFE("Failed to get ServiceExtension object");
return nullptr;
}
NativeValue* method = obj->GetProperty(name);
if (method == nullptr || method->TypeOf() != NATIVE_FUNCTION) {
WLOGFE("Failed to get '%{public}s' from ServiceExtension object", name);
return nullptr;
}
WLOGFI("(%{public}s), success", name);
return nativeEngine.CallFunction(value, method, argv, argc);
}
} // namespace Rosen
} // namespace OHOS
@@ -59,7 +59,7 @@ void JsWindowConnectCallback::OnAbilityDisconnectDone(const AppExecFwk::ElementN
}
NativeValue* CreateJsWindowExtensionContext(NativeEngine& engine,
std::shared_ptr<WindowExtensionContext> context)
std::shared_ptr<WindowExtensionContext> context)
{
WLOGFI("CreateJsWindowExtensionContext begin");
NativeValue* objValue = CreateJsExtensionContext(engine, context); // TODO CreateJsBaseContext?
@@ -38,26 +38,21 @@ WindowExtensionStubImpl::~WindowExtensionStubImpl()
}
}
std::shared_ptr<RSSurfaceNode> WindowExtensionStubImpl::CreateWindow(Rect& rect)
sptr<Window> WindowExtensionStubImpl::CreateWindow(Rect& rect,
const std::shared_ptr<AbilityRuntime::Context>& context)
{
// WLOGFI("call start windowName_ %{public}s", windowName_.c_str());
sptr<WindowOption> option = new (std::nothrow)WindowOption();
if (option == nullptr) {
WLOGFE("Get option failed");
return nullptr;
}
option->SetWindowType(WindowType::WINDOW_TYPE_APP_COMPONENT);
option->SetWindowMode(OHOS::Rosen::WindowMode::WINDOW_MODE_FLOATING);
option->SetWindowRect(rect);
WLOGFI("create window");
window_ = Window::Create(windowName_, option, nullptr);
if (window_ == nullptr) {
WLOGFE("create window failed");
return nullptr;
}
WLOGFI("call end");
return nullptr; //window_->GetSurfaceNode();
option->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
option->SetWindowMode(OHOS::Rosen::WindowMode::WINDOW_MODE_FULLSCREEN);
// option->SetWindowRect(rect);
WLOGFI("Window::Create");
window_ = Window::Create(windowName_, option, context);
return window_;
}
void WindowExtensionStubImpl::Resize(Rect rect)
@@ -91,8 +86,12 @@ void WindowExtensionStubImpl::RequestFocus()
void WindowExtensionStubImpl::ConnectToExtension(sptr<IWindowExtensionClient>& token)
{
token_ = token;
token_->OnBackPress();
WLOGFI("called");
}
sptr<Window> WindowExtensionStubImpl::GetWindow() const
{
return window_;
}
} // namespace Rosen
} // namespace OHOS