From 5a1d49e71cf2f8ff608642913e40822a8132e8cc Mon Sep 17 00:00:00 2001 From: wuzhihuitmac Date: Sat, 4 Mar 2023 04:09:41 +0000 Subject: [PATCH 1/4] modify readme Signed-off-by: wuzhihuitmac Change-Id: I5feea359a7adbad9e2555c52b8ee724167524023 --- README.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++- README_zh.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) mode change 100755 => 100644 README.md mode change 100755 => 100644 README_zh.md diff --git a/README.md b/README.md old mode 100755 new mode 100644 index 86646ee..06495e2 --- a/README.md +++ b/README.md @@ -111,6 +111,26 @@ The APIs provided for the vibrator are used to trigger and stop vibration. The f

Stops vibration based on the mode specified by stopMode. There are two modes: VIBRATOR_STOP_MODE_TIME and VIBRATOR_STOP_MODE_PRESET, which are used to stop vibration triggered by duration and effectId, respectively. This API uses a promise to indicate whether the vibration is stopped successfully.

+

stopVibration(callback: AsyncCallback<void>)

+ +

停止所有模式的马达振动,callback为停止振动是否成功。

+ + +

stopVibration(): Promise<void>

+ +

停止所有模式的马达振动,返回Promise表示触发振动是否成功。

+ + +

isSupportEffect(effectId: string, callback: AsyncCallback<boolean>)

+ +

查询是否支持传入的参数effectId,返回true则表示支持,否则不支持。

+ + +

isSupportEffect(effectId: string): Promise<boolean>

+ +

查询是否支持传入的参数effectId,返回true则表示支持,否则不支持。

+ + @@ -121,6 +141,8 @@ The APIs provided for the vibrator are used to trigger and stop vibration. The f 3. Stop vibration that is triggered with a specific duration. 4. Trigger vibration with a specific effect. 5. Stop vibration that is triggered with a specific effect. +6. Query whether 'haptic. lock. timer' is supported. If so, vibrate the effectId. +7. Stop all types of vibration. The following sample code provides a complete process of using the vibrator APIs: @@ -154,7 +176,7 @@ export default { } console.info("Succeeded in triggering vibration."); }); - // Step 54 Stop vibration that is triggered with a specific effect. + // Step 5 Stop vibration that is triggered with a specific effect. vibrator.stop("preset", function(error) { if (error) { console.error("Failed to stop vibration. Error code: " + error.code); @@ -162,6 +184,49 @@ export default { } console.info("Succeeded in stopping vibration."); }); + // Step 6 Query whether 'haptic. lock. timer' is supported. If so, vibrate the effectId. + try { + vibrator.isSupportEffect('haptic.clock.timer').then((err, state) => { + if (err) { + console.error('isSupportEffect failed. Error msg:' + JSON.stringify(err)); + return; + } + console.log('The effectId is ' + (state ? 'supported' : 'unsupported')); + if (state) { + try { + vibrator.startVibration({ + type: 'preset', + effectId: 'haptic.clock.timer', + count: 1, + }, { + usage: 'unknown' + }).then(()=>{ + console.log('Promise returned to indicate a successful vibration'); + }).catch((error)=>{ + console.error('Promise returned to indicate a failed vibration:' + JSON.stringify(error)); + }); + } catch (error) { + console.error('exception in, error:' + JSON.stringify(error)); + } + } + }, (error) => { + console.error('isSupportEffect failed, error:' + JSON.stringify(error)); + }) + } catch (error) { + console.error('Exception in, error:' + JSON.stringify(error)); + } + // Step 7 Stop all types of vibration. + try { + vibrator.stopVibration(function (error) { + if (error) { + console.log('error.code' + error.code + 'error.message' + error.message); + return; + } + console.log('Callback returned to indicate successful.'); + }) + } catch (error) { + console.info('errCode: ' + error.code + ' ,msg: ' + error.message); + } } onDestroy() { console.info('AceApplication onDestroy'); diff --git a/README_zh.md b/README_zh.md old mode 100755 new mode 100644 index 4023602..ff0bd9b --- a/README_zh.md +++ b/README_zh.md @@ -111,6 +111,26 @@

按照指定的要停止的振动模式来停止震动。stopMode为枚举马达两种振动类型,VIBRATOR_STOP_MODE_TIME、VIBRATOR_STOP_MODE_PRESET分别为停止duration模式的振动和停止预置EffectId模式的振动,返回Promise表示触发振动是否成功。

+

stopVibration(callback: AsyncCallback<void>)

+ +

停止所有模式的马达振动,callback为停止振动是否成功。

+ + +

stopVibration(): Promise<void>

+ +

停止所有模式的马达振动,返回Promise表示触发振动是否成功。

+ + +

isSupportEffect(effectId: string, callback: AsyncCallback<boolean>)

+ +

查询是否支持传入的参数effectId,返回true则表示支持,否则不支持。

+ + +

isSupportEffect(effectId: string): Promise<boolean>

+ +

查询是否支持传入的参数effectId,返回true则表示支持,否则不支持。

+ + @@ -121,6 +141,8 @@ 3. 停止马达按照指定持续时间振动。 4. 触发按照指定振动效果字符串振动。 5. 停止按照指定振动效果字符串振动。 +6. 查询是否支持'haptic.clock.timer',如果支持则振动该effectId。 +7. 停止所有类型振动。 下述的代码示例中,提供了马达震动使用的完整流程。 @@ -162,6 +184,49 @@ export default { } console.info("Succeeded in stopping vibration."); }); + //步骤6 查询是否支持'haptic.clock.timer',如果支持则振动该effectId + try { + vibrator.isSupportEffect('haptic.clock.timer').then((err, state) => { + if (err) { + console.error('isSupportEffect failed. Error msg:' + JSON.stringify(err)); + return; + } + console.log('The effectId is ' + (state ? 'supported' : 'unsupported')); + if (state) { + try { + vibrator.startVibration({ + type: 'preset', + effectId: 'haptic.clock.timer', + count: 1, + }, { + usage: 'unknown' + }).then(()=>{ + console.log('Promise returned to indicate a successful vibration'); + }).catch((error)=>{ + console.error('Promise returned to indicate a failed vibration:' + JSON.stringify(error)); + }); + } catch (error) { + console.error('exception in, error:' + JSON.stringify(error)); + } + } + }, (error) => { + console.error('isSupportEffect failed, error:' + JSON.stringify(error)); + }) + } catch (error) { + console.error('Exception in, error:' + JSON.stringify(error)); + } + //步骤7 停止所有类型振动 + try { + vibrator.stopVibration(function (error) { + if (error) { + console.log('error.code' + error.code + 'error.message' + error.message); + return; + } + console.log('Callback returned to indicate successful.'); + }) + } catch (error) { + console.info('errCode: ' + error.code + ' ,msg: ' + error.message); + } } onDestroy() { console.info('AceApplication onDestroy'); -- Gitee From a42a66d10ed68626522256f96e128ef00dab5ea3 Mon Sep 17 00:00:00 2001 From: wuzhihuitmac Date: Sat, 4 Mar 2023 06:41:21 +0000 Subject: [PATCH 2/4] modify readme Signed-off-by: wuzhihuitmac Change-Id: Ib31567a062cbc7ac4b1742840b96891b90417bc8 --- README.md | 18 +++++++++--------- README_zh.md | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 06495e2..639a58b 100644 --- a/README.md +++ b/README.md @@ -186,9 +186,9 @@ export default { }); // Step 6 Query whether 'haptic. lock. timer' is supported. If so, vibrate the effectId. try { - vibrator.isSupportEffect('haptic.clock.timer').then((err, state) => { + vibrator.isSupportEffect('haptic.clock.timer', function (err, state) { if (err) { - console.error('isSupportEffect failed. Error msg:' + JSON.stringify(err)); + console.error('isSupportEffect failed, error:' + JSON.stringify(err)); return; } console.log('The effectId is ' + (state ? 'supported' : 'unsupported')); @@ -200,17 +200,17 @@ export default { count: 1, }, { usage: 'unknown' - }).then(()=>{ - console.log('Promise returned to indicate a successful vibration'); - }).catch((error)=>{ - console.error('Promise returned to indicate a failed vibration:' + JSON.stringify(error)); + }, (error) => { + if(error) { + console.error('haptic.clock.timer vibrator error:' + JSON.stringify(error)); + } else { + console.log('haptic.clock.timer vibrator success'); + } }); } catch (error) { - console.error('exception in, error:' + JSON.stringify(error)); + console.error('Exception in, error:' + JSON.stringify(error)); } } - }, (error) => { - console.error('isSupportEffect failed, error:' + JSON.stringify(error)); }) } catch (error) { console.error('Exception in, error:' + JSON.stringify(error)); diff --git a/README_zh.md b/README_zh.md index ff0bd9b..b76023d 100644 --- a/README_zh.md +++ b/README_zh.md @@ -186,9 +186,9 @@ export default { }); //步骤6 查询是否支持'haptic.clock.timer',如果支持则振动该effectId try { - vibrator.isSupportEffect('haptic.clock.timer').then((err, state) => { + vibrator.isSupportEffect('haptic.clock.timer', function (err, state) { if (err) { - console.error('isSupportEffect failed. Error msg:' + JSON.stringify(err)); + console.error('isSupportEffect failed, error:' + JSON.stringify(err)); return; } console.log('The effectId is ' + (state ? 'supported' : 'unsupported')); @@ -200,17 +200,17 @@ export default { count: 1, }, { usage: 'unknown' - }).then(()=>{ - console.log('Promise returned to indicate a successful vibration'); - }).catch((error)=>{ - console.error('Promise returned to indicate a failed vibration:' + JSON.stringify(error)); + }, (error) => { + if(error) { + console.error('haptic.clock.timer vibrator error:' + JSON.stringify(error)); + } else { + console.log('haptic.clock.timer vibrator success'); + } }); } catch (error) { - console.error('exception in, error:' + JSON.stringify(error)); + console.error('Exception in, error:' + JSON.stringify(error)); } } - }, (error) => { - console.error('isSupportEffect failed, error:' + JSON.stringify(error)); }) } catch (error) { console.error('Exception in, error:' + JSON.stringify(error)); -- Gitee From 4963204304e072ccffe9c26c3bf41d7fac0567d0 Mon Sep 17 00:00:00 2001 From: wuzhihuitmac Date: Sat, 4 Mar 2023 09:16:14 +0000 Subject: [PATCH 3/4] modify readme Signed-off-by: wuzhihuitmac Change-Id: I2d263d977bee01eb150e028fd95868f2b2e86901 --- README.md | 110 +++++++++++++++++++++++++++--------------------- README_zh.md | 117 ++++++++++++++++++++++++++++----------------------- 2 files changed, 127 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index 639a58b..7ae94bd 100644 --- a/README.md +++ b/README.md @@ -75,65 +75,57 @@ The APIs provided for the vibrator are used to trigger and stop vibration. The f **Table 2** JS APIs for the vibrator + - - - - - - - - - - - - - - - -

API

Description

vibrate(duration: number, callback?: AsyncCallback<void>)

-

Triggers vibration based on the duration specified by duration. This API uses a callback to indicate whether the vibration is triggered successfully.

-

vibrate(duration: number): Promise<void>

-

Triggers vibration based on the duration specified by duration. This API uses a promise to indicate whether the vibration is triggered successfully.

-

vibrate(effectId: EffectId, callback?: AsyncCallback<void>)

+

startVibration(effect: VibrateEffect, attribute: VibrateAttribute, callback?: AsyncCallback<void>)

Triggers vibration based on the vibration effect specified by effectId. This API uses a callback to indicate whether the vibration is triggered successfully.

+

Triggers vibration based on the vibration effect specified by effect and attribute. This API uses a callback to indicate whether the vibration is triggered successfully.

vibrate(effectId: EffectId): Promise<void>

+

startVibration(effect: VibrateEffect, attribute: VibrateAttribute): Promise<void>

Triggers vibration based on the vibration effect specified by effectId. This API uses a promise to indicate whether the vibration is triggered successfully.

+

Triggers vibration based on the vibration effect specified by effect and attribute. This API uses a promise to indicate whether the vibration is triggered successfully.

stop(stopMode: VibratorStopMode, callback?: AsyncCallback<void>)

+

stopVibration(stopMode: VibratorStopMode, callback?: AsyncCallback<void>)

Stops vibration based on the mode specified by stopMode. There are two modes: VIBRATOR_STOP_MODE_TIME and VIBRATOR_STOP_MODE_PRESET, which are used to stop vibration triggered by duration and effectId, respectively. This API uses a callback to indicate whether the vibration is stopped successfully.

stop(stopMode: VibratorStopMode): Promise<void>

+

stopVibration(stopMode: VibratorStopMode): Promise<void>

Stops vibration based on the mode specified by stopMode. There are two modes: VIBRATOR_STOP_MODE_TIME and VIBRATOR_STOP_MODE_PRESET, which are used to stop vibration triggered by duration and effectId, respectively. This API uses a promise to indicate whether the vibration is stopped successfully.

stopVibration(callback: AsyncCallback<void>)

停止所有模式的马达振动,callback为停止振动是否成功。

+

Stop all types of vibration. This API uses a callback to indicate whether the vibration is stopped successfully.

stopVibration(): Promise<void>

停止所有模式的马达振动,返回Promise表示触发振动是否成功。

+

Stop all types of vibration. This API uses a promise to indicate whether the vibration is stopped successfully.

isSupportEffect(effectId: string, callback: AsyncCallback<boolean>)

查询是否支持传入的参数effectId,返回true则表示支持,否则不支持。

+

Query whether the effectId is supported. This API uses a callback to indicate whether the query structure of EffectId is successful.

isSupportEffect(effectId: string): Promise<boolean>

查询是否支持传入的参数effectId,返回true则表示支持,否则不支持。

+

Query whether the effectId is supported. This API uses a promise to indicate whether the vibration is stopped successfully.

+ ### How to Use 1. Import the **vibrator** package. @@ -153,37 +145,59 @@ export default { onCreate() { console.info('MiscdeviceJsAPI AceApplication onCreate'); // Step 2 Trigger vibration with a specific duration. - vibrator.vibrate(100, function(error) { - if (error) { - console.error("Failed to trigger vibration. Error code: " + error.code); - return; - } - console.info("Succeeded in triggering vibration."); - }); + try { + vibrator.startVibration({ + type: 'time', + duration: 1000, + }, { + id: 0, + usage: 'alarm' + }, (error) => { + if (error) { + console.error('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message); + return; + } + console.log('Callback returned to indicate a successful vibration.'); + }); + } catch (error) { + console.error('errCode: ' + error.code + ' ,msg: ' + error.message); + } // Step 3 Stop vibration that is triggered with a specific duration. - vibrator.stop("time", function(error) { - if (error) { - console.error("Failed to stop vibration. Error code: " + error.code); - return; - } - console.info("Succeeded in stopping vibration."); - }); + try { + vibrator.stopVibration("time").then(() => { + console.log("stopVibration success"); + }, (error)=>{ + console.log("stopVibration error:" + JSON.stringify(error)); + }); + } catch (error) { + console.error('Exception in, error:' + JSON.stringify(error)); + } // Step 4 Trigger vibration based on with a specific effect. - vibrator.vibrate("haptic.clock.timer", function(error) { - if (error) { - console.error("Failed to trigger vibration. Error code: " + error.code); - return; - } - console.info("Succeeded in triggering vibration."); - }); + try { + vibrator.startVibration({ + type: 'preset', + effectId: 'haptic.clock.timer', + count: 1, + }, { + usage: 'unknown' + }).then(()=>{ + console.log('Promise returned to indicate a successful vibration'); + }).catch((error)=>{ + console.error('Promise returned to indicate a failed vibration:' + JSON.stringify(error)); + }); + } catch (error) { + console.error('exception in, error:' + JSON.stringify(error)); + } // Step 5 Stop vibration that is triggered with a specific effect. - vibrator.stop("preset", function(error) { - if (error) { - console.error("Failed to stop vibration. Error code: " + error.code); - return; - } - console.info("Succeeded in stopping vibration."); - }); + try { + vibrator.stopVibration("preset").then(() => { + console.log("stopVibration success"); + }, (error)=>{ + console.log("stopVibration error:" + JSON.stringify(error)); + }); + } catch (error) { + console.error('Exception in, error:' + JSON.stringify(error)); + } // Step 6 Query whether 'haptic. lock. timer' is supported. If so, vibrate the effectId. try { vibrator.isSupportEffect('haptic.clock.timer', function (err, state) { diff --git a/README_zh.md b/README_zh.md index b76023d..02f9c2a 100644 --- a/README_zh.md +++ b/README_zh.md @@ -70,7 +70,7 @@ ### 接口说明 -马达主要提供的功能有:触发震动,停止震动。JS API类开放能力如下: +马达主要提供的功能有:触发振动,停止振动。JS API类开放能力如下: **表 2** 马达JS API的主要接口 @@ -81,59 +81,50 @@ -

vibrate(duration: number, callback?: AsyncCallback<void>)

+

startVibration(effect: VibrateEffect, attribute: VibrateAttribute, callback?: AsyncCallback<void>)

-

按照指定持续时间触发震动。duration为振动持续时长,callback为触发振动是否成功。

+

按照指定的effect和attribute触发振动。effect为振动效果,attribute为振动属性,返回callback表示触发振动是否成功。

-

vibrate(duration: number): Promise<void>

+

startVibration(effect: VibrateEffect, attribute: VibrateAttribute): Promise<void>

-

按照指定持续时间触发震动,返回Promise表示触发振动是否成功。

+

按照指定的effect和attribute触发振动。effect为振动效果,attribute为振动属性,返回Promise表示触发振动是否成功。

-

vibrate(effectId: EffectId, callback?: AsyncCallback<void>)

+

stopVibration(stopMode: VibratorStopMode, callback?: AsyncCallback<void>)

-

按照指定振动效果字符串触发震动。effectId表示预置的振动效果串,callback为触发振动是否成功。

+

按照指定的要停止的振动模式来停止振动。stopMode为枚举马达两种振动类型,VIBRATOR_STOP_MODE_TIME、VIBRATOR_STOP_MODE_PRESET分别为停止duration模式的振动和停止预置EffectId模式的振动,返回callback表示停止振动是否成功。

-

vibrate(effectId: EffectId): Promise<void>

+

stopVibration(stopMode: VibratorStopMode): Promise<void>

-

按照指定振动效果字符串触发震动。effectId表示预置的振动效果串,返回Promise表示触发振动是否成功。

- - -

stop(stopMode: VibratorStopMode, callback?: AsyncCallback<void>)

- -

按照指定的要停止的振动模式来停止震动。stopMode为枚举马达两种振动类型,VIBRATOR_STOP_MODE_TIME、VIBRATOR_STOP_MODE_PRESET分别为停止duration模式的振动和停止预置EffectId模式的振动,callback为停止振动是否成功。

- - -

stop(stopMode: VibratorStopMode): Promise<void>

- -

按照指定的要停止的振动模式来停止震动。stopMode为枚举马达两种振动类型,VIBRATOR_STOP_MODE_TIME、VIBRATOR_STOP_MODE_PRESET分别为停止duration模式的振动和停止预置EffectId模式的振动,返回Promise表示触发振动是否成功。

+

按照指定的要停止的振动模式来停止振动。stopMode为枚举马达两种振动类型,VIBRATOR_STOP_MODE_TIME、VIBRATOR_STOP_MODE_PRESET分别为停止duration模式的振动和停止预置EffectId模式的振动,返回Promise表示停止振动是否成功。

stopVibration(callback: AsyncCallback<void>)

-

停止所有模式的马达振动,callback为停止振动是否成功。

+

停止所有模式的马达振动,返回callback表示停止振动是否成功。

stopVibration(): Promise<void>

-

停止所有模式的马达振动,返回Promise表示触发振动是否成功。

+

停止所有模式的马达振动,返回Promise表示停止振动是否成功。

isSupportEffect(effectId: string, callback: AsyncCallback<boolean>)

-

查询是否支持传入的参数effectId,返回true则表示支持,否则不支持。

+

查询是否支持传入的参数effectId,返回callback表示effectId是否支持。

isSupportEffect(effectId: string): Promise<boolean>

-

查询是否支持传入的参数effectId,返回true则表示支持,否则不支持。

+

查询是否支持传入的参数effectId,返回Promise表示effectId是否支持。

+ ### 使用说明 1. 导入vibrator包。 @@ -144,7 +135,7 @@ 6. 查询是否支持'haptic.clock.timer',如果支持则振动该effectId。 7. 停止所有类型振动。 -下述的代码示例中,提供了马达震动使用的完整流程。 +下述的代码示例中,提供了马达振动使用的完整流程。 ``` //步骤1 导包 @@ -153,37 +144,59 @@ export default { onCreate() { console.info('MiscdeviceJsAPI AceApplication onCreate'); //步骤2 触发马达按照指定持续的时间振动 - vibrator.vibrate(100, function(error) { - if (error) { - console.error("Failed to trigger vibration. Error code: " + error.code); - return; - } - console.info("Succeeded in triggering vibration."); - }); + try { + vibrator.startVibration({ + type: 'time', + duration: 1000, + }, { + id: 0, + usage: 'alarm' + }, (error) => { + if (error) { + console.error('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message); + return; + } + console.log('Callback returned to indicate a successful vibration.'); + }); + } catch (error) { + console.error('errCode: ' + error.code + ' ,msg: ' + error.message); + } //步骤3 停止马达按照指定持续的时间振动 - vibrator.stop("time", function(error) { - if (error) { - console.error("Failed to stop vibration. Error code: " + error.code); - return; - } - console.info("Succeeded in stopping vibration."); - }); + try { + vibrator.stopVibration("time").then(() => { + console.log("stopVibration success"); + }, (error)=>{ + console.log("stopVibration error:" + JSON.stringify(error)); + }); + } catch (error) { + console.error('Exception in, error:' + JSON.stringify(error)); + } //步骤4 触发马达按照指定的字符串效果振动 - vibrator.vibrate("haptic.clock.timer", function(error) { - if (error) { - console.error("Failed to trigger vibration. Error code: " + error.code); - return; - } - console.info("Succeeded in triggering vibration."); - }); + try { + vibrator.startVibration({ + type: 'preset', + effectId: 'haptic.clock.timer', + count: 1, + }, { + usage: 'unknown' + }).then(()=>{ + console.log('Promise returned to indicate a successful vibration'); + }).catch((error)=>{ + console.error('Promise returned to indicate a failed vibration:' + JSON.stringify(error)); + }); + } catch (error) { + console.error('exception in, error:' + JSON.stringify(error)); + } //步骤5 停止马达按照指定的字符串效果振动 - vibrator.stop("preset", function(error) { - if (error) { - console.error("Failed to stop vibration. Error code: " + error.code); - return; - } - console.info("Succeeded in stopping vibration."); - }); + try { + vibrator.stopVibration("preset").then(() => { + console.log("stopVibration success"); + }, (error)=>{ + console.log("stopVibration error:" + JSON.stringify(error)); + }); + } catch (error) { + console.error('Exception in, error:' + JSON.stringify(error)); + } //步骤6 查询是否支持'haptic.clock.timer',如果支持则振动该effectId try { vibrator.isSupportEffect('haptic.clock.timer', function (err, state) { -- Gitee From 729a35825283e6b57df83f7a3fefda05df901eec Mon Sep 17 00:00:00 2001 From: wuzhihuitmac Date: Sat, 4 Mar 2023 09:22:48 +0000 Subject: [PATCH 4/4] modify readme Signed-off-by: wuzhihuitmac Change-Id: I7151042937e1da0a74a178b2ae4c53250d40506e --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7ae94bd..d0fbe74 100644 --- a/README.md +++ b/README.md @@ -114,12 +114,12 @@ The APIs provided for the vibrator are used to trigger and stop vibration. The f

isSupportEffect(effectId: string, callback: AsyncCallback<boolean>)

-

Query whether the effectId is supported. This API uses a callback to indicate whether the query structure of EffectId is successful.

+

Query whether the effectId is supported. This API uses a callback to indicate whether the query result of EffectId is successful.

isSupportEffect(effectId: string): Promise<boolean>

-

Query whether the effectId is supported. This API uses a promise to indicate whether the vibration is stopped successfully.

+

Query whether the effectId is supported. This API uses a promise to indicate whether the query result of EffectId is successful.

-- Gitee