From 6ca45d6806e3a0923f9f8dfb5af936d76e8234a8 Mon Sep 17 00:00:00 2001 From: guojin26 Date: Tue, 25 Jan 2022 16:46:36 +0800 Subject: [PATCH 1/4] add sTSDeviceManager Signed-off-by: guojin26 --- device/eTSDeviceManager/README_zh.md | 19 ++ device/eTSDeviceManager/build.gradle | 34 +++ device/eTSDeviceManager/entry/build.gradle | 21 ++ .../entry/src/main/config.json | 67 ++++++ .../entry/src/main/ets/MainAbility/app.ets | 23 ++ .../ets/MainAbility/components/deviceView.ets | 60 +++++ .../ets/MainAbility/model/deviceDataModel.ets | 28 +++ .../MainAbility/model/deviceStateAction.ets | 36 +++ .../MainAbility/model/remoteDeviceModel.ets | 213 ++++++++++++++++++ .../src/main/ets/MainAbility/pages/index.ets | 95 ++++++++ .../main/resources/base/element/string.json | 28 +++ .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../src/main/resources/en/element/string.json | 28 +++ .../src/main/resources/zh/element/string.json | 28 +++ .../screenshots/device/main.png | Bin 0 -> 46178 bytes device/eTSDeviceManager/settings.gradle | 1 + 16 files changed, 681 insertions(+) create mode 100644 device/eTSDeviceManager/README_zh.md create mode 100644 device/eTSDeviceManager/build.gradle create mode 100644 device/eTSDeviceManager/entry/build.gradle create mode 100644 device/eTSDeviceManager/entry/src/main/config.json create mode 100644 device/eTSDeviceManager/entry/src/main/ets/MainAbility/app.ets create mode 100644 device/eTSDeviceManager/entry/src/main/ets/MainAbility/components/deviceView.ets create mode 100644 device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceDataModel.ets create mode 100644 device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceStateAction.ets create mode 100644 device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets create mode 100644 device/eTSDeviceManager/entry/src/main/ets/MainAbility/pages/index.ets create mode 100644 device/eTSDeviceManager/entry/src/main/resources/base/element/string.json create mode 100644 device/eTSDeviceManager/entry/src/main/resources/base/media/icon.png create mode 100644 device/eTSDeviceManager/entry/src/main/resources/en/element/string.json create mode 100644 device/eTSDeviceManager/entry/src/main/resources/zh/element/string.json create mode 100644 device/eTSDeviceManager/screenshots/device/main.png create mode 100644 device/eTSDeviceManager/settings.gradle diff --git a/device/eTSDeviceManager/README_zh.md b/device/eTSDeviceManager/README_zh.md new file mode 100644 index 0000000000..aaa3442ff1 --- /dev/null +++ b/device/eTSDeviceManager/README_zh.md @@ -0,0 +1,19 @@ +# 设备管理-DeviceManager接口 + + + +### 简介 + +本示例展示了在eTS中DeviceManager接口的使用,包括获取授信设备列表,设备扫描,设备认证,设备状态订阅。 + +### 使用说明 + +1、进入应用会自动获取授信设备列表显示在设备列表中,状态显示为"online",并开始设备扫描发现设备,发现设备后会显示在设备列表中,状态显示为"need authenticate"。 + +2、设备状态订阅会监听组网状态变化从而刷新界面。 + +### 约束与限制 + +1、本示例需要组网测试。 + +2、本示例仅支持标准系统上运行。 diff --git a/device/eTSDeviceManager/build.gradle b/device/eTSDeviceManager/build.gradle new file mode 100644 index 0000000000..f1b1a556a0 --- /dev/null +++ b/device/eTSDeviceManager/build.gradle @@ -0,0 +1,34 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' + +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 8 + supportSystem "standard" +} + +buildscript { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } + dependencies { + classpath 'com.huawei.ohos:hap:3.0.5.2' + classpath 'com.huawei.ohos:decctest:1.2.7.2' + } +} + +allprojects { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } +} diff --git a/device/eTSDeviceManager/entry/build.gradle b/device/eTSDeviceManager/entry/build.gradle new file mode 100644 index 0000000000..cef7b37de8 --- /dev/null +++ b/device/eTSDeviceManager/entry/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.huawei.ohos.hap' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 8 + defaultConfig { + compatibleSdkVersion 7 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testImplementation 'junit:junit:4.13.1' +} diff --git a/device/eTSDeviceManager/entry/src/main/config.json b/device/eTSDeviceManager/entry/src/main/config.json new file mode 100644 index 0000000000..fd977cb306 --- /dev/null +++ b/device/eTSDeviceManager/entry/src/main/config.json @@ -0,0 +1,67 @@ +{ + "app": { + "bundleName": "ohos.samples.etsdevicemanager", + "vendor": "samples", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "ohos.samples.etsdevicemanager", + "name": ".MyApplication", + "mainAbility": ".MainAbility", + "srcPath": "", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry", + "installationFree": false + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "visible": true, + "srcPath": "MainAbility", + "name": ".MainAbility", + "srcLanguage": "ets", + "icon": "$media:icon", + "description": "$string:description_mainability", + "formsEnabled": false, + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": ".MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/app.ets b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 0000000000..58946d00c6 --- /dev/null +++ b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2020 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') + }, +} \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/components/deviceView.ets b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/components/deviceView.ets new file mode 100644 index 0000000000..6e911653c1 --- /dev/null +++ b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/components/deviceView.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 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 { DeviceDataModel } from '../model/deviceDataModel' + +@Component +export struct DeviceView { + private device: DeviceDataModel = null + + build() { + Column() { + Row() { + Text($r('app.string.device_name')) + .fontColor(Color.Black) + .fontSize(20) + .width(130) + Text(this.device.deviceName) + .fontColor(Color.Black) + .fontSize(20) + .layoutWeight(1) + }.width('100%') + + Row() { + Text($r('app.string.device_id')) + .fontColor(Color.Black) + .fontSize(20) + .width(130) + Text(this.device.deviceId) + .fontColor(Color.Black) + .fontSize(20) + .layoutWeight(1) + }.width('100%') + + Row() { + Text($r('app.string.device_state')) + .fontColor(Color.Black) + .fontSize(20) + .width(130) + Text(this.device.state) + .fontColor(Color.Black) + .fontSize(20) + .layoutWeight(1) + } + .width('100%') + } + .padding(10) + } +} \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceDataModel.ets b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceDataModel.ets new file mode 100644 index 0000000000..403bff8cb2 --- /dev/null +++ b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceDataModel.ets @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 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 class DeviceDataModel { + deviceId: string + deviceName: string + deviceType: number + state: string + + constructor(deviceId: string, deviceName: string, deviceType: number, state: string) { + this.deviceId = deviceId + this.deviceName = deviceName + this.deviceType = deviceType + this.state = state + } +} \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceStateAction.ets b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceStateAction.ets new file mode 100644 index 0000000000..eac8f0f3c0 --- /dev/null +++ b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceStateAction.ets @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 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 enum DeviceStateChangeAction { + /** + * device online action + */ + ONLINE = 0, + + /** + * device ready action, the device information synchronization was completed. + */ + READY = 1, + + /** + * device offline action + */ + OFFLINE = 2, + + /** + * device change action + */ + CHANGE = 3 +} \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets new file mode 100644 index 0000000000..de362deb57 --- /dev/null +++ b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2020 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 deviceManager from '@ohos.distributedHardware.deviceManager' +import { DeviceStateChangeAction } from '../model/deviceStateAction' + +var SUBSCRIBE_ID = 100 + +export class RemoteDeviceModel { + deviceList = [] + discoverList = [] + callback + authCallback + deviceManager + + constructor() { + } + + registerDeviceListCallback(callback) { + if (typeof (this.deviceManager) != 'undefined') { + this.registerDeviceListCallbackImplement(callback) + return + } + console.log('[DeviceMnager.RemoteDeviceModel] deviceManager.createDeviceManager begin') + let self = this + deviceManager.createDeviceManager('ohos.samples.etsdevicemanager', (error, value) => { + if (error) { + console.error('[DeviceMnager.RemoteDeviceModel] createDeviceManager failed.') + return; + } + self.deviceManager = value + self.registerDeviceListCallbackImplement(callback) + console.log('[DeviceMnager.RemoteDeviceModel] createDeviceManager callback returned, error=' + error + ' value=' + value) + }); + console.log('[DeviceMnager.RemoteDeviceModel] deviceManager.createDeviceManager end') + } + + deviceStateChangeActionOnline(device) { + this.deviceList[this.deviceList.length] = device + console.info('[DeviceMnager.RemoteDeviceModel] online, device list=' + JSON.stringify(this.deviceList)) + if (this.authCallback != null) { + this.authCallback() + this.authCallback = null + } + this.callback() + } + + deviceStateChangeActionOffline(device) { + console.info('[DeviceMnager.RemoteDeviceModel] offline, this.deviceList.length=' + this.deviceList.length) + let list = [] + for (let i = 0; i < this.deviceList.length; i++) { + if (this.deviceList[i].deviceId !== device.deviceId) { + list.push(device) + } + } + this.deviceList = list + console.info('[DeviceMnager.RemoteDeviceModel] offline, device list=' + JSON.stringify(this.deviceList)) + this.callback() + } + + deviceStateChangeActionReady(device) { + if (this.deviceList.length <= 0) { + this.deviceList[this.deviceList.length] = device + this.callback() + return + } + for (let j = 0; j < this.deviceList.length; j++) { + if (this.deviceList[j].deviceId === device.deviceId) { + this.deviceList[j] = device + break + } + } + console.info('[DeviceMnager.RemoteDeviceModel] ready, device list=' + JSON.stringify(this.deviceList)) + this.callback() + } + + registerDeviceListCallbackImplement(callback) { + console.info('[DeviceMnager.RemoteDeviceModel] registerDeviceListCallback') + this.callback = callback + if (this.deviceManager === undefined) { + console.error('[DeviceMnager.RemoteDeviceModel] deviceManager has not initialized') + this.callback() + return + } + console.info('[DeviceMnager.RemoteDeviceModel] getTrustedDeviceListSync begin') + let list = this.deviceManager.getTrustedDeviceListSync() + console.info('[DeviceMnager.RemoteDeviceModel] getTrustedDeviceListSync end, deviceList=' + JSON.stringify(list)) + if (typeof (list) != 'undefined' && typeof (list.length) != 'undefined') { + this.deviceList = list + } + this.callback() + console.info('[DeviceMnager.RemoteDeviceModel] callback finished'); + let self = this; + this.deviceManager.on('deviceStateChange', (data) => { + if (data == null) { + return + } + console.info('[DeviceMnager.RemoteDeviceModel] deviceStateChange data=' + JSON.stringify(data)) + switch (data.action) { + case DeviceStateChangeAction.ONLINE: + console.info('[DeviceMnager.RemoteDeviceModel] deviceStateChange ONLINE'); + self.deviceStateChangeActionOnline(data.device) + break; + case DeviceStateChangeAction.READY: + console.info('[DeviceMnager.RemoteDeviceModel] deviceStateChange READY'); + self.deviceStateChangeActionReady(data.device) + break; + case DeviceStateChangeAction.OFFLINE: + console.info('[DeviceMnager.RemoteDeviceModel] deviceStateChange OFFLINE'); + self.deviceStateChangeActionOffline(data.device) + break + case DeviceStateChangeAction.CHANGE: + break + default: + break + } + }); + this.deviceManager.on('deviceFound', (data) => { + if (data == null) { + return + } + console.info('[DeviceMnager.RemoteDeviceModel] deviceFound data=' + JSON.stringify(data)) + self.deviceFound(data) + }); + this.deviceManager.on('discoverFail', (data) => { + console.info('[DeviceMnager.RemoteDeviceModel] discoverFail data=' + JSON.stringify(data)) + }); + this.deviceManager.on('serviceDie', () => { + console.error('[DeviceMnager.RemoteDeviceModel] serviceDie') + }); + this.startDeviceDiscovery() + } + + deviceFound(data) { + for (var i = 0;i < this.discoverList.length; i++) { + if (this.discoverList[i].deviceId == data.device.deviceId) { + console.info('[DeviceMnager.RemoteDeviceModel] device founded ignored') + return + } + } + this.discoverList[this.discoverList.length] = data.device + console.info('[DeviceMnager.RemoteDeviceModel] deviceFound self.discoverList=' + this.discoverList) + this.callback(); + } + + startDeviceDiscovery() { + SUBSCRIBE_ID = Math.floor(65536 * Math.random()) + var info = { + subscribeId: SUBSCRIBE_ID, + mode: 0xAA, + medium: 2, + freq: 2, + isSameAccount: false, + isWakeRemote: true, + capability: 0 + }; + console.info('[DeviceMnager.RemoteDeviceModel] startDeviceDiscovery ' + SUBSCRIBE_ID) + this.deviceManager.startDeviceDiscovery(info) + } + + unregisterDeviceListCallback() { + console.info('[DeviceMnager.RemoteDeviceModel] stopDeviceDiscovery ' + SUBSCRIBE_ID) + this.deviceManager.stopDeviceDiscovery(SUBSCRIBE_ID); + this.deviceManager.off('deviceStateChange') + this.deviceManager.off('deviceFound') + this.deviceManager.off('discoverFail') + this.deviceManager.off('serviceDie') + this.deviceList = [] + this.discoverList = [] + } + + authenticateDevice(device, callBack) { + console.info('[DeviceMnager.RemoteDeviceModel] authenticateDevice ' + JSON.stringify(device)); + for (let i = 0; i < this.discoverList.length; i++) { + if (this.discoverList[i].deviceId != device.deviceId) { + continue + } + let extraInfo = { + 'targetPkgName': 'ohos.samples.etsdevicemanager', + 'appName': 'eTSDeviceManger', + 'appDescription': 'eTSDeviceManger Ability', + 'business': '0' + } + let authParam = { + 'authType': 1, + 'appIcon': '', + 'appThumbnail': '', + 'extraInfo': extraInfo + } + this.deviceManager.authenticateDevice(device, authParam, (err, data) => { + if (err) { + console.info('[DeviceMnager.RemoteDeviceModel] authenticateDevice error:' + JSON.stringify(err)) + this.authCallback = null + return + } + console.info('[DeviceMnager.RemoteDeviceModel] authenticateDevice succeed:' + JSON.stringify(data)) + this.authCallback = callBack + }) + } + } +} \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/pages/index.ets b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 0000000000..623776426b --- /dev/null +++ b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2020 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 { DeviceView } from '../components/deviceView' +import { RemoteDeviceModel } from '../model/remoteDeviceModel' +import { DeviceDataModel } from '../model/deviceDataModel' + +@Entry +@Component +struct Index { + @State deviceList: Array = [] + private remoteDeviceModel: RemoteDeviceModel = new RemoteDeviceModel() + + refreshDevice() { + let self = this + this.remoteDeviceModel.registerDeviceListCallback(() => { + console.info('[DeviceMnager.IndexPage] registerDeviceListCallback, callback entered') + self.deviceList = [] + let deviceTempList = self.remoteDeviceModel.discoverList + for (var i = 0; i < deviceTempList.length; i++) { + console.info('[DeviceMnager.IndexPage] discoverList device ' + i + '/' + deviceTempList.length + + ' deviceId=' + deviceTempList[i].deviceId + ' deviceName=' + deviceTempList[i].deviceName + + ' deviceType=' + deviceTempList[i].deviceType) + self.deviceList.push({ + deviceId: deviceTempList[i].deviceId, + deviceName: deviceTempList[i].deviceName, + deviceType: deviceTempList[i].deviceType, + state: 'discover' + }) + } + deviceTempList = self.remoteDeviceModel.deviceList + for (var i = 0; i < deviceTempList.length; i++) { + console.info('[DeviceMnager.IndexPage] deviceList device ' + i + '/' + deviceTempList.length + + ' deviceId=' + deviceTempList[i].deviceId + ' deviceName=' + deviceTempList[i].deviceName + + ' deviceType=' + deviceTempList[i].deviceType) + self.deviceList.push({ + deviceId: deviceTempList[i].deviceId, + deviceName: deviceTempList[i].deviceName, + deviceType: deviceTempList[i].deviceType, + state: 'online' + }) + } + }) + } + + aboutToAppear() { + this.refreshDevice() + } + + build() { + Column() { + Row() { + Text($r("app.string.app_name")) + .fontColor(Color.White) + .fontSize(20) + } + .width('100%').height(50) + .padding({ left: 15 }) + .backgroundColor('#0D9FFB') + + List() { + ForEach(this.deviceList, (item, index) => { + ListItem() { + DeviceView({ device: item }) + } + .onClick(() => { + let self = this + if (item.state === 'discover') { + this.remoteDeviceModel.authenticateDevice(item, () => { + console.log('[DeviceMnager.IndexPage] auth and online finished') + self.deviceList[index].state = 'online' + }) + } + }) + }, item => JSON.stringify(item)) + } + .width('100%') + .layoutWeight(1) + .divider({ strokeWidth: 1, color: Color.Gray, startMargin: 10, endMargin: 10 }) + } + .width('100%').height('100%') + } +} \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/resources/base/element/string.json b/device/eTSDeviceManager/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000..bb97964d97 --- /dev/null +++ b/device/eTSDeviceManager/entry/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "app_name", + "value": "eTSDeviceManger" + }, + { + "name": "description_mainability", + "value": "eTSDeviceManger Ability" + }, + { + "name": "refresh_device_list", + "value": "Refresh device list" + }, + { + "name": "device_name", + "value": "Device name:" + }, + { + "name": "device_id", + "value": "Device id:" + }, + { + "name": "device_state", + "value": "State:" + } + ] +} \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/resources/base/media/icon.png b/device/eTSDeviceManager/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 TorQGp3OtCvWz^;2 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 literal 0 HcmV?d00001 diff --git a/device/eTSDeviceManager/settings.gradle b/device/eTSDeviceManager/settings.gradle new file mode 100644 index 0000000000..4773db7323 --- /dev/null +++ b/device/eTSDeviceManager/settings.gradle @@ -0,0 +1 @@ +include ':entry' -- Gitee From 5ec13fadf88f26b3668eeb0ba97593c3c63dc62f Mon Sep 17 00:00:00 2001 From: guojin26 Date: Tue, 25 Jan 2022 16:56:29 +0800 Subject: [PATCH 2/4] update readme Signed-off-by: guojin26 --- device/eTSDeviceManager/README_zh.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/device/eTSDeviceManager/README_zh.md b/device/eTSDeviceManager/README_zh.md index aaa3442ff1..e4738b23fc 100644 --- a/device/eTSDeviceManager/README_zh.md +++ b/device/eTSDeviceManager/README_zh.md @@ -8,9 +8,11 @@ ### 使用说明 -1、进入应用会自动获取授信设备列表显示在设备列表中,状态显示为"online",并开始设备扫描发现设备,发现设备后会显示在设备列表中,状态显示为"need authenticate"。 +1、进入应用会自动获取授信设备列表显示在设备列表中,状态显示为"online",并开始设备扫描发现设备,发现设备后会显示在设备列表中,状态显示为"discover"。 -2、设备状态订阅会监听组网状态变化从而刷新界面。 +2、点击状态为discover的设备,会触发认证,认证完成会刷新界面。 + +3、设备状态订阅会监听组网状态变化从而刷新界面。 ### 约束与限制 -- Gitee From ef71a53eb65654432022cf94d283ea1a5561635d Mon Sep 17 00:00:00 2001 From: guojin26 Date: Tue, 25 Jan 2022 17:03:42 +0800 Subject: [PATCH 3/4] update Signed-off-by: guojin26 --- device/eTSDeviceManager/README_zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/eTSDeviceManager/README_zh.md b/device/eTSDeviceManager/README_zh.md index e4738b23fc..7b6ed4584e 100644 --- a/device/eTSDeviceManager/README_zh.md +++ b/device/eTSDeviceManager/README_zh.md @@ -10,7 +10,7 @@ 1、进入应用会自动获取授信设备列表显示在设备列表中,状态显示为"online",并开始设备扫描发现设备,发现设备后会显示在设备列表中,状态显示为"discover"。 -2、点击状态为discover的设备,会触发认证,认证完成会刷新界面。 +2、点击状态为"discover"的设备,会触发认证,认证完成会刷新界面。 3、设备状态订阅会监听组网状态变化从而刷新界面。 -- Gitee From 26f05f9f1b9b057927530e8dc6e443322fc7b36a Mon Sep 17 00:00:00 2001 From: guojin26 Date: Tue, 25 Jan 2022 17:36:22 +0800 Subject: [PATCH 4/4] update Signed-off-by: guojin26 --- .../ets/MainAbility/model/deviceStateAction.ets | 16 ++++++++-------- .../ets/MainAbility/model/remoteDeviceModel.ets | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceStateAction.ets b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceStateAction.ets index eac8f0f3c0..8aa0b75a67 100644 --- a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceStateAction.ets +++ b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/deviceStateAction.ets @@ -15,22 +15,22 @@ export enum DeviceStateChangeAction { /** - * device online action - */ + * device online action + */ ONLINE = 0, /** - * device ready action, the device information synchronization was completed. - */ + * device ready action, the device information synchronization was completed. + */ READY = 1, /** - * device offline action - */ + * device offline action + */ OFFLINE = 2, /** - * device change action - */ + * device change action + */ CHANGE = 3 } \ No newline at end of file diff --git a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets index de362deb57..984ca301af 100644 --- a/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets +++ b/device/eTSDeviceManager/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets @@ -16,7 +16,7 @@ import deviceManager from '@ohos.distributedHardware.deviceManager' import { DeviceStateChangeAction } from '../model/deviceStateAction' -var SUBSCRIBE_ID = 100 +let SUBSCRIBE_ID = 100 export class RemoteDeviceModel { deviceList = [] -- Gitee