mirror of
https://github.com/openharmony/device_manager.git
synced 2026-07-19 18:13:32 -04:00
@@ -14,11 +14,11 @@
|
||||
*/
|
||||
|
||||
apply plugin: 'com.huawei.ohos.hap'
|
||||
apply plugin: 'com.huawei.ohos.decctest'
|
||||
//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510
|
||||
ohos {
|
||||
compileSdkVersion 6
|
||||
compileSdkVersion 8
|
||||
defaultConfig {
|
||||
compatibleSdkVersion 6
|
||||
compatibleSdkVersion 7
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
@@ -28,14 +28,9 @@ ohos {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
|
||||
testImplementation 'junit:junit:4.13'
|
||||
ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.200'
|
||||
}
|
||||
decc {
|
||||
supportType = ['html', 'xml']
|
||||
testImplementation 'junit:junit:4.13.1'
|
||||
}
|
||||
|
||||
@@ -11,12 +11,10 @@
|
||||
"module": {
|
||||
"package": "com.ohos.devicemanagerui",
|
||||
"name": ".MyApplication",
|
||||
"mainAbility": "com.ohos.devicemanagerui.MainAbility",
|
||||
"mainAbility": ".MainAbility",
|
||||
"srcPath": "",
|
||||
"deviceType": [
|
||||
"phone",
|
||||
"tablet",
|
||||
"tv",
|
||||
"wearable"
|
||||
"phone"
|
||||
],
|
||||
"distro": {
|
||||
"deliveryWithInstall": true,
|
||||
@@ -36,10 +34,14 @@
|
||||
]
|
||||
}
|
||||
],
|
||||
"orientation": "unspecified",
|
||||
"visible": true,
|
||||
"name": "com.ohos.devicemanagerui.MainAbility",
|
||||
"srcPath": "MainAbility",
|
||||
"name": ".MainAbility",
|
||||
"srcLanguage": "js",
|
||||
"icon": "$media:icon",
|
||||
"description": "$string:mainability_description",
|
||||
"description": "$string:description_mainability",
|
||||
"formsEnabled": false,
|
||||
"label": "$string:entry_MainAbility",
|
||||
"type": "page",
|
||||
"launchType": "standard"
|
||||
@@ -48,12 +50,13 @@
|
||||
"js": [
|
||||
{
|
||||
"pages": [
|
||||
"pages/index/index"
|
||||
"pages/index/index",
|
||||
"pages/second/second"
|
||||
],
|
||||
"name": "default",
|
||||
"name": ".MainAbility",
|
||||
"window": {
|
||||
"designWidth": 720,
|
||||
"autoDesignWidth": true
|
||||
"autoDesignWidth": false
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* 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("Application onCreate");
|
||||
},
|
||||
onDestroy() {
|
||||
console.info("Application onDestroy");
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"strings": {
|
||||
"pinCodeConnection": "Pin connection",
|
||||
"enterThePinCode": "Please enter the displayed pin code",
|
||||
"delete": "Del",
|
||||
"off": "Off",
|
||||
|
||||
"toConnectToThisComputer": " connection",
|
||||
"resourceAccess": "Resource access",
|
||||
"cancel": "Cancel",
|
||||
"parenthesesLeft": "(",
|
||||
"parenthesesRight": ")",
|
||||
"allow": "Allow",
|
||||
|
||||
"applyAuth": "Allow open apply auth?",
|
||||
"from": "From ",
|
||||
|
||||
"enterDisplayPinCode": "Please enter the displayed pin code"
|
||||
},
|
||||
"Files": {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"strings": {
|
||||
"pinCodeConnection": "PIN码连接",
|
||||
"enterThePinCode": "请输入PIN码",
|
||||
"delete": "删除",
|
||||
"off": "关闭",
|
||||
|
||||
"toConnectToThisComputer": "想要连接本机",
|
||||
"resourceAccess": "用于资源访问",
|
||||
"cancel": "取消",
|
||||
"parenthesesLeft": "(",
|
||||
"parenthesesRight": ")",
|
||||
"allow": "允许",
|
||||
|
||||
"applyAuth": "是否允许连接?",
|
||||
"from": "来自",
|
||||
|
||||
"enterDisplayPinCode": "请在主控端输入连接码进行验证"
|
||||
},
|
||||
"Files": {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,285 @@
|
||||
/*
|
||||
* 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;
|
||||
opacity: 0.8;
|
||||
width: 100%;
|
||||
background-color: azure;
|
||||
}
|
||||
|
||||
.container > div {
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.main-pin {
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
opacity: 0.8;
|
||||
width: 100%;
|
||||
padding: 3% 0;
|
||||
background-color: azure;
|
||||
}
|
||||
.main-pin > .pin-numb {
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
padding: 0 0px 3% 0px;
|
||||
}
|
||||
.main-pin > .pin-numb > .pin-numb-item {
|
||||
font-size: 30px;
|
||||
height: 14%;
|
||||
margin: 0 5px;
|
||||
padding-bottom: 2%;
|
||||
font-weight: 800;
|
||||
width: 30px;
|
||||
border-bottom-width: 2px;
|
||||
border-bottom-color: darkgray;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.main-pin > .input {
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
padding: 2%;
|
||||
}
|
||||
|
||||
.main-pin > .input > .numb {
|
||||
text-color: black;
|
||||
padding: 2%;
|
||||
flex-shrink: 0;
|
||||
margin: 0 5px;
|
||||
flex-basis: 72px;
|
||||
background-color: white;
|
||||
border: 1px;
|
||||
}
|
||||
|
||||
.join-auth {
|
||||
padding-top: 10%;
|
||||
}
|
||||
.join-auth-image > image {
|
||||
height: 50%;
|
||||
}
|
||||
.join-authorize {
|
||||
padding-top: 4%;
|
||||
}
|
||||
.join-pin {
|
||||
padding: 4% 0;
|
||||
}
|
||||
.join-pin > .pin {
|
||||
font-size: 50px;
|
||||
height: 31%;
|
||||
font-weight: bolder;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.join-auth > .title,
|
||||
.join-auth-image > .title,
|
||||
.join-authorize > .title {
|
||||
font-size: 18px;
|
||||
height: 28%;
|
||||
font-weight: 800;
|
||||
color: #000000;
|
||||
}
|
||||
.join-auth > .title {
|
||||
height: 14%;
|
||||
}
|
||||
.join-auth-image > .title {
|
||||
height: 9%;
|
||||
}
|
||||
.join-pin > .title {
|
||||
font-size: 28px;
|
||||
height: 20%;
|
||||
font-weight: 800;
|
||||
}
|
||||
.main-pin > .title {
|
||||
font-size: 30px;
|
||||
height: 14%;
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
.join-auth > .title-tip,
|
||||
.join-auth-image > .title-tip,
|
||||
.main-pin > .title-tip,
|
||||
.join-authorize > .title-tip {
|
||||
font-size: 15px;
|
||||
height: 14%;
|
||||
color: #5A5A5A;
|
||||
}
|
||||
.join-auth > .title-tip {
|
||||
height: 14%;
|
||||
}
|
||||
.join-auth-image > .title-tip {
|
||||
height: 8%;
|
||||
}
|
||||
.join-auth-image > .title-tip > image {
|
||||
width: 30px;
|
||||
height: 10%;
|
||||
margin: 5px 10px 0 0;
|
||||
}
|
||||
.join-pin > .title-tip {
|
||||
font-size: 20px;
|
||||
height: 17%;
|
||||
font-weight: 600;
|
||||
}
|
||||
.main-pin > .title-tip {
|
||||
font-size: 18px;
|
||||
height: 10%;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.join-auth > .dialog-foot,
|
||||
.join-auth-image > .dialog-foot,
|
||||
.join-authorize > .dialog-foot {
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
justify-content: space-around;
|
||||
margin: 28% 20px 10% 20px;
|
||||
}
|
||||
.join-authorize > .dialog-foot {
|
||||
margin: 35% 20px 10% 20px;
|
||||
}
|
||||
.join-auth-image > .dialog-foot {
|
||||
margin: 3% 20px;
|
||||
}
|
||||
.join-pin > .dialog-foot {
|
||||
margin: 3% 20px;
|
||||
}
|
||||
|
||||
.join-auth .button-cancel,
|
||||
.join-auth-image .button-cancel,
|
||||
.join-authorize .button-cancel {
|
||||
width: 160px;
|
||||
height: 12%;
|
||||
}
|
||||
.join-pin .button-cancel {
|
||||
width: 100%;
|
||||
font-size: 26px;
|
||||
height: 17%;
|
||||
}
|
||||
|
||||
.join-auth .button-ok,
|
||||
.join-auth-image .button-ok,
|
||||
.join-authorize .button-ok {
|
||||
width: 150px;
|
||||
height: 12%;
|
||||
}
|
||||
|
||||
/* css of wifi page*/
|
||||
.join-wifi-container,
|
||||
.main-wifi {
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.input-container {
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 50%;
|
||||
width: 100%;
|
||||
padding: 2% 15% 2% 15%;
|
||||
}
|
||||
|
||||
.keyboard-container {
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 50%;
|
||||
width: 100%;
|
||||
padding: 1%;
|
||||
}
|
||||
|
||||
.input-title {
|
||||
height: 15%;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.input-area {
|
||||
border: 1px solid darkgrey;
|
||||
border-radius: 5px;
|
||||
width: 100%;
|
||||
height: 25%;
|
||||
margin-top: 5%;
|
||||
}
|
||||
|
||||
.button-area {
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
height: 25%;
|
||||
margin-top: 5%;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.input-label {
|
||||
width: 20%;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.input-text {
|
||||
width: 60%;
|
||||
font-size: 14px;
|
||||
text-align: start;
|
||||
padding-start: 5%;
|
||||
max-lines: 1;
|
||||
}
|
||||
|
||||
.input-divider {
|
||||
color: darkgrey;
|
||||
}
|
||||
|
||||
.button-row {
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
height: 23%;
|
||||
width: 100%;
|
||||
margin: 1% 0;
|
||||
}
|
||||
|
||||
.wifi-button {
|
||||
height: 100%;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.keyboard-button {
|
||||
width: 9%;
|
||||
margin: 0 1%;
|
||||
height: 100%;
|
||||
border: 1px solid darkgrey;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.join-wifi-text {
|
||||
width: 80%;
|
||||
font-size: 16px;
|
||||
text-align: center;
|
||||
height: 33%;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
<!--
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<div class="container">
|
||||
<div if="{{status == 'main-pin'}}" class="main-pin">
|
||||
<text class="title">{{ $t('strings.pinCodeConnection') }}</text>
|
||||
<text class="title-tip">{{ $t('strings.enterThePinCode') }}</text>
|
||||
<div class="pin-numb" >
|
||||
<text class="pin-numb-item">{{pin[0]}}</text>
|
||||
<text class="pin-numb-item">{{pin[1]}}</text>
|
||||
<text class="pin-numb-item">{{pin[2]}}</text>
|
||||
<text class="pin-numb-item">{{pin[3]}}</text>
|
||||
<text class="pin-numb-item">{{pin[4]}}</text>
|
||||
<text class="pin-numb-item">{{pin[5]}}</text>
|
||||
</div>
|
||||
<div class="input" >
|
||||
<button @click="mainInputPin(1)" type="text" class="numb">1</button>
|
||||
<button @click="mainInputPin(2)" type="text" class="numb">2</button>
|
||||
<button @click="mainInputPin(3)" type="text" class="numb">3</button>
|
||||
<button @click="mainInputPin(4)" type="text" class="numb">4</button>
|
||||
</div>
|
||||
<div class="input" >
|
||||
<button @click="mainInputPin(5)" type="text" class="numb">5</button>
|
||||
<button @click="mainInputPin(6)" type="text" class="numb">6</button>
|
||||
<button @click="mainInputPin(7)" type="text" class="numb">7</button>
|
||||
<button @click="mainInputPin(8)" type="text" class="numb">8</button>
|
||||
</div>
|
||||
<div class="input" >
|
||||
<button @click="mainInputPin(9)" type="text" class="numb">9</button>
|
||||
<button @click="mainInputPin(0)" type="text" class="numb">0</button>
|
||||
<button @click="mainInputPinBack" type="text" class="numb">{{ $t('strings.delete') }}</button>
|
||||
<button @click="mainInputPinCancel" type="text" class="numb">{{ $t('strings.off') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
<div if="{{status == 'join-authorize'}}" class="join-authorize">
|
||||
<text class="title">{{statusInfo.deviceName}}{{ $t('strings.toConnectToThisComputer') }}</text>
|
||||
<text class="title-tip"> {{ $t( 'strings.resourceAccess' ) }}</text>
|
||||
<div class="dialog-foot">
|
||||
<button @click="joinAuthorizeCancel" type="text" class="button-cancel">
|
||||
{{ $t('strings.cancel') }}{{ $t('strings.parenthesesLeft') }}{{ timeRemaining }}{{ $t('strings.parenthesesRight') }}
|
||||
</button>
|
||||
<button @click="joinAuthorizeOk" class="button-ok" type="capsule">
|
||||
{{ $t('strings.allow') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div if="{{status == 'join-auth'}}" class="join-auth">
|
||||
<text class="title-tip">{{ statusInfo.appName }}</text>
|
||||
<text class="title">{{ $t('strings.applyAuth') }}</text>
|
||||
<text class="title-tip">{{ $t('strings.from') }}{{statusInfo.deviceName}}</text>
|
||||
<div class="dialog-foot">
|
||||
<button @click="joinAuthCancel" type="text" class="button-cancel">
|
||||
{{ $t('strings.cancel') }}{{ $t('strings.parenthesesLeft') }}{{ timeRemaining }}{{ $t('strings.parenthesesRight') }}
|
||||
</button>
|
||||
<button @click="joinAuthOk" class="button-ok" type="capsule">
|
||||
{{ $t('strings.allow') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div if="{{status == 'main-wifi'}}" class="main-wifi">
|
||||
<div class="input-container">
|
||||
<text class="input-title">请输入网络信息</text>
|
||||
<div class="input-area">
|
||||
<text class="input-label">SSID:</text>
|
||||
<divider class="input-divider" vertical="true"></divider>
|
||||
<text onclick="changeFocus(0)" style="background-color: {{currentSsidColor}};"
|
||||
class="input-text">{{wifiInfo.wifiSsid}}</text>
|
||||
</div>
|
||||
<div class="input-area">
|
||||
<text class="input-label">Key:</text>
|
||||
<divider class="input-divider" vertical="true"></divider>
|
||||
<text onclick="changeFocus(1)" style="background-color: {{currentKeyColor}};"
|
||||
class="input-text">{{wifiInfo.wifiPassword}}</text>
|
||||
</div>
|
||||
<div class="button-area">
|
||||
<button onclick="mainWifiCancel" class="wifi-button" type="capsule">取消</button>
|
||||
<button onclick="mainWifiConfirm" class="wifi-button" type="capsule">确认</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="keyboard-container">
|
||||
<div class="button-row" >
|
||||
<text for='{{ item in keyboardItem.line1 }}' onclick="inputChar({{ item }})" class="keyboard-button">{{ item }}</text>
|
||||
<text onclick="deleteChar" class="keyboard-button">Del</text>
|
||||
</div>
|
||||
<div class="button-row" >
|
||||
<text for='{{ item in keyboardItem.line2 }}' onclick="inputChar({{ item }})" class="keyboard-button">{{ item }}</text>
|
||||
<text onclick="changeCase" class="keyboard-button">Aa</text>
|
||||
</div>
|
||||
<div class="button-row" >
|
||||
<text for='{{ item in keyboardItem.line3 }}' onclick="inputChar({{ item }})" class="keyboard-button">{{ item }}</text>
|
||||
</div>
|
||||
<div class="button-row" >
|
||||
<text for='{{ item in keyboardItem.line4 }}' onclick="inputChar({{ item }})" class="keyboard-button">{{ item }}</text>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="join-wifi-container" if="{{status == 'join-wifi'}}">
|
||||
<text class="join-wifi-text">{{wifiInfo.wifiSsid}}</text>
|
||||
<text class="join-wifi-text" if="{{configureResult == 0}}">配网成功</text>
|
||||
<text class="join-wifi-text" if="{{configureResult == 1}}">配网失败</text>
|
||||
<button class="join-wifi-text" onclick="joinWifiCancel">关闭</button>
|
||||
</div>
|
||||
|
||||
<div if="{{status == 'join-auth-image'}}" class="join-auth-image">
|
||||
<image src="{{ statusInfo.appThumbnail }}"></image>
|
||||
<div class="title-tip">
|
||||
<image src="{{ statusInfo.appIcon }}"></image>
|
||||
<text>{{ statusInfo.appName }}</text>
|
||||
</div>
|
||||
<text class="title">{{ $t('strings.applyAuth') }}</text>
|
||||
<text class="title-tip">{{ $t('strings.from') }}{{statusInfo.deviceName}}</text>
|
||||
<div class="dialog-foot">
|
||||
<button @click="joinAuthImageCancel" type="text" class="button-cancel">
|
||||
{{ $t('strings.cancel') }}{{ $t('strings.parenthesesLeft') }}{{ timeRemaining }}{{ $t('strings.parenthesesRight') }}
|
||||
</button>
|
||||
<button @click="joinAuthImageOk" class="button-ok" type="capsule">
|
||||
{{ $t('strings.allow') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div if="{{status == 'join-pin'}}" class="join-pin">
|
||||
<text class="title">{{ $t('strings.pinCodeConnection') }}</text>
|
||||
<text class="title-tip">{{ $t('strings.enterDisplayPinCode') }}</text>
|
||||
<text class="pin">{{statusInfo.pinCode.split('').join(' ')}}</text>
|
||||
<div class="dialog-foot">
|
||||
<button @click="joinPinCancel" type="text" class="button-cancel">
|
||||
{{ $t('strings.cancel') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,523 @@
|
||||
/*
|
||||
* 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 router from '@system.router';
|
||||
import deviceManager from '@ohos.distributedHardware.deviceManager';
|
||||
function uint8ArrayToBase64(array) {
|
||||
array = new Uint8Array(array);
|
||||
let table = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
|
||||
,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2'
|
||||
,'3','4','5','6','7','8','9','+','/'],
|
||||
base64Str = '', length = array.byteLength, i = 0;
|
||||
for(i = 0; length - i >= 3; i += 3) {
|
||||
let num1 = array[i], num2 = array[i + 1], num3 = array[i + 2];
|
||||
base64Str += table[num1 >>> 2] + table[((num1 & 0b11) << 4) | (num2 >>> 4)] + table[((num2 & 0b1111) << 2) |
|
||||
(num3 >>> 6)] + table[num3 & 0b111111];
|
||||
}
|
||||
const lastByte = length - i;
|
||||
if(lastByte === 1) {
|
||||
const lastNum1 = array[i];
|
||||
base64Str += table[lastNum1 >>> 2] + table[((lastNum1 & 0b11) << 4)] + '==';
|
||||
} else if(lastByte === 2){
|
||||
const lastNum1 = array[i];
|
||||
const lastNum2 = array[i + 1];
|
||||
base64Str += table[lastNum1 >>> 2] + table[((lastNum1 & 0b11) << 4) | (lastNum2 >>> 4)] + table[(lastNum2 &
|
||||
0b1111) << 2] + '=';
|
||||
}
|
||||
return 'data:image/png;base64,' + base64Str;
|
||||
}
|
||||
const TAG = "DeviceManagerUI:";
|
||||
|
||||
const AUTH_TYPE_PIN = 1
|
||||
const AUTH_TYPE_WIFI = 2
|
||||
|
||||
const LOWER_CASE_KEYS = {
|
||||
line1 : ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
|
||||
line2 : ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'],
|
||||
line3 : [',', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '.'],
|
||||
line4 : [';', '*', 'z', 'x', 'c', 'v', 'b', 'n', 'm', '-', '_'],
|
||||
}
|
||||
const UPPER_CASE_KEYS = {
|
||||
line1 : ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
|
||||
line2 : ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'],
|
||||
line3 : [',', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '.'],
|
||||
line4 : [';', '*', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '-', '_'],
|
||||
}
|
||||
|
||||
const CURRENT_FOCUS_SSID = 0
|
||||
const CURRENT_FOCUS_KEY = 1
|
||||
|
||||
const USER_WIFI_CANCEL_CODE = 5
|
||||
|
||||
const ACTIVE_COLOR = '#fff'
|
||||
const INACTIVE_COLOR = '#ddd'
|
||||
|
||||
const WIFI_CONFIGURE_SUCCESS = 0
|
||||
const WIFI_CONFIGURE_FAILED = 1
|
||||
const WIFI_CONFIGURE_DOING = 2
|
||||
const WIFI_CONFIGURE_DEFAULT = -1
|
||||
|
||||
let dmClass;
|
||||
|
||||
export default {
|
||||
data: {
|
||||
// showType: ['main-pin','join-authorize','join-auth','join-auth-image','join-pin']
|
||||
status: "",
|
||||
// showInfo
|
||||
statusInfo: {
|
||||
deviceName: "AppName",
|
||||
appName: 'PackageName',
|
||||
appIcon: null,
|
||||
appThumbnail: null,
|
||||
pinCode: '',
|
||||
pinToken: ''
|
||||
},
|
||||
// join: join-authorize timing
|
||||
timeRemaining: 0,
|
||||
// input pinCode
|
||||
pin: ['','','','','',''],
|
||||
// input pinCode next number
|
||||
pinNumb: 0,
|
||||
wifiInfo: {
|
||||
wifiSsid: '',
|
||||
wifiPassword: ''
|
||||
},
|
||||
keyboardItem : LOWER_CASE_KEYS,
|
||||
isSSidFocus : false,
|
||||
isKeyFocus : false,
|
||||
currentSsidColor : INACTIVE_COLOR,
|
||||
currentKeyColor : INACTIVE_COLOR,
|
||||
configureResult : WIFI_CONFIGURE_DEFAULT
|
||||
},
|
||||
|
||||
log(m) {
|
||||
console.info(TAG + m);
|
||||
},
|
||||
|
||||
onDestroy() {
|
||||
this.log("onDestroy")
|
||||
if (dmClass != null) {
|
||||
dmClass.off('dmFaCallback');
|
||||
dmClass.off('deviceStateChange');
|
||||
dmClass.off('serviceDie');
|
||||
dmClass.release();
|
||||
dmClass = null
|
||||
}
|
||||
},
|
||||
|
||||
onShow() {
|
||||
if (dmClass) {
|
||||
this.log('deviceManager exist')
|
||||
this.initStatue()
|
||||
} else {
|
||||
this.log('createDeviceManager')
|
||||
deviceManager.createDeviceManager('com.ohos.devicemanagerui', (err, dm) => {
|
||||
this.log("createDeviceManager err:" + JSON.stringify(err) + ' --success:' + JSON.stringify(dm))
|
||||
if (err) return;
|
||||
dmClass = dm;
|
||||
dmClass.on('dmFaCallback', () => {
|
||||
this.log("dmFaCallback executed, dialog closed")
|
||||
router.back()
|
||||
})
|
||||
this.initStatue()
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onHide() {
|
||||
this.log('onHide')
|
||||
this.timeRemaining = 0
|
||||
},
|
||||
|
||||
/**
|
||||
* Get authentication param
|
||||
*/
|
||||
initStatue() {
|
||||
this.log('initStatue')
|
||||
const data = dmClass.getFaParam();
|
||||
this.log('getFaParam:' + JSON.stringify(data))
|
||||
// const data = dmClas icationParam:' + JSON.stringify(data))
|
||||
// Authentication type, 1 for pin code.
|
||||
if(data&&!data.FaType){
|
||||
return;
|
||||
}
|
||||
if (data && data.FaType == 1) {
|
||||
this.log('initStatue:data.FaType == 1' )
|
||||
let authParam = data.authParam
|
||||
this.log('initStatue authParam: ' +authParam )
|
||||
this.statusInfo = {
|
||||
deviceName: authParam.extraInfo.PackageName,
|
||||
appName: authParam.extraInfo.appName,
|
||||
appIcon: uint8ArrayToBase64(authParam.appIcon),
|
||||
appThumbnail: uint8ArrayToBase64(authParam.appThumbnail),
|
||||
pinCode: authParam.extraInfo.pinCode + '',
|
||||
pinToken: authParam.extraInfo.pinToken
|
||||
}
|
||||
this.log('initStatue statusInfo: ' +this.statusInfo )
|
||||
// direction: 1(main)/0(join)
|
||||
if (authParam.extraInfo.direction == 1) {
|
||||
this.log('initStatue statusInfo: authParam.extraInfo.direction == 1')
|
||||
this.mainPin()
|
||||
} else if (authParam.appIcon) {
|
||||
this.log('initStatue statusInfo:authParam.appIcon == 1')
|
||||
this.joinAuthImage()
|
||||
} else if (authParam.extraInfo.business == 0) {
|
||||
// business: 0(FA流转)/1(资源访问)
|
||||
this.log('initStatue statusInfo:authParam.extraInfo.business == 0')
|
||||
this.joinAuth()
|
||||
} else {
|
||||
this.log('initStatue join')
|
||||
this.joinAuthorize()
|
||||
}
|
||||
}
|
||||
this.log('initStatue wifi start')
|
||||
if (data && data.FaType == AUTH_TYPE_WIFI && data.ConWifiParam == WIFI_CONFIGURE_DOING) {
|
||||
this.log("show main wifi page")
|
||||
this.mainWifi()
|
||||
}
|
||||
|
||||
if (data && data.FaType == AUTH_TYPE_WIFI && data.ConWifiParam != WIFI_CONFIGURE_DOING) {
|
||||
this.log("show join wifi page")
|
||||
let wifiParam = data.conWifiParam
|
||||
this.wifiInfo.wifiSsid = wifiParam.wifiSsid;
|
||||
this.configureResult = wifiParam.configureResult
|
||||
this.joinWifi()
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set user Operation from devicemanager Fa, this interface can only used by devicemanager Fa.
|
||||
*
|
||||
* @param operateAction User Operation Actions.
|
||||
* ACTION_ALLOW_AUTH = 0, allow authentication
|
||||
* ACTION_CANCEL_AUTH = 1, cancel authentication
|
||||
* ACTION_AUTH_CONFIRM_TIMEOUT = 2, user operation timeout for authentication confirm
|
||||
* ACTION_CANCEL_PINCODE_DISPLAY = 3, cancel pinCode display
|
||||
* ACTION_CANCEL_PINCODE_INPUT = 4, cancel pinCode input
|
||||
*/
|
||||
setUserOperation(operation) {
|
||||
this.log('setUserOperation: ' + operation)
|
||||
if (dmClass != null) {
|
||||
var data = dmClass.setUserOperation(operation);
|
||||
this.log('setUserOperation result: ' + JSON.stringify(data))
|
||||
} else {
|
||||
this.log('deviceManagerObject not exit')
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* verify auth info, such as pin code.
|
||||
* @param pinCode
|
||||
* @return
|
||||
*/
|
||||
verifyAuthInfo(pinCode) {
|
||||
this.log('verifyAuthInfo: ' + pinCode)
|
||||
if (dmClass != null) {
|
||||
dmClass.verifyAuthInfo({
|
||||
"authType": 1,
|
||||
"token": this.statusInfo.pinToken,
|
||||
"extraInfo": {
|
||||
"pinCode": +pinCode
|
||||
}
|
||||
}, (err, data) => {
|
||||
if (err) {
|
||||
this.log("verifyAuthInfo err:" + JSON.stringify(err))
|
||||
}
|
||||
this.log("verifyAuthInfo result:" + JSON.stringify(data))
|
||||
router.back()
|
||||
});
|
||||
} else {
|
||||
this.log('deviceManagerObject not exit')
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Input pinCode at the main control terminal
|
||||
*/
|
||||
mainPin() {
|
||||
this.status = 'main-pin'
|
||||
this.log("mainPin")
|
||||
},
|
||||
|
||||
/**
|
||||
* Enter a number with the keyboard
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
mainInputPin(s) {
|
||||
this.log('mainInputPin input: ' + s + '-' + this.pin)
|
||||
if (this.pinNumb == 6) return
|
||||
if (this.pinNumb < 6) {
|
||||
this.pin[this.pinNumb] =
|
||||
++this.pinNumb
|
||||
this.pin = [...this.pin]
|
||||
}
|
||||
this.log('mainInputPin pin: ' + this.pin + '-' + this.pin.join(''))
|
||||
if (this.pinNumb == 6) {
|
||||
// input end
|
||||
this.log('mainInputPin end: ' + this.pin + '-' + this.pin.join(''))
|
||||
this.verifyAuthInfo(this.pin.join(''))
|
||||
router.back()
|
||||
}
|
||||
this.log("mainInputPin")
|
||||
},
|
||||
|
||||
/**
|
||||
* Keyboard delete number
|
||||
*/
|
||||
mainInputPinBack() {
|
||||
if (this.pinNumb > 0) {
|
||||
--this.pinNumb
|
||||
this.pin[this.pinNumb] = ''
|
||||
this.pin = [...this.pin]
|
||||
}
|
||||
this.log("mainInputPinBack")
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel pinCode input
|
||||
*/
|
||||
mainInputPinCancel() {
|
||||
this.setUserOperation(4)
|
||||
router.back()
|
||||
this.log("mainInputPinCancel")
|
||||
},
|
||||
|
||||
/**
|
||||
* Main end wifiInfo input Page display
|
||||
*/
|
||||
mainWifi() {
|
||||
this.status = 'main-wifi'
|
||||
this.log(" this.status = 'main-wifi'")
|
||||
},
|
||||
|
||||
/**
|
||||
* Join end presents wifi configure result
|
||||
*/
|
||||
joinWifi() {
|
||||
this.status = 'join-wifi'
|
||||
this.log(" this.status = 'join-wifi'")
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel current operation
|
||||
*/
|
||||
mainWifiCancel() {
|
||||
this.log(' mainWifiCancel')
|
||||
this.setUserOperation(USER_WIFI_CANCEL_CODE)
|
||||
router.back()
|
||||
},
|
||||
|
||||
/**
|
||||
* main end wifi ssid and pwd confirm
|
||||
*/
|
||||
mainWifiConfirm() {
|
||||
this.log(' mainWifiConfirm')
|
||||
dmClass.configureWifiInfo(this.wifiInfo, (err, data) => {
|
||||
this.log('configureWifiInfo callback err = ' + err)
|
||||
this.log('mainWifiConfirm + wifiSsid = ' + this.wifiInfo.wifiSsid)
|
||||
})
|
||||
router.back();
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel result dialog
|
||||
*/
|
||||
joinWifiCancel() {
|
||||
this.log("joinWifiCancel")
|
||||
router.back()
|
||||
},
|
||||
|
||||
/**
|
||||
* Join end authorization, business(FA流转)/1(资源访问): 0
|
||||
*/
|
||||
joinAuthorize() {
|
||||
this.status = 'join-authorize'
|
||||
this.timing(60, 'join-authorize', () => {
|
||||
this.setUserOperation(2)
|
||||
router.back()
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* Join end authorization, business(FA流转)/1(资源访问): 1
|
||||
*/
|
||||
joinAuth() {
|
||||
this.log("joinAuth")
|
||||
this.status = 'join-auth'
|
||||
this.timing(60, 'join-auth', () => {
|
||||
this.setUserOperation(2)
|
||||
router.back()
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* Join end authorization, business(FA流转)/1(资源访问): 1, show application icon
|
||||
*/
|
||||
joinAuthImage() {
|
||||
this.log("joinAuthImage")
|
||||
this.status = 'join-auth-image'
|
||||
this.timing(60, 'join-auth-image', () => {
|
||||
this.setUserOperation(2)
|
||||
router.back()
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* Display pinCode at join end
|
||||
*/
|
||||
joinPin() {
|
||||
this.status = 'join-pin'
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel authorization
|
||||
*/
|
||||
joinAuthorizeCancel() {
|
||||
this.setUserOperation(1)
|
||||
router.back()
|
||||
},
|
||||
|
||||
/**
|
||||
* Confirm authorization
|
||||
*/
|
||||
joinAuthorizeOk() {
|
||||
this.setUserOperation(0)
|
||||
this.joinPin()
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel authorization
|
||||
*/
|
||||
joinAuthCancel() {
|
||||
this.setUserOperation(1)
|
||||
router.back()
|
||||
},
|
||||
|
||||
/**
|
||||
* Confirm authorization
|
||||
*/
|
||||
joinAuthOk() {
|
||||
this.setUserOperation(0)
|
||||
this.joinPin()
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel authorization
|
||||
*/
|
||||
joinAuthImageCancel() {
|
||||
this.setUserOperation(1)
|
||||
router.back()
|
||||
},
|
||||
|
||||
/**
|
||||
* Confirm authorization
|
||||
*/
|
||||
joinAuthImageOk() {
|
||||
this.setUserOperation(0)
|
||||
this.joinPin()
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel authorization
|
||||
*/
|
||||
joinPinCancel() {
|
||||
this.setUserOperation(3)
|
||||
router.back()
|
||||
},
|
||||
|
||||
/**
|
||||
* Pure function countdown
|
||||
* @param numb second
|
||||
* @param status
|
||||
* @param callback
|
||||
* @return
|
||||
*/
|
||||
timing(numb, status, callback) {
|
||||
this.log("timing")
|
||||
this.timeRemaining = numb
|
||||
const next = () => {
|
||||
if (status != this.status) return
|
||||
--this.timeRemaining
|
||||
if (this.timeRemaining > 0) {
|
||||
setTimeout(next, 1000)
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
next()
|
||||
},
|
||||
|
||||
/**
|
||||
* Change keyboard focus in wifi page
|
||||
* @param currentArea - area that user clicked
|
||||
*/
|
||||
changeFocus(currentArea) {
|
||||
this.log("changeFocus" )
|
||||
if (currentArea == CURRENT_FOCUS_SSID) {
|
||||
this.isSSidFocus = true
|
||||
this.currentSsidColor = ACTIVE_COLOR
|
||||
|
||||
this.isKeyFocus = false
|
||||
this.currentKeyColor = INACTIVE_COLOR
|
||||
}
|
||||
if (currentArea == CURRENT_FOCUS_KEY) {
|
||||
this.isSSidFocus = false
|
||||
this.currentSsidColor = INACTIVE_COLOR
|
||||
|
||||
this.isKeyFocus = true
|
||||
this.currentKeyColor = ACTIVE_COLOR
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Change input case to upper case or lower case
|
||||
*/
|
||||
changeCase() {
|
||||
this.log("changeCase" )
|
||||
if (this.keyboardItem == LOWER_CASE_KEYS) {
|
||||
this.keyboardItem = UPPER_CASE_KEYS;
|
||||
} else {
|
||||
this.keyboardItem = LOWER_CASE_KEYS;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Add char to the selected input area
|
||||
* @param itemChar - the char in the button that user clicked
|
||||
*/
|
||||
inputChar(itemChar) {
|
||||
this.log("inputChar :"+itemChar)
|
||||
if (this.isSSidFocus == true) {
|
||||
this.ssidString = this.ssidString + itemChar
|
||||
}
|
||||
if (this.isKeyFocus == true) {
|
||||
this.keyString = this.keyString + itemChar
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove the first char of the selected input area
|
||||
*/
|
||||
deleteChar() {
|
||||
this.log("deleteChar")
|
||||
if (this.isSSidFocus == true && this.ssidString.length > 0) {
|
||||
this.ssidString = this.ssidString.substring(0, this.ssidString.length - 1)
|
||||
}
|
||||
if (this.isKeyFocus == true && this.keyString.length > 0) {
|
||||
this.keyString = this.keyString.substring(0, this.keyString.length - 1)
|
||||
}
|
||||
},
|
||||
}
|
||||
@@ -2,10 +2,10 @@
|
||||
"string": [
|
||||
{
|
||||
"name": "entry_MainAbility",
|
||||
"value": "entry_MainAbility"
|
||||
"value": "DeviceManagerUI"
|
||||
},
|
||||
{
|
||||
"name": "mainability_description",
|
||||
"name": "description_mainability",
|
||||
"value": "JS_Empty Ability"
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user