diff --git a/arkoala-arkts/arkui/src/Application.ts b/arkoala-arkts/arkui/src/Application.ts index df0f3e77354200f04518068900dffaae8561aff6..64e60da6e3e43126c3cc9df85d894567efd02ddf 100644 --- a/arkoala-arkts/arkui/src/Application.ts +++ b/arkoala-arkts/arkui/src/Application.ts @@ -302,7 +302,7 @@ export class Application { } // TODO: make [emitEvent] suitable to get string argument - emitEvent(type: int32, target: int32, arg0: int32, arg1: int32) { + emitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string { const node = PeerNode.findPeerByNativeId(target) if (node != undefined) { try { @@ -328,6 +328,7 @@ export class Application { InteropNativeModule._NativeLog("emitEvent error: " + errorInfo(error as Object)) } } + return "0" } static createApplication(appUrl: string, params: string, useNativeLog: boolean): Application { diff --git a/arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts b/arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts index 431e97dff35b652f3edd28789c7205917037a342..3a7ba1c6caddfe386c9a21c4d75c743fb085084e 100644 --- a/arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts +++ b/arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts @@ -43,7 +43,7 @@ export class ArkTestComponentPeer extends ArkCommonMethodPeer { this.onChangeCallback = callback } logAttribute(message: string): void { - InteropNativeModule._AppendGroupedLog(1, message) + InteropNativeModule._AppendGroupedLog(0, message + "\n") } } export interface ArkTestComponentAttributes extends ArkCommonMethodAttributes { diff --git a/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts b/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts index 38bf4ba7c26a5b59ed2dc621fa254747539fb0e0..83016e900be785d53f0d86b590edce4597fec9ce 100644 --- a/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts +++ b/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts @@ -113,8 +113,9 @@ export class EtsHarnessApplication { return true } - emitEvent(type: int32, target: int32, arg0: int32, arg1: int32) { + emitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string { const node = PeerNode.findPeerByNativeId(target) + let result = "0" switch (type) { case 1: { if (node != undefined) { @@ -124,11 +125,15 @@ export class EtsHarnessApplication { break } case 2: { - UserView.startNativeLog(1) + UserView.startNativeLog(0) break; } case 3: { - UserView.stopNativeLog(1) + UserView.stopNativeLog(0) + break; + } + case 4: { + result = UserView.getNativeLog(0) break; } default: { @@ -136,6 +141,7 @@ export class EtsHarnessApplication { break; } } + return result } updateStates(manager: StateManager, root: ComputableState ) { diff --git a/arkoala-arkts/ets-harness/src/ets/pages/case1.ets b/arkoala-arkts/ets-harness/src/ets/pages/case1.ets index 8594a52146b8ff833d3da9c834e46f83d0e43903..98f08cc78f917d946f3d32e72ad1e1411dac2a8e 100644 --- a/arkoala-arkts/ets-harness/src/ets/pages/case1.ets +++ b/arkoala-arkts/ets-harness/src/ets/pages/case1.ets @@ -5,7 +5,6 @@ struct Case1 { build() { TestComponent({ id: 42 }).onChange(() => { this.x++ - console.log("Case1 - value:" + this.x) }) .log("Case1 - value:" + this.x) } diff --git a/arkoala-arkts/ets-harness/src/ets/pages/case2.ets b/arkoala-arkts/ets-harness/src/ets/pages/case2.ets index 30529d8ff43399e65a4711f9e977a7b44a7bf47b..392f423b721054a3cb977c33ac769cf3d6a414c2 100644 --- a/arkoala-arkts/ets-harness/src/ets/pages/case2.ets +++ b/arkoala-arkts/ets-harness/src/ets/pages/case2.ets @@ -5,7 +5,6 @@ struct Case2 { build() { TestComponent({ id: 42 }).onChange(() => { this.x-- - console.log("Case2 - value:" + this.x) }) .log("Case2 - value:" + this.x) } diff --git a/arkoala-arkts/ets-harness/src/loader.ts b/arkoala-arkts/ets-harness/src/loader.ts index 586a48ad776d73d7c0253693835eb97f636d4636..4fabe956a1c2248e01cfcdcbd257aaef9e5b53e0 100644 --- a/arkoala-arkts/ets-harness/src/loader.ts +++ b/arkoala-arkts/ets-harness/src/loader.ts @@ -26,7 +26,7 @@ export interface LoaderOps { } export interface NativeControl extends LoaderOps { - _EmitEvent(type: int32, target: int32, arg0: int32, arg1: int32): void + _EmitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string _RestartWith(page: string): void } @@ -46,20 +46,27 @@ export function nativeModule(): NativeControl { return theModule } +export enum TaskType { + OnChange = 1, + StartLog = 2, + StopLog = 3, + GetLog = 4, +} + export class AppControl { getLog(): string { - return "" + return nativeModule()._EmitEvent(TaskType.GetLog, -1, 0, 0) } - emitTask(type: int32, target: int32, arg1: int32, arg2: int32): AppControl { + emitTask(type: int32, target: int32, arg1: int32 = 0, arg2: int32 = 0): AppControl { nativeModule()._EmitEvent(type, target, arg1, arg2) return this } start(): AppControl { - nativeModule()._EmitEvent(2, -1, 0, 0) + nativeModule()._EmitEvent(TaskType.StartLog, -1, 0, 0) return this } stop(): AppControl { - nativeModule()._EmitEvent(3, -1, 0, 0) + nativeModule()._EmitEvent(TaskType.StopLog, -1, 0, 0) return this } nextFrame(): AppControl { diff --git a/arkoala-arkts/ets-harness/src/test_entry.ts b/arkoala-arkts/ets-harness/src/test_entry.ts index ec112fe5e519d4085f3f10c7974bb5992df68cb7..47cd0f1566f4573dda8c84920a92c6a3d06db363 100644 --- a/arkoala-arkts/ets-harness/src/test_entry.ts +++ b/arkoala-arkts/ets-harness/src/test_entry.ts @@ -1,33 +1,37 @@ import { Assert } from "@koalaui/harness" -import { AppControl } from "./loader" +import { AppControl, TaskType } from "./loader" export function entry(control: AppControl) { suite("Case1", () => { test("StateChange:Increment", () => { + const expected = "Case1 - value:1\nCase1 - value:2\nCase1 - value:3\n" + const componentId = 42 // id from Case1.TestComponent // onChange - control + const actual = control .loadPage("Case1") .start() - .emitTask(1, 42, 0, 0).nextFrame() - .emitTask(1, 42, 0, 0).nextFrame() - .emitTask(1, 42, 0, 0).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() .stop() - let x = 3 - Assert.equal(x, 3, "StateChange test is failed!\n expected: " + 3 + "\ncurrent: " + x) + .getLog() + Assert.equal(expected, actual, "StateChange: Case1 test is failed!") }) }) suite("Case2", () => { test("StateChange:Decrement", () => { + const expected = "Case2 - value:-1\nCase2 - value:-2\nCase2 - value:-3\n" + const componentId = 42 // id from Case2.TestComponent // onChange - control + const actual = control .loadPage("Case2") .start() - .emitTask(1, 42, 0, 0).nextFrame() - .emitTask(1, 42, 0, 0).nextFrame() - .emitTask(1, 42, 0, 0).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() .stop() - let x = -3 - Assert.equal(x, -3, "StateChange test is failed!\n expected: " + (-3) + "\ncurrent: " + x) + .getLog() + Assert.equal(expected, actual, "StateChange: Case2 test is failed!") }) }) } diff --git a/arkoala-arkts/loader/src/loader.ts b/arkoala-arkts/loader/src/loader.ts index 8936e229e7ea669915fc0c9c0b484149afd0acc5..f66b0a9775d09a10bf5c11fe79d032e68ed46984 100644 --- a/arkoala-arkts/loader/src/loader.ts +++ b/arkoala-arkts/loader/src/loader.ts @@ -46,7 +46,7 @@ export interface NativeControl extends LoaderOps { _SetVsyncCallback(pipeline: KPointer): void _VSyncAwait(pipeline: KPointer): Promise _UnblockVsyncWait(pipeline: KPointer): void - _EmitEvent(type: int32, target: int32, arg0: int32, arg1: int32): void + _EmitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string } function callCallback(id: int32, args: KUint8ArrayPtr, length: int32): int32 { diff --git a/interop/src/cpp/common-interop.cc b/interop/src/cpp/common-interop.cc index c522cc84ab0bd84559822dbc4005e071c0c42f42..cd3146017a72ae26c0003daf542ef9ad802386be 100644 --- a/interop/src/cpp/common-interop.cc +++ b/interop/src/cpp/common-interop.cc @@ -259,7 +259,7 @@ struct ForeignVMContext { typedef KInt (*LoadVirtualMachine_t)(KInt vmKind, const char* classPath, const char* libraryPath, const struct ForeignVMContext* foreignVM); typedef KNativePointer (*StartApplication_t)(const char* appUrl, const char* appParams); typedef KBoolean (*RunApplication_t)(const KInt arg0, const KInt arg1); -typedef void (*EmitEvent_t)(const KInt type, const KInt target, const KInt arg0, const KInt arg1); +typedef const char* (*EmitEvent_t)(const KInt type, const KInt target, const KInt arg0, const KInt arg1); typedef void (*RestartWith_t)(const char* page); void* getImpl(const char* path, const char* name) { @@ -310,12 +310,15 @@ KBoolean impl_RunApplication(const KInt arg0, const KInt arg1) { } KOALA_INTEROP_2(RunApplication, KBoolean, KInt, KInt) -void impl_EmitEvent(const KInt type, const KInt target, const KInt arg0, const KInt arg1) { +KStringPtr impl_EmitEvent(const KInt type, const KInt target, const KInt arg0, const KInt arg1) { static EmitEvent_t impl = nullptr; if (!impl) impl = reinterpret_cast(getImpl(nullptr, "EmitEvent")); - impl(type, target, arg0, arg1); + const char* out = impl(type, target, arg0, arg1); + auto size = std::string(out).size(); + KStringPtr result(out, size, true); + return result; } -KOALA_INTEROP_V4(EmitEvent, KInt, KInt, KInt, KInt) +KOALA_INTEROP_4(EmitEvent,KStringPtr, KInt, KInt, KInt, KInt) void impl_RestartWith(const KStringPtr& page) { static RestartWith_t impl = nullptr; diff --git a/interop/src/cpp/vmloader.cc b/interop/src/cpp/vmloader.cc index d409a87809cda49b24ca74dfb50627c35307f5f4..e7eda0d423f7ca522c28c57f70d23030254936fd 100644 --- a/interop/src/cpp/vmloader.cc +++ b/interop/src/cpp/vmloader.cc @@ -310,7 +310,7 @@ const AppInfo javaAppInfo = { "enter", "(IIJ)Z", "emitEvent", - "(IIII)V", + "(IIII)Ljava/lang/String;", }; #endif @@ -324,7 +324,7 @@ const AppInfo pandaAppInfo = { "enter", "IIJ:Z", "emitEvent", - "IIII:V", + "IIII:Lstd/core/String;", }; const AppInfo harnessAppInfo = { "@koalaui/ets-harness/src/EtsHarnessApplication/EtsHarnessApplication", @@ -335,7 +335,7 @@ const AppInfo harnessAppInfo = { "enter", "II:Z", "emitEvent", - "IIII:V", + "IIII:Lstd/core/String;", "restartWith", "Lstd/core/String;:V" }; @@ -509,15 +509,15 @@ extern "C" DLL_EXPORT KBoolean RunApplication(const KInt arg0, const KInt arg1) return 1; } -extern "C" DLL_EXPORT void EmitEvent(const KInt type, const KInt target, const KInt arg0, const KInt arg1) { +extern "C" DLL_EXPORT const char* EmitEvent(const KInt type, const KInt target, const KInt arg0, const KInt arg1) { #ifdef KOALA_JNI if (g_vmEntry.vmKind == JAVA_VM_KIND) { JNIEnv* jEnv = (JNIEnv*)(g_vmEntry.env); if (!g_vmEntry.emitEvent) { LOGE("Cannot find emitEvent method"); - return; + return "-1"; } - jEnv->CallVoidMethod( + auto rv = (jstring)jEnv->CallObjectMethod( (jobject)(g_vmEntry.app), (jmethodID)(g_vmEntry.emitEvent), (jint)type, @@ -529,6 +529,8 @@ extern "C" DLL_EXPORT void EmitEvent(const KInt type, const KInt target, const K jEnv->ExceptionDescribe(); jEnv->ExceptionClear(); } + const char *result = jEnv->GetStringUTFChars(rv, 0); + return result; } #endif #ifdef KOALA_ETS_NAPI @@ -536,9 +538,9 @@ extern "C" DLL_EXPORT void EmitEvent(const KInt type, const KInt target, const K EtsEnv* etsEnv = (EtsEnv*)(g_vmEntry.env); if (!g_vmEntry.emitEvent) { LOGE("Cannot find emitEvent method"); - return; + return "-1"; } - etsEnv->CallVoidMethod( + auto rv = (ets_string)etsEnv->CallObjectMethod( (ets_object)(g_vmEntry.app), (ets_method)(g_vmEntry.emitEvent), (ets_int)type, @@ -551,8 +553,11 @@ extern "C" DLL_EXPORT void EmitEvent(const KInt type, const KInt target, const K etsEnv->ErrorDescribe(); etsEnv->ErrorClear(); } + const char *result = etsEnv->GetStringUTFChars(rv, 0); + return result; } #endif + return "-1"; } extern "C" DLL_EXPORT void RestartWith(const char* page) {