Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Xts Acts
提交
85fa4131
X
Xts Acts
项目概览
OpenHarmony
/
Xts Acts
1 年多 前同步成功
通知
9
Star
22
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
X
Xts Acts
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
85fa4131
编写于
3月 13, 2023
作者:
O
openharmony_ci
提交者:
Gitee
3月 13, 2023
浏览文件
操作
浏览文件
下载
差异文件
!7924 validator修改提交1018分支
Merge pull request !7924 from 田文哲/monthly_20221018
上级
ad96d888
a8b6f5da
变更
30
显示空白变更内容
内联
并排
Showing
30 changed file
with
548 addition
and
269 deletion
+548
-269
validator/acts_validator/signature/openharmony_sx.p7b
validator/acts_validator/signature/openharmony_sx.p7b
+0
-0
validator/acts_validator/src/main/ets/MainAbility/MainAbility.ts
...or/acts_validator/src/main/ets/MainAbility/MainAbility.ts
+6
-5
validator/acts_validator/src/main/ets/pages/ArkUI/ArkUI_index.ets
...r/acts_validator/src/main/ets/pages/ArkUI/ArkUI_index.ets
+10
-10
validator/acts_validator/src/main/ets/pages/Audio/Audio_index.ets
...r/acts_validator/src/main/ets/pages/Audio/Audio_index.ets
+10
-10
validator/acts_validator/src/main/ets/pages/Audio/ScrollListTest.ets
...cts_validator/src/main/ets/pages/Audio/ScrollListTest.ets
+1
-1
validator/acts_validator/src/main/ets/pages/Camera/CameraFormat.ets
...acts_validator/src/main/ets/pages/Camera/CameraFormat.ets
+1
-0
validator/acts_validator/src/main/ets/pages/Camera/CameraOrientation0.ets
...alidator/src/main/ets/pages/Camera/CameraOrientation0.ets
+2
-1
validator/acts_validator/src/main/ets/pages/Camera/CameraOrientation180.ets
...idator/src/main/ets/pages/Camera/CameraOrientation180.ets
+2
-1
validator/acts_validator/src/main/ets/pages/Camera/CameraOrientation270.ets
...idator/src/main/ets/pages/Camera/CameraOrientation270.ets
+2
-1
validator/acts_validator/src/main/ets/pages/Camera/CameraOrientation90.ets
...lidator/src/main/ets/pages/Camera/CameraOrientation90.ets
+2
-1
validator/acts_validator/src/main/ets/pages/Camera/CameraVideo.ets
.../acts_validator/src/main/ets/pages/Camera/CameraVideo.ets
+1
-0
validator/acts_validator/src/main/ets/pages/Camera/Camera_index.ets
...acts_validator/src/main/ets/pages/Camera/Camera_index.ets
+11
-10
validator/acts_validator/src/main/ets/pages/Experience/DeskFps.ets
.../acts_validator/src/main/ets/pages/Experience/DeskFps.ets
+120
-0
validator/acts_validator/src/main/ets/pages/Experience/Experience_index.ets
...idator/src/main/ets/pages/Experience/Experience_index.ets
+14
-12
validator/acts_validator/src/main/ets/pages/Experience/PhotoFps.ets
...acts_validator/src/main/ets/pages/Experience/PhotoFps.ets
+123
-0
validator/acts_validator/src/main/ets/pages/Experience/ScrollListTest.ets
...alidator/src/main/ets/pages/Experience/ScrollListTest.ets
+2
-1
validator/acts_validator/src/main/ets/pages/Player/Player_index.ets
...acts_validator/src/main/ets/pages/Player/Player_index.ets
+11
-10
validator/acts_validator/src/main/ets/pages/Player/ScrollListTest.ets
...ts_validator/src/main/ets/pages/Player/ScrollListTest.ets
+2
-1
validator/acts_validator/src/main/ets/pages/common/CameraOrientation.ets
...validator/src/main/ets/pages/common/CameraOrientation.ets
+1
-1
validator/acts_validator/src/main/ets/pages/common/CanvasCustomContainer1.ets
...ator/src/main/ets/pages/common/CanvasCustomContainer1.ets
+1
-1
validator/acts_validator/src/main/ets/pages/common/CanvasCustomContainer2.ets
...ator/src/main/ets/pages/common/CanvasCustomContainer2.ets
+1
-1
validator/acts_validator/src/main/ets/pages/common/CustomContainer.ets
...s_validator/src/main/ets/pages/common/CustomContainer.ets
+1
-1
validator/acts_validator/src/main/ets/pages/common/CustomContainer2.ets
..._validator/src/main/ets/pages/common/CustomContainer2.ets
+1
-1
validator/acts_validator/src/main/ets/pages/common/CustomContainer3.ets
..._validator/src/main/ets/pages/common/CustomContainer3.ets
+1
-1
validator/acts_validator/src/main/ets/pages/common/CustomContainer4.ets
..._validator/src/main/ets/pages/common/CustomContainer4.ets
+1
-1
validator/acts_validator/src/main/ets/pages/common/CustomContainer5.ets
..._validator/src/main/ets/pages/common/CustomContainer5.ets
+1
-1
validator/acts_validator/src/main/ets/pages/common/ExperienceCustomContainer.ets
...r/src/main/ets/pages/common/ExperienceCustomContainer.ets
+165
-153
validator/acts_validator/src/main/ets/pages/index.ets
validator/acts_validator/src/main/ets/pages/index.ets
+47
-43
validator/acts_validator/src/main/module.json
validator/acts_validator/src/main/module.json
+6
-0
validator/acts_validator/src/main/resources/base/profile/main_pages.json
...validator/src/main/resources/base/profile/main_pages.json
+2
-1
未找到文件。
validator/acts_validator/signature/openharmony_sx.p7b
浏览文件 @
85fa4131
无法预览此类型文件
validator/acts_validator/src/main/ets/MainAbility/MainAbility.ts
浏览文件 @
85fa4131
...
...
@@ -17,14 +17,15 @@ export default class MainAbility extends Ability {
console
.
log
(
"
[Demo] MainAbility onWindowStageCreate
"
)
let
AtManager
=
abilityAccessCtrl
.
createAtManager
();
AtManager
.
requestPermissionsFromUser
(
this
.
context
,[
"
ohos.permission.READ_MEDIA
"
,
"
ohos.permission.WRITE_MEDIA
"
,
"
ohos.permission.CAPTURE_SCREEN
"
,
"
ohos.permission.INTERNET
"
,
"
ohos.permission.CAMERA
"
]).
then
(()
=>
{})
windowStage
.
loadContent
(
"
pages/index
"
,
(
err
,
data
)
=>
{
AtManager
.
requestPermissionsFromUser
(
this
.
context
,[
'
ohos.permission.READ_MEDIA
'
,
'
ohos.permission.WRITE_MEDIA
'
,
'
ohos.permission.CAPTURE_SCREEN
'
,
'
ohos.permission.INTERNET
'
,
'
ohos.permission.CAMERA
'
,
'
ohos.permission.MICROPHONE
'
,
'
ohos.permission.START_INVISIBLE_ABILITY
'
]).
then
(
()
=>
{}
);
windowStage
.
loadContent
(
'
pages/index
'
,
(
err
,
data
)
=>
{
if
(
err
.
code
)
{
console
.
error
(
'
Failed to load the content. Cause:
'
+
JSON
.
stringify
(
err
)
);
console
.
error
(
'
Failed to load the content. Cause:
'
+
JSON
.
stringify
(
err
)
);
return
;
}
console
.
info
(
'
Succeeded in loading the content. Data:
'
+
JSON
.
stringify
(
data
))
console
.
info
(
'
Succeeded in loading the content. Data:
'
+
JSON
.
stringify
(
data
)
);
});
}
...
...
validator/acts_validator/src/main/ets/pages/ArkUI/ArkUI_index.ets
浏览文件 @
85fa4131
...
...
@@ -26,8 +26,8 @@ let path1 = path + '/ArkUI';
let VarColor = [];
let ColorBackPath = path + '/ArkUIColorBack.txt';
let txtPath = path1 + 'ArkUIReport.txt';
let xmlPath =path1 + 'ArkUITest.xml';
let txtPath = path1 + '
/
ArkUIReport.txt';
let xmlPath =path1 + '
/
ArkUITest.xml';
@Entry
@Component
...
...
@@ -298,23 +298,23 @@ struct IndexPage {
serializer.setDeclaration();
serializer.startElement("testsuite");
serializer.setAttributes("name","ActsArkUITest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", failNum);
serializer.setAttributes("ignored",
ignoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", testNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsArkUITest");
for (let i = 0; i < title.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
validator/acts_validator/src/main/ets/pages/Audio/Audio_index.ets
浏览文件 @
85fa4131
...
...
@@ -27,8 +27,8 @@ let path1 = path + '/Audio';
let VarColor = [];
let ColorBackPath = path + '/AudioColorBack.txt';
let txtPath = path1 + 'AudioReport.txt';
let xmlPath =path1 + 'AudioTest.xml';
let txtPath = path1 + '
/
AudioReport.txt';
let xmlPath =path1 + '
/
AudioTest.xml';
@Entry
@Component
...
...
@@ -277,23 +277,23 @@ struct IndexPage {
serializer.setDeclaration();
serializer.startElement("testsuite");
serializer.setAttributes("name","ActsAudioTest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", failNum);
serializer.setAttributes("ignored",
ignoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", testNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsAudioTest");
for (let i = 0; i < title.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
validator/acts_validator/src/main/ets/pages/Audio/ScrollListTest.ets
浏览文件 @
85fa4131
/*
* Copyright (c) 2022
-2023
Huawei Device Co., Ltd.
* 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
...
...
validator/acts_validator/src/main/ets/pages/Camera/CameraFormat.ets
浏览文件 @
85fa4131
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import camera from '@ohos.multimedia.camera'
import Logger from '../model/Logger'
import CameraService from '../model/CameraService'
...
...
validator/acts_validator/src/main/ets/pages/Camera/CameraOrientation0.ets
浏览文件 @
85fa4131
/*
* Copyright (c) 2022
-2023
Huawei Device Co., Ltd.
* 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
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import camera from '@ohos.multimedia.camera'
import Logger from '../model/Logger'
import CameraService from '../model/CameraService'
...
...
validator/acts_validator/src/main/ets/pages/Camera/CameraOrientation180.ets
浏览文件 @
85fa4131
/*
* Copyright (c) 2022
-2023
Huawei Device Co., Ltd.
* 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
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import camera from '@ohos.multimedia.camera'
import Logger from '../model/Logger'
import CameraService from '../model/CameraService'
...
...
validator/acts_validator/src/main/ets/pages/Camera/CameraOrientation270.ets
浏览文件 @
85fa4131
/*
* Copyright (c) 2022
-2023
Huawei Device Co., Ltd.
* 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
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import camera from '@ohos.multimedia.camera'
import Logger from '../model/Logger'
import CameraService from '../model/CameraService'
...
...
validator/acts_validator/src/main/ets/pages/Camera/CameraOrientation90.ets
浏览文件 @
85fa4131
/*
* Copyright (c) 2022
-2023
Huawei Device Co., Ltd.
* 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
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import camera from '@ohos.multimedia.camera'
import Logger from '../model/Logger'
import CameraService from '../model/CameraService'
...
...
validator/acts_validator/src/main/ets/pages/Camera/CameraVideo.ets
浏览文件 @
85fa4131
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import camera from '@ohos.multimedia.camera'
import Logger from '../model/Logger'
import CameraService from '../model/CameraService'
...
...
validator/acts_validator/src/main/ets/pages/Camera/Camera_index.ets
浏览文件 @
85fa4131
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import prompt from '@ohos.prompt';
import router from '@ohos.router';
import fileio from '@ohos.fileio';
...
...
@@ -26,8 +27,8 @@ let path1 = path + '/Camera';
let VarColor = [];
let ColorBackPath = path + '/CameraColorBack.txt';
let txtPath = path1 + 'CameraReport.txt';
let xmlPath = path1 + 'CameraTest.xml';
let txtPath = path1 + '
/
CameraReport.txt';
let xmlPath = path1 + '
/
CameraTest.xml';
@Entry
@Component
...
...
@@ -281,23 +282,23 @@ struct IndexPage {
serializer.setDeclaration();
serializer.startElement("testsuite");
serializer.setAttributes("name", "ActsCameraTest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", failNum);
serializer.setAttributes("ignored",
ignoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", testNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsCameraTest");
for (let i = 0; i < title.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
validator/acts_validator/src/main/ets/pages/Experience/DeskFps.ets
0 → 100644
浏览文件 @
85fa4131
/*
* Copyright (c) 2022-2023 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 fileio from '@ohos.fileio';
import {CustomContainer} from '../common/ExperienceCustomContainer';
import FirstDialog from '../model/FirstDialog';
import context from '@ohos.app.ability.common';
let abilityContext = getContext(this) as context.UIAbilityContext;
let path = globalThis.dir;
let Xpath = path + '/DeskFps.log'
@Entry
@Component
struct CustomContainerUser {
@State name: string = 'DeskFps';
@State StepTips: string = '操作步骤:根据操作提示滑动系统桌面测试帧率'+'\n'+'预期结果:帧率高于54帧测试通过';
@State Vue: boolean = false;
@State StartEnable: boolean = true;
@State Fps: string = '0';
async aboutToAppear(){
await FirstDialog.ChooseDialog(this.StepTips,this.name);
this.Vue = false;
}
@Builder specificNoParam() {
Column() {
Flex({direction:FlexDirection.Column,alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) {
Column(){
Row(){
Text(`根据以下操作步骤完成测试`+ '\n' + '\n' + '\n' + '\n'+ '\n' + '\n' + '\n' + '\n')
.fontColor(Color.White).fontSize('24fp')
}
Row(){
Text(`测试步骤:`+ '\n' + '\n' + `1.点击开始键进入系统桌面`+ '\n' + '\n'
+ `2.双击执行DeskFps.bat`+ '\n' + '\n' +`3.左右滑动系统桌面连续10s以上` + '\n' + '\n'
+ '4.回到DeskFps测试项点击停止键' + '\n' + '\n' + `5.若测试最高帧率大于54帧则通过测试`
+ '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' )
.fontColor(Color.White).fontSize('20fp')
}
Row(){
Column(){
Button(`开始`)
.borderRadius(8)
.backgroundColor(0x317aff)
.width('30%')
.enabled(this.StartEnable)
.opacity(this.StartEnable? 1 : 0.4)
.onClick(async () => {
this.StartEnable = !this.StartEnable;
let str = {
bundleName:"com.ohos.launcher",
abilityName: "com.ohos.launcher.MainAbility",
}
abilityContext.startAbility(str).then((data) => {
}).catch((error) => {
})
})
}
Column(){
Button(`结束`)
.borderRadius(8)
.backgroundColor(0x317aff)
.width('30%')
.enabled(!this.StartEnable)
.opacity(!this.StartEnable? 1 : 0.4)
.onClick(() => {
this.StartEnable = !this.StartEnable
let fd = fileio.openSync(Xpath, 0o100 | 0o2002, 0o664);
let buf = new ArrayBuffer(4096);
fileio.readSync(fd,buf);
let report = String.fromCharCode.apply(null,new Uint8Array(buf));
let head = report.indexOf(':');
let end = report.indexOf('|');
this.Fps = report.substring(head+1,end);
let num = Number(this.Fps)
if(num >= 54 ) {
this.Vue = true;
}
})
}
}
Row(){
Text('\n' + '\n' + '\n' + '\n'+ '\n' + '\n' + '\n' + '\n' + `测试结果:` + this.Fps + '帧' )
.fontColor(Color.White).fontSize('24fp')
}
}
}
}.width('100%').height('80%').backgroundColor(Color.Black)
.justifyContent(FlexAlign.SpaceEvenly)
}
build() {
Column() {
CustomContainer({
title: this.name,
Url:'pages/Experience/Experience_index',
StepTips:this.StepTips,
content: this.specificNoParam,
name:$name,
Vue: $Vue,
StartEnable: $StartEnable,
Fps: $Fps
})
}.width('100%').height('100%').backgroundColor(Color.Black)
}
}
validator/acts_validator/src/main/ets/pages/Experience/Experience_index.ets
浏览文件 @
85fa4131
/*
* Copyright (c) 2022
-2023
Huawei Device Co., Ltd.
* 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
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import prompt from '@ohos.prompt';
import router from '@ohos.router';
import fileio from '@ohos.fileio';
...
...
@@ -26,8 +27,8 @@ let path1 = path + '/Experience';
let VarColor = [];
let ColorBackPath = path + '/ExperienceColorBack.txt';
let txtPath = path1 + 'ExperienceReport.txt';
let xmlPath =path1 + 'ExperienceTest.xml';
let txtPath = path1 + '
/
ExperienceReport.txt';
let xmlPath =path1 + '
/
ExperienceTest.xml';
@Entry
@Component
...
...
@@ -38,7 +39,8 @@ struct IndexPage {
@State result : string = '';
@State TEST : number = 0;
private TestCaseList = [
{title:'ScrollingList',uri:'pages/Experience/ScrollListTest'},
{title:'DeskFps',uri:'pages/Experience/DeskFps'},
{title:'PhotoFps',uri:'pages/Experience/PhotoFps'},
]
@State ColorObject : string[] = VarColor;
async onPageShow(){
...
...
@@ -276,23 +278,23 @@ struct IndexPage {
serializer.setDeclaration();
serializer.startElement("testsuite");
serializer.setAttributes("name","ActsExperienceTest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", failNum);
serializer.setAttributes("ignored",
ignoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", testNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsExperienceTest");
for (let i = 0; i < title.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
validator/acts_validator/src/main/ets/pages/Experience/PhotoFps.ets
0 → 100644
浏览文件 @
85fa4131
/*
* Copyright (c) 2022-2023 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 fileio from '@ohos.fileio';
import {CustomContainer} from '../common/ExperienceCustomContainer';
import FirstDialog from '../model/FirstDialog';
let path = globalThis.dir;
let Xpath = path + '/PhotoFps.log';
@Entry
@Component
struct CustomContainerUser {
@State name: string = 'PhotoFps';
@State StepTips: string = '操作步骤:根据操作提示滑动图库测试帧率'+'\n'+'预期结果:帧率高于或等于54帧测试通过';
@State Vue: boolean = false;
@State StartEnable: boolean = true;
@State Fps: string = '0';
async aboutToAppear(){
await FirstDialog.ChooseDialog(this.StepTips,this.name);
this.Vue = false;
}
@Builder specificNoParam() {
Column() {
Flex({direction:FlexDirection.Column,alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) {
Column(){
Row(){
Text(`根据以下操作步骤完成测试`+ '\n' + '\n' + '\n' + '\n'+ '\n' + '\n' + '\n' + '\n')
.fontColor(Color.White).fontSize('24fp')
}
Row(){
Text(`测试步骤:`+ '\n' + '\n' +`1.在图库中预置500张图片`+ '\n' + '\n' +`2.点击开始键进入图库`+ '\n' + '\n'
+ `3.双击执行PhotoFps.bat`+ '\n' + '\n' +`4.滑动图库缩略图界面连续10s以上` + '\n' + '\n'
+ '5.回到PhotoFps测试项点击停止键' + '\n' + '\n' + `6.若测试最高帧率大于或等于54帧则通过测试`
+ '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' )
.fontColor(Color.White).fontSize('20fp')
}
Row(){
Column(){
Button(`开始`)
.borderRadius(8)
.backgroundColor(0x317aff)
.width('30%')
.enabled(this.StartEnable)
.opacity(this.StartEnable? 1 : 0.4)
.onClick(async () => {
this.StartEnable = !this.StartEnable;
let bundleName=new String("com.ohos.photos").toString();
let abilityName=new String("com.ohos.photos.MainAbility").toString();
let str = {
"bundleName": bundleName,
"abilityName": abilityName,
"parameters": ""
}
globalThis.abilityContext.startAbility(str, (err, data) => {
if(err) {
return;
}
})
})
}
Column(){
Button(`结束`)
.borderRadius(8)
.backgroundColor(0x317aff)
.width('30%')
.enabled(!this.StartEnable)
.opacity(!this.StartEnable? 1 : 0.4)
.onClick(() => {
this.StartEnable = !this.StartEnable
let fd = fileio.openSync(Xpath, 0o100 | 0o2002, 0o664);
let buf = new ArrayBuffer(4096);
fileio.readSync(fd,buf);
let report = String.fromCharCode.apply(null,new Uint8Array(buf));
let head = report.indexOf(':');
let end = report.indexOf('|');
this.Fps = report.substring(head+1,end);
let num = Number(this.Fps)
if(num >= 54) {
this.Vue = true;
}
})
}
}
Row(){
Text('\n' + '\n' + '\n' + '\n'+ '\n' + '\n' + '\n' + '\n' + `测试结果:` + this.Fps + '帧' )
.fontColor(Color.White).fontSize('24fp')
}
}
}
}.width('100%').height('80%').backgroundColor(Color.Black)
.justifyContent(FlexAlign.SpaceEvenly)
}
build() {
Column() {
CustomContainer({
title: this.name,
Url:'pages/Experience/Experience_index',
StepTips:this.StepTips,
content: this.specificNoParam,
name:$name,
Vue: $Vue,
StartEnable: $StartEnable,
Fps: $Fps
})
}.width('100%').height('100%').backgroundColor(Color.Black)
}
}
\ No newline at end of file
validator/acts_validator/src/main/ets/pages/Experience/ScrollListTest.ets
浏览文件 @
85fa4131
/*
* Copyright (c) 2022
-2023
Huawei Device Co., Ltd.
* 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
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {CustomContainer} from '../common/CustomContainer';
import FirstDialog from '../model/FirstDialog';
@Entry
...
...
validator/acts_validator/src/main/ets/pages/Player/Player_index.ets
浏览文件 @
85fa4131
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import prompt from '@ohos.prompt';
import router from '@ohos.router';
import fileio from '@ohos.fileio';
...
...
@@ -26,8 +27,8 @@ let path1 = path + '/Player';
let VarColor = [];
let ColorBackPath = path + '/PlayerColorBack.txt';
let txtPath = path1 + 'PlayerReport.txt';
let xmlPath =path1 + 'PlayerTest.xml';
let txtPath = path1 + '
/
PlayerReport.txt';
let xmlPath =path1 + '
/
PlayerTest.xml';
@Entry
@Component
...
...
@@ -276,23 +277,23 @@ struct IndexPage {
serializer.setDeclaration();
serializer.startElement("testsuite");
serializer.setAttributes("name","ActsPlayerTest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", failNum);
serializer.setAttributes("ignored",
ignoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", testNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsPlayerTest");
for (let i = 0; i < title.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
validator/acts_validator/src/main/ets/pages/Player/ScrollListTest.ets
浏览文件 @
85fa4131
/*
* Copyright (c) 2022
-2023
Huawei Device Co., Ltd.
* 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
...
...
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {CustomContainer} from '../common/CustomContainer';
import FirstDialog from '../model/FirstDialog';
@Entry
...
...
validator/acts_validator/src/main/ets/pages/common/CameraOrientation.ets
浏览文件 @
85fa4131
...
...
@@ -125,7 +125,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/' + displayName;
let dirPath = path + '/
screenshot' + '/
' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
validator/acts_validator/src/main/ets/pages/common/CanvasCustomContainer1.ets
浏览文件 @
85fa4131
...
...
@@ -126,7 +126,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/' + displayName;
let dirPath = path + '/
screenshot' + '/
' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
validator/acts_validator/src/main/ets/pages/common/CanvasCustomContainer2.ets
浏览文件 @
85fa4131
...
...
@@ -128,7 +128,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/' + displayName;
let dirPath = path + '/
screenshot' + '/
' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
validator/acts_validator/src/main/ets/pages/common/CustomContainer.ets
浏览文件 @
85fa4131
...
...
@@ -122,7 +122,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/' + displayName;
let dirPath = path + '/
screenshot' + '/
' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
validator/acts_validator/src/main/ets/pages/common/CustomContainer2.ets
浏览文件 @
85fa4131
...
...
@@ -124,7 +124,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/' + displayName;
let dirPath = path + '/
screenshot' + '/
' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
validator/acts_validator/src/main/ets/pages/common/CustomContainer3.ets
浏览文件 @
85fa4131
...
...
@@ -125,7 +125,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/' + displayName;
let dirPath = path + '/
screenshot' + '/
' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
validator/acts_validator/src/main/ets/pages/common/CustomContainer4.ets
浏览文件 @
85fa4131
...
...
@@ -122,7 +122,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/' + displayName;
let dirPath = path + '/
screenshot' + '/
' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
validator/acts_validator/src/main/ets/pages/common/CustomContainer5.ets
浏览文件 @
85fa4131
...
...
@@ -126,7 +126,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/' + displayName;
let dirPath = path + '/
screenshot' + '/
' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
validator/acts_validator/src/main/ets/pages/common/
Media
CustomContainer.ets
→
validator/acts_validator/src/main/ets/pages/common/
Experience
CustomContainer.ets
浏览文件 @
85fa4131
...
...
@@ -12,8 +12,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fileio from '@ohos.fileio';
import prompt from '@ohos.prompt';
import fileio from '@ohos.fileio';
import router from '@ohos.router';
import screenshot from '@ohos.screenshot';
import image from '@ohos.multimedia.image';
...
...
@@ -21,18 +21,30 @@ import Logger from '../model/Logger';
import mediaLibrary from '@ohos.multimedia.mediaLibrary';
let path = globalThis.dir;
const TAG = '[Screenshot]';
@Component
export struct CustomContainer {
@Link FillColor: string;
@Link name: string;
Url : string = '';
@Link name : string;
title : string = '';
StepTips: string = '';
Url : string = '';
@Link StartEnable : boolean
@Link Vue : boolean;
@Link Fps : string;
@BuilderParam content: () => void;
@Builder
PassBtn(text: Resource, isFullScreen: boolean) {
Button() {
if(this.Vue == false){
Button({stateEffect:this.Vue}) {
Image($r('app.media.ic_public_pass')).width('20vp').height('20vp')
}.width('30%').height('30vp').backgroundColor(Color.Grey).opacity(0.4)
.onClick(()=>{
})
}
else{
Button({stateEffect:this.Vue}) {
Image($r('app.media.ic_public_pass')).width('20vp').height('20vp')
}.width('30%').height('30vp').backgroundColor(Color.Grey)
.onClick(()=>{
...
...
@@ -47,6 +59,7 @@ export struct CustomContainer {
});
})
}
}
@Builder
FailBtn(text: Resource, isFullScreen: boolean) {
Button(){
...
...
@@ -87,8 +100,7 @@ export struct CustomContainer {
Image($r('app.media.ic_public_help')).width('20vp').height('20vp')
}.width('30%').height('30vp').backgroundColor(Color.Grey)
.onClick(() =>{
AlertDialog.show(
{
AlertDialog.show({
title:'操作提示',
message: this.StepTips,
confirm:{
...
...
@@ -96,8 +108,7 @@ export struct CustomContainer {
action:()=>{
}
}
}
)
})
})
this.FailBtn($r('app.string.btn_fullscreen'), true);
}.width('100%').justifyContent(FlexAlign.SpaceEvenly).backgroundColor(Color.Black)
...
...
@@ -113,7 +124,7 @@ export struct CustomContainer {
};
let name = this.name;
let displayName = `${info.prefix}${name}${info.suffix}`;
let dirPath = path + '/
' + displayName;
let dirPath = path + '/
screenshot' + '/' + displayName;
let imagePackerApi = image.createImagePacker();
let arrayBuffer = await imagePackerApi.packing(data, packOpts);
let fd = fileio.openSync(dirPath,0o102,0o666);
...
...
@@ -125,6 +136,7 @@ export struct CustomContainer {
}
await fileio.close(fd);
Logger.info(TAG, `write done`);
}
getScreen = (isFullScreen: boolean) => {
let screenshotOptions: screenshot.ScreenshotOptions = {
...
...
validator/acts_validator/src/main/ets/pages/index.ets
浏览文件 @
85fa4131
...
...
@@ -29,6 +29,7 @@ let path2 = path + '/Audio';
let path3 = path + '/Camera';
let path4 = path + '/Player';
let path5 = path + '/Experience';
let picturePath = path + '/screenshot';
let ArkUIColorBackPath = path + '/ArkUIColorBack.txt';
let AudioColorBackPath = path + '/AudioColorBack.txt';
let CameraColorBackPath = path + '/CameraColorBack.txt';
...
...
@@ -81,6 +82,7 @@ struct IndexPage {
fileio.mkdirSync(path3);
fileio.mkdirSync(path4);
fileio.mkdirSync(path5);
fileio.mkdirSync(picturePath);
let promise = preferences.put('index', 1);
promise.then(() => {
...
...
@@ -198,6 +200,8 @@ struct IndexPage {
fileio.unlinkSync(CameraColorBackPath);
fileio.unlinkSync(PlayerColorBackPath);
fileio.unlinkSync(ExperienceColorBackPath);
fileio.rmdirSync(picturePath);
fileio.mkdirSync(picturePath);
fileio.openSync(TimePath, 0o100 | 0o2002, 0o664);
fileio.openSync(xmlPath, 0o100 | 0o2002, 0o664);
fileio.openSync(path11, 0o100 | 0o2002, 0o664);
...
...
@@ -438,33 +442,33 @@ struct IndexPage {
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", failNum);
serializer.setAttributes("tests", testNum);
serializer.setAttributes("ignored",
ignoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("unavailable", "0");
serializer.setAttributes("productinfo", "{ }");
serializer.setAttributes("modules", "
");
serializer.setAttributes("runmodules", "
");
serializer.setAttributes("modules", "");
serializer.setAttributes("runmodules", "");
/*
* ArkUI
*/
serializer.startElement("testsuite");
serializer.setAttributes("name", "ActsArkUITest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", ArkuiFailNum);
serializer.setAttributes("ignored",
ArkUIIgnoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", ArkuiTestNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsArkUITest");
for (let i = 0; i < title1.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title1[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result1[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
@@ -473,23 +477,23 @@ struct IndexPage {
*/
serializer.startElement("testsuite");
serializer.setAttributes("name", "ActsAudioTest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", audioFailNum);
serializer.setAttributes("ignored",
AudioIgnoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", audioTestNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsAudioTest");
for (let i = 0; i < title2.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title2[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result2[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
@@ -498,23 +502,23 @@ struct IndexPage {
*/
serializer.startElement("testsuite");
serializer.setAttributes("name", "ActsCameraTest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", cameraFailNum);
serializer.setAttributes("ignored",
CameraIgnoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", cameraTestNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsCameraTest");
for (let i = 0; i < title2.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title3[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result3[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
@@ -523,23 +527,23 @@ struct IndexPage {
*/
serializer.startElement("testsuite");
serializer.setAttributes("name", "ActsPlayerTest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", playerFailNum);
serializer.setAttributes("ignored",
PlayerIgnoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", playerTestNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsPlayerTest");
for (let i = 0; i < title2.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title4[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result4[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
@@ -548,23 +552,23 @@ struct IndexPage {
*/
serializer.startElement("testsuite");
serializer.setAttributes("name", "ActsExperienceTest");
serializer.setAttributes("time", "
");
serializer.setAttributes("time", "");
serializer.setAttributes("errors", "0");
serializer.setAttributes("disabled", "0");
serializer.setAttributes("failures", experienceFailNum);
serializer.setAttributes("ignored",
ExperienceIgnoreNum
);
serializer.setAttributes("ignored",
"0"
);
serializer.setAttributes("tests", experienceTestNum);
serializer.setAttributes("message", "
");
serializer.setAttributes("message", "");
serializer.setAttributes("modulename", "ActsExperienceTest");
for (let i = 0; i < title2.length; i++) {
serializer.startElement("testcase");
serializer.setAttributes("name", String(title5[i]));
serializer.setAttributes("status", "
");
serializer.setAttributes("time", "
");
serializer.setAttributes("classname", "
");
serializer.setAttributes("status", "");
serializer.setAttributes("time", "");
serializer.setAttributes("classname", "");
serializer.setAttributes("result", String(result5[i]));
serializer.setAttributes("level", "
");
serializer.setAttributes("message", "
");
serializer.setAttributes("level", "");
serializer.setAttributes("message", "");
serializer.endElement();
}
serializer.endElement();
...
...
validator/acts_validator/src/main/module.json
浏览文件 @
85fa4131
...
...
@@ -53,6 +53,12 @@
},
{
"name"
:
"ohos.permission.CAMERA"
},
{
"name"
:
"ohos.permission.MICROPHONE"
},
{
"name"
:
"ohos.permission.START_INVISIBLE_ABILITY"
}
]
}
...
...
validator/acts_validator/src/main/resources/base/profile/main_pages.json
浏览文件 @
85fa4131
...
...
@@ -38,6 +38,7 @@
"pages/Player/Player_index"
,
"pages/Player/ScrollListTest"
,
"pages/Experience/Experience_index"
,
"pages/Experience/ScrollListTest"
"pages/Experience/PhotoFps"
,
"pages/Experience/DeskFps"
]
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录