Commit af6160f8 authored by 范雪寒's avatar 范雪寒

feat:

parent 226ae6a6
......@@ -15,6 +15,9 @@
"_children": [
{
"__id__": 2
},
{
"__id__": 7
}
],
"_active": false,
......@@ -270,5 +273,79 @@
"_originalWidth": 0,
"_originalHeight": 0,
"_id": "29zXboiXFBKoIV4PQ2liTe"
},
{
"__type__": "cc.Node",
"_name": "middleLayer",
"_objFlags": 0,
"_parent": {
"__id__": 1
},
"_children": [],
"_active": true,
"_components": [
{
"__id__": 8
}
],
"_prefab": null,
"_opacity": 255,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_contentSize": {
"__type__": "cc.Size",
"width": 0,
"height": 0
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_trs": {
"__type__": "TypedArray",
"ctor": "Float64Array",
"array": [
0,
0,
0,
0,
0,
0,
1,
1,
1,
1
]
},
"_eulerAngles": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_skewX": 0,
"_skewY": 0,
"_is3DNode": false,
"_groupIndex": 0,
"groupIndex": 0,
"_id": "6caZQRGatDJJMWpck1fhab"
},
{
"__type__": "d98e34LKINGEIpG3utycEds",
"_name": "",
"_objFlags": 0,
"node": {
"__id__": 7
},
"_enabled": true,
"label": null,
"text": "hello",
"_id": "92vsFTcCRNa43x2/GLXFra"
}
]
\ No newline at end of file
const testMockData = {"eof":1,"file":"/storage/emulated/0/Android/data/com.example.oxford/cache/shengtong/gradeVoice.mp3","audioUrl":"https://staging-teach.cdn.ireadabc.com/db48d49e122ba65aa7c5ee56963418a6.mp3","result":{"duration":"2.470","fluency":100,"integrity":100,"kernel_version":"3.6.7","overall":99,"pronunciation":99,"resource_version":"2.3.6","rhythm":0,"speed":78},"tokenId":"621c32543327932cfc000002"};
const recordMockData = {"text":"what can i do for you","audioUrl":"https://staging-teach.cdn.ireadabc.com/368ad56174f85e2ff1f39f12bac5c693.mp3"};
export function initAir(_this) {
const realAir = {
uploadUrl: "",
uploadData: null,
engineInfo: null,
hideAirClassLoading(templateName, loadData) {
_this.log("***成功调用hideAirClassLoading***");
window.air.onCourseInScreen && window.air.onCourseInScreen(() => {
_this.log("***成功调用onCourseInScreen***");
});
},
osmoCallback: function (res) {
_this.log(`***成功调用osmoCallback***参数==${res}`);
},
osmoHandwritingCallback: function (res) {
_this.log(`***成功调用osmoHandwritingCallback***参数==${res}`);
},
osmoHandwritingMlkitCallback: function (res) {
_this.log(`***成功调用osmoHandwritingMlkitCallback***参数==${res}`);
},
osmoFingerReadCallback: function (res) {
_this.log(`***成功调用osmoFingerReadCallback***参数==${res}`);
},
startScanCodeCallback: null,
needUpdateCallback: null,
getEngineInfoCallback: null,
configurationPortraitCallback: null,
configurationLandscapeCallback: null,
recognitionCameraCallBack: null,
testCallBack: null,
recordCallBack: null,
onCourseInScreen: null,
};
try {
window.air = new Proxy(realAir, {
set: function (target, key, value, receiver) {
let newValue = value;
if (key == "osmoCallback" || key == "osmoHandwritingCallback" || key == "osmoHandwritingMlkitCallback" || key == "osmoFingerReadCallback") {
newValue = function (res) {
_this.log(`||==成功调用${key}==||参数==${JSON.stringify(res)}`);
if(typeof(res) == 'string') {
value(res);
} else {
value(JSON.stringify(res));
}
}
}
return Reflect.set(target, key, newValue, receiver);
},
get: function (target, key, receiver) {
return Reflect.get(target, key, receiver);
},
deleteProperty: function (target, key) {
return Reflect.deleteProperty(target, key);
}
});
} catch (e) {
console.error("浏览器不支持ES6新特性Proxy/Reflect,请使用谷歌浏览器!");
}
window.courseware = {
getData(callback) {
_this.log("===成功调用getData===");
callback && callback(null);
},
uploadUrl() {
_this.log("===成功调用uploadUrl===");
return window.air.uploadUrl;
},
uploadData() {
_this.log("===成功调用uploadData===");
return window.air.uploadData;
},
nextPage() {
_this.log("===成功调用nextPage===");
},
beforePage() {
_this.log("===成功调用beforePage===");
},
jumpPage(page) {
_this.log(`===成功调用jumpPage=== page == ${page}`);
},
sendAnswer(answerObj) {
_this.log(`===成功调用sendAnswer=== answerObj == ${JSON.stringify(answerObj)}`);
answerObj.callback && answerObj.callback();
},
getAnswer(queryObj, callback) {
_this.log(`===成功调用getAnswer=== queryObj == ${JSON.stringify(queryObj)}`);
callback && callback(null);
},
addStar() {
_this.log(`===成功调用addStar===`);
},
getTemplates(callback) {
_this.log(`===成功调用getTemplates===`);
callback && callback(null);
},
getTemplateUrl(templateName, callback) {
_this.log(`===成功调用getTemplateUrl=== templateName == ${templateName}`);
callback && callback(null);
},
gameEnd() {
_this.log(`===成功调用gameEnd===`);
},
// isSpeechToText 1: 录音转文本,0:纯录音
startRecord(isSpeechToText) {
_this.log(`===成功调用startRecord=== isSpeechToText == ${isSpeechToText}`);
window.courseware.hasCalledStartRecord = true;
window.courseware.callOcMethod("startRecord", { isSpeechToText });
},
stopRecord(callback1, callback2) {
// 传两个参数是为了兼容以前
window.courseware.hasCalledStartRecord = false;
const callback = callback1 || callback2;
_this.log(`===成功调用stopRecord===`);
if (!callback) {
// 不传回调函数就表示取消评测
window.courseware.callOcMethod("stopRecord", { isBreak: 1 });
return;
}
// 结束录音
window.air.recordCallBack = (res) => {
res = typeof(res) == 'string' ? res : JSON.stringify(res);
_this.log(`===成功调用recordCallBack=== res == ${res}`);
callback && callback(res);
window.air.recordCallBack = null;
};
window.courseware.callOcMethod("stopRecord", { isBreak: 0 });
},
startTest(testText, option) {
window.courseware.hasCalledStartTest = true;
_this.log(`===成功调用startTest=== testText == ${testText}`);
window.courseware.callOcMethod("startTest", { ...option, "params": testText });
},
stopTest(callback) {
window.courseware.hasCalledStartTest = false;
_this.log(`===成功调用stopTest===`);
if (!callback) {
// 不传回调函数就表示取消评测
_this.log(`===成功取消录音评测===`);
window.courseware.callOcMethod("stopTest", { isBreak: 1 });
return;
}
// 结束录音
window.air.testCallBack = (res) => {
res = typeof(res) == 'string' ? res : JSON.stringify(res);
_this.log(`===成功调用testCallBack=== res == ${res}`);
callback && callback(res);
window.air.testCallBack = null;
};
window.courseware.callOcMethod("stopTest", {});
},
openRecognitionCamera(callback) {
window.courseware.hasCalledOpenRecognitionCamera = true;
_this.log(`===成功调用openRecognitionCamera===`);
window.air.recognitionCameraCallBack = (res) => {
callback && callback(JSON.stringify(res));
window.air.recognitionCameraCallBack = null;
};
window.courseware.callOcMethod("openRecognitionCamera", {});
},
closeRecognitionCamera() {
window.courseware.hasCalledOpenRecognitionCamera = false;
_this.log(`===成功调用closeRecognitionCamera===`);
window.courseware.callOcMethod("closeRecognitionCamera", {});
},
getEngineInfo(callback) {
_this.log(`===成功调用getEngineInfo===`);
// 调用原生获取机器信息
window.air.getEngineInfoCallback = (res) => {
if(typeof(res) == 'string') {
window.air.engineInfo = res;
callback && callback(res);
} else {
window.air.engineInfo = JSON.stringify(res);
callback && callback(JSON.stringify(res));
}
window.air.getEngineInfoCallback = null;
};
window.courseware.callOcMethod("getEngineInfo", {});
},
needUpdate(label, url, callback) {
_this.log(`===成功调用needUpdate===`);
// 调用原生获取机器信息
window.air.needUpdateCallback = (res) => {
callback && callback(res);
window.air.needUpdateCallback = null;
};
window.courseware.callOcMethod("needUpdate", { label: label, url: url });
},
startScanCode(callback) {
_this.log(`===成功调用startScanCode===`);
// 调用原生开始扫码
window.air.startScanCodeCallback = (res) => {
callback && callback(res);
window.air.startScanCodeCallback = null;
};
window.courseware.callOcMethod("startScanCode", {});
},
openOsmo(params = {}) {
window.courseware.hasCalledOpenOsmo = true;
_this.log(`===成功调用openOsmo===${JSON.stringify(params)}`);
window.courseware.callOcMethod("openOsmo", params);
},
closeOsmo() {
window.courseware.hasCalledOpenOsmo = false;
_this.log(`===成功调用closeOsmo===`);
window.courseware.callOcMethod("closeOsmo", {});
},
openOsmoHandwriting(params = {}) {
window.courseware.hasCalledOpenOsmoHandwriting = true;
_this.log(`===成功调用openOsmoHandwriting===${JSON.stringify(params)}`);
window.courseware.callOcMethod("openOsmoHandwriting", params);
},
closeOsmoHandwriting() {
window.courseware.hasCalledOpenOsmoHandwriting = false;
_this.log(`===成功调用closeOsmoHandwriting===`);
window.courseware.callOcMethod("closeOsmoHandwriting", {});
},
openOsmoHandwritingMlkit(params = {}) {
window.courseware.hasCalledOpenOsmoHandwritingMlkit = true;
_this.log(`===成功调用openOsmoHandwritingMlkit===${JSON.stringify(params)}`);
window.courseware.callOcMethod("openOsmoHandwritingMlkit", params);
},
closeOsmoHandwritingMlkit() {
window.courseware.hasCalledOpenOsmoHandwritingMlkit = false;
_this.log(`===成功调用closeOsmoHandwritingMlkit===`);
window.courseware.callOcMethod("closeOsmoHandwritingMlkit", {});
},
openOsmoFingerRead(params = {}) {
window.courseware.hasCalledOpenOsmoFingerRead = true;
_this.log(`===成功调用openOsmoFingerRead===${JSON.stringify(params)}`);
window.courseware.callOcMethod("openOsmoFingerRead", params);
},
closeOsmoFingerRead() {
window.courseware.hasCalledOpenOsmoFingerRead = false;
_this.log(`===成功调用closeOsmoFingerRead===`);
window.courseware.callOcMethod("closeOsmoFingerRead", {});
},
onConfigurationPortrait(params = {}, callback) {
_this.log(`===成功调用onConfigurationPortrait||竖屏===`);
window.air.configurationPortraitCallback = (res) => {
callback && callback(res);
window.air.configurationPortraitCallback = null;
};
window.courseware.callOcMethod("onConfigurationPortrait", params);
},
onConfigurationLandscape(params = {}, callback) {
_this.log(`===成功调用onConfigurationLandscape||横屏===`);
window.air.configurationLandscapeCallback = (res) => {
callback && callback(res);
window.air.configurationLandscapeCallback = null;
};
window.courseware.callOcMethod("onConfigurationLandscape", params);
},
callOcMethod(method, param) {
const paramStr = JSON.stringify(param);
_this.log(`===成功调用原生方法${method}===参数==${paramStr}`);
if (cc.sys.isNative && cc.sys.os == cc.sys.OS_IOS) {
return jsb.reflection.callStaticMethod('RootViewController', `${method}:`, paramStr);
} else if (cc.sys.isNative && cc.sys.os == cc.sys.OS_ANDROID) {
return jsb.reflection.callStaticMethod('com/iplayabc/cocos/AppActivity', method, '(Ljava/lang/String;)Ljava/lang/String;', paramStr);
} else if (cc.sys.isNative && cc.sys.os == cc.sys.OS_WINDOWS) {
console.log('汪汪汪')
} else {
console.error(`非源生环境,网页版不支持${method}方法,将返回此方法的Mock数据以便于网页版调试使用`);
if(method == 'getEngineInfo'){
window.air.getEngineInfoCallback({isDev: 1, uuid: 'debug-xxxxxx-xxxxxx'});
} else if (method == 'startTest') {
} else if (method == 'stopTest') {
window.air.testCallBack(testMockData);
} else if (method == 'startRecord') {
} else if (method == 'stopRecord') {
window.air.recordCallBack(recordMockData);
} else{
console.error(`${method}方法还没有Mock数据,请联系技术支持人员添加`);
}
}
},
freeAllOcMethod() {
if (window.courseware.hasCalledStartRecord) {
window.courseware.stopRecord();
}
if (window.courseware.hasCalledStartTest) {
window.courseware.stopTest();
}
if (window.courseware.hasCalledOpenRecognitionCamera) {
window.courseware.closeRecognitionCamera();
}
if (window.courseware.hasCalledOpenOsmo) {
window.courseware.closeOsmo();
}
if (window.courseware.hasCalledOpenOsmoHandwriting) {
window.courseware.closeOsmoHandwriting();
}
if (window.courseware.hasCalledOpenOsmoHandwritingMlkit) {
window.courseware.closeOsmoHandwritingMlkit();
}
if (window.courseware.hasCalledOpenOsmoFingerRead) {
window.courseware.closeOsmoFingerRead();
}
}
};
}
{
"ver": "1.0.8",
"uuid": "15fea870-2ab5-4a2e-b2c5-9534af654642",
"isPlugin": false,
"loadPluginInWeb": true,
"loadPluginInNative": true,
"loadPluginInEditor": false,
"subMetas": {}
}
\ No newline at end of file
import { initAir } from "./air";
import { middleLayerBase } from "./middleLayerBase";
const { ccclass, property } = cc._decorator;
@ccclass
export default class NewClass extends middleLayerBase {
reWriteAir() {
(<any>window).courseware.getData = async (callback) => {
let data = null;
if (this.courseItem && this.courseItem.data) {
data = JSON.parse(this.courseItem.data);
this.log("===成功调用getData===" + this.courseItem.data);
}
callback && callback(data);
}
if (!(<any>window).air) {
(<any>window).air = {};
}
(<any>window).air.hideAirClassLoading = () => {
(<any>window).air.onCourseInScreen && (<any>window).air.onCourseInScreen(() => {
console.log("***成功调用onCourseInScreen***");
});
this.hideWaitingLetters();
this.hideMask();
}
}
showMask() {
}
hideMask() {
}
hideWaitingLetters() {
}
showWaitingLetters() {
}
protected start(): void {
this.node.zIndex = 9999;
cc.game.addPersistRootNode(this.node);
}
role = 'student';
protected onLoad(): void {
initAir(this);
this.reWriteAir();
}
}
{
"ver": "1.0.8",
"uuid": "d98e3e0b-2883-4610-8a46-deeb7270476c",
"isPlugin": false,
"loadPluginInWeb": true,
"loadPluginInNative": true,
"loadPluginInEditor": false,
"subMetas": {}
}
\ No newline at end of file
export abstract class middleLayerBase extends cc.Component {
abstract reWriteAir(): void;
abstract showMask(): void;
abstract hideMask(): void;
abstract hideWaitingLetters(): void;
abstract showWaitingLetters(): void;
callNetworkApiPost(uri, data, callBack) {
this.getBaseUrl((baseUrl) => {
const xhr = new XMLHttpRequest();
const url = `${baseUrl}${uri}`;
xhr.open("POST", url, true);
xhr.setRequestHeader('content-type', 'application/json');
xhr.onreadystatechange = () => {
if (xhr.readyState == 4) {
callBack(JSON.parse(xhr.responseText));
}
}
xhr.send(JSON.stringify(data));
});
}
callNetworkApiGet(uri, data, callBack) {
this.getBaseUrl((baseUrl) => {
let queryStr = '?';
const params = [];
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
params.push(`${key}=${data[key]}`);
}
}
queryStr += params.join("&");
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {
callBack(xhr.responseText);
}
};
const url = `${baseUrl}${uri}${queryStr}`;
console.log('url = ' + url);
xhr.open('GET', url, true);
xhr.send();
});
}
async getBaseUrl(callback) {
const engineInfo = await this.getEngineInfo();
const { isDev } = JSON.parse(engineInfo);
if (isDev == 1) {
callback('http://staging-openapi.iteachabc.com');
} else {
callback('http://openapi.iteachabc.com');
}
}
getEngineInfo() {
if ((<any>window).air.engineInfo) {
return (<any>window).air.engineInfo;
} else {
return new Promise((resolve, reject) => {
(<any>window).courseware.getEngineInfo(() => {
resolve((<any>window).air.engineInfo);
});
});
}
}
asyncCallNetworkApiGet(apiName, data) {
return new Promise((resolve, reject) => {
this.callNetworkApiGet(apiName, data, (res => {
resolve(res);
}));
});
}
asyncCallNetworkApiPost(uri, data) {
return new Promise((resolve, reject) => {
this.callNetworkApiPost(uri, data, (res) => {
resolve(res);
});
});
}
loadOnlineBundle(bundleName) {
this.callNetworkApiGet(`/api/template/v1/${bundleName}`, {}, (datastr) => {
const data = JSON.parse(datastr);
let configData = null;
if (cc.sys.os == cc.sys.OS_IOS) {
configData = data.data.conf.ios;
} else if (cc.sys.os == cc.sys.OS_ANDROID) {
configData = data.data.conf.android;
} else {
configData = data.data.conf.web_desktop;
}
const sceneName = configData.sceneName;
const version = configData.version;
const bondleUrl = configData.bondleUrl;
this.loadBundle(sceneName, version, bondleUrl);
});
}
currentBundleInfo = null;
reloadBundle() {
const { sceneName, version, bondleUrl } = this.currentBundleInfo;
this.loadBundle(sceneName, version, bondleUrl);
}
loadBundle(sceneName, version, bondleUrl) {
this.currentBundleInfo = { sceneName, version, bondleUrl };
this.showMask();
this.showWaitingLetters();
cc.assetManager.loadBundle(bondleUrl, { version: version }, async (err, bundle) => {
bundle.loadScene(sceneName, null, null, (err, scene) => {
const btnRestart = cc.find('middleLayer/BtnRestart');
btnRestart.active = false;
cc.audioEngine.stopAll();
cc.director.runScene(scene, null, () => {
console.log('sceneName = ' + sceneName);
const canvas = cc.find('Canvas');
const middleLayer = cc.find('middleLayer');
cc.find('middleLayer/ExitBtn').active = true;
this.hideWaitingLetters();
this.hideMask();
canvas.getComponent(cc.Widget).updateAlignment();
middleLayer.scale = canvas.width / middleLayer.width;
// this.showLog('middleLayer.scale = ' + middleLayer.scale);
});
});
});
}
courses = null;
courseIndex = 0;
courseItem = null;
loadOnlineCourseWare(courseId, linkFlag = false) {
this.showWaitingLetters();
let api = `/api/courseware/v1/${courseId}/list`;
if (linkFlag === true) {
api = `/api/courseware/v1/${courseId}/eq/level/list`;
}
this.callNetworkApiGet(api, {}, (datastr) => {
const data = JSON.parse(datastr);
if (data.rows && data.rows.length > 0) {
this.courses = data.rows;
this.courseIndex = data.index || 0;
this.courseItem = data.rows[this.courseIndex];
}
if (this.courses && this.courses.length > 1 && this.courseIndex <= this.courses.length - 1) {
cc.find('middleLayer/BtnRight').active = true;
}
if (this.courseIndex > 0) {
cc.find('middleLayer/BtnLeft').active = false;
}
this.reWriteAir();
this.loadPageBundle();
});
}
loadPageBundle() {
let sceneName, version, bondleUrl = "";
if (cc.sys.os == cc.sys.OS_IOS) {
sceneName = this.courseItem.conf.ios.sceneName;
version = this.courseItem.conf.ios.version;
bondleUrl = this.courseItem.conf.ios.bondleUrl;
} else if (cc.sys.os == cc.sys.OS_ANDROID) {
sceneName = this.courseItem.conf.android.sceneName;
version = this.courseItem.conf.android.version;
bondleUrl = this.courseItem.conf.android.bondleUrl;
} else {
sceneName = this.courseItem.conf.web_desktop.sceneName;
version = this.courseItem.conf.web_desktop.version;
bondleUrl = this.courseItem.conf.web_desktop.bondleUrl;
}
this.loadBundle(sceneName, version, bondleUrl);
}
goPrePage() {
this.goTarIndexPage(this.courseIndex - 1);
}
goNextPage() {
this.goTarIndexPage(this.courseIndex + 1);
}
goTarIndexPage(index) {
if (!this.courses || index == this.courseIndex || index < 0 || index > this.courses.length - 1) {
return;
}
(<any>window).courseware.freeAllOcMethod();
this.courseIndex = index;
this.courseItem = this.courses[this.courseIndex];
this.loadPageBundle();
}
log(str: string) {
cc.log(str);
}
showTips(str: string) {
const tipsNode = new cc.Node();
tipsNode.parent = cc.find('Canvas');
tipsNode.zIndex = 100;
const bg = cc.instantiate(cc.find('middleLayer/bg'));
bg.parent = tipsNode;
bg.active = true;
bg.color = cc.color(100, 100, 100);
const labelNode = new cc.Node();
labelNode.parent = tipsNode;
const label = labelNode.addComponent(cc.Label);
label.string = str;
bg.width = 200;
bg.height = labelNode.height + 20;
cc.tween(tipsNode)
.set({ opacity: 255 })
.delay(1)
.to(1, { opacity: 0 })
.removeSelf()
.start();
}
}
\ No newline at end of file
{
"ver": "1.0.8",
"uuid": "9fdb1995-66ab-43ba-9a0d-1784672ccdf2",
"isPlugin": false,
"loadPluginInWeb": true,
"loadPluginInNative": true,
"loadPluginInEditor": false,
"subMetas": {}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment