diff --git a/multimedia/BUILD.gn b/multimedia/BUILD.gn
index b1ffb0661a4ce34d348397b078bbafe6a0f05fab..f4b0f53bfacb7cff5f621394de29ced09d87674c 100644
--- a/multimedia/BUILD.gn
+++ b/multimedia/BUILD.gn
@@ -45,6 +45,7 @@ group("multimedia") {
"media/media_cpp_standard:ActsAvcodecNdkTest",
"media/media_js_standard/audioPlayer:audio_player_js_hap",
"media/media_js_standard/audioRecorder:audio_recorder_js_hap",
+ "media/media_js_standard/avRecorder:av_recorder_js_hap",
"media/media_js_standard/recorderFormat:recorder_format_js_hap",
"media/media_js_standard/videoPlayer:video_player_js_hap",
"medialibrary/mediaLibrary_album:mediaLibrary_album_hap",
diff --git a/multimedia/media/media_js_standard/MediaTestBase.js b/multimedia/media/media_js_standard/MediaTestBase.js
index 20a4fd1056a585bc9a38b2f413b8e11effd402f4..d61e40a4d8bfe864c40d0a964a215a4f62c90df0 100644
--- a/multimedia/media/media_js_standard/MediaTestBase.js
+++ b/multimedia/media/media_js_standard/MediaTestBase.js
@@ -20,7 +20,7 @@ import mediaLibrary from '@ohos.multimedia.mediaLibrary'
import fileio from '@ohos.fileio'
import featureAbility from '@ohos.ability.featureAbility'
import { UiDriver, BY, PointerMatrix } from '@ohos.UiTest'
-
+const CODECMIMEVALUE = ['video/avc', 'audio/mp4a-latm', 'audio/mpeg']
const context = featureAbility.getContext();
export async function getPermission(permissionNames) {
@@ -31,23 +31,54 @@ export async function getPermission(permissionNames) {
export async function driveFn(num) {
console.info(`case come in driveFn 111`)
- try {
- let driver = await UiDriver.create()
- console.info(`case come in driveFn 222`)
- console.info(`driver is ${JSON.stringify(driver)}`)
+ let driver = await UiDriver.create()
+ console.info(`case come in driveFn 222`)
+ console.info(`driver is ${JSON.stringify(driver)}`)
+ await msleepAsync(2000)
+ console.info(`UiDriver start`)
+ for (let i = 0; i < num; i++) {
+ let button = await driver.findComponent(BY.text('允许'))
+ console.info(`button is ${JSON.stringify(button)}`)
await msleepAsync(2000)
- console.info(`UiDriver start`)
- for (let i = 0; i < num; i++) {
- let button = await driver.findComponent(BY.text('允许'))
- console.info(`button is ${JSON.stringify(button)}`)
- await msleepAsync(2000)
- await button.click()
+ await button.click()
+ }
+ await msleepAsync(2000)
+}
+
+export async function getAvRecorderFd(pathName, fileType) {
+ console.info('case come in getAvRecorderFd')
+ let fdObject = {
+ fileAsset : null,
+ fdNumber : null
+ }
+ let displayName = pathName;
+ console.info('[mediaLibrary] displayName is ' + displayName);
+ console.info('[mediaLibrary] fileType is ' + fileType);
+ const mediaTest = mediaLibrary.getMediaLibrary();
+ let fileKeyObj = mediaLibrary.FileKey;
+ let mediaType;
+ let publicPath;
+ if (fileType == 'audio') {
+ mediaType = mediaLibrary.MediaType.AUDIO;
+ publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_AUDIO);
+ } else {
+ mediaType = mediaLibrary.MediaType.VIDEO;
+ publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO);
+ }
+ console.info('[mediaLibrary] publicPath is ' + publicPath);
+ let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath);
+ if (dataUri != undefined) {
+ let args = dataUri.id.toString();
+ let fetchOp = {
+ selections : fileKeyObj.ID + "=?",
+ selectionArgs : [args],
}
- await msleepAsync(2000)
- } catch (err) {
- console.info('err is ' + err);
- return;
+ let fetchFileResult = await mediaTest.getFileAssets(fetchOp);
+ fdObject.fileAsset = await fetchFileResult.getAllObject();
+ fdObject.fdNumber = await fdObject.fileAsset[0].open('rw');
+ console.info('case getFd number is: ' + fdObject.fdNumber);
}
+ return fdObject;
}
// File operation
@@ -63,7 +94,17 @@ export async function getFileDescriptor(fileName) {
});
return fileDescriptor;
}
-
+export async function getStageFileDescriptor(fileName) {
+ let fileDescriptor = undefined;
+ let mgr = globalThis.abilityContext.resourceManager
+ await mgr.getRawFileDescriptor(fileName).then(value => {
+ fileDescriptor = {fd: value.fd, offset: value.offset, length: value.length};
+ console.log('case getRawFileDescriptor success fileName: ' + fileName);
+ }).catch(error => {
+ console.log('case getRawFileDescriptor err: ' + error);
+ });
+ return fileDescriptor;
+}
export async function closeFileDescriptor(fileName) {
await resourceManager.getResourceManager().then(async (mgr) => {
await mgr.closeRawFileDescriptor(fileName).then(() => {
@@ -117,6 +158,12 @@ export function printError(error, done) {
done();
}
+export function assertErr(opera, err, done) {
+ console.info(`case ${opera} error,errMessage is ${err.message}`);
+ expect().assertFail();
+ done();
+}
+
// callback function for promise call back error
export function failureCallback(error) {
expect().assertFail();
@@ -130,6 +177,21 @@ export function catchCallback(error) {
}
export function checkDescription(actualDescription, descriptionKey, descriptionValue) {
+ for (let i = 0; i < descriptionKey.length; i++) {
+ let property = actualDescription[descriptionKey[i]];
+ console.info('case key is '+ descriptionKey[i]);
+ console.info('case actual value is '+ property);
+ console.info('case hope value is '+ descriptionValue[i]);
+ if (descriptionKey[i] == 'codec_mime') {
+ expect(property).assertEqual(CODECMIMEVALUE[descriptionValue[i]]);
+ } else {
+ expect(property).assertEqual(descriptionValue[i]);
+ }
+
+ }
+}
+
+export function checkOldDescription(actualDescription, descriptionKey, descriptionValue) {
for (let i = 0; i < descriptionKey.length; i++) {
let property = actualDescription[descriptionKey[i]];
console.info('case key is ' + descriptionKey[i]);
diff --git a/multimedia/media/media_js_standard/avRecorder/BUILD.gn b/multimedia/media/media_js_standard/avRecorder/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..d92ea4e494a77588eba6bf8a63e2254e49d395ed
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/BUILD.gn
@@ -0,0 +1,35 @@
+# Copyright (C) 2021 Huawei Device Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//test/xts/tools/build/suite.gni")
+
+ohos_js_hap_suite("av_recorder_js_hap") {
+ hap_profile = "./src/main/config.json"
+ deps = [
+ ":av_recorder_js_assets",
+ ":av_recorder_resources",
+ ]
+ certificate_profile = "./signature/openharmony_sx.p7b"
+ hap_name = "ActsAvRecorderJsTest"
+ subsystem_name = "multimedia"
+ part_name = "multimedia_player_framework"
+}
+ohos_js_assets("av_recorder_js_assets") {
+ js2abc = true
+ hap_profile = "./src/main/config.json"
+ source_dir = "./src/main/js"
+}
+ohos_resources("av_recorder_resources") {
+ sources = [ "./src/main/resources" ]
+ hap_profile = "./src/main/config.json"
+}
diff --git a/multimedia/media/media_js_standard/avRecorder/Test.json b/multimedia/media/media_js_standard/avRecorder/Test.json
new file mode 100644
index 0000000000000000000000000000000000000000..b9bc1c958b9a186e796338fe1f14d91e356c2c40
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/Test.json
@@ -0,0 +1,34 @@
+{
+ "description": "Configuration for avRecorder Tests",
+ "driver": {
+ "type": "OHJSUnitTest",
+ "test-timeout": "1000000",
+ "shell-timeout": "1000000",
+ "testcase-timeout": 60000,
+ "bundle-name": "ohos.acts.multimedia.audio.avrecorder",
+ "package-name": "ohos.acts.multimedia.audio.avrecorder"
+ },
+ "kits": [
+ {
+ "type": "ShellKit",
+ "run-command": [
+ "rm -rf /storage/media/100/local/files/Audios/audio_*",
+ "rm -rf /storage/media/100/local/files/Videos/audio_*",
+ "param set persist.ace.testmode.enabled 1",
+ "power-shell wakeup",
+ "uinput -T -d 300 600 -m 300 600 300 100 -u 300 100",
+ "power-shell setmode 602"
+ ],
+ "teardown-command":[
+ "power-shell setmode 600"
+ ]
+ },
+ {
+ "test-file-name": [
+ "ActsAvRecorderJsTest.hap"
+ ],
+ "type": "AppInstallKit",
+ "cleanup-apps": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/signature/openharmony_sx.p7b b/multimedia/media/media_js_standard/avRecorder/signature/openharmony_sx.p7b
new file mode 100644
index 0000000000000000000000000000000000000000..af1e34a9a3de7fd75a2064c2ee16571882d639a3
Binary files /dev/null and b/multimedia/media/media_js_standard/avRecorder/signature/openharmony_sx.p7b differ
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/config.json b/multimedia/media/media_js_standard/avRecorder/src/main/config.json
new file mode 100644
index 0000000000000000000000000000000000000000..0e3f3f389bf8325c3391b22dd1741fcedee9ca2f
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/config.json
@@ -0,0 +1,126 @@
+{
+ "app": {
+ "apiVersion": {
+ "compatible": 6,
+ "releaseType": "Beta1",
+ "target": 7
+ },
+ "vendor": "acts",
+ "bundleName": "ohos.acts.multimedia.audio.avrecorder",
+ "version": {
+ "code": 1000000,
+ "name": "1.0.0"
+ }
+ },
+ "deviceConfig": {
+ "default": {
+ "debug": true
+ }
+ },
+ "module": {
+ "abilities": [
+ {
+ "skills": [
+ {
+ "entities": [
+ "entity.system.home"
+ ],
+ "actions": [
+ "action.system.home"
+ ]
+ }
+ ],
+ "orientation": "unspecified",
+ "formsEnabled": false,
+ "name": ".MainAbility",
+ "srcLanguage": "js",
+ "srcPath": "MainAbility",
+ "icon": "$media:icon",
+ "description": "$string:MainAbility_desc",
+ "label": "$string:MainAbility_label",
+ "type": "page",
+ "visible": true,
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "formsEnabled": false,
+ "name": ".TestAbility",
+ "srcLanguage": "js",
+ "srcPath": "TestAbility",
+ "icon": "$media:icon",
+ "description": "$string:TestAbility_desc",
+ "label": "$string:TestAbility_label",
+ "type": "page",
+ "visible": true,
+ "launchType": "standard"
+ }
+ ],
+ "deviceType": [
+ "tablet",
+ "default",
+ "default",
+ "tablet",
+ "tv",
+ "wearable"
+ ],
+ "reqPermissions": [
+ {
+ "name": "ohos.permission.GRANT_SENSITIVE_PERMISSIONS",
+ "reason": "use ohos.permission.GRANT_SENSITIVE_PERMISSIONS"
+ },
+ {
+ "name": "ohos.permission.MICROPHONE",
+ "reason": "use ohos.permission.MICROPHONE"
+ },
+ {
+ "name": "ohos.permission.MEDIA_LOCATION",
+ "reason": "use ohos.permission.MEDIA_LOCATION"
+ },
+ {
+ "name": "ohos.permission.READ_MEDIA",
+ "reason": "use ohos.permission.READ_MEDIA"
+ },
+ {
+ "name": "ohos.permission.WRITE_MEDIA",
+ "reason": "use ohos.permission.WRITE_MEDIA"
+ }
+ ],
+ "mainAbility": ".MainAbility",
+ "distro": {
+ "moduleType": "entry",
+ "installationFree": false,
+ "deliveryWithInstall": true,
+ "moduleName": "entry"
+ },
+ "package": "ohos.acts.multimedia.audio.avrecorder",
+ "name": ".entry",
+ "js": [
+ {
+ "pages": [
+ "pages/index/index"
+ ],
+ "name": "default",
+ "window": {
+ "designWidth": 720,
+ "autoDesignWidth": true
+ }
+ },
+ {
+ "pages": [
+ "pages/index/index"
+ ],
+ "name": ".TestAbility",
+ "window": {
+ "designWidth": 720,
+ "autoDesignWidth": false
+ }
+ }
+ ],
+ "testRunner": {
+ "name": "OpenHarmonyTestRunner",
+ "srcPath": "TestRunner"
+ },
+ "srcPath": ""
+ }
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/app.js b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..830070d196d86b127cea947d168bfd116f446205
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/app.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export default {
+ onCreate() {
+ console.info('AceApplication onCreate');
+ },
+ onDestroy() {
+ console.info('AceApplication onDestroy');
+ }
+};
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/i18n/en-US.json b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/i18n/en-US.json
new file mode 100644
index 0000000000000000000000000000000000000000..e63c70d978a3a53be988388c87182f81785e170c
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/i18n/en-US.json
@@ -0,0 +1,6 @@
+{
+ "strings": {
+ "hello": "Hello",
+ "world": "World"
+ }
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/i18n/zh-CN.json b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/i18n/zh-CN.json
new file mode 100644
index 0000000000000000000000000000000000000000..de6ee5748322f44942c1b003319d8e66c837675f
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/i18n/zh-CN.json
@@ -0,0 +1,6 @@
+{
+ "strings": {
+ "hello": "您好",
+ "world": "世界"
+ }
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.css b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..c9195944a956c0d5628c701b7a3d9d2ed525cd2d
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.css
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.container {
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+}
+
+.title {
+ font-size: 40px;
+ color: #000000;
+ opacity: 0.9;
+}
+
+@media screen and (device-type: tablet) and (orientation: landscape) {
+ .title {
+ font-size: 100px;
+ }
+}
+
+@media screen and (device-type: wearable) {
+ .title {
+ font-size: 28px;
+ color: #FFFFFF;
+ }
+}
+
+@media screen and (device-type: tv) {
+ .container {
+ background-image: url("/common/images/Wallpaper.png");
+ background-size: cover;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ .title {
+ font-size: 100px;
+ color: #FFFFFF;
+ }
+}
+
+@media screen and (device-type: phone) and (orientation: landscape) {
+ .title {
+ font-size: 60px;
+ }
+}
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.hml b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.hml
new file mode 100644
index 0000000000000000000000000000000000000000..8d0e2061b88c99c91488405f0f2ead0c77de1a9e
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.hml
@@ -0,0 +1,20 @@
+
+
+
+
+ {{ $t('strings.hello') }} {{ title }}
+
+
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.js b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..10a75693f4d0c5190ffc04a915bc0f73d797e86a
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/MainAbility/pages/index/index.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+export default {
+ data: {
+ title: ""
+ },
+ onInit() {
+ this.title = this.$t('strings.world');
+ },
+ onShow() {
+ console.info('onShow finish')
+ },
+ onReady() {
+ },
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/app.js b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5ee271df29e516d1c8929054283e5f2bf5c981c
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/app.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'
+import { Hypium } from '@ohos/hypium'
+import testsuite from '../test/List.test'
+
+export default {
+ onCreate() {
+ console.info('TestApplication onCreate')
+ var abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
+ var abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
+ console.info('start run testcase!!!')
+ Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite)
+ },
+ onDestroy() {
+ console.info("TestApplication onDestroy");
+ }
+};
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/i18n/en-US.json b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/i18n/en-US.json
new file mode 100644
index 0000000000000000000000000000000000000000..55561b83737c3c31d082fbfa11e5fc987a351104
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/i18n/en-US.json
@@ -0,0 +1,8 @@
+{
+ "strings": {
+ "hello": "Hello",
+ "world": "World"
+ },
+ "Files": {
+ }
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/i18n/zh-CN.json b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/i18n/zh-CN.json
new file mode 100644
index 0000000000000000000000000000000000000000..cce1af06761a42add0cac1a0567aa3237eda8cb4
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/i18n/zh-CN.json
@@ -0,0 +1,8 @@
+{
+ "strings": {
+ "hello": "您好",
+ "world": "世界"
+ },
+ "Files": {
+ }
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.css b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..b21c92c6290ea747bd891e2ab673721afc5521ed
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.css
@@ -0,0 +1,30 @@
+.container {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+}
+
+.title {
+ font-size: 60px;
+ text-align: center;
+ width: 100%;
+ height: 40%;
+ margin: 10px;
+}
+
+@media screen and (device-type: phone) and (orientation: landscape) {
+ .title {
+ font-size: 60px;
+ }
+}
+
+@media screen and (device-type: tablet) and (orientation: landscape) {
+ .title {
+ font-size: 100px;
+ }
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.hml b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.hml
new file mode 100644
index 0000000000000000000000000000000000000000..f64b040a5ae394dbaa5e185e1ecd4f4556b92184
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.hml
@@ -0,0 +1,5 @@
+
+
+ {{ $t('strings.hello') }} {{ title }}
+
+
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.js b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..d94b75c085fa1c16a0b2721609b18c57a7295476
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestAbility/pages/index/index.js
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export default {
+ data: {
+ title: ""
+ },
+ onInit() {
+ this.title = this.$t('strings.world');
+ }
+}
+
+
+
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/TestRunner/OpenHarmonyTestRunner.js b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestRunner/OpenHarmonyTestRunner.js
new file mode 100644
index 0000000000000000000000000000000000000000..b9e78ce7cf73f1ade6ba52a408a44e33f5430f0d
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/TestRunner/OpenHarmonyTestRunner.js
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'
+
+function translateParamsToString(parameters) {
+ const keySet = new Set([
+ '-s class', '-s notClass', '-s suite', '-s itName',
+ '-s level', '-s testType', '-s size', '-s timeout',
+ '-s package', '-s dryRun'
+ ])
+ let targetParams = '';
+ for (const key in parameters) {
+ if (keySet.has(key)) {
+ targetParams += ' ' + key + ' ' + parameters[key]
+ }
+ }
+ return targetParams.trim()
+}
+
+ export default {
+ onPrepare() {
+ console.info('OpenHarmonyTestRunner OnPrepare')
+ },
+ onRun() {
+ console.log('OpenHarmonyTestRunner onRun run')
+ var abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
+ var abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
+
+ var testAbilityName = abilityDelegatorArguments.parameters['-p'] + '.TestAbility'
+
+ var cmd = 'aa start -d 0 -a ' + testAbilityName + ' -b ' + abilityDelegatorArguments.bundleName
+ cmd += ' ' + translateParamsToString(abilityDelegatorArguments.parameters)
+ var debug = abilityDelegatorArguments.parameters["-D"]
+ console.info('debug value : '+debug)
+ if (debug == 'true')
+ {
+ cmd += ' -D'
+ }
+ console.info('cmd : '+cmd)
+ abilityDelegator.executeShellCommand(cmd, (err, data) => {
+ console.info('executeShellCommand : err : ' + JSON.stringify(err));
+ console.info('executeShellCommand : data : ' + data.stdResult);
+ console.info('executeShellCommand : data : ' + data.exitCode);
+ })
+ }
+};
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/test/AVRecorderFuncTest.test.js b/multimedia/media/media_js_standard/avRecorder/src/main/js/test/AVRecorderFuncTest.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..30e6e84df328191e062928aa595b88b4d4b0f39b
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/test/AVRecorderFuncTest.test.js
@@ -0,0 +1,517 @@
+/*
+ * Copyright (C) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import * as mediaTestBase from '../../../../../MediaTestBase.js';
+import media from '@ohos.multimedia.media';
+import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index';
+
+export default function AVRecorderFuncTest(recorderContxt) {
+ describe('AVRecorderFuncTest', function () {
+ const RECORDER_TIME = 3000;
+ const PAUSE_TIME = 1000;
+ const END = 0;
+ const CREATE_PROMISE = 1;
+ const CREATE_CALLBACK = 2;
+ const PREPARE_PROMISE = 3;
+ const PREPARE_CALLBACK = 4;
+ const GETSURFACE_PROMISE = 5;
+ const GETSURFACE_CALLBACK = 6;
+ const STARTCAMERA = 7;
+ const START_PROMISE = 8;
+ const START_CALLBACK = 9;
+ const PAUSE_PROMISE = 10;
+ const PAUSE_CALLBACK = 11;
+ const RESUME_PROMISE = 12;
+ const RESUME_CALLBACK = 13;
+ const STOP_PROMISE = 14;
+ const STOP_CALLBACK = 15;
+ const RESET_PROMISE = 16;
+ const RESET_CALLBACK = 17;
+ const RELEASE_PROMISE = 18;
+ const RELEASE_CALLBACK = 19;
+ const SETCALLBACKOFF = 20;
+ const STOPVIDEOOUTPUT = 21;
+ let mySteps = new Array();
+ let caseCount = 0;
+ let fdPath;
+ let fdObject;
+ let playerSurfaceId = '';
+ let avRecorder = null;
+ let surfaceID = '';
+ let needDone = false;
+
+ let avProfile = {
+ audioBitrate : 48000,
+ audioChannels : 2,
+ audioCodec : media.CodecMimeType.AUDIO_AAC,
+ audioSampleRate : 48000,
+ fileFormat : media.ContainerFormatType.CFT_MPEG_4,
+ videoBitrate : 48000,
+ videoCodec : media.CodecMimeType.VIDEO_MPEG4,
+ videoFrameWidth : 640,
+ videoFrameHeight : 480,
+ videoFrameRate : 30
+ }
+ let avConfig = {
+ audioSourceType : media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
+ videoSourceType : media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV,
+ profile : avProfile,
+ url : 'fd://',
+ rotation : 0,
+ location : { latitude : 30, longitude : 130 }
+ }
+
+ let audioProfile = {
+ audioBitrate : 48000,
+ audioChannels : 2,
+ audioCodec : media.CodecMimeType.AUDIO_AAC,
+ audioSampleRate : 48000,
+ fileFormat : media.ContainerFormatType.CFT_MPEG_4,
+ }
+
+ let audioConfig = {
+ audioSourceType : media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
+ profile : audioProfile,
+ url : 'fd://',
+ rotation : 0,
+ location : { latitude : 30, longitude : 130 }
+ }
+
+ beforeAll(async function () {
+ console.info('beforeAll case In');
+ let permissionName1 = 'ohos.permission.MICROPHONE';
+ let permissionName2 = 'ohos.permission.MEDIA_LOCATION';
+ let permissionName3 = 'ohos.permission.READ_MEDIA';
+ let permissionName4 = 'ohos.permission.WRITE_MEDIA';
+ let permissionName5 = 'ohos.permission.CAMERA';
+ let permissionNames = [permissionName1, permissionName2, permissionName3, permissionName4, permissionName5];
+ await mediaTestBase.getPermission(permissionNames);
+ await mediaTestBase.msleepAsync(2000);
+ await mediaTestBase.driveFn(3);
+ console.info('beforeAll case Out');
+ })
+
+ beforeEach(async function () {
+ console.info('beforeEach case In');
+ playerSurfaceId = globalThis.value;
+ avRecorder = undefined;
+ surfaceID = '';
+ caseCount += 1;
+ needDone = false;
+ console.info('beforeEach case Out');
+ })
+
+ afterEach(async function () {
+ console.info('afterEach case In');
+ mySteps = new Array();
+ await releaseByPromise();
+ await mediaTestBase.closeFd(fdObject.fileAsset, fdObject.fdNumber);
+ console.info('afterEach case Out');
+ })
+
+ afterAll(function () {
+ console.info('afterAll case');
+ })
+
+ async function getRecorderFileFd(fileName, fileType) {
+ console.info("case current fileName is: " + fileName);
+ fdObject = await mediaTestBase.getAvRecorderFd(fileName, fileType);
+ fdPath = "fd://" + fdObject.fdNumber.toString();
+ console.info("case fdPath is: " + fdPath);
+ avConfig.url = fdPath;
+ console.info("case to out getRecorderFileFd");
+ }
+
+ async function createAVRecorderByPromise(done) {
+ console.info(`case to create avRecorder by promise`);
+ await media.createAVRecorder().then((recorder) => {
+ console.info('case createAVRecorder promise called');
+ if (typeof (recorder) != 'undefined') {
+ avRecorder = recorder;
+ expect(avRecorder.state).assertEqual('idle');
+ setCallbackOn(done);
+ nextStep(done);
+ } else {
+ console.info('case create avRecorder failed!!!');
+ expect().assertFail();
+ done();
+ }
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+
+ function createAVRecorderByCallback(done) {
+ console.info(`case to create avRecorder by callback`);
+ media.createAVRecorder((err, recorder) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case createAVRecorder callback success ');
+ avRecorder = recorder;
+ expect(avRecorder.state).assertEqual('idle');
+ setCallbackOn(done);
+ nextStep(done);
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+
+ async function prepareByPromise() {
+ console.info(`case to prepare by promise`);
+ await avRecorder.prepare(avConfig).then(() => {
+ console.info('case recorder prepare by promise called');
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+
+ function prepareByCallback() {
+ console.info(`case to prepare by callback`);
+ avRecorder.prepare(avConfig, (err) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case recorder prepare by callback called');
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+
+ async function getInputSurfaceByPromise(done) {
+ console.info(`case to getsurface by promise`);
+ await avRecorder.getInputSurface().then((outputSurface) => {
+ console.info('case getInputSurface by promise called');
+ surfaceID = outputSurface;
+ console.info('case outputSurface surfaceID is: ' + surfaceID);
+ nextStep(done);
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+
+ function getInputSurfaceByCallback(done) {
+ console.info(`case to getsurface by callback`);
+ avRecorder.getInputSurface((err, outputSurface) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case getInputSurface by callback called');
+ surfaceID = outputSurface;
+ console.info('case outputSurface surfaceID is: ' + surfaceID);
+ nextStep(done);
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+
+ async function startByPromise() {
+ console.info(`case to start by promise`);
+ await avRecorder.start().then(() => {
+ console.info('case recorder start by promise called');
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+
+ function startByCallback() {
+ console.info(`case to start by callback`);
+ avRecorder.start((err) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case recorder start by callback called');
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+
+ async function pauseByPromise() {
+ console.info(`case to pause by promise`);
+ await avRecorder.pause().then(() => {
+ console.info('case recorder pause by promise called');
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+
+ function pauseByCallback() {
+ console.info(`case to pause by callback`);
+ avRecorder.pause((err) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case recorder pause by callback called');
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+
+ async function resumeByPromise() {
+ console.info(`case to resume by promise`);
+ await avRecorder.resume().then(() => {
+ console.info('case recorder resume by promise called');
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+
+ function resumeByCallback() {
+ console.info(`case to resume by callback`);
+ avRecorder.resume((err) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case recorder resume by callback called');
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+
+ async function stopByPromise() {
+ console.info(`case to stop by promise`);
+ await avRecorder.stop().then(() => {
+ console.info('case recorder stop by promise called');
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+
+ function stopByCallback() {
+ console.info(`case to stop by callback`);
+ avRecorder.stop((err) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case recorder stop by callback called');
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+
+ async function resetByPromise() {
+ console.info(`case to reset by promise`);
+ await avRecorder.reset().then(() => {
+ console.info('case recorder reset by promise called');
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+
+ function resetByCallback() {
+ console.info(`case to reset by callback`);
+ avRecorder.reset((err) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case recorder reset by callback called');
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+
+ async function releaseByPromise(done) {
+ console.info(`case to release by promise`);
+ if (avRecorder) {
+ await avRecorder.release().then(() => {
+ console.info('case recorder release by promise called');
+ }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback);
+ }
+ if(needDone) {
+ avRecorder = undefined;
+ done();
+ }
+ }
+
+ async function releaseByCallback(done) {
+ console.info(`case to release by callback`);
+ if (avRecorder) {
+ avRecorder.release(async(err) => {
+ if (typeof (err) == 'undefined') {
+ console.info('case recorder release by callback called');
+ avRecorder = undefined;
+ } else {
+ mediaTestBase.failureCallback(err);
+ }
+ });
+ }
+ if (needDone) {
+ avRecorder = undefined;
+ done();
+ }
+ }
+
+ async function nextStep(done) {
+ console.info("case myStep[0]: " + mySteps[0]);
+ if (mySteps[0] == END) {
+ console.info("case to END");
+ done();
+ }
+ switch (mySteps[0]) {
+ case CREATE_PROMISE:
+ mySteps.shift();
+ await createAVRecorderByPromise(done);
+ break;
+ case CREATE_CALLBACK:
+ mySteps.shift();
+ createAVRecorderByCallback(done);
+ break;
+ case PREPARE_PROMISE:
+ mySteps.shift();
+ await prepareByPromise();
+ break;
+ case PREPARE_CALLBACK:
+ mySteps.shift();
+ prepareByCallback();
+ break;
+ case GETSURFACE_PROMISE:
+ mySteps.shift();
+ await getInputSurfaceByPromise(done);
+ break;
+ case GETSURFACE_CALLBACK:
+ mySteps.shift();
+ getInputSurfaceByCallback(done);
+ break;
+ case STARTCAMERA:
+ mySteps.shift();
+ await startVideoOutput();
+ nextStep(done);
+ break;
+ case START_PROMISE:
+ mySteps.shift();
+ await startByPromise();
+ break;
+ case START_CALLBACK:
+ mySteps.shift();
+ startByCallback();
+ break;
+ case PAUSE_PROMISE:
+ mySteps.shift();
+ await pauseByPromise();
+ break;
+ case PAUSE_CALLBACK:
+ mySteps.shift();
+ pauseByCallback();
+ break;
+ case RESUME_PROMISE:
+ mySteps.shift();
+ await resumeByPromise();
+ break;
+ case RESUME_CALLBACK:
+ mySteps.shift();
+ resumeByCallback();
+ break;
+ case STOP_PROMISE:
+ mySteps.shift();
+ await stopByPromise();
+ break;
+ case STOP_CALLBACK:
+ mySteps.shift();
+ stopByCallback();
+ break;
+ case RESET_PROMISE:
+ mySteps.shift();
+ await resetByPromise();
+ break;
+ case RESET_CALLBACK:
+ mySteps.shift();
+ resetByCallback();
+ break;
+ case RELEASE_PROMISE:
+ mySteps.shift();
+ await releaseByPromise(done);
+ break;
+ case RELEASE_CALLBACK:
+ mySteps.shift();
+ await releaseByCallback(done);
+ break;
+ case SETCALLBACKOFF:
+ mySteps.shift();
+ setCallbackOff(done);
+ break;
+ case STOPVIDEOOUTPUT:
+ mySteps.shift();
+ await stopVideoOutput();
+ nextStep(done);
+ break;
+ default:
+ console.info('do nothing');
+ }
+ }
+
+ function setCallbackOn(done) {
+ console.info('case callback on');
+ avRecorder.on('stateChange', async (state, reason) => {
+ console.info('case state has changed, new state is :' + state);
+ switch (state) {
+ case 'idle':
+ nextStep(done);
+ break;
+ case 'prepared':
+ nextStep(done);
+ break;
+ case 'started':
+ await mediaTestBase.msleepAsync(RECORDER_TIME);
+ nextStep(done);
+ break;
+ case 'paused':
+ await mediaTestBase.msleepAsync(PAUSE_TIME);
+ nextStep(done);
+ break;
+ case 'stopped':
+ nextStep(done);
+ break;
+ case 'released':
+ avRecorder = undefined;
+ nextStep(done);
+ break;
+ case 'error':
+ console.info("case error state!!!");
+ break;
+ default:
+ console.info('case start is unknown');
+ nextStep(done);
+ }
+ });
+ avRecorder.on('error', (err) => {
+ console.info('case avRecorder.on(error) called, errMessage is ' + err.message);
+ nextStep(done);
+ });
+ }
+
+ function setCallbackOff(done) {
+ console.info('case callback off called');
+ if (avRecorder != undefined) {
+ console.info('case to call avRecorder.off("stateChange")');
+ avRecorder.off('stateChange');
+ console.info('case to call avRecorder.off("error")');
+ avRecorder.off('error');
+ console.info('case call avRecorder.off done');
+ }
+ needDone = true;
+ nextStep(done);
+ console.info('case callback off done');
+ }
+
+ /* *
+ * @tc.number : SUB_MULTIMEDIA_MEDIA_AVRECORDER_FUNC_0100
+ * @tc.name : 01. test only avRecorder basic function by promise interfaces
+ * @tc.desc : test only avRecorder operation: start-pause-resume-stop
+ * @tc.size : MediumTest
+ * @tc.type : Function
+ * @tc.level : Level0
+ */
+ it('SUB_MULTIMEDIA_MEDIA_AVRECORDER_FUNC_0100', 0, async function (done) {
+ avConfig = audioConfig;
+ caseCount = 1;
+ let fileName = 'avRecorder_func_0'+ caseCount +'.m4a';
+ await getRecorderFileFd(fileName, 'audio');
+ mySteps = new Array(CREATE_PROMISE, PREPARE_PROMISE, START_PROMISE, PAUSE_PROMISE,
+ RESUME_PROMISE, STOP_PROMISE, RESET_PROMISE, SETCALLBACKOFF, RELEASE_PROMISE);
+ nextStep(done);
+ })
+
+ /* *
+ * @tc.number : SUB_MULTIMEDIA_MEDIA_AVRECORDER_FUNC_0200
+ * @tc.name : 01. test only avRecorder basic function by callback interfaces
+ * @tc.desc : test only avRecorder operation: start-pause-resume-stop
+ * @tc.size : MediumTest
+ * @tc.type : Function
+ * @tc.level : Level0
+ */
+ it('SUB_MULTIMEDIA_MEDIA_AVRECORDER_FUNC_0200', 0, async function (done) {
+ let fileName = 'avRecorder_func_0'+ caseCount +'.m4a';
+ await getRecorderFileFd(fileName, 'audio');
+ mySteps = new Array(CREATE_CALLBACK, PREPARE_CALLBACK, START_CALLBACK, PAUSE_CALLBACK,
+ RESUME_CALLBACK, STOP_CALLBACK, RESET_CALLBACK, SETCALLBACKOFF, RELEASE_CALLBACK);
+ nextStep(done);
+ })
+ })
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/js/test/List.test.js b/multimedia/media/media_js_standard/avRecorder/src/main/js/test/List.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a2eec44f4c99f44843e113d2a19348642d44f1f0
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/js/test/List.test.js
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import AVRecorderFuncTest from './AVRecorderFuncTest.test.js'
+
+
+export default function testsuite(recorderContxt) {
+ AVRecorderFuncTest(recorderContxt)
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/resources/base/element/string.json b/multimedia/media/media_js_standard/avRecorder/src/main/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..0f7093c2bfb152947743af94756b906697a6b7de
--- /dev/null
+++ b/multimedia/media/media_js_standard/avRecorder/src/main/resources/base/element/string.json
@@ -0,0 +1,28 @@
+{
+ "string": [
+ {
+ "name": "entry_MainAbility",
+ "value": "entry_MainAbility"
+ },
+ {
+ "name": "mainability_description",
+ "value": "JS_Empty Ability"
+ },
+ {
+ "name": "MainAbility_desc",
+ "value": "description"
+ },
+ {
+ "name": "MainAbility_label",
+ "value": "label"
+ },
+ {
+ "name": "TestAbility_desc",
+ "value": "description"
+ },
+ {
+ "name": "TestAbility_label",
+ "value": "label"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/multimedia/media/media_js_standard/avRecorder/src/main/resources/base/media/icon.png b/multimedia/media/media_js_standard/avRecorder/src/main/resources/base/media/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c
Binary files /dev/null and b/multimedia/media/media_js_standard/avRecorder/src/main/resources/base/media/icon.png differ