From 0202fc13acd2c86a8ba59132c0bdbfeba53cb9bc Mon Sep 17 00:00:00 2001 From: guojin26 Date: Tue, 30 Nov 2021 10:16:06 +0800 Subject: [PATCH 1/8] add kvstore Signed-off-by: guojin26 --- data/eTSKvStore/README_zh.md | 23 +++ data/eTSKvStore/build.gradle | 34 ++++ data/eTSKvStore/entry/build.gradle | 21 ++ data/eTSKvStore/entry/src/main/config.json | 66 +++++++ .../entry/src/main/ets/MainAbility/app.ets | 22 +++ .../main/ets/MainAbility/common/dialog.ets | 80 ++++++++ .../main/ets/MainAbility/common/noteItem.ets | 61 ++++++ .../main/ets/MainAbility/common/titleBar.ets | 150 ++++++++++++++ .../ets/MainAbility/model/kvStoreModel.ets | 103 ++++++++++ .../ets/MainAbility/model/noteDataModel.ets | 49 +++++ .../MainAbility/model/remoteDeviceModel.ets | 187 ++++++++++++++++++ .../src/main/ets/MainAbility/pages/index.ets | 134 +++++++++++++ .../main/resources/base/element/string.json | 32 +++ .../src/main/resources/base/media/add.png | Bin 0 -> 2637 bytes .../src/main/resources/base/media/back.png | Bin 0 -> 3970 bytes .../src/main/resources/base/media/checked.png | Bin 0 -> 8737 bytes .../src/main/resources/base/media/delete.png | Bin 0 -> 8709 bytes .../resources/base/media/ic_hop_normal.png | Bin 0 -> 550 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../src/main/resources/base/media/uncheck.png | Bin 0 -> 6290 bytes .../src/main/resources/en/element/string.json | 32 +++ .../src/main/resources/zh/element/string.json | 32 +++ data/eTSKvStore/screenshots/devices/main.png | Bin 0 -> 47819 bytes data/eTSKvStore/settings.gradle | 1 + 24 files changed, 1027 insertions(+) create mode 100644 data/eTSKvStore/README_zh.md create mode 100644 data/eTSKvStore/build.gradle create mode 100644 data/eTSKvStore/entry/build.gradle create mode 100644 data/eTSKvStore/entry/src/main/config.json create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/app.ets create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/common/dialog.ets create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/common/noteItem.ets create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets create mode 100644 data/eTSKvStore/entry/src/main/resources/base/element/string.json create mode 100644 data/eTSKvStore/entry/src/main/resources/base/media/add.png create mode 100644 data/eTSKvStore/entry/src/main/resources/base/media/back.png create mode 100644 data/eTSKvStore/entry/src/main/resources/base/media/checked.png create mode 100644 data/eTSKvStore/entry/src/main/resources/base/media/delete.png create mode 100644 data/eTSKvStore/entry/src/main/resources/base/media/ic_hop_normal.png create mode 100644 data/eTSKvStore/entry/src/main/resources/base/media/icon.png create mode 100644 data/eTSKvStore/entry/src/main/resources/base/media/uncheck.png create mode 100644 data/eTSKvStore/entry/src/main/resources/en/element/string.json create mode 100644 data/eTSKvStore/entry/src/main/resources/zh/element/string.json create mode 100644 data/eTSKvStore/screenshots/devices/main.png create mode 100644 data/eTSKvStore/settings.gradle diff --git a/data/eTSKvStore/README_zh.md b/data/eTSKvStore/README_zh.md new file mode 100644 index 0000000000..64fd85e24c --- /dev/null +++ b/data/eTSKvStore/README_zh.md @@ -0,0 +1,23 @@ +# eTS分布式数据管理 + + + +### 简介 + +本示例展示了在eTS中分布式数据管理的使用,包括KVManager对象实例的创建和KVStore数据流转的使用。 + +### 使用说明 + +1、两台设备组网 + +2、在一台界面中点击右上角的流转按钮,在弹窗中选择对端设备拉起对端设备上的应用 + +3、拉起对端设备后,在界面中点击"+"按钮新增笔记卡片,点击每个卡片右上角的"X"按钮可以删除此卡片,可以看到对端设备和当前设备界面数据保持一致 + +4、操作对端设备,当前设备界面也会保持和对端设备界面显示一致 + + + +### 约束与限制 + +本示例仅支持标准系统上运行。 diff --git a/data/eTSKvStore/build.gradle b/data/eTSKvStore/build.gradle new file mode 100644 index 0000000000..8469dbed39 --- /dev/null +++ b/data/eTSKvStore/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 7 + 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.3.4' + classpath 'com.huawei.ohos:decctest:1.2.6.0' + } +} + +allprojects { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } +} diff --git a/data/eTSKvStore/entry/build.gradle b/data/eTSKvStore/entry/build.gradle new file mode 100644 index 0000000000..1587dd1948 --- /dev/null +++ b/data/eTSKvStore/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 7 + 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/data/eTSKvStore/entry/src/main/config.json b/data/eTSKvStore/entry/src/main/config.json new file mode 100644 index 0000000000..a196f4038c --- /dev/null +++ b/data/eTSKvStore/entry/src/main/config.json @@ -0,0 +1,66 @@ +{ + "app": { + "bundleName": "ohos.samples.etskvstore", + "vendor": "samples", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "ohos.samples.etskvstore", + "name": ".MyApplication", + "mainAbility": ".MainAbility", + "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:entry_MainAbility", + "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/data/eTSKvStore/entry/src/main/ets/MainAbility/app.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 0000000000..e7c503157d --- /dev/null +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,22 @@ +/* + * 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/data/eTSKvStore/entry/src/main/ets/MainAbility/common/dialog.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/dialog.ets new file mode 100644 index 0000000000..bc12d4c571 --- /dev/null +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/dialog.ets @@ -0,0 +1,80 @@ +/* + * 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 {DeviceModel} from '../model/noteDataModel' + +@CustomDialog +export struct DeviceDialog { + controller: CustomDialogController + private deviceList: Array = [] + @Link selectedIndex: number + + build() { + Column() { + Text($r('app.string.check_device')) + .fontSize(20) + .width('100%') + .textAlign(TextAlign.Center) + .fontColor(Color.Black) + .fontWeight(FontWeight.Bold) + List() { + ForEach(this.deviceList, item => { + ListItem() { + Row() { + Text(item.deviceName) + .fontSize(20) + .width('90%') + .fontColor(Color.Black) + if (this.deviceList.indexOf(item) == this.selectedIndex) { + Image($r('app.media.checked')) + .width('8%') + .objectFit(ImageFit.Contain) + } else { + Image($r('app.media.uncheck')) + .width('8%') + .objectFit(ImageFit.Contain) + } + } + .height(55) + .onClick(() => { + var index = this.deviceList.indexOf(item) + console.log("KvStore[Dialog] select device:" + item.deviceId) + if (index === this.selectedIndex) { + console.log("KvStore[IndexPage] index === this.selectedIndex") + return; + } + this.selectedIndex = this.deviceList.indexOf(item) + }) + } + }, item => item.deviceName) + } + + Button() { + Text($r('app.string.cancel')) + .fontColor('#0D9FFB') + .width('90%') + .textAlign(TextAlign.Center) + .fontSize(20) + } + .type(ButtonType.Capsule) + .backgroundColor(Color.White) + .onClick(() => { + this.controller.close() + }) + } + .backgroundColor(Color.White) + .border({ color: Color.White, radius: 20 }) + .padding(10) + } +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/noteItem.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/noteItem.ets new file mode 100644 index 0000000000..582c71f9e3 --- /dev/null +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/noteItem.ets @@ -0,0 +1,61 @@ +/* + * 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 {NoteModel} from '../model/noteDataModel'; + +@Component +export struct NoteListItem { + private note: NoteModel = null + private deleteNoteCallBack = null + + build() { + Column() { + if (this.note.title === '' && this.note.content === '') { + Image($r('app.media.add')) + .objectFit(ImageFit.Contain) + .width(50).height('100%') + } else { + Stack({ alignContent: Alignment.TopEnd }) { + Column() { + Text(this.note.title) + .fontColor(Color.Black) + .fontSize(20) + .height('50%') + .width('100%') + .textAlign(TextAlign.Center) + .margin({ top: 20 }) + Text(this.note.content) + .fontColor(Color.Gray) + .fontSize(18) + .width('100%') + .textAlign(TextAlign.Center) + } + .width('100%').height('100%') + + Image($r('app.media.delete')) + .width('30%') + .height('30%') + .objectFit(ImageFit.Contain) + .onClick(() => { + this.deleteNoteCallBack(this.note) + }) + } + } + } + .width('100%') + .height(120) + .backgroundColor('#DFDFF5') + .border({ width: 5, color: '#F5F5F5', radius: 10 }) + } +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets new file mode 100644 index 0000000000..046b2a2d72 --- /dev/null +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets @@ -0,0 +1,150 @@ +/* + * 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 {DeviceDialog} from '../common/dialog' +import featureAbility from '@ohos.ability.featureAbility' +import {RemoteDeviceModel} from '../model/remoteDeviceModel' +import {DeviceModel} from '../model/noteDataModel' + +const NOTES_CHANGE = 'notesChange'; +const EXIT = 'exit' + +@Component +export struct TitleBar { + @State @Watch('selectedIndexChange') selectedIndex: number = 0 + @State deviceList: Array = [] + private startAbilityCallBack = null + private remoteDeviceModel: RemoteDeviceModel = null + @Link isDistributed: boolean + @Link dialogShow: boolean + private dialogController: CustomDialogController = new CustomDialogController({ + builder: DeviceDialog({ deviceList: this.deviceList, selectedIndex: $selectedIndex }), + autoCancel: true + }) + + selectedIndexChange() { + console.log('KvStore[IndexPage] selectedIndexChange'); + if (this.selectedIndex == 0) { + console.log("KvStore[IndexPage] stop ability") + this.startAbilityCallBack(EXIT) + this.isDistributed = false + this.deviceList = [] + this.dialogController.close() + this.dialogShow = false + } else { + console.log('KvStore[IndexPage] start ability ......') + this.isDistributed = true + let needAuth; + if (this.remoteDeviceModel.discoverList.length > 0) { + needAuth = true + } else { + needAuth = false + } + console.log('KvStore[IndexPage] start ability1, needAuth:' + needAuth) + if (needAuth) { + this.remoteDeviceModel.authenticateDevice(this.deviceList[this.selectedIndex], () => { + console.log("KvStore[IndexPage] auth and online finished") + for (var i = 0; i < this.remoteDeviceModel.deviceList.length; i++) { + if (this.remoteDeviceModel.deviceList[i].deviceName === this.deviceList[this.selectedIndex].deviceName) { + this.startAbility(this.remoteDeviceModel.deviceList[i].deviceId) + } + } + }) + } else { + console.log('KvStore[IndexPage] continue unauthed device:' + JSON.stringify(this.deviceList)) + this.startAbility(this.deviceList[this.selectedIndex].deviceId) + } + console.log('KvStore[IndexPage] start ability2 ......') + this.deviceList = [] + this.dialogShow = false + this.dialogController.close() + } + } + + startAbility(deviceId) { + console.log('KvStore[IndexPage] startAbility deviceId:' + deviceId); + featureAbility.startAbility({ + want: { + bundleName: 'ohos.samples.etskvstore', + abilityName: 'ohos.samples.etskvstore.MainAbility', + deviceId: deviceId, + parameters: { + isFA: 'FA' + } + } + }).then((data) => { + console.log('KvStore[IndexPage] start ability finished:' + JSON.stringify(data)); + this.startAbilityCallBack(NOTES_CHANGE) + }); + } + + showDialog() { + this.dialogShow = true + this.deviceList = []; + this.remoteDeviceModel.registerDeviceListCallback(() => { + console.info('KvStore[IndexPage] registerDeviceListCallback, callback entered'); + this.deviceList[0] = { + deviceId: '0', + deviceName: '本机', + deviceType: 0, + checked: false + } + var deviceList_; + if (this.remoteDeviceModel.discoverList.length > 0) { + deviceList_ = this.remoteDeviceModel.discoverList; + } else { + deviceList_ = this.remoteDeviceModel.deviceList; + } + for (var i = 0; i < deviceList_.length; i++) { + console.info('KvStore[IndexPage] device ' + i + '/' + deviceList_.length + + ' deviceId=' + deviceList_[i].deviceId + ' deviceName=' + deviceList_[i].deviceName + + ' deviceType=' + deviceList_[i].deviceType); + this.deviceList[i + 1] = { + deviceId: deviceList_[i].deviceId, + deviceName: deviceList_[i].deviceName, + deviceType: deviceList_[i].deviceType, + checked: false + } + } + for (let i = 0; i < this.deviceList.length; i++) { + this.deviceList[i].checked = (this.selectedIndex === i); + console.info('KvStore[IndexPage] list[i].checked:' + this.deviceList[i].checked); + } + }) + this.dialogController.open() + } + + build() { + Row() { + Text($r("app.string.title")) + .width('82%') + .fontColor(Color.White) + .fontSize(20) + Button() { + Image($r('app.media.ic_hop_normal')) + .width(70).height(40) + .objectFit(ImageFit.Contain) + } + .type(ButtonType.Normal) + .backgroundColor('#0D9FFB') + .onClick(() => { + console.info('KvStore[IndexPage] showDialog start'); + this.showDialog() + }) + } + .height(50).width('100%') + .backgroundColor('#0D9FFB') + .padding({ left: 15, right: 15 }) + } +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets new file mode 100644 index 0000000000..4d5ff486ef --- /dev/null +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2021 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 distributedData from '@ohos.data.distributeddata'; + +const STORE_ID = 'etskvstore_kvstore'; + +export class KvStoreModel { + kvManager; + kvStore; + + constructor() { + } + + createKvStore(callback) { + if (typeof (this.kvStore) === 'undefined') { + var config = { + bundleName: 'ohos.samples.etskvstore', + userInfo: { + userId: '0', + userType: 0 + } + }; + let self = this; + console.info('[KvStoreModel] createKVManager begin'); + distributedData.createKVManager(config).then((manager) => { + console.info('[KvStoreModel] createKVManager success, kvManager=' + JSON.stringify(manager)); + self.kvManager = manager; + var options = { + createIfMissing: true, + encrypt: false, + backup: false, + autoSync: true, + kvStoreType: 1, + securityLevel: 3, + }; + console.info('[KvStoreModel] kvManager.getKVStore begin'); + self.kvManager.getKVStore(STORE_ID, options).then((store) => { + console.info('[KvStoreModel] getKVStore success, kvStore=' + store); + self.kvStore = store; + callback(); + }); + console.info('kvstore[KvStoreModel] kvManager.getKVStore end'); + }); + console.info('kvstore[KvStoreModel] createKVManager end'); + } else { + callback(); + } + } + + put(key, value) { + console.info('[KvStoreModel] kvStore.put ' + key + '=' + value); + this.kvStore.put(key, value).then((data) => { + this.kvStore.get(key).then((data) => { + console.info('[KvStoreModel] kvStore.get ' + key + '=' + JSON.stringify(data)); + }); + console.info('[KvStoreModel] kvStore.put ' + key + ' finished, data=' + JSON.stringify(data)); + }).catch((err) => { + console.error('[KvStoreModel] kvStore.put ' + key + ' failed, ' + JSON.stringify(err)); + }); + } + + setOnMessageReceivedListener(msg, callback) { + console.info('[KvStoreModel] setOnMessageReceivedListener ' + msg); + let self = this; + this.createKvStore(() => { + console.info('[KvStoreModel] kvStore.on(dataChange) begin'); + self.kvStore.on('dataChange', 1, (data) => { + console.info('[KvStoreModel] dataChange, ' + JSON.stringify(data)); + console.info('[KvStoreModel] dataChange, insert ' + data.insertEntries.length + ' udpate ' + + data.updateEntries.length); + for (var i = 0; i < data.insertEntries.length; i++) { + if (data.insertEntries[i].key === msg) { + var value = data.insertEntries[i].value.value + console.info('[KvStoreModel] insertEntries receive ' + msg + '=' + value); + callback(value); + return; + } + } + for (i = 0; i < data.updateEntries.length; i++) { + if (data.updateEntries[i].key === msg) { + var value = data.updateEntries[i].value.value + console.info('[KvStoreModel] updateEntries receive ' + msg + '=' + value); + callback(value); + return; + } + } + }); + console.info('[KvStoreModel] kvStore.on(dataChange) end'); + }) + } +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets new file mode 100644 index 0000000000..76d73cbeff --- /dev/null +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets @@ -0,0 +1,49 @@ +/* + * 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 NoteModel { + title: string + content: string + + constructor(title: string, content: string) { + this.title = title + this.content = content + } +} + +export function transStrToNoteModel(str: string): Array { + let noteList: Array = [] + var notes = JSON.parse(str) + console.info('[NoteModel]notes.length = ' + notes.length) + for (var note in notes) { + var jsonStr = JSON.stringify(notes[note]) + console.info('[NoteModel]notes[note] = ' + jsonStr) + noteList.push({ title: notes[note].title, content: notes[note].content }) + } + return noteList +} + +export class DeviceModel { + deviceId: string + deviceName: string + deviceType: number + checked: boolean + + constructor(deviceId: string, deviceName: string, deviceType: number, checked: boolean) { + this.deviceId = deviceId + this.deviceName = deviceName + this.deviceType = deviceType + this.checked = checked + } +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets new file mode 100644 index 0000000000..e57cd8e97a --- /dev/null +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets @@ -0,0 +1,187 @@ +/* + * 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'; + +var SUBSCRIBE_ID = 100; + +export class RemoteDeviceModel { + deviceList = []; + discoverList = []; + callback; + authCallback; + deviceManager; + + constructor() { + } + + registerDeviceListCallback(callback) { + if (typeof (this.deviceManager) == 'undefined') { + console.log('[RemoteDeviceModel] deviceManager.createDeviceManager begin'); + let self = this; + deviceManager.createDeviceManager("ohos.samples.etskvstore", (error, value) => { + if (error) { + console.error('[RemoteDeviceModel] createDeviceManager failed.'); + return; + } + self.deviceManager = value; + self.registerDeviceListCallback_(callback); + console.log('[RemoteDeviceModel] createDeviceManager callback returned, error=' + error + ' value=' + value); + }); + console.log('[RemoteDeviceModel] deviceManager.createDeviceManager end'); + } else { + this.registerDeviceListCallback_(callback); + } + } + + registerDeviceListCallback_(callback) { + console.info('[RemoteDeviceModel] registerDeviceListCallback'); + this.callback = callback; + if (this.deviceManager == undefined) { + console.error('[RemoteDeviceModel] deviceManager has not initialized'); + this.callback(); + return; + } + + console.info('[RemoteDeviceModel] getTrustedDeviceListSync begin'); + var list = this.deviceManager.getTrustedDeviceListSync(); + console.info('[RemoteDeviceModel] getTrustedDeviceListSync end, deviceList=' + JSON.stringify(list)); + if (typeof (list) != 'undefined' && typeof (list.length) != 'undefined') { + this.deviceList = list; + } + this.callback(); + console.info('[RemoteDeviceModel] callback finished'); + + let self = this; + this.deviceManager.on('deviceStateChange', (data) => { + if (data == null) { + return + } + console.info('[RemoteDeviceModel] deviceStateChange data=' + JSON.stringify(data)); + switch (data.action) { + case 0: + self.deviceList[self.deviceList.length] = data.device; + console.info('[RemoteDeviceModel] online, updated device list=' + JSON.stringify(self.deviceList)); + self.callback(); + if (self.authCallback != null) { + self.authCallback(); + self.authCallback = null; + } + break; + case 2: + if (self.deviceList.length > 0) { + for (var i = 0; i < self.deviceList.length; i++) { + if (self.deviceList[i].deviceId == data.device.deviceId) { + self.deviceList[i] = data.device; + break; + } + } + } + console.info('[RemoteDeviceModel] change, updated device list=' + JSON.stringify(self.deviceList)); + self.callback(); + break; + case 1: + if (self.deviceList.length > 0) { + var list = new Array(); + for (var j = 0; j < self.deviceList.length; j++) { + if (self.deviceList[j].deviceId != data.device.deviceId) { + list[j] = data.device; + } + } + self.deviceList = list; + } + console.info('[RemoteDeviceModel] offline, updated device list=' + JSON.stringify(data.device)); + self.callback(); + break; + default: + break; + } + }); + this.deviceManager.on('deviceFound', (data) => { + if (data == null) { + return + } + console.info('[RemoteDeviceModel] deviceFound data=' + JSON.stringify(data)); + console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + self.discoverList); + for (var i = 0;i < self.discoverList.length; i++) { + if (self.discoverList[i].deviceId == data.device.deviceId) { + console.info('[RemoteDeviceModel] device founded ignored'); + return; + } + } + self.discoverList[self.discoverList.length] = data.device; + console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + self.discoverList); + self.callback(); + }); + this.deviceManager.on('discoverFail', (data) => { + console.info('[RemoteDeviceModel] discoverFail data=' + JSON.stringify(data)); + }); + this.deviceManager.on('serviceDie', () => { + console.error('[RemoteDeviceModel] serviceDie'); + }); + + 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('[RemoteDeviceModel] startDeviceDiscovery ' + SUBSCRIBE_ID); + this.deviceManager.startDeviceDiscovery(info); + } + + unregisterDeviceListCallback() { + console.info('[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 = []; + } + + authenticateDevice(device, callBack) { + console.info('[RemoteDeviceModel] authenticateDevice ' + JSON.stringify(device)); + for (var i = 0; i < this.discoverList.length; i++) { + if (this.discoverList[i].deviceId === device.deviceId) { + let extraInfo = { + 'targetPkgName': 'ohos.samples.etskvstore', + 'appName': 'Distributed Calc', + 'appDescription': 'Distributed Calc', + 'business': '0' + } + let authParam = { + 'authType': 1, + 'appIcon': '', + 'appThumbnail': '', + 'extraInfo': extraInfo + } + this.deviceManager.authenticateDevice(device, authParam, (err, data) => { + if (err) { + console.info('[RemoteDeviceModel] authenticateDevice error:' + JSON.stringify(err)); + this.authCallback = null + return + } + console.info('[RemoteDeviceModel] authenticateDevice succeed:' + JSON.stringify(data)); + this.authCallback = callBack + }) + + } + } + } +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 0000000000..a15357f4a9 --- /dev/null +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,134 @@ +/* + * 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 featureAbility from '@ohos.ability.featureAbility' +import {NoteListItem} from '../common/noteItem' +import {TitleBar} from '../common/titleBar' +import {KvStoreModel} from '../model/kvStoreModel' +import {RemoteDeviceModel} from '../model/remoteDeviceModel' +import {NoteModel, transStrToNoteModel} from '../model/noteDataModel' + +const NOTES_CHANGE = 'notesChange'; +const EXIT = 'exit' +let kvStoreModel: KvStoreModel = new KvStoreModel() +let noteList: Array = [{ title: '', content: '' }] +let notesNum: number = 0 + +@Entry +@Component +struct Index { + @State notes: Array = [{ title: '', content: '' }] + @State dialogShow: boolean = false + @State isDistributed: boolean = false + private remoteDeviceModel: RemoteDeviceModel = new RemoteDeviceModel() + + aboutToAppear() { + featureAbility.getWant((error, want) => { + console.info('Calc[IndexPage] featureAbility.getWant =' + JSON.stringify(want.parameters)); + if (want.parameters.isFA === 'FA') { + this.isDistributed = true + } + }) + kvStoreModel.setOnMessageReceivedListener(NOTES_CHANGE, (value) => { + console.info('kvstore[IndexPage] NOTES_CHANGE' + value) + if (this.isDistributed) { + if (value.search(EXIT) != -1) { + console.info('[json]EXIT' + EXIT) + featureAbility.terminateSelf((error) => { + console.info('kvstore[IndexPage] terminateSelf finished, error=' + error); + }); + } else { + var str = value.substring(0, value.lastIndexOf('}]') + 2) + noteList = transStrToNoteModel(str) + var strNum = value.substring(value.lastIndexOf('numBegin')+'numBegin'.length,value.lastIndexOf('numEnd')) + notesNum = Number(strNum) + } + } + }) + setInterval(() => { + if (!this.dialogShow) { + this.notes = noteList + } + }, 500) + } + + deleteNoteCallBack(item) { + console.log('KvStore[IndexPage] deleteNote' + item); + var index = noteList.indexOf(item) + this.notes = [] + for (let i = 0;i < noteList.length; i++) { + if (i != index) { + this.notes.push(noteList[i]) + } + } + noteList = this.notes + kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList)+'numBegin'+notesNum+'numEnd') + } + + startAbilityCallBack(key){ + console.log('KvStore[IndexPage] startAbilityCallBack' + key); + if(NOTES_CHANGE === key){ + kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList)+'numBegin'+notesNum+'numEnd') + } + if(EXIT === key){ + kvStoreModel.put(NOTES_CHANGE, EXIT) + } + } + + build() { + Column() { + TitleBar({ + startAbilityCallBack: this.startAbilityCallBack, + remoteDeviceModel: this.remoteDeviceModel, + isDistributed: $isDistributed, + dialogShow: $dialogShow + }) + + Grid() { + ForEach(this.notes, item => { + GridItem() { + NoteListItem({ + note: item, + deleteNoteCallBack: this.deleteNoteCallBack + }) + } + .onClick(() => { + console.info('KvStore[IndexPage] GridItem.click' + item.title); + if (item.title === '' && item.content === '') { + notesNum += 1 + noteList[noteList.length-1] = { title: '笔记' + notesNum, content: '笔记内容' } + noteList.push({ title: '', content: '' }) + this.notes = noteList + if (this.isDistributed) { + kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList)+'numBegin'+notesNum+'numEnd') + } + } + }) + }, item => item.title) + } + .columnsTemplate('1fr 1fr 1fr') + .columnsGap(10) + .rowsGap(10) + .padding(10) + .margin({ bottom: 50 }) + } + } + + onDestroy() { + this.remoteDeviceModel.unregisterDeviceListCallback(); + if (this.isDistributed) { + this.isDistributed = false + } + } +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/resources/base/element/string.json b/data/eTSKvStore/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000..818c149ace --- /dev/null +++ b/data/eTSKvStore/entry/src/main/resources/base/element/string.json @@ -0,0 +1,32 @@ +{ + "string": [ + { + "name": "entry_MainAbility", + "value": "eTSKvStore" + }, + { + "name": "description_mainability", + "value": "eTSKvStore Ability" + }, + { + "name": "title", + "value": "eTSKvStore" + }, + { + "name": "check_device", + "value": "Check device" + }, + { + "name": "cancel", + "value": "Cancel" + }, + { + "name": "note", + "value": "Note" + }, + { + "name": "note_content", + "value": "Note content" + } + ] +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/resources/base/media/add.png b/data/eTSKvStore/entry/src/main/resources/base/media/add.png new file mode 100644 index 0000000000000000000000000000000000000000..e265f83c48e4a7f92b4466cd331033302b7f6a56 GIT binary patch literal 2637 zcmeHJX;_n27XA`HAuyl;96*8Lldu#)c@Pi=@W)VsV%C0R*L#08s zVA&#ssZv0ZgbD@JAz&;}_C< z8Hu2)y-yne0NqnWygzI^wg*ZBp2b0uQrIA3{R!THq|a0d0NR?T@VJ1au$k+QnIXe} zP3srYSr4sWICf~y%!0NTbsllQkMQ2X%O(y~5P9>v@+4A8sC8XC_Uf+?PE%VqBF2(m z_97^^L*0NkOfu!^{!=9~k`qw^Zt^52wtr;3Sv<$-b5{t@kjc+z8#n-|@PlL;Nc2hy z67{HN2hs}*;8v2iCtd7A0@tMV_pAT{3L+8=dy71gsPR`Pt1uw?XG{j;v^fHtzknIm zL!ut%o^Yzj0eCC-a;H%UP}y;F?+^jNee;|c|2@EqqYY*%FfrnhVwEx|mGmc!t#fu`UvhZi>3hDK6h8A8umS%d-RS_yD-+ zfyk984r`-I=&^~RhZk4tlt$chnP6CQAtzqsS`f!MrRUmaa>avu56`{3#!8j;KkT#O zLRsS_Qh3di)%mwl+q3d;o8M$NgnbuporP=sN#EWKGxx@_7WO2Q(QvN4b+~iYu2DX} zNoF4Jzncc%kq@NGyZ^2&OS57~xgLL58a5|8Q%YTd=?jiX4ud`b*+8 zSV>);;)EM-l#|lx+z{a4-Y1gnysqp-TLKzB;%)my+vH*9u)-i2%FYiucK42_+hBbB}8bZzTwTslEc#I9S<=#@{G(&47}V z-)U&Q5dVrtUnzC!)*T0p&^|B-r4NkC^>HOH@{C~*3k*F=2lg0*Xv!}@-5iKz+=o|? zU%?&JAOx!egD^xOj_C(p;C=oT z?4i5(grKP@ITd{SMX&|myI(k=ae?<2{(czru~gUsV9eJKJUex)?m3(!!Vv~#Lx=&< zLA_QjQu=2CPY8`^oV33|A@Sx6$cT{HU2z!|5wIGI# zHQ|s+b_ezFHzs>7rXH2;Y=ukf_L0&S{~L=KZH^-aW;C)TTNZ)K29wp|t4oGzk(;^m zXe~ii!dA%-$hSO0Lq1fRk&0QH?d%k?YNx!e;X_pI^wWH~jMfnAj-4>!6k+KJRzlHj z`%UF|*McAG&2S`c?dw;rz3TKMJ6?~_knB&t&^Xf-_$J_|dY;lb3%C>JAym@AA?ek#Uj?l8$e^g3ETel8SBQeg+w<$ zem-xJ@JbO>Oa2Cv`>X&wus%aOx^ix$SqkqmV;v7FS6*hNw!QDk!B$<`9cp|?>eaHV zxl6oFifY%Pd+JGh&2{hu4T?tky)QZIXD&V^6Og>Ehl6$x*LCN()VKfbIc0l2udCA*R;!}n2QPC-vX zpT49=5)u;B+`Fr?m(mwoaST=y)9&DWn6Qbx>VeD~LqF!rFixctL8-8`&xLkf8+;>yCdNsH(|QIM>;vSS~)H(cjX)V}YIvp|4)2z`fQ zfR`r?uQ1Sp_$Wb=96r5z^RS2r;PBkmZdj-3bA?Jg5@mt33_F4VZ7;W+w$aC;^`QA$ jI2ZXk-R-|M^6ka literal 0 HcmV?d00001 diff --git a/data/eTSKvStore/entry/src/main/resources/base/media/back.png b/data/eTSKvStore/entry/src/main/resources/base/media/back.png new file mode 100644 index 0000000000000000000000000000000000000000..29959451a929c75464876f9a6e668f849e573fe9 GIT binary patch literal 3970 zcmbVPXIK+kx1NMRLKP5DLxKT<6a|$~5{ibNfPx6iXk*3RSmr= z%}^}#7y=v=gd-|diXcTP9u@C+pZoLv`hLvJ^Q>93*SpqU>z#Keow2nN7eR^u03c2# zncIWUzCRa22)tK2*A##cNSM8qDNr+jS_FVSMr3o7v(fG=`Lup_3)!B*y$F~&g47`m z@lHZqBuhdsIV)YSgLSxc9I{dCwufdGBhHEA(TfgGN3DT#E9{Z-fYbDWKlaG~N$^{68Q@d5+k( z$LoXom-8uGLAW1Mbc^lO*Sg0rB1E6Lo{Go_}n_%+Q-&+F}=bww{*lyVRZCElo( zA2a9PI7jngp!j5h=IFlqvve7U3Y{coUH}F6m*tg-{tx1lBiW$_&t2)^&&(I4v9v}O zpCq$R1?I8IBjd-Q?D}GI?tU(fqNjQB%@qhL@0h!)nJ~jPTP4UIds(}F=Cx&`DkOgO zRE#la6xzsrmh=GxzNKOiY+oR92Xgc)FgH`*PH6QjQy_WsBxLD{(x<@vJQh?!c)*0=7i*Iv2;J|h>LK8Qf<-TB$P zd$U68vt#2I4fjA0`UHtf2u26*6g4B7x;$Bz74myz3MilsEyc$Ji{=OJtC&!~MpFad z9WkwTv@^#Sls8taaiQ!XC{t{Y{;j*z=J2tOW+l|1p>Kq>DLuRbHNsTnxET@jDw`gT zR9Pvbjy5IRFI%25k^%=DJPPuYXHxl9 z8p@tgQKAuz2u`7-O)bC*zaXQmNHlQOU?%ircv>XrToznYfagEN!bny;iwzR4^}Tw# zJS1;{?UAsH-sLYa$%O{j$29J&Qp7%0t|!=Yq(g_!;50EgL?J6JbRYFq=2nU zHxI#(%3;iYr$nYZAm<^7t2A8=0}N3EndOP(it?9lpdR-o()8$i4E;7OE$OLcnb@Ou zRzI!vP3i#WXo$_zX7tpehuGR<^|(BCsld|@*Xcvc_WLRaF{VNFw&I@G5op>ey z?OI>L5Kgu|;F33-fx?jCrRr25R3oTF;`5C6H5h#;=iH-WaDt1kJ7#Byp%Hg0w43Mh z*2JuQd0!W^LmP}hRNC$$66n#Kf!)jNCZ%gSMV3k+Nhm4jh?`MWa6i~A^gZ&W#ky;f^4>Mak)<6#H;rW7ZVM5&!p_qE{vXMb5_6z;zn4GC)ln2b!}gmR@2<|cP*m2 z&)dQBlq6uIl0vG^h52PHiq3G?6Aq;`mi&2fI{^fFFj2MlfgJPBMxR$PS>1vXyo zQ#QZhhZ5?y?_TqOcVO}w(F+q7e<=V7jwBlg6i9{{_fBmvqN!DrXYLvT(MI~yby;yF z1VeawYYPNb)LW`-qf3Ic5fjG+`XkJ>kd zy1?~M0q&O>OWTg0pSHe)no?_6{P2w!A)q#Dk3o>%e(jsEKTbNJQ#HB=bmF~)m{JQ^ zr^7aOq5=0+!>E6T>%4>n6Ty@o0nzV!b*m~zLz{0xx*m7NsC|?H3aM3(*xH0+2qNkB zClLp2+SBl{HM+xsk+eee@WOS0c6hv3wCc_ewEyN?MDIRS19obbSPM}+5HlOs{gQXm z5^tIzct?RS6h(xhIP&C#NTaE@6+;D9k9;J)$uY*pG{cqq330Mhh&%6fVit&n5SBlM z@VrP=li0~km+w$;kDLoEAEd+ZP%NQmPzm*b)nIuSy@11P=Z^2P{G$|syLLU=#kF;g ze~do4=Li1c9Ti-AR$&?7&XV|cfU%bL0*=d>69IfEqi1%c42FD&9Y3JgRwh?;0o#b7 z^ezNyK@;=RruXvS^8$DpY%{})0*?_V#dpo{IxrD9`d;m~HdFcN{ZNd1b8h_bd!fnw z^GIv0M_}&Q0ws8l(3`{F->Bq;RtV}#k+LuxE(9UPdp$>R0@LRusOL0V8$vzTjBxC>%0!+wl)p>>iwX zF$p9wmQjkdFonM^?9+`+mJ9Ze9XGL&PD1a;Vx*WW%2;{Tt?;Ul3n{AH6bTn5Y2k$j zB#9B|Nr}oGeyE3lQD?v-Me9?C5%y!!zHkq#hIA0fDD65hh9q@7OVJT)Xbl1M+|h+=-WAVr3j zjfY7wR}Fm048u)zyN0}}tZ^#HP-Wtmye)IENu0gu2M)9BRqO%x_^`n4#h_BO1SYn# z_V^``ChtHQt{xQCQRiXG(%(Sv<-NrJ67Ij7yP>$R2=6 z+G>egfmWM(@_=4FL9_F$Tbvesk7Irn?GLl97>l7%KCJO#VN*xp&f5TXsmI&jGfviHyXh&&G*69hWA#pz=Z z2y<+xxHCOZx=?+6?YkV%>pd}mF}orY%;?b?*C7uMY(xPF)tvwP!KjLuQ9tfXj`&MZ zx9^>Q>bCn)!lgY&5@V}!=zsw)fg%||Abr@U_`UU}Q>_Xt(UV4wiOjx+G2QU#)!eeR zrsH!my%vrfv}KB;*!wI=ajQimHsHSBc*6X)eB}3^QOg=r4#Cy30q*D3r+<@!azUxu_&y02KcWz>{ zTWTAyNG!kP^F4&QJj)n(y^a;G^F0M>;Ke=_Q|eV*>+Al=2$K5G`?4+g6JLrP8$d;M z=6jwY@42KMa}D0sg9j^_=7z++1qbDXMER||ah>E1M|ic83XBBjeVRDGn-$HB<=k{i zHBy0SZ%C)+16`-&{q}| zKO$;bo*=rESUkBy^DB~ah$zAlBYp6oIOGo-OA~kcXlrJ4nQ&ozRQ5@U7n*|O87htt zX7^~UNxmV^PH^pUZ0lm27i9PsQZwg4n9p|y!1Y|wX|lZ>h8*~9&oqcH95}f7ac)6Y zux}w?2rn={urUujZ3}&JOG^fGOD>rF&p`g%Abjm*hh}BgGoal2oW5#Co*yMF|B0a} zJtzBhc2ABJM)|18eHd7lRl&&zI;<$eWMDD!s=v1t^*)PV*;qC{yH+<+0K~lxq!B7% zBtm0FW;vLaNn4>g{cOwftNZ2~zPMK1u+eQO9$(+n*D1qLr|@4W#g6t7bA7%^IeCP7~OKD0*{t%XSM*l+lv5>2-pu$q#H| zp`AQ!_6UqU>iIccD#Dny84DJ`-aTG_p0c$itaR(y`PY!>_U-ofCDJu=7-9YqT^X)E zYkZfoC4m#Y{9NSsGargw*Y6V|9*p;sf~4|ujT@05bv+$Bl5P(&L9vr9tra}GxdvvF z%E6YiKU~`822z2Ro(=mf*gfT04j;6@GvmHo75fU1k>0#gzq}6)OHAQQtB*h+_WpC3 z%_*R)?4~4TF3|z?M(V3~-4Mw1rFwJg2qHbxg)p}Qc75pM^Gd~_9I>v>`!B-(gsZia Vwt(Mfr@=!tK(??ouQBzw@jsfI@DBh0 literal 0 HcmV?d00001 diff --git a/data/eTSKvStore/entry/src/main/resources/base/media/checked.png b/data/eTSKvStore/entry/src/main/resources/base/media/checked.png new file mode 100644 index 0000000000000000000000000000000000000000..a77ded514ac884365ec515801bb34c68e6e5b7f8 GIT binary patch literal 8737 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 literal 0 HcmV?d00001 diff --git a/data/eTSKvStore/entry/src/main/resources/base/media/icon.png b/data/eTSKvStore/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 mnl{+T4&#qG_WyUv;kmIiwi`ZIBjVP53X|XrvPW literal 0 HcmV?d00001 diff --git a/data/eTSKvStore/entry/src/main/resources/en/element/string.json b/data/eTSKvStore/entry/src/main/resources/en/element/string.json new file mode 100644 index 0000000000..818c149ace --- /dev/null +++ b/data/eTSKvStore/entry/src/main/resources/en/element/string.json @@ -0,0 +1,32 @@ +{ + "string": [ + { + "name": "entry_MainAbility", + "value": "eTSKvStore" + }, + { + "name": "description_mainability", + "value": "eTSKvStore Ability" + }, + { + "name": "title", + "value": "eTSKvStore" + }, + { + "name": "check_device", + "value": "Check device" + }, + { + "name": "cancel", + "value": "Cancel" + }, + { + "name": "note", + "value": "Note" + }, + { + "name": "note_content", + "value": "Note content" + } + ] +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/resources/zh/element/string.json b/data/eTSKvStore/entry/src/main/resources/zh/element/string.json new file mode 100644 index 0000000000..5617a1d22b --- /dev/null +++ b/data/eTSKvStore/entry/src/main/resources/zh/element/string.json @@ -0,0 +1,32 @@ +{ + "string": [ + { + "name": "entry_MainAbility", + "value": "eTSKvStore" + }, + { + "name": "description_mainability", + "value": "eTSKvStore Ability" + }, + { + "name": "title", + "value": "分布式数据管理" + }, + { + "name": "check_device", + "value": "选择设备" + }, + { + "name": "cancel", + "value": "取消" + }, + { + "name": "note", + "value": "笔记" + }, + { + "name": "note_content", + "value": "笔记内容" + } + ] +} \ No newline at end of file diff --git a/data/eTSKvStore/screenshots/devices/main.png b/data/eTSKvStore/screenshots/devices/main.png new file mode 100644 index 0000000000000000000000000000000000000000..a76c6bcaabe077d9e479dea4d2bfae5315454c8d GIT binary patch literal 47819 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�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 literal 0 HcmV?d00001 diff --git a/data/eTSKvStore/settings.gradle b/data/eTSKvStore/settings.gradle new file mode 100644 index 0000000000..4773db7323 --- /dev/null +++ b/data/eTSKvStore/settings.gradle @@ -0,0 +1 @@ +include ':entry' -- Gitee From b5118642a3147e0928a10daa4872c1a753ec59ea Mon Sep 17 00:00:00 2001 From: guojin26 Date: Tue, 30 Nov 2021 16:56:52 +0800 Subject: [PATCH 2/8] format Signed-off-by: guojin26 --- .../entry/src/main/ets/MainAbility/pages/index.ets | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets index a15357f4a9..d89fb71338 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets @@ -51,7 +51,7 @@ struct Index { } else { var str = value.substring(0, value.lastIndexOf('}]') + 2) noteList = transStrToNoteModel(str) - var strNum = value.substring(value.lastIndexOf('numBegin')+'numBegin'.length,value.lastIndexOf('numEnd')) + var strNum = value.substring(value.lastIndexOf('numBegin') + 'numBegin'.length, value.lastIndexOf('numEnd')) notesNum = Number(strNum) } } @@ -73,15 +73,15 @@ struct Index { } } noteList = this.notes - kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList)+'numBegin'+notesNum+'numEnd') + kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList) + 'numBegin' + notesNum + 'numEnd') } - startAbilityCallBack(key){ + startAbilityCallBack(key) { console.log('KvStore[IndexPage] startAbilityCallBack' + key); - if(NOTES_CHANGE === key){ - kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList)+'numBegin'+notesNum+'numEnd') + if (NOTES_CHANGE === key) { + kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList) + 'numBegin' + notesNum + 'numEnd') } - if(EXIT === key){ + if (EXIT === key) { kvStoreModel.put(NOTES_CHANGE, EXIT) } } @@ -111,7 +111,7 @@ struct Index { noteList.push({ title: '', content: '' }) this.notes = noteList if (this.isDistributed) { - kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList)+'numBegin'+notesNum+'numEnd') + kvStoreModel.put(NOTES_CHANGE, JSON.stringify(noteList) + 'numBegin' + notesNum + 'numEnd') } } }) -- Gitee From 326226d241312d7bd077679f78b7f108c172d5dc Mon Sep 17 00:00:00 2001 From: guojin26 Date: Wed, 1 Dec 2021 10:09:56 +0800 Subject: [PATCH 3/8] update code Signed-off-by: guojin26 --- data/eTSKvStore/build.gradle | 1 - data/eTSKvStore/entry/build.gradle | 5 --- .../main/ets/MainAbility/common/dialog.ets | 4 +-- .../main/ets/MainAbility/common/titleBar.ets | 4 +-- .../ets/MainAbility/model/deviceDataModel.ets | 28 ++++++++++++++++ .../MainAbility/model/remoteDeviceModel.ets | 32 ++++++++++--------- .../src/main/ets/MainAbility/pages/index.ets | 4 +-- 7 files changed, 51 insertions(+), 27 deletions(-) create mode 100644 data/eTSKvStore/entry/src/main/ets/MainAbility/model/deviceDataModel.ets diff --git a/data/eTSKvStore/build.gradle b/data/eTSKvStore/build.gradle index 8469dbed39..cae0ab0036 100644 --- a/data/eTSKvStore/build.gradle +++ b/data/eTSKvStore/build.gradle @@ -18,7 +18,6 @@ buildscript { } dependencies { classpath 'com.huawei.ohos:hap:3.0.3.4' - classpath 'com.huawei.ohos:decctest:1.2.6.0' } } diff --git a/data/eTSKvStore/entry/build.gradle b/data/eTSKvStore/entry/build.gradle index 1587dd1948..8243c3b322 100644 --- a/data/eTSKvStore/entry/build.gradle +++ b/data/eTSKvStore/entry/build.gradle @@ -14,8 +14,3 @@ ohos { } } } - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testImplementation 'junit:junit:4.13.1' -} diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/dialog.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/dialog.ets index bc12d4c571..1f004c5402 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/dialog.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/dialog.ets @@ -12,12 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {DeviceModel} from '../model/noteDataModel' +import {DeviceDataModel} from '../model/deviceDataModel' @CustomDialog export struct DeviceDialog { controller: CustomDialogController - private deviceList: Array = [] + private deviceList: Array = [] @Link selectedIndex: number build() { diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets index 046b2a2d72..02de441ab3 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets @@ -15,7 +15,7 @@ import {DeviceDialog} from '../common/dialog' import featureAbility from '@ohos.ability.featureAbility' import {RemoteDeviceModel} from '../model/remoteDeviceModel' -import {DeviceModel} from '../model/noteDataModel' +import {DeviceDataModel} from '../model/deviceDataModel' const NOTES_CHANGE = 'notesChange'; const EXIT = 'exit' @@ -23,7 +23,7 @@ const EXIT = 'exit' @Component export struct TitleBar { @State @Watch('selectedIndexChange') selectedIndex: number = 0 - @State deviceList: Array = [] + @State deviceList: Array = [] private startAbilityCallBack = null private remoteDeviceModel: RemoteDeviceModel = null @Link isDistributed: boolean diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/deviceDataModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/deviceDataModel.ets new file mode 100644 index 0000000000..5de30665fd --- /dev/null +++ b/data/eTSKvStore/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 + checked: boolean + + constructor(deviceId: string, deviceName: string, deviceType: number, checked: boolean) { + this.deviceId = deviceId + this.deviceName = deviceName + this.deviceType = deviceType + this.checked = checked + } +} \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets index e57cd8e97a..99cced753f 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets @@ -70,38 +70,39 @@ export class RemoteDeviceModel { } console.info('[RemoteDeviceModel] deviceStateChange data=' + JSON.stringify(data)); switch (data.action) { - case 0: + case deviceManager.DeviceStateChangeAction.ONLINE: self.deviceList[self.deviceList.length] = data.device; - console.info('[RemoteDeviceModel] online, updated device list=' + JSON.stringify(self.deviceList)); + console.info('[RemoteDeviceModel] online, device list=' + JSON.stringify(self.deviceList)); self.callback(); if (self.authCallback != null) { self.authCallback(); self.authCallback = null; } break; - case 2: + case deviceManager.DeviceStateChangeAction.READY: if (self.deviceList.length > 0) { - for (var i = 0; i < self.deviceList.length; i++) { - if (self.deviceList[i].deviceId == data.device.deviceId) { - self.deviceList[i] = data.device; - break; + var list = new Array(); + for (var j = 0; j < self.deviceList.length; j++) { + if (self.deviceList[j].deviceId != data.device.deviceId) { + list[j] = data.device; } } + self.deviceList = list; } - console.info('[RemoteDeviceModel] change, updated device list=' + JSON.stringify(self.deviceList)); + console.info('[RemoteDeviceModel] ready, device list=' + JSON.stringify(data.device)); self.callback(); break; - case 1: + case deviceManager.DeviceStateChangeAction.OFFLINE: + case deviceManager.DeviceStateChangeAction.CHANGE: if (self.deviceList.length > 0) { - var list = new Array(); - for (var j = 0; j < self.deviceList.length; j++) { - if (self.deviceList[j].deviceId != data.device.deviceId) { - list[j] = data.device; + for (var i = 0; i < self.deviceList.length; i++) { + if (self.deviceList[i].deviceId == data.device.deviceId) { + self.deviceList[i] = data.device; + break; } } - self.deviceList = list; } - console.info('[RemoteDeviceModel] offline, updated device list=' + JSON.stringify(data.device)); + console.info('[RemoteDeviceModel] offline, device list=' + JSON.stringify(self.deviceList)); self.callback(); break; default: @@ -153,6 +154,7 @@ export class RemoteDeviceModel { this.deviceManager.off('discoverFail'); this.deviceManager.off('serviceDie'); this.deviceList = []; + this.discoverList = [] } authenticateDevice(device, callBack) { diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets index d89fb71338..17f3978e21 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets @@ -35,7 +35,7 @@ struct Index { aboutToAppear() { featureAbility.getWant((error, want) => { - console.info('Calc[IndexPage] featureAbility.getWant =' + JSON.stringify(want.parameters)); + console.info('KvStore[IndexPage] featureAbility.getWant =' + JSON.stringify(want.parameters)); if (want.parameters.isFA === 'FA') { this.isDistributed = true } @@ -52,7 +52,7 @@ struct Index { var str = value.substring(0, value.lastIndexOf('}]') + 2) noteList = transStrToNoteModel(str) var strNum = value.substring(value.lastIndexOf('numBegin') + 'numBegin'.length, value.lastIndexOf('numEnd')) - notesNum = Number(strNum) + notesNum = parseInt(strNum) } } }) -- Gitee From adb7f1ce75f83700733516cac4db4e0f7032bb87 Mon Sep 17 00:00:00 2001 From: guojin26 Date: Wed, 1 Dec 2021 10:12:52 +0800 Subject: [PATCH 4/8] update code Signed-off-by: guojin26 --- .../main/ets/MainAbility/model/noteDataModel.ets | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets index 76d73cbeff..edaf5ca6c0 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets @@ -32,18 +32,4 @@ export function transStrToNoteModel(str: string): Array { noteList.push({ title: notes[note].title, content: notes[note].content }) } return noteList -} - -export class DeviceModel { - deviceId: string - deviceName: string - deviceType: number - checked: boolean - - constructor(deviceId: string, deviceName: string, deviceType: number, checked: boolean) { - this.deviceId = deviceId - this.deviceName = deviceName - this.deviceType = deviceType - this.checked = checked - } } \ No newline at end of file -- Gitee From ee7011e8bb0782c3e4603393cd924cc8f7736289 Mon Sep 17 00:00:00 2001 From: guojin26 Date: Wed, 1 Dec 2021 17:29:19 +0800 Subject: [PATCH 5/8] update code Signed-off-by: guojin26 --- .../main/ets/MainAbility/common/noteItem.ets | 2 +- .../main/ets/MainAbility/common/titleBar.ets | 48 +++--- .../ets/MainAbility/model/kvStoreModel.ets | 95 ++++++------ .../MainAbility/model/remoteDeviceModel.ets | 138 +++++++++--------- .../src/main/ets/MainAbility/pages/index.ets | 6 +- 5 files changed, 143 insertions(+), 146 deletions(-) diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/noteItem.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/noteItem.ets index 582c71f9e3..0219508b79 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/noteItem.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/noteItem.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {NoteModel} from '../model/noteDataModel'; +import {NoteModel} from '../model/noteDataModel' @Component export struct NoteListItem { diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets index 02de441ab3..4c6938850c 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets @@ -17,7 +17,7 @@ import featureAbility from '@ohos.ability.featureAbility' import {RemoteDeviceModel} from '../model/remoteDeviceModel' import {DeviceDataModel} from '../model/deviceDataModel' -const NOTES_CHANGE = 'notesChange'; +const NOTES_CHANGE = 'notesChange' const EXIT = 'exit' @Component @@ -45,11 +45,9 @@ export struct TitleBar { } else { console.log('KvStore[IndexPage] start ability ......') this.isDistributed = true - let needAuth; - if (this.remoteDeviceModel.discoverList.length > 0) { - needAuth = true - } else { - needAuth = false + let needAuth = false; + if(this.remoteDeviceModel!=null){ + needAuth = this.remoteDeviceModel.discoverList.length > 0 } console.log('KvStore[IndexPage] start ability1, needAuth:' + needAuth) if (needAuth) { @@ -73,7 +71,7 @@ export struct TitleBar { } startAbility(deviceId) { - console.log('KvStore[IndexPage] startAbility deviceId:' + deviceId); + console.log('KvStore[IndexPage] startAbility deviceId:' + deviceId) featureAbility.startAbility({ want: { bundleName: 'ohos.samples.etskvstore', @@ -84,7 +82,7 @@ export struct TitleBar { } } }).then((data) => { - console.log('KvStore[IndexPage] start ability finished:' + JSON.stringify(data)); + console.log('KvStore[IndexPage] start ability finished:' + JSON.stringify(data)) this.startAbilityCallBack(NOTES_CHANGE) }); } @@ -93,33 +91,33 @@ export struct TitleBar { this.dialogShow = true this.deviceList = []; this.remoteDeviceModel.registerDeviceListCallback(() => { - console.info('KvStore[IndexPage] registerDeviceListCallback, callback entered'); + console.info('KvStore[IndexPage] registerDeviceListCallback, callback entered') this.deviceList[0] = { deviceId: '0', - deviceName: '本机', + deviceName: 'Local device', deviceType: 0, checked: false } - var deviceList_; + var deviceTempList; if (this.remoteDeviceModel.discoverList.length > 0) { - deviceList_ = this.remoteDeviceModel.discoverList; + deviceTempList = this.remoteDeviceModel.discoverList } else { - deviceList_ = this.remoteDeviceModel.deviceList; + deviceTempList = this.remoteDeviceModel.deviceList } - for (var i = 0; i < deviceList_.length; i++) { - console.info('KvStore[IndexPage] device ' + i + '/' + deviceList_.length + - ' deviceId=' + deviceList_[i].deviceId + ' deviceName=' + deviceList_[i].deviceName - + ' deviceType=' + deviceList_[i].deviceType); - this.deviceList[i + 1] = { - deviceId: deviceList_[i].deviceId, - deviceName: deviceList_[i].deviceName, - deviceType: deviceList_[i].deviceType, + for (var i = 0; i < deviceTempList.length; i++) { + console.info('KvStore[IndexPage] device ' + i + '/' + deviceTempList.length + + ' deviceId=' + deviceTempList[i].deviceId + ' deviceName=' + deviceTempList[i].deviceName + + ' deviceType=' + deviceTempList[i].deviceType) + this.deviceList.push({ + deviceId: deviceTempList[i].deviceId, + deviceName: deviceTempList[i].deviceName, + deviceType: deviceTempList[i].deviceType, checked: false - } + }) } for (let i = 0; i < this.deviceList.length; i++) { - this.deviceList[i].checked = (this.selectedIndex === i); - console.info('KvStore[IndexPage] list[i].checked:' + this.deviceList[i].checked); + this.deviceList[i].checked = (this.selectedIndex === i) + console.info('KvStore[IndexPage] list[i].checked:' + this.deviceList[i].checked) } }) this.dialogController.open() @@ -139,7 +137,7 @@ export struct TitleBar { .type(ButtonType.Normal) .backgroundColor('#0D9FFB') .onClick(() => { - console.info('KvStore[IndexPage] showDialog start'); + console.info('KvStore[IndexPage] showDialog start') this.showDialog() }) } diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets index 4d5ff486ef..1bb463a930 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets @@ -12,9 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import distributedData from '@ohos.data.distributeddata'; +import distributedData from '@ohos.data.distributeddata' -const STORE_ID = 'etskvstore_kvstore'; +const STORE_ID = 'etskvstore_test' export class KvStoreModel { kvManager; @@ -24,80 +24,77 @@ export class KvStoreModel { } createKvStore(callback) { - if (typeof (this.kvStore) === 'undefined') { - var config = { - bundleName: 'ohos.samples.etskvstore', - userInfo: { - userId: '0', - userType: 0 - } - }; - let self = this; - console.info('[KvStoreModel] createKVManager begin'); - distributedData.createKVManager(config).then((manager) => { - console.info('[KvStoreModel] createKVManager success, kvManager=' + JSON.stringify(manager)); - self.kvManager = manager; - var options = { - createIfMissing: true, - encrypt: false, - backup: false, - autoSync: true, - kvStoreType: 1, - securityLevel: 3, - }; - console.info('[KvStoreModel] kvManager.getKVStore begin'); - self.kvManager.getKVStore(STORE_ID, options).then((store) => { - console.info('[KvStoreModel] getKVStore success, kvStore=' + store); - self.kvStore = store; - callback(); - }); - console.info('kvstore[KvStoreModel] kvManager.getKVStore end'); - }); - console.info('kvstore[KvStoreModel] createKVManager end'); - } else { + if ((typeof (this.kvStore) != 'undefined')) { callback(); + return; } + var config = { + bundleName: 'ohos.samples.etskvstore', + userInfo: { + userId: '0', + userType: 0 + } + }; + let self = this; + console.info('[KvStoreModel] createKVManager begin') + distributedData.createKVManager(config).then((manager) => { + console.info('[KvStoreModel] createKVManager success, kvManager=' + JSON.stringify(manager)) + self.kvManager = manager; + var options = { + createIfMissing: true, + encrypt: false, + backup: false, + autoSync: true, + kvStoreType: 1, + securityLevel: 3, + }; + console.info('[KvStoreModel] kvManager.getKVStore begin') + self.kvManager.getKVStore(STORE_ID, options).then((store) => { + console.info('[KvStoreModel] getKVStore success, kvStore=' + store) + self.kvStore = store + callback() + }) + console.info('kvstore[KvStoreModel] kvManager.getKVStore end') + }); + console.info('kvstore[KvStoreModel] createKVManager end') } put(key, value) { console.info('[KvStoreModel] kvStore.put ' + key + '=' + value); this.kvStore.put(key, value).then((data) => { - this.kvStore.get(key).then((data) => { - console.info('[KvStoreModel] kvStore.get ' + key + '=' + JSON.stringify(data)); - }); - console.info('[KvStoreModel] kvStore.put ' + key + ' finished, data=' + JSON.stringify(data)); + console.info('[KvStoreModel] kvStore.put ' + key + ' finished, data=' + JSON.stringify(data)) }).catch((err) => { - console.error('[KvStoreModel] kvStore.put ' + key + ' failed, ' + JSON.stringify(err)); + console.error('[KvStoreModel] kvStore.put ' + key + ' failed, ' + JSON.stringify(err)) }); } setOnMessageReceivedListener(msg, callback) { - console.info('[KvStoreModel] setOnMessageReceivedListener ' + msg); - let self = this; + console.info('[KvStoreModel] setOnMessageReceivedListener ' + msg) + let self = this this.createKvStore(() => { - console.info('[KvStoreModel] kvStore.on(dataChange) begin'); + console.info('[KvStoreModel] kvStore.on(dataChange) begin') self.kvStore.on('dataChange', 1, (data) => { console.info('[KvStoreModel] dataChange, ' + JSON.stringify(data)); console.info('[KvStoreModel] dataChange, insert ' + data.insertEntries.length + ' udpate ' - + data.updateEntries.length); - for (var i = 0; i < data.insertEntries.length; i++) { + + data.updateEntries.length) + for (let i = 0; i < data.insertEntries.length; i++) { if (data.insertEntries[i].key === msg) { var value = data.insertEntries[i].value.value - console.info('[KvStoreModel] insertEntries receive ' + msg + '=' + value); + console.info('[KvStoreModel] insertEntries receive ' + msg + '=' + value) callback(value); return; } } - for (i = 0; i < data.updateEntries.length; i++) { - if (data.updateEntries[i].key === msg) { - var value = data.updateEntries[i].value.value - console.info('[KvStoreModel] updateEntries receive ' + msg + '=' + value); + for (let j = 0; j < data.updateEntries.length; j++) { + if (data.updateEntries[j].key === msg) { + var value = data.updateEntries[j].value.value + console.info('[KvStoreModel] updateEntries receive ' + msg + '=' + value) callback(value); return; } } }); - console.info('[KvStoreModel] kvStore.on(dataChange) end'); + console.info('[KvStoreModel] kvStore.on(dataChange) end') }) } } \ No newline at end of file diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets index 99cced753f..213f9e139d 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets @@ -12,55 +12,55 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import deviceManager from '@ohos.distributedHardware.deviceManager'; +import deviceManager from '@ohos.distributedHardware.deviceManager' -var SUBSCRIBE_ID = 100; +var SUBSCRIBE_ID = 100 export class RemoteDeviceModel { - deviceList = []; - discoverList = []; - callback; - authCallback; - deviceManager; + deviceList = [] + discoverList = [] + callback + authCallback + deviceManager constructor() { } registerDeviceListCallback(callback) { - if (typeof (this.deviceManager) == 'undefined') { - console.log('[RemoteDeviceModel] deviceManager.createDeviceManager begin'); - let self = this; - deviceManager.createDeviceManager("ohos.samples.etskvstore", (error, value) => { - if (error) { - console.error('[RemoteDeviceModel] createDeviceManager failed.'); - return; - } - self.deviceManager = value; - self.registerDeviceListCallback_(callback); - console.log('[RemoteDeviceModel] createDeviceManager callback returned, error=' + error + ' value=' + value); - }); - console.log('[RemoteDeviceModel] deviceManager.createDeviceManager end'); - } else { - this.registerDeviceListCallback_(callback); + if (typeof (this.deviceManager) != 'undefined') { + this.registerDeviceListCallback_(callback) + return } + console.log('[RemoteDeviceModel] deviceManager.createDeviceManager begin') + let self = this + deviceManager.createDeviceManager("ohos.samples.etskvstore", (error, value) => { + if (error) { + console.error('[RemoteDeviceModel] createDeviceManager failed.') + return; + } + self.deviceManager = value + self.registerDeviceListCallback_(callback) + console.log('[RemoteDeviceModel] createDeviceManager callback returned, error=' + error + ' value=' + value) + }); + console.log('[RemoteDeviceModel] deviceManager.createDeviceManager end') } registerDeviceListCallback_(callback) { - console.info('[RemoteDeviceModel] registerDeviceListCallback'); - this.callback = callback; + console.info('[RemoteDeviceModel] registerDeviceListCallback') + this.callback = callback if (this.deviceManager == undefined) { - console.error('[RemoteDeviceModel] deviceManager has not initialized'); - this.callback(); - return; + console.error('[RemoteDeviceModel] deviceManager has not initialized') + this.callback() + return } - console.info('[RemoteDeviceModel] getTrustedDeviceListSync begin'); - var list = this.deviceManager.getTrustedDeviceListSync(); - console.info('[RemoteDeviceModel] getTrustedDeviceListSync end, deviceList=' + JSON.stringify(list)); + console.info('[RemoteDeviceModel] getTrustedDeviceListSync begin') + var list = this.deviceManager.getTrustedDeviceListSync() + console.info('[RemoteDeviceModel] getTrustedDeviceListSync end, deviceList=' + JSON.stringify(list)) if (typeof (list) != 'undefined' && typeof (list.length) != 'undefined') { - this.deviceList = list; + this.deviceList = list } - this.callback(); + this.callback() console.info('[RemoteDeviceModel] callback finished'); let self = this; @@ -68,71 +68,71 @@ export class RemoteDeviceModel { if (data == null) { return } - console.info('[RemoteDeviceModel] deviceStateChange data=' + JSON.stringify(data)); + console.info('[RemoteDeviceModel] deviceStateChange data=' + JSON.stringify(data)) switch (data.action) { case deviceManager.DeviceStateChangeAction.ONLINE: - self.deviceList[self.deviceList.length] = data.device; - console.info('[RemoteDeviceModel] online, device list=' + JSON.stringify(self.deviceList)); - self.callback(); + self.deviceList[self.deviceList.length] = data.device + console.info('[RemoteDeviceModel] online, device list=' + JSON.stringify(self.deviceList)) + self.callback() if (self.authCallback != null) { - self.authCallback(); - self.authCallback = null; + self.authCallback() + self.authCallback = null } break; case deviceManager.DeviceStateChangeAction.READY: if (self.deviceList.length > 0) { - var list = new Array(); + var list = new Array() for (var j = 0; j < self.deviceList.length; j++) { if (self.deviceList[j].deviceId != data.device.deviceId) { - list[j] = data.device; + list[j] = data.device } } - self.deviceList = list; + self.deviceList = list } - console.info('[RemoteDeviceModel] ready, device list=' + JSON.stringify(data.device)); - self.callback(); + console.info('[RemoteDeviceModel] ready, device list=' + JSON.stringify(data.device)) + self.callback() break; case deviceManager.DeviceStateChangeAction.OFFLINE: case deviceManager.DeviceStateChangeAction.CHANGE: if (self.deviceList.length > 0) { for (var i = 0; i < self.deviceList.length; i++) { if (self.deviceList[i].deviceId == data.device.deviceId) { - self.deviceList[i] = data.device; - break; + self.deviceList[i] = data.device + break } } } - console.info('[RemoteDeviceModel] offline, device list=' + JSON.stringify(self.deviceList)); - self.callback(); - break; + console.info('[RemoteDeviceModel] offline, device list=' + JSON.stringify(self.deviceList)) + self.callback() + break default: - break; + break } }); this.deviceManager.on('deviceFound', (data) => { if (data == null) { return } - console.info('[RemoteDeviceModel] deviceFound data=' + JSON.stringify(data)); - console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + self.discoverList); + console.info('[RemoteDeviceModel] deviceFound data=' + JSON.stringify(data)) + console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + self.discoverList) for (var i = 0;i < self.discoverList.length; i++) { if (self.discoverList[i].deviceId == data.device.deviceId) { - console.info('[RemoteDeviceModel] device founded ignored'); - return; + console.info('[RemoteDeviceModel] device founded ignored') + return } } - self.discoverList[self.discoverList.length] = data.device; - console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + self.discoverList); + self.discoverList[self.discoverList.length] = data.device + console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + self.discoverList) self.callback(); }); this.deviceManager.on('discoverFail', (data) => { - console.info('[RemoteDeviceModel] discoverFail data=' + JSON.stringify(data)); + console.info('[RemoteDeviceModel] discoverFail data=' + JSON.stringify(data)) }); this.deviceManager.on('serviceDie', () => { - console.error('[RemoteDeviceModel] serviceDie'); + console.error('[RemoteDeviceModel] serviceDie') }); - SUBSCRIBE_ID = Math.floor(65536 * Math.random()); + SUBSCRIBE_ID = Math.floor(65536 * Math.random()) var info = { subscribeId: SUBSCRIBE_ID, mode: 0xAA, @@ -142,24 +142,24 @@ export class RemoteDeviceModel { isWakeRemote: true, capability: 0 }; - console.info('[RemoteDeviceModel] startDeviceDiscovery ' + SUBSCRIBE_ID); - this.deviceManager.startDeviceDiscovery(info); + console.info('[RemoteDeviceModel] startDeviceDiscovery ' + SUBSCRIBE_ID) + this.deviceManager.startDeviceDiscovery(info) } unregisterDeviceListCallback() { - console.info('[RemoteDeviceModel] stopDeviceDiscovery ' + SUBSCRIBE_ID); + console.info('[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.deviceManager.off('deviceStateChange') + this.deviceManager.off('deviceFound') + this.deviceManager.off('discoverFail') + this.deviceManager.off('serviceDie') + this.deviceList = [] this.discoverList = [] } authenticateDevice(device, callBack) { console.info('[RemoteDeviceModel] authenticateDevice ' + JSON.stringify(device)); - for (var i = 0; i < this.discoverList.length; i++) { + for (let i = 0; i < this.discoverList.length; i++) { if (this.discoverList[i].deviceId === device.deviceId) { let extraInfo = { 'targetPkgName': 'ohos.samples.etskvstore', @@ -175,11 +175,11 @@ export class RemoteDeviceModel { } this.deviceManager.authenticateDevice(device, authParam, (err, data) => { if (err) { - console.info('[RemoteDeviceModel] authenticateDevice error:' + JSON.stringify(err)); + console.info('[RemoteDeviceModel] authenticateDevice error:' + JSON.stringify(err)) this.authCallback = null return } - console.info('[RemoteDeviceModel] authenticateDevice succeed:' + JSON.stringify(data)); + console.info('[RemoteDeviceModel] authenticateDevice succeed:' + JSON.stringify(data)) this.authCallback = callBack }) diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets index 17f3978e21..4a057784f6 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/pages/index.ets @@ -46,7 +46,7 @@ struct Index { if (value.search(EXIT) != -1) { console.info('[json]EXIT' + EXIT) featureAbility.terminateSelf((error) => { - console.info('kvstore[IndexPage] terminateSelf finished, error=' + error); + console.info('kvstore[IndexPage] terminateSelf finished, error=' + error) }); } else { var str = value.substring(0, value.lastIndexOf('}]') + 2) @@ -126,7 +126,9 @@ struct Index { } onDestroy() { - this.remoteDeviceModel.unregisterDeviceListCallback(); + if(this.remoteDeviceModel != null) { + this.remoteDeviceModel.unregisterDeviceListCallback() + } if (this.isDistributed) { this.isDistributed = false } -- Gitee From d639744de85aaa9314f7462df2510e19b7f8aa5d Mon Sep 17 00:00:00 2001 From: guojin26 Date: Thu, 2 Dec 2021 08:53:52 +0800 Subject: [PATCH 6/8] update Signed-off-by: guojin26 --- .../entry/src/main/ets/MainAbility/model/kvStoreModel.ets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets index 1bb463a930..9d2a70a2e0 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets @@ -79,7 +79,7 @@ export class KvStoreModel { + data.updateEntries.length) for (let i = 0; i < data.insertEntries.length; i++) { if (data.insertEntries[i].key === msg) { - var value = data.insertEntries[i].value.value + let value = data.insertEntries[i].value.value console.info('[KvStoreModel] insertEntries receive ' + msg + '=' + value) callback(value); return; @@ -87,7 +87,7 @@ export class KvStoreModel { } for (let j = 0; j < data.updateEntries.length; j++) { if (data.updateEntries[j].key === msg) { - var value = data.updateEntries[j].value.value + let value = data.updateEntries[j].value.value console.info('[KvStoreModel] updateEntries receive ' + msg + '=' + value) callback(value); return; -- Gitee From 39ba032118fba9088ff972dd1f291ff2cc25b07f Mon Sep 17 00:00:00 2001 From: guojin26 Date: Thu, 2 Dec 2021 16:19:32 +0800 Subject: [PATCH 7/8] update code Signed-off-by: guojin26 --- .../main/ets/MainAbility/common/titleBar.ets | 65 ++++++++----------- .../ets/MainAbility/model/kvStoreModel.ets | 27 +++----- .../ets/MainAbility/model/noteDataModel.ets | 2 - .../MainAbility/model/remoteDeviceModel.ets | 24 ++++--- 4 files changed, 49 insertions(+), 69 deletions(-) diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets index 4c6938850c..3d0c3f5f87 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets @@ -33,6 +33,29 @@ export struct TitleBar { autoCancel: true }) + selectDevice() { + console.log('KvStore[IndexPage] start ability ......') + this.isDistributed = true + if (this.remoteDeviceModel != null && this.remoteDeviceModel.discoverList.length > 0) { + console.log('KvStore[IndexPage] start ability1, needAuth:') + this.remoteDeviceModel.authenticateDevice(this.deviceList[this.selectedIndex], () => { + console.log("KvStore[IndexPage] auth and online finished") + for (var i = 0; i < this.remoteDeviceModel.deviceList.length; i++) { + if (this.remoteDeviceModel.deviceList[i].deviceName === this.deviceList[this.selectedIndex].deviceName) { + this.startAbility(this.remoteDeviceModel.deviceList[i].deviceId) + } + } + }) + } else { + console.log('KvStore[IndexPage] continue unauthed device:' + JSON.stringify(this.deviceList)) + this.startAbility(this.deviceList[this.selectedIndex].deviceId) + } + console.log('KvStore[IndexPage] start ability2 ......') + this.deviceList = [] + this.dialogShow = false + this.dialogController.close() + } + selectedIndexChange() { console.log('KvStore[IndexPage] selectedIndexChange'); if (this.selectedIndex == 0) { @@ -43,30 +66,7 @@ export struct TitleBar { this.dialogController.close() this.dialogShow = false } else { - console.log('KvStore[IndexPage] start ability ......') - this.isDistributed = true - let needAuth = false; - if(this.remoteDeviceModel!=null){ - needAuth = this.remoteDeviceModel.discoverList.length > 0 - } - console.log('KvStore[IndexPage] start ability1, needAuth:' + needAuth) - if (needAuth) { - this.remoteDeviceModel.authenticateDevice(this.deviceList[this.selectedIndex], () => { - console.log("KvStore[IndexPage] auth and online finished") - for (var i = 0; i < this.remoteDeviceModel.deviceList.length; i++) { - if (this.remoteDeviceModel.deviceList[i].deviceName === this.deviceList[this.selectedIndex].deviceName) { - this.startAbility(this.remoteDeviceModel.deviceList[i].deviceId) - } - } - }) - } else { - console.log('KvStore[IndexPage] continue unauthed device:' + JSON.stringify(this.deviceList)) - this.startAbility(this.deviceList[this.selectedIndex].deviceId) - } - console.log('KvStore[IndexPage] start ability2 ......') - this.deviceList = [] - this.dialogShow = false - this.dialogController.close() + this.selectDevice() } } @@ -92,18 +92,13 @@ export struct TitleBar { this.deviceList = []; this.remoteDeviceModel.registerDeviceListCallback(() => { console.info('KvStore[IndexPage] registerDeviceListCallback, callback entered') - this.deviceList[0] = { + this.deviceList.push({ deviceId: '0', deviceName: 'Local device', deviceType: 0, checked: false - } - var deviceTempList; - if (this.remoteDeviceModel.discoverList.length > 0) { - deviceTempList = this.remoteDeviceModel.discoverList - } else { - deviceTempList = this.remoteDeviceModel.deviceList - } + }) + var deviceTempList = this.remoteDeviceModel.discoverList.length > 0 ? this.remoteDeviceModel.discoverList : this.remoteDeviceModel.deviceList; for (var i = 0; i < deviceTempList.length; i++) { console.info('KvStore[IndexPage] device ' + i + '/' + deviceTempList.length + ' deviceId=' + deviceTempList[i].deviceId + ' deviceName=' + deviceTempList[i].deviceName @@ -112,13 +107,9 @@ export struct TitleBar { deviceId: deviceTempList[i].deviceId, deviceName: deviceTempList[i].deviceName, deviceType: deviceTempList[i].deviceType, - checked: false + checked: (this.selectedIndex === i) }) } - for (let i = 0; i < this.deviceList.length; i++) { - this.deviceList[i].checked = (this.selectedIndex === i) - console.info('KvStore[IndexPage] list[i].checked:' + this.deviceList[i].checked) - } }) this.dialogController.open() } diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets index 9d2a70a2e0..4b62c12cd6 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/kvStoreModel.ets @@ -17,15 +17,15 @@ import distributedData from '@ohos.data.distributeddata' const STORE_ID = 'etskvstore_test' export class KvStoreModel { - kvManager; - kvStore; + kvManager + kvStore constructor() { } createKvStore(callback) { if ((typeof (this.kvStore) != 'undefined')) { - callback(); + callback() return; } var config = { @@ -40,7 +40,7 @@ export class KvStoreModel { distributedData.createKVManager(config).then((manager) => { console.info('[KvStoreModel] createKVManager success, kvManager=' + JSON.stringify(manager)) self.kvManager = manager; - var options = { + let options = { createIfMissing: true, encrypt: false, backup: false, @@ -77,19 +77,12 @@ export class KvStoreModel { console.info('[KvStoreModel] dataChange, ' + JSON.stringify(data)); console.info('[KvStoreModel] dataChange, insert ' + data.insertEntries.length + ' udpate ' + data.updateEntries.length) - for (let i = 0; i < data.insertEntries.length; i++) { - if (data.insertEntries[i].key === msg) { - let value = data.insertEntries[i].value.value - console.info('[KvStoreModel] insertEntries receive ' + msg + '=' + value) - callback(value); - return; - } - } - for (let j = 0; j < data.updateEntries.length; j++) { - if (data.updateEntries[j].key === msg) { - let value = data.updateEntries[j].value.value - console.info('[KvStoreModel] updateEntries receive ' + msg + '=' + value) - callback(value); + let entries = data.insertEntries.length > 0 ? data.insertEntries : data.updateEntries + for (let i = 0; i < entries.length; i++) { + if (entries[i].key === msg) { + let value = entries[i].value.value + console.info('[KvStoreModel] Entries receive ' + msg + '=' + value) + callback(value) return; } } diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets index edaf5ca6c0..81c42abcb5 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/noteDataModel.ets @@ -27,8 +27,6 @@ export function transStrToNoteModel(str: string): Array { var notes = JSON.parse(str) console.info('[NoteModel]notes.length = ' + notes.length) for (var note in notes) { - var jsonStr = JSON.stringify(notes[note]) - console.info('[NoteModel]notes[note] = ' + jsonStr) noteList.push({ title: notes[note].title, content: notes[note].content }) } return noteList diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets index 213f9e139d..c669efe6ed 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets @@ -28,7 +28,7 @@ export class RemoteDeviceModel { registerDeviceListCallback(callback) { if (typeof (this.deviceManager) != 'undefined') { - this.registerDeviceListCallback_(callback) + this.registerDeviceListCallbackImplement(callback) return } console.log('[RemoteDeviceModel] deviceManager.createDeviceManager begin') @@ -39,13 +39,13 @@ export class RemoteDeviceModel { return; } self.deviceManager = value - self.registerDeviceListCallback_(callback) + self.registerDeviceListCallbackImplement(callback) console.log('[RemoteDeviceModel] createDeviceManager callback returned, error=' + error + ' value=' + value) }); console.log('[RemoteDeviceModel] deviceManager.createDeviceManager end') } - registerDeviceListCallback_(callback) { + registerDeviceListCallbackImplement(callback) { console.info('[RemoteDeviceModel] registerDeviceListCallback') this.callback = callback if (this.deviceManager == undefined) { @@ -55,7 +55,7 @@ export class RemoteDeviceModel { } console.info('[RemoteDeviceModel] getTrustedDeviceListSync begin') - var list = this.deviceManager.getTrustedDeviceListSync() + let list = this.deviceManager.getTrustedDeviceListSync() console.info('[RemoteDeviceModel] getTrustedDeviceListSync end, deviceList=' + JSON.stringify(list)) if (typeof (list) != 'undefined' && typeof (list.length) != 'undefined') { this.deviceList = list @@ -81,10 +81,10 @@ export class RemoteDeviceModel { break; case deviceManager.DeviceStateChangeAction.READY: if (self.deviceList.length > 0) { - var list = new Array() - for (var j = 0; j < self.deviceList.length; j++) { - if (self.deviceList[j].deviceId != data.device.deviceId) { - list[j] = data.device + let list = new Array() + for (let i = 0; i < self.deviceList.length; i++) { + if (self.deviceList[i].deviceId != data.device.deviceId) { + list[i] = data.device } } self.deviceList = list @@ -95,9 +95,9 @@ export class RemoteDeviceModel { case deviceManager.DeviceStateChangeAction.OFFLINE: case deviceManager.DeviceStateChangeAction.CHANGE: if (self.deviceList.length > 0) { - for (var i = 0; i < self.deviceList.length; i++) { - if (self.deviceList[i].deviceId == data.device.deviceId) { - self.deviceList[i] = data.device + for (let j = 0; j < self.deviceList.length; j ++) { + if (self.deviceList[j ].deviceId == data.device.deviceId) { + self.deviceList[j ] = data.device break } } @@ -114,7 +114,6 @@ export class RemoteDeviceModel { return } console.info('[RemoteDeviceModel] deviceFound data=' + JSON.stringify(data)) - console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + self.discoverList) for (var i = 0;i < self.discoverList.length; i++) { if (self.discoverList[i].deviceId == data.device.deviceId) { console.info('[RemoteDeviceModel] device founded ignored') @@ -182,7 +181,6 @@ export class RemoteDeviceModel { console.info('[RemoteDeviceModel] authenticateDevice succeed:' + JSON.stringify(data)) this.authCallback = callBack }) - } } } -- Gitee From bd62972abe31cbe9e938e61eac37bbfcfb7a2dbc Mon Sep 17 00:00:00 2001 From: guojin26 Date: Thu, 2 Dec 2021 17:48:20 +0800 Subject: [PATCH 8/8] update code Signed-off-by: guojin26 --- .../main/ets/MainAbility/common/titleBar.ets | 37 +++-- .../MainAbility/model/remoteDeviceModel.ets | 146 ++++++++++-------- 2 files changed, 105 insertions(+), 78 deletions(-) diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets index 3d0c3f5f87..d450f70ce8 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/common/titleBar.ets @@ -33,27 +33,32 @@ export struct TitleBar { autoCancel: true }) + clearSelectState() { + this.deviceList = [] + this.dialogShow = false + this.dialogController.close() + } + selectDevice() { console.log('KvStore[IndexPage] start ability ......') this.isDistributed = true - if (this.remoteDeviceModel != null && this.remoteDeviceModel.discoverList.length > 0) { - console.log('KvStore[IndexPage] start ability1, needAuth:') - this.remoteDeviceModel.authenticateDevice(this.deviceList[this.selectedIndex], () => { - console.log("KvStore[IndexPage] auth and online finished") - for (var i = 0; i < this.remoteDeviceModel.deviceList.length; i++) { - if (this.remoteDeviceModel.deviceList[i].deviceName === this.deviceList[this.selectedIndex].deviceName) { - this.startAbility(this.remoteDeviceModel.deviceList[i].deviceId) - } - } - }) - } else { + if (this.remoteDeviceModel === null || this.remoteDeviceModel.discoverList.length <= 0) { console.log('KvStore[IndexPage] continue unauthed device:' + JSON.stringify(this.deviceList)) this.startAbility(this.deviceList[this.selectedIndex].deviceId) + this.clearSelectState() + return } + console.log('KvStore[IndexPage] start ability1, needAuth:') + this.remoteDeviceModel.authenticateDevice(this.deviceList[this.selectedIndex], () => { + console.log("KvStore[IndexPage] auth and online finished") + for (var i = 0; i < this.remoteDeviceModel.deviceList.length; i++) { + if (this.remoteDeviceModel.deviceList[i].deviceName === this.deviceList[this.selectedIndex].deviceName) { + this.startAbility(this.remoteDeviceModel.deviceList[i].deviceId) + } + } + }) console.log('KvStore[IndexPage] start ability2 ......') - this.deviceList = [] - this.dialogShow = false - this.dialogController.close() + this.clearSelectState() } selectedIndexChange() { @@ -65,9 +70,9 @@ export struct TitleBar { this.deviceList = [] this.dialogController.close() this.dialogShow = false - } else { - this.selectDevice() + return } + this.selectDevice() } startAbility(deviceId) { diff --git a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets index c669efe6ed..aeddba696d 100644 --- a/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets +++ b/data/eTSKvStore/entry/src/main/ets/MainAbility/model/remoteDeviceModel.ets @@ -45,15 +45,55 @@ export class RemoteDeviceModel { console.log('[RemoteDeviceModel] deviceManager.createDeviceManager end') } + deviceStateChangeActionOnline(device) { + this.deviceList[this.deviceList.length] = device + console.info('[RemoteDeviceModel] online, device list=' + JSON.stringify(this.deviceList)) + this.callback() + if (this.authCallback != null) { + this.authCallback() + this.authCallback = null + } + } + + deviceStateChangeActionReady(device) { + if (this.deviceList.length <= 0) { + this.callback() + return + } + let list = new Array() + for (let i = 0; i < this.deviceList.length; i++) { + if (this.deviceList[i].deviceId != device.deviceId) { + list[i] = device + } + } + this.deviceList = list + console.info('[RemoteDeviceModel] ready, device list=' + JSON.stringify(device)) + this.callback() + } + + deviceStateChangeActionOffline(device) { + if (this.deviceList.length <= 0) { + 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('[RemoteDeviceModel] offline, device list=' + JSON.stringify(this.deviceList)) + this.callback() + } + registerDeviceListCallbackImplement(callback) { console.info('[RemoteDeviceModel] registerDeviceListCallback') this.callback = callback - if (this.deviceManager == undefined) { + if (this.deviceManager === undefined) { console.error('[RemoteDeviceModel] deviceManager has not initialized') this.callback() return } - console.info('[RemoteDeviceModel] getTrustedDeviceListSync begin') let list = this.deviceManager.getTrustedDeviceListSync() console.info('[RemoteDeviceModel] getTrustedDeviceListSync end, deviceList=' + JSON.stringify(list)) @@ -62,7 +102,6 @@ export class RemoteDeviceModel { } this.callback() console.info('[RemoteDeviceModel] callback finished'); - let self = this; this.deviceManager.on('deviceStateChange', (data) => { if (data == null) { @@ -71,39 +110,14 @@ export class RemoteDeviceModel { console.info('[RemoteDeviceModel] deviceStateChange data=' + JSON.stringify(data)) switch (data.action) { case deviceManager.DeviceStateChangeAction.ONLINE: - self.deviceList[self.deviceList.length] = data.device - console.info('[RemoteDeviceModel] online, device list=' + JSON.stringify(self.deviceList)) - self.callback() - if (self.authCallback != null) { - self.authCallback() - self.authCallback = null - } + self.deviceStateChangeActionOnline(data.device) break; case deviceManager.DeviceStateChangeAction.READY: - if (self.deviceList.length > 0) { - let list = new Array() - for (let i = 0; i < self.deviceList.length; i++) { - if (self.deviceList[i].deviceId != data.device.deviceId) { - list[i] = data.device - } - } - self.deviceList = list - } - console.info('[RemoteDeviceModel] ready, device list=' + JSON.stringify(data.device)) - self.callback() + self.deviceStateChangeActionReady(data.device) break; case deviceManager.DeviceStateChangeAction.OFFLINE: case deviceManager.DeviceStateChangeAction.CHANGE: - if (self.deviceList.length > 0) { - for (let j = 0; j < self.deviceList.length; j ++) { - if (self.deviceList[j ].deviceId == data.device.deviceId) { - self.deviceList[j ] = data.device - break - } - } - } - console.info('[RemoteDeviceModel] offline, device list=' + JSON.stringify(self.deviceList)) - self.callback() + self.deviceStateChangeActionOffline(data.device) break default: break @@ -114,15 +128,7 @@ export class RemoteDeviceModel { return } console.info('[RemoteDeviceModel] deviceFound data=' + JSON.stringify(data)) - for (var i = 0;i < self.discoverList.length; i++) { - if (self.discoverList[i].deviceId == data.device.deviceId) { - console.info('[RemoteDeviceModel] device founded ignored') - return - } - } - self.discoverList[self.discoverList.length] = data.device - console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + self.discoverList) - self.callback(); + self.deviceFound(data) }); this.deviceManager.on('discoverFail', (data) => { console.info('[RemoteDeviceModel] discoverFail data=' + JSON.stringify(data)) @@ -130,7 +136,22 @@ export class RemoteDeviceModel { this.deviceManager.on('serviceDie', () => { console.error('[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('[RemoteDeviceModel] device founded ignored') + return + } + } + this.discoverList[this.discoverList.length] = data.device + console.info('[RemoteDeviceModel] deviceFound self.discoverList=' + this.discoverList) + this.callback(); + } + startDeviceDiscovery() { SUBSCRIBE_ID = Math.floor(65536 * Math.random()) var info = { subscribeId: SUBSCRIBE_ID, @@ -159,29 +180,30 @@ export class RemoteDeviceModel { authenticateDevice(device, callBack) { console.info('[RemoteDeviceModel] authenticateDevice ' + JSON.stringify(device)); for (let i = 0; i < this.discoverList.length; i++) { - if (this.discoverList[i].deviceId === device.deviceId) { - let extraInfo = { - 'targetPkgName': 'ohos.samples.etskvstore', - 'appName': 'Distributed Calc', - 'appDescription': 'Distributed Calc', - 'business': '0' - } - let authParam = { - 'authType': 1, - 'appIcon': '', - 'appThumbnail': '', - 'extraInfo': extraInfo - } - this.deviceManager.authenticateDevice(device, authParam, (err, data) => { - if (err) { - console.info('[RemoteDeviceModel] authenticateDevice error:' + JSON.stringify(err)) - this.authCallback = null - return - } - console.info('[RemoteDeviceModel] authenticateDevice succeed:' + JSON.stringify(data)) - this.authCallback = callBack - }) + if (this.discoverList[i].deviceId != device.deviceId) { + continue } + let extraInfo = { + 'targetPkgName': 'ohos.samples.etskvstore', + 'appName': 'Distributed kvstore', + 'appDescription': 'Distributed kvstore', + 'business': '0' + } + let authParam = { + 'authType': 1, + 'appIcon': '', + 'appThumbnail': '', + 'extraInfo': extraInfo + } + this.deviceManager.authenticateDevice(device, authParam, (err, data) => { + if (err) { + console.info('[RemoteDeviceModel] authenticateDevice error:' + JSON.stringify(err)) + this.authCallback = null + return + } + console.info('[RemoteDeviceModel] authenticateDevice succeed:' + JSON.stringify(data)) + this.authCallback = callBack + }) } } } \ No newline at end of file -- Gitee